From 2acdfb1c0c53c79554b24cc81e1234f4a2d78961 Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Tue, 22 Aug 2023 20:54:05 +0800 Subject: [PATCH 001/153] feature: create model --- .eslintrc.yml | 12 + .../20190115071418-create-followship.js | 8 +- migrations/20190115071419-create-like.js | 8 +- migrations/20190115071420-create-reply.js | 8 +- migrations/20190115071420-create-tweet.js | 6 +- migrations/20190115071421-create-user.js | 4 +- models/followship.js | 30 +- models/like.js | 32 +- models/reply.js | 33 +- models/tweet.js | 33 +- models/user.js | 48 +- package-lock.json | 5335 +++++++---------- package.json | 5 + 13 files changed, 2278 insertions(+), 3284 deletions(-) create mode 100644 .eslintrc.yml diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 000000000..5960a273e --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,12 @@ +env: + browser: true + commonjs: true + es2021: true +extends: + - standard +parserOptions: + ecmaVersion: 12 +rules: + arrow-parens: + - warn + - as-needed \ No newline at end of file diff --git a/migrations/20190115071418-create-followship.js b/migrations/20190115071418-create-followship.js index 4e04770a7..0198e35a1 100644 --- a/migrations/20190115071418-create-followship.js +++ b/migrations/20190115071418-create-followship.js @@ -8,17 +8,17 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - followerId: { + follower_id: { type: Sequelize.INTEGER }, - followingId: { + following_id: { type: Sequelize.INTEGER }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } diff --git a/migrations/20190115071419-create-like.js b/migrations/20190115071419-create-like.js index 08c9e524d..c313944ac 100644 --- a/migrations/20190115071419-create-like.js +++ b/migrations/20190115071419-create-like.js @@ -8,17 +8,17 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - UserId: { + user_id: { type: Sequelize.INTEGER }, - TweetId: { + tweet_id: { type: Sequelize.INTEGER }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } diff --git a/migrations/20190115071420-create-reply.js b/migrations/20190115071420-create-reply.js index ccfd119c5..f10285ebe 100644 --- a/migrations/20190115071420-create-reply.js +++ b/migrations/20190115071420-create-reply.js @@ -8,20 +8,20 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - UserId: { + user_id: { type: Sequelize.INTEGER }, - TweetId: { + tweet_id: { type: Sequelize.INTEGER }, comment: { type: Sequelize.TEXT }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } diff --git a/migrations/20190115071420-create-tweet.js b/migrations/20190115071420-create-tweet.js index 201c8e824..8cda661aa 100644 --- a/migrations/20190115071420-create-tweet.js +++ b/migrations/20190115071420-create-tweet.js @@ -8,17 +8,17 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - UserId: { + user_id: { type: Sequelize.INTEGER }, description: { type: Sequelize.TEXT }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } diff --git a/migrations/20190115071421-create-user.js b/migrations/20190115071421-create-user.js index 2376dbb50..8e51d4a7a 100644 --- a/migrations/20190115071421-create-user.js +++ b/migrations/20190115071421-create-user.js @@ -26,11 +26,11 @@ module.exports = { role: { type: Sequelize.STRING }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } diff --git a/models/followship.js b/models/followship.js index 790f3faa3..1ab09e1b8 100644 --- a/models/followship.js +++ b/models/followship.js @@ -1,8 +1,26 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') module.exports = (sequelize, DataTypes) => { - const Followship = sequelize.define('Followship', { - }, {}); - Followship.associate = function(models) { + class Followship extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + } }; - return Followship; -}; \ No newline at end of file + Followship.init({ + followerId: DataTypes.INTEGER, + followingId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'Followship', + tableName: 'Followships', + underscored: true + }) + return Followship +} diff --git a/models/like.js b/models/like.js index c8939de1f..a56b6ce05 100644 --- a/models/like.js +++ b/models/like.js @@ -1,8 +1,28 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') module.exports = (sequelize, DataTypes) => { - const Like = sequelize.define('Like', { - }, {}); - Like.associate = function(models) { + class Like extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + Like.belongsTo(models.User) + Like.belongsTo(models.Tweet) + } }; - return Like; -}; \ No newline at end of file + Like.init({ + UserId: DataTypes.INTEGER, + TweetId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'Like', + tableName: 'Likes', + underscored: true + }) + return Like +} diff --git a/models/reply.js b/models/reply.js index 60387f164..192c54426 100644 --- a/models/reply.js +++ b/models/reply.js @@ -1,8 +1,29 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') module.exports = (sequelize, DataTypes) => { - const Reply = sequelize.define('Reply', { - }, {}); - Reply.associate = function(models) { + class Reply extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + Reply.belongsTo(models.Tweet) + Reply.belongsTo(models.User) + } }; - return Reply; -}; \ No newline at end of file + Reply.init({ + comment: DataTypes.TEXT, + UserId: DataTypes.INTEGER, + TweetId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'Reply', + tableName: 'Replies', + underscored: true + }) + return Reply +} diff --git a/models/tweet.js b/models/tweet.js index a8b660077..241079d5a 100644 --- a/models/tweet.js +++ b/models/tweet.js @@ -1,8 +1,29 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') module.exports = (sequelize, DataTypes) => { - const Tweet = sequelize.define('Tweet', { - }, {}); - Tweet.associate = function(models) { + class Tweet extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + Tweet.hasMany(models.Reply, { foreignKey: 'tweetId' }) + Tweet.hasMany(models.Like, { foreignKey: 'tweetId' }) + Tweet.belongsTo(models.User) + } }; - return Tweet; -}; \ No newline at end of file + Tweet.init({ + description: DataTypes.TEXT, + UserId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'Tweet', + tableName: 'Tweets', + underscored: true + }) + return Tweet +} diff --git a/models/user.js b/models/user.js index 82c5f84c8..bd0ccc976 100644 --- a/models/user.js +++ b/models/user.js @@ -1,8 +1,44 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') module.exports = (sequelize, DataTypes) => { - const User = sequelize.define('User', { - }, {}); - User.associate = function(models) { + class User extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + User.hasMany(models.Reply, { foreignKey: 'userId' }) + User.hasMany(models.Tweet, { foreignKey: 'userId' }) + User.hasMany(models.Like, { foreignKey: 'userId' }) + User.belongsToMany(User, { + through: models.Followship, + foreignKey: 'followingId', + as: 'Followers' + }) + User.belongsToMany(User, { + through: models.Followship, + foreignKey: 'followerId', + as: 'Followings' + }) + } }; - return User; -}; \ No newline at end of file + User.init({ + name: DataTypes.STRING, + email: DataTypes.STRING, + password: DataTypes.STRING, + avatar: DataTypes.STRING, + introduction: DataTypes.STRING, + role: DataTypes.STRING, + cover: DataTypes.STRING + }, { + sequelize, + modelName: 'User', + tableName: 'Users', + underscored: true + }) + return User +} diff --git a/package-lock.json b/package-lock.json index 0307072c0..fcde41c6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3183 +1,103 @@ { "name": "test", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "test", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "bcrypt-nodejs": "0.0.3", - "body-parser": "^1.18.3", - "chai": "^4.2.0", - "connect-flash": "^0.1.1", - "express": "^4.16.4", - "express-handlebars": "^3.0.0", - "express-session": "^1.15.6", - "faker": "^4.1.0", - "method-override": "^3.0.0", - "mocha": "^6.0.2", - "mysql2": "^1.6.4", - "passport": "^0.4.0", - "passport-local": "^1.0.0", - "sequelize": "^6.18.0", - "sequelize-cli": "^5.5.0", - "sinon": "^10.0.0", - "sinon-chai": "^3.3.0" - }, - "devDependencies": { - "proxyquire": "^2.1.3", - "sequelize-test-helpers": "^1.4.2", - "supertest": "^3.3.0" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" - }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/node": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", - "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" - }, - "node_modules/@types/validator": { - "version": "13.7.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.2.tgz", - "integrity": "sha512-KFcchQ3h0OPQgFirBRPZr5F/sVjxZsOrQHedj3zi8AH3Zv/hOLx2OLR4hxR5HcfoU+33n69ZuOfzthKVdMoTiw==" - }, - "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==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "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/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-nodejs": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", - "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=", - "deprecated": "bcrypt-nodejs is no longer actively maintained. Please use bcrypt or bcryptjs. See https://github.com/kelektiv/node.bcrypt.js/wiki/bcrypt-vs-brypt.js to learn more about these two options" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.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==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "engines": { - "node": "*" - } - }, - "node_modules/cli-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", - "dependencies": { - "ansi-regex": "^2.1.1", - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.5" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "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.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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==" - }, - "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/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/connect-flash": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", - "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "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=" - }, - "node_modules/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" - }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "bin": { - "editorconfig": "bin/editorconfig" - } - }, - "node_modules/editorconfig/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==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/editorconfig/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "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==", - "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/es5-ext": { - "version": "0.10.60", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", - "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "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.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "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-handlebars": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", - "integrity": "sha512-7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZYdIiha2JqwiaG6o2Wu6NZJQ0u7Fg==", - "dependencies": { - "glob": "^7.1.3", - "graceful-fs": "^4.1.2", - "handlebars": "^4.1.2", - "object.assign": "^4.1.0", - "promise": "^8.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dependencies": { - "type": "^2.5.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" - }, - "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/faker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", - "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" - }, - "node_modules/fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "dependencies": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.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==", - "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/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "dev": true, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dependencies": { - "is-property": "^1.0.2" - } - }, - "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==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "engines": { - "node": "*" - } - }, - "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==", - "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-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.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==", - "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=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflection": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz", - "integrity": "sha512-cmZlljCRTBFouT8UzMzrGcVEvkv6D/wBdcdKG7J1QH5cXjtU75Dm+P27v9EKu/Y43UYyCJd1WC4zLebRrC8NBw==", - "engines": [ - "node >= 0.4.0" - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.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==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/js-beautify": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.3.tgz", - "integrity": "sha512-f1ra8PHtOEu/70EBnmiUlV8nJePS58y9qKjl4JHfYWlFH6bo7ogZBz//FAZp7jDuXtYnGYKymZPlrg2I/9Zo4g==", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "nopt": "^5.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dependencies": { - "get-func-name": "^2.0.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==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "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=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "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=" - }, - "node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "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.)", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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": "*" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/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==" - }, - "node_modules/mocha/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", - "dependencies": { - "moment": ">= 2.9.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/mysql2": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.7.0.tgz", - "integrity": "sha512-xTWWQPjP5rcrceZQ7CSTKR/4XIDeH/cRkNH/uzvVGQ7W5c7EJ0dXeJUusk7OKhIoHj7uFKUxDVSCfLIl+jluog==", - "dependencies": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.5.0", - "long": "^4.0.0", - "lru-cache": "^5.1.1", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.1" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "dependencies": { - "lru-cache": "^4.1.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/named-placeholders/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==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/named-placeholders/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "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==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/nise": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "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.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "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==", - "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=", - "dependencies": { - "wrappy": "1" - } - }, - "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==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "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=" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, - "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": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxyquire": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", - "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", - "dev": true, - "dependencies": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/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/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "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==" - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/retry-as-promised": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", - "integrity": "sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==" - }, - "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==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "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.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" - }, - "node_modules/sequelize": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.19.0.tgz", - "integrity": "sha512-B3oGIdpYBERDjRDm74h7Ky67f6ZLcmBXOA7HscYObiOSo4pD7VBc9mtm44wNV7unc0uk8I1d30nbZBTQCE377A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], - "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", - "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.34", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^5.0.0", - "semver": "^7.3.5", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.7.0", - "wkx": "^0.5.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/sequelize-cli": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.1.tgz", - "integrity": "sha512-ZM4kUZvY3y14y+Rq3cYxGH7YDJz11jWHcN2p2x7rhAIemouu4CEXr5ebw30lzTBtyXV4j2kTO+nUjZOqzG7k+Q==", - "dependencies": { - "bluebird": "^3.5.3", - "cli-color": "^1.4.0", - "fs-extra": "^7.0.1", - "js-beautify": "^1.8.8", - "lodash": "^4.17.5", - "resolve": "^1.5.0", - "umzug": "^2.1.0", - "yargs": "^13.1.0" - }, - "bin": { - "sequelize": "lib/sequelize", - "sequelize-cli": "lib/sequelize" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize-test-helpers": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/sequelize-test-helpers/-/sequelize-test-helpers-1.4.2.tgz", - "integrity": "sha512-v7Yy9DKjzFA/OHLtxvFClgN2CKA9cRwxn9+6ha6xoqUzRngXdsbrmle0KD1onSqnCwVIweWlRTLJxcEl1ueozA==", - "dev": true, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/davesag" - }, - "peerDependencies": { - "chai": ">= 4", - "sinon": ">= 10.0.0" - } - }, - "node_modules/sequelize/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/sequelize/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sequelize/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==" - }, - "node_modules/sequelize/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sequelize/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "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=" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "node_modules/sinon": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-10.0.0.tgz", - "integrity": "sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw==", - "dependencies": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.1", - "diff": "^4.0.2", - "nise": "^4.1.0", - "supports-color": "^7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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=" - }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "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_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.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==", - "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==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dev": true, - "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/superagent/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/superagent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/supertest": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.4.2.tgz", - "integrity": "sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^3.8.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uglify-js": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", - "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/umzug": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", - "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", - "dependencies": { - "bluebird": "^3.7.2" - }, - "engines": { - "node": ">=6.0.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==", - "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/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "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/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" }, - "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "engines": { - "node": ">= 0.10" + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" } }, - "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==", - "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" + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, - "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=" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dependencies": { - "string-width": "^1.0.2 || 2" + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + } } }, - "node_modules/wkx": { + "@humanwhocodes/config-array": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "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==", - "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.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/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==", - "dependencies": { - "ansi-regex": "^4.1.0" + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -3217,6 +137,11 @@ "@types/ms": "*" } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -3246,6 +171,27 @@ "negotiator": "0.6.3" } }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -3272,11 +218,330 @@ "sprintf-js": "~1.0.2" } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "dependencies": { + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -3287,12 +552,22 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3355,6 +630,11 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3534,6 +814,26 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -3564,6 +864,11 @@ "type-detect": "^4.0.0" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -3599,6 +904,14 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, "dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", @@ -3646,6 +959,43 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "requires": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", @@ -3673,71 +1023,517 @@ "unbox-primitive": "^1.0.1" } }, - "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==", + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.60", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", + "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "eslint-config-standard": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", + "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==" + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } } }, - "es5-ext": { - "version": "0.10.60", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", - "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } + "eslint-plugin-promise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==" }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3909,6 +1705,29 @@ "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -3959,6 +1778,28 @@ "is-buffer": "~2.0.3" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -4006,6 +1847,27 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -4056,6 +1918,51 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -4104,6 +2011,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4122,6 +2034,11 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -4149,6 +2066,25 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, "inflection": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz", @@ -4188,6 +2124,34 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4231,11 +2195,24 @@ "has-tostringtag": "^1.0.0" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4298,6 +2275,14 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "requires": { + "which-typed-array": "^1.1.11" + } + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4328,6 +2313,11 @@ "nopt": "^5.0.0" } }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -4337,6 +2327,29 @@ "esprima": "^4.0.0" } }, + "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==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -4350,6 +2363,26 @@ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -4369,6 +2402,16 @@ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -4646,6 +2689,11 @@ } } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -4705,6 +2753,17 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -4736,6 +2795,142 @@ "es-abstract": "^1.19.1" } }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4757,6 +2952,19 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4778,6 +2986,23 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4815,6 +3040,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -4825,6 +3055,14 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -4835,10 +3073,68 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, - "pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "process-nextick-args": { "version": "2.0.1", @@ -4846,6 +3142,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -4884,6 +3185,11 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -4913,6 +3219,65 @@ "unpipe": "1.0.0" } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4936,11 +3301,42 @@ } } }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "dependencies": { + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + } + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -4956,16 +3352,81 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, "retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", "integrity": "sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==" }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "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==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5121,8 +3582,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/sequelize-test-helpers/-/sequelize-test-helpers-1.4.2.tgz", "integrity": "sha512-v7Yy9DKjzFA/OHLtxvFClgN2CKA9cRwxn9+6ha6xoqUzRngXdsbrmle0KD1onSqnCwVIweWlRTLJxcEl1ueozA==", - "dev": true, - "requires": {} + "dev": true }, "serve-static": { "version": "1.14.2", @@ -5145,6 +3605,19 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5196,14 +3669,79 @@ "sinon-chai": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "requires": {} + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==" + } + } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5219,23 +3757,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "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" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -5245,6 +3766,142 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -5263,6 +3920,23 @@ "define-properties": "^1.1.3" } }, + "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -5278,6 +3952,11 @@ } } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -5341,6 +4020,74 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==" + }, + "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==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -5360,16 +4107,40 @@ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -5379,6 +4150,62 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "uglify-js": { "version": "3.15.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", @@ -5422,6 +4249,14 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5438,6 +4273,20 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -5473,6 +4322,18 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", diff --git a/package.json b/package.json index e85b8c07c..8beb8b1d3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,11 @@ "body-parser": "^1.18.3", "chai": "^4.2.0", "connect-flash": "^0.1.1", + "eslint": "^7.32.0", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", "express": "^4.16.4", "express-handlebars": "^3.0.0", "express-session": "^1.15.6", From 644ce149453d30df0be1f9ae458244b1cf49f123 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Tue, 22 Aug 2023 23:16:47 +0800 Subject: [PATCH 002/153] feat: eslint files --- .../20190115071418-create-followship.js | 8 ++-- migrations/20190115071419-create-like.js | 8 ++-- migrations/20190115071420-create-reply.js | 8 ++-- migrations/20190115071420-create-tweet.js | 8 ++-- migrations/20190115071421-create-user.js | 8 ++-- models/index.js | 40 +++++++++---------- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/migrations/20190115071418-create-followship.js b/migrations/20190115071418-create-followship.js index 0198e35a1..da1802d87 100644 --- a/migrations/20190115071418-create-followship.js +++ b/migrations/20190115071418-create-followship.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Followships', { @@ -22,9 +22,9 @@ module.exports = { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Followships'); + return queryInterface.dropTable('Followships') } -}; \ No newline at end of file +} diff --git a/migrations/20190115071419-create-like.js b/migrations/20190115071419-create-like.js index c313944ac..3099bbf46 100644 --- a/migrations/20190115071419-create-like.js +++ b/migrations/20190115071419-create-like.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Likes', { @@ -22,9 +22,9 @@ module.exports = { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Likes'); + return queryInterface.dropTable('Likes') } -}; \ No newline at end of file +} diff --git a/migrations/20190115071420-create-reply.js b/migrations/20190115071420-create-reply.js index f10285ebe..5553f9ad9 100644 --- a/migrations/20190115071420-create-reply.js +++ b/migrations/20190115071420-create-reply.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Replies', { @@ -25,9 +25,9 @@ module.exports = { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Replies'); + return queryInterface.dropTable('Replies') } -}; \ No newline at end of file +} diff --git a/migrations/20190115071420-create-tweet.js b/migrations/20190115071420-create-tweet.js index 8cda661aa..b7522f101 100644 --- a/migrations/20190115071420-create-tweet.js +++ b/migrations/20190115071420-create-tweet.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Tweets', { @@ -22,9 +22,9 @@ module.exports = { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Tweets'); + return queryInterface.dropTable('Tweets') } -}; \ No newline at end of file +} diff --git a/migrations/20190115071421-create-user.js b/migrations/20190115071421-create-user.js index 8e51d4a7a..6c30c1abd 100644 --- a/migrations/20190115071421-create-user.js +++ b/migrations/20190115071421-create-user.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Users', { @@ -34,9 +34,9 @@ module.exports = { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Users'); + return queryInterface.dropTable('Users') } -}; \ No newline at end of file +} diff --git a/models/index.js b/models/index.js index 33f09e776..e92dffac8 100644 --- a/models/index.js +++ b/models/index.js @@ -1,37 +1,37 @@ -'use strict'; +'use strict' -const fs = require('fs'); -const path = require('path'); -const Sequelize = require('sequelize'); -const basename = path.basename(__filename); -const env = process.env.NODE_ENV || 'development'; -const config = require(__dirname + '/../config/config.json')[env]; -const db = {}; +const fs = require('fs') +const path = require('path') +const Sequelize = require('sequelize') +const basename = path.basename(__filename) +const env = process.env.NODE_ENV || 'development' +const config = require(__dirname + '/../config/config.json')[env] +const db = {} -let sequelize; +let sequelize if (config.use_env_variable) { - sequelize = new Sequelize(process.env[config.use_env_variable], config); + sequelize = new Sequelize(process.env[config.use_env_variable], config) } else { - sequelize = new Sequelize(config.database, config.username, config.password, config); + sequelize = new Sequelize(config.database, config.username, config.password, config) } fs .readdirSync(__dirname) .filter(file => { - return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js') }) .forEach(file => { - const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); - db[model.name] = model; - }); + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes) + db[model.name] = model + }) Object.keys(db).forEach(modelName => { if (db[modelName].associate) { - db[modelName].associate(db); + db[modelName].associate(db) } -}); +}) -db.sequelize = sequelize; -db.Sequelize = Sequelize; +db.sequelize = sequelize +db.Sequelize = Sequelize -module.exports = db; +module.exports = db From 7ec09418bedf470b4d064bf02a6ce2f6e7396f1e Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Wed, 23 Aug 2023 00:27:44 +0800 Subject: [PATCH 003/153] add reply, tweet model --- .eslintrc.yml | 12 + migrations/20190115071420-create-reply.js | 16 +- migrations/20190115071420-create-tweet.js | 14 +- models/index.js | 40 +- models/reply.js | 34 +- models/tweet.js | 34 +- package-lock.json | 5335 ++++++++------------- package.json | 5 + test/models/Reply.spec.js | 48 +- 9 files changed, 2229 insertions(+), 3309 deletions(-) create mode 100644 .eslintrc.yml diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 000000000..495c19c36 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,12 @@ +env: + browser: true + commonjs: true + es2021: true +extends: + - standard +parserOptions: + ecmaVersion: 12 +rules: + arrow-parens: + - warn + - as-needed diff --git a/migrations/20190115071420-create-reply.js b/migrations/20190115071420-create-reply.js index ccfd119c5..5553f9ad9 100644 --- a/migrations/20190115071420-create-reply.js +++ b/migrations/20190115071420-create-reply.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Replies', { @@ -8,26 +8,26 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - UserId: { + user_id: { type: Sequelize.INTEGER }, - TweetId: { + tweet_id: { type: Sequelize.INTEGER }, comment: { type: Sequelize.TEXT }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Replies'); + return queryInterface.dropTable('Replies') } -}; \ No newline at end of file +} diff --git a/migrations/20190115071420-create-tweet.js b/migrations/20190115071420-create-tweet.js index 201c8e824..b7522f101 100644 --- a/migrations/20190115071420-create-tweet.js +++ b/migrations/20190115071420-create-tweet.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Tweets', { @@ -8,23 +8,23 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - UserId: { + user_id: { type: Sequelize.INTEGER }, description: { type: Sequelize.TEXT }, - createdAt: { + created_at: { allowNull: false, type: Sequelize.DATE }, - updatedAt: { + updated_at: { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Tweets'); + return queryInterface.dropTable('Tweets') } -}; \ No newline at end of file +} diff --git a/models/index.js b/models/index.js index 33f09e776..e92dffac8 100644 --- a/models/index.js +++ b/models/index.js @@ -1,37 +1,37 @@ -'use strict'; +'use strict' -const fs = require('fs'); -const path = require('path'); -const Sequelize = require('sequelize'); -const basename = path.basename(__filename); -const env = process.env.NODE_ENV || 'development'; -const config = require(__dirname + '/../config/config.json')[env]; -const db = {}; +const fs = require('fs') +const path = require('path') +const Sequelize = require('sequelize') +const basename = path.basename(__filename) +const env = process.env.NODE_ENV || 'development' +const config = require(__dirname + '/../config/config.json')[env] +const db = {} -let sequelize; +let sequelize if (config.use_env_variable) { - sequelize = new Sequelize(process.env[config.use_env_variable], config); + sequelize = new Sequelize(process.env[config.use_env_variable], config) } else { - sequelize = new Sequelize(config.database, config.username, config.password, config); + sequelize = new Sequelize(config.database, config.username, config.password, config) } fs .readdirSync(__dirname) .filter(file => { - return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js') }) .forEach(file => { - const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); - db[model.name] = model; - }); + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes) + db[model.name] = model + }) Object.keys(db).forEach(modelName => { if (db[modelName].associate) { - db[modelName].associate(db); + db[modelName].associate(db) } -}); +}) -db.sequelize = sequelize; -db.Sequelize = Sequelize; +db.sequelize = sequelize +db.Sequelize = Sequelize -module.exports = db; +module.exports = db diff --git a/models/reply.js b/models/reply.js index 60387f164..91efec4d0 100644 --- a/models/reply.js +++ b/models/reply.js @@ -1,8 +1,30 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') + module.exports = (sequelize, DataTypes) => { - const Reply = sequelize.define('Reply', { - }, {}); - Reply.associate = function(models) { + class Reply extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + Reply.belongsTo(models.Tweet, { foreignKey: 'tweetId' }) + Reply.belongsTo(models.User, { foreignKey: 'userId' }) + } }; - return Reply; -}; \ No newline at end of file + Reply.init({ + tweetId: DataTypes.INTEGER, + userId: DataTypes.INTEGER, + comment: DataTypes.TEXT + }, { + sequelize, + modelName: 'Reply', + tableName: 'Replies', + underscored: true + }) + return Reply +} diff --git a/models/tweet.js b/models/tweet.js index a8b660077..7eb0803db 100644 --- a/models/tweet.js +++ b/models/tweet.js @@ -1,8 +1,30 @@ -'use strict'; +'use strict' +const { + Model +} = require('sequelize') + module.exports = (sequelize, DataTypes) => { - const Tweet = sequelize.define('Tweet', { - }, {}); - Tweet.associate = function(models) { + class Tweet extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate (models) { + // define association here + Tweet.hasMany(models.Reply, { foreignKey: 'tweetId' }) + Tweet.hasMany(models.Like, { foreignKey: 'tweetId' }) + Tweet.belongsTo(models.User, { foreignKey: 'userId' }) + } }; - return Tweet; -}; \ No newline at end of file + Tweet.init({ + userId: DataTypes.INTEGER, + description: DataTypes.TEXT + }, { + sequelize, + modelName: 'Tweet', + tableName: 'Tweets', + underscored: true + }) + return Tweet +} diff --git a/package-lock.json b/package-lock.json index 0307072c0..fcde41c6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3183 +1,103 @@ { "name": "test", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "test", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "bcrypt-nodejs": "0.0.3", - "body-parser": "^1.18.3", - "chai": "^4.2.0", - "connect-flash": "^0.1.1", - "express": "^4.16.4", - "express-handlebars": "^3.0.0", - "express-session": "^1.15.6", - "faker": "^4.1.0", - "method-override": "^3.0.0", - "mocha": "^6.0.2", - "mysql2": "^1.6.4", - "passport": "^0.4.0", - "passport-local": "^1.0.0", - "sequelize": "^6.18.0", - "sequelize-cli": "^5.5.0", - "sinon": "^10.0.0", - "sinon-chai": "^3.3.0" - }, - "devDependencies": { - "proxyquire": "^2.1.3", - "sequelize-test-helpers": "^1.4.2", - "supertest": "^3.3.0" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" - }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/node": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", - "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" - }, - "node_modules/@types/validator": { - "version": "13.7.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.2.tgz", - "integrity": "sha512-KFcchQ3h0OPQgFirBRPZr5F/sVjxZsOrQHedj3zi8AH3Zv/hOLx2OLR4hxR5HcfoU+33n69ZuOfzthKVdMoTiw==" - }, - "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==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "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/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-nodejs": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", - "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=", - "deprecated": "bcrypt-nodejs is no longer actively maintained. Please use bcrypt or bcryptjs. See https://github.com/kelektiv/node.bcrypt.js/wiki/bcrypt-vs-brypt.js to learn more about these two options" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.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==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "engines": { - "node": "*" - } - }, - "node_modules/cli-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", - "dependencies": { - "ansi-regex": "^2.1.1", - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.5" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "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.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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==" - }, - "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/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/connect-flash": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", - "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "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=" - }, - "node_modules/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" - }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "bin": { - "editorconfig": "bin/editorconfig" - } - }, - "node_modules/editorconfig/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==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/editorconfig/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "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==", - "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/es5-ext": { - "version": "0.10.60", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", - "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "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.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "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-handlebars": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", - "integrity": "sha512-7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZYdIiha2JqwiaG6o2Wu6NZJQ0u7Fg==", - "dependencies": { - "glob": "^7.1.3", - "graceful-fs": "^4.1.2", - "handlebars": "^4.1.2", - "object.assign": "^4.1.0", - "promise": "^8.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dependencies": { - "type": "^2.5.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" - }, - "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/faker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", - "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" - }, - "node_modules/fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "dependencies": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.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==", - "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/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "dev": true, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dependencies": { - "is-property": "^1.0.2" - } - }, - "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==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "engines": { - "node": "*" - } - }, - "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==", - "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-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.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==", - "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=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflection": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz", - "integrity": "sha512-cmZlljCRTBFouT8UzMzrGcVEvkv6D/wBdcdKG7J1QH5cXjtU75Dm+P27v9EKu/Y43UYyCJd1WC4zLebRrC8NBw==", - "engines": [ - "node >= 0.4.0" - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.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==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/js-beautify": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.3.tgz", - "integrity": "sha512-f1ra8PHtOEu/70EBnmiUlV8nJePS58y9qKjl4JHfYWlFH6bo7ogZBz//FAZp7jDuXtYnGYKymZPlrg2I/9Zo4g==", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "nopt": "^5.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dependencies": { - "get-func-name": "^2.0.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==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "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=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "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=" - }, - "node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "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.)", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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": "*" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/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==" - }, - "node_modules/mocha/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", - "dependencies": { - "moment": ">= 2.9.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/mysql2": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.7.0.tgz", - "integrity": "sha512-xTWWQPjP5rcrceZQ7CSTKR/4XIDeH/cRkNH/uzvVGQ7W5c7EJ0dXeJUusk7OKhIoHj7uFKUxDVSCfLIl+jluog==", - "dependencies": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.5.0", - "long": "^4.0.0", - "lru-cache": "^5.1.1", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.1" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "dependencies": { - "lru-cache": "^4.1.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/named-placeholders/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==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/named-placeholders/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "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==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/nise": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "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.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "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==", - "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=", - "dependencies": { - "wrappy": "1" - } - }, - "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==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "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=" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, - "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": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxyquire": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", - "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", - "dev": true, - "dependencies": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/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/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "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==" - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/retry-as-promised": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", - "integrity": "sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==" - }, - "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==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "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.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" - }, - "node_modules/sequelize": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.19.0.tgz", - "integrity": "sha512-B3oGIdpYBERDjRDm74h7Ky67f6ZLcmBXOA7HscYObiOSo4pD7VBc9mtm44wNV7unc0uk8I1d30nbZBTQCE377A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], - "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", - "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.34", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^5.0.0", - "semver": "^7.3.5", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.7.0", - "wkx": "^0.5.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/sequelize-cli": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.1.tgz", - "integrity": "sha512-ZM4kUZvY3y14y+Rq3cYxGH7YDJz11jWHcN2p2x7rhAIemouu4CEXr5ebw30lzTBtyXV4j2kTO+nUjZOqzG7k+Q==", - "dependencies": { - "bluebird": "^3.5.3", - "cli-color": "^1.4.0", - "fs-extra": "^7.0.1", - "js-beautify": "^1.8.8", - "lodash": "^4.17.5", - "resolve": "^1.5.0", - "umzug": "^2.1.0", - "yargs": "^13.1.0" - }, - "bin": { - "sequelize": "lib/sequelize", - "sequelize-cli": "lib/sequelize" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize-test-helpers": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/sequelize-test-helpers/-/sequelize-test-helpers-1.4.2.tgz", - "integrity": "sha512-v7Yy9DKjzFA/OHLtxvFClgN2CKA9cRwxn9+6ha6xoqUzRngXdsbrmle0KD1onSqnCwVIweWlRTLJxcEl1ueozA==", - "dev": true, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/davesag" - }, - "peerDependencies": { - "chai": ">= 4", - "sinon": ">= 10.0.0" - } - }, - "node_modules/sequelize/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/sequelize/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sequelize/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==" - }, - "node_modules/sequelize/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sequelize/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "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=" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "node_modules/sinon": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-10.0.0.tgz", - "integrity": "sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw==", - "dependencies": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.1", - "diff": "^4.0.2", - "nise": "^4.1.0", - "supports-color": "^7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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=" - }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "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_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.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==", - "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==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/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=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dev": true, - "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/superagent/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/superagent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/supertest": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.4.2.tgz", - "integrity": "sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^3.8.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uglify-js": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", - "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/umzug": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", - "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", - "dependencies": { - "bluebird": "^3.7.2" - }, - "engines": { - "node": ">=6.0.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==", - "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/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "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/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" }, - "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "engines": { - "node": ">= 0.10" + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" } }, - "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==", - "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" + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, - "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=" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dependencies": { - "string-width": "^1.0.2 || 2" + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + } } }, - "node_modules/wkx": { + "@humanwhocodes/config-array": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "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==", - "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.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/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==", - "dependencies": { - "ansi-regex": "^4.1.0" + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -3217,6 +137,11 @@ "@types/ms": "*" } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -3246,6 +171,27 @@ "negotiator": "0.6.3" } }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -3272,11 +218,330 @@ "sprintf-js": "~1.0.2" } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "dependencies": { + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -3287,12 +552,22 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3355,6 +630,11 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3534,6 +814,26 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -3564,6 +864,11 @@ "type-detect": "^4.0.0" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -3599,6 +904,14 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, "dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", @@ -3646,6 +959,43 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "requires": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", @@ -3673,71 +1023,517 @@ "unbox-primitive": "^1.0.1" } }, - "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==", + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.60", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", + "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "eslint-config-standard": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", + "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==" + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } } }, - "es5-ext": { - "version": "0.10.60", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", - "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } + "eslint-plugin-promise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==" }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3909,6 +1705,29 @@ "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -3959,6 +1778,28 @@ "is-buffer": "~2.0.3" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -4006,6 +1847,27 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -4056,6 +1918,51 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -4104,6 +2011,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4122,6 +2034,11 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -4149,6 +2066,25 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, "inflection": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz", @@ -4188,6 +2124,34 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4231,11 +2195,24 @@ "has-tostringtag": "^1.0.0" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4298,6 +2275,14 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "requires": { + "which-typed-array": "^1.1.11" + } + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4328,6 +2313,11 @@ "nopt": "^5.0.0" } }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -4337,6 +2327,29 @@ "esprima": "^4.0.0" } }, + "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==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -4350,6 +2363,26 @@ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -4369,6 +2402,16 @@ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -4646,6 +2689,11 @@ } } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -4705,6 +2753,17 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -4736,6 +2795,142 @@ "es-abstract": "^1.19.1" } }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4757,6 +2952,19 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4778,6 +2986,23 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4815,6 +3040,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -4825,6 +3055,14 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -4835,10 +3073,68 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, - "pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "process-nextick-args": { "version": "2.0.1", @@ -4846,6 +3142,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -4884,6 +3185,11 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -4913,6 +3219,65 @@ "unpipe": "1.0.0" } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4936,11 +3301,42 @@ } } }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "dependencies": { + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + } + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -4956,16 +3352,81 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, "retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", "integrity": "sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==" }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "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==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5121,8 +3582,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/sequelize-test-helpers/-/sequelize-test-helpers-1.4.2.tgz", "integrity": "sha512-v7Yy9DKjzFA/OHLtxvFClgN2CKA9cRwxn9+6ha6xoqUzRngXdsbrmle0KD1onSqnCwVIweWlRTLJxcEl1ueozA==", - "dev": true, - "requires": {} + "dev": true }, "serve-static": { "version": "1.14.2", @@ -5145,6 +3605,19 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5196,14 +3669,79 @@ "sinon-chai": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "requires": {} + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==" + } + } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5219,23 +3757,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "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" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -5245,6 +3766,142 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -5263,6 +3920,23 @@ "define-properties": "^1.1.3" } }, + "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -5278,6 +3952,11 @@ } } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -5341,6 +4020,74 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==" + }, + "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==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -5360,16 +4107,40 @@ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -5379,6 +4150,62 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + } + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "uglify-js": { "version": "3.15.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", @@ -5422,6 +4249,14 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5438,6 +4273,20 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -5473,6 +4322,18 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", diff --git a/package.json b/package.json index e85b8c07c..8beb8b1d3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,11 @@ "body-parser": "^1.18.3", "chai": "^4.2.0", "connect-flash": "^0.1.1", + "eslint": "^7.32.0", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", "express": "^4.16.4", "express-handlebars": "^3.0.0", "express-session": "^1.15.6", diff --git a/test/models/Reply.spec.js b/test/models/Reply.spec.js index 33c1ba044..f85aa0fc9 100644 --- a/test/models/Reply.spec.js +++ b/test/models/Reply.spec.js @@ -1,7 +1,7 @@ -const chai = require('chai'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -chai.use(require('sinon-chai')); +const chai = require('chai') +const sinon = require('sinon') +const proxyquire = require('proxyquire') +chai.use(require('sinon-chai')) const { expect } = require('chai') const { @@ -37,13 +37,13 @@ describe('# Reply Model', () => { it('called Reply.init with the correct parameters', () => { expect(Reply.init).to.have.been.calledWithMatch( { - comment: DataTypes.TEXT, - }, + comment: DataTypes.TEXT + } ) }) }) - // 檢查 reply 的關聯是否正確 + // 檢查 reply 的關聯是否正確 context('associations', () => { const User = 'User' const Tweet = 'Tweet' @@ -53,12 +53,12 @@ describe('# Reply Model', () => { Reply.associate({ Tweet }) }) - it('should belong to user', (done) => { + it('should belong to user', done => { // 檢查是否有呼叫 belongsTo(User) expect(Reply.belongsTo).to.have.been.calledWith(User) done() }) - it('should belong to tweet', (done) => { + it('should belong to tweet', done => { // 檢查是否有呼叫 belongsTo(Tweet) expect(Reply.belongsTo).to.have.been.calledWith(Tweet) done() @@ -66,40 +66,38 @@ describe('# Reply Model', () => { }) // 檢查 model 的新增、修改、刪除、更新 context('action', () => { - let data = null // 檢查 db.Reply 是否真的可以新增一筆資料 - it('create', (done) => { - db.Reply.create({}).then((reply) => { + it('create', done => { + db.Reply.create({}).then(reply => { data = reply done() }) }) // 檢查 db.Reply 是否真的可以讀取一筆資料 - it('read', (done) => { - db.Reply.findByPk(data.id).then((reply) => { + it('read', done => { + db.Reply.findByPk(data.id).then(reply => { expect(data.id).to.be.equal(reply.id) - done() - }) + done() + }) }) // 檢查 db.Reply 是否真的可以更新一筆資料 - it('update', (done) => { - db.Reply.update({}, { where: { id: data.id }}).then(() => { - db.Reply.findByPk(data.id).then((reply) => { - expect(data.updatedAt).to.be.not.equal(reply.updatedAt) + it('update', done => { + db.Reply.update({}, { where: { id: data.id } }).then(() => { + db.Reply.findByPk(data.id).then(reply => { + expect(data.updatedAt).to.be.not.equal(reply.updatedAt) done() }) }) }) // 檢查 db.Reply 是否真的可以刪除一筆資料 - it('delete', (done) => { - db.Reply.destroy({ where: { id: data.id }}).then(() => { - db.Reply.findByPk(data.id).then((reply) => { - expect(reply).to.be.equal(null) + it('delete', done => { + db.Reply.destroy({ where: { id: data.id } }).then(() => { + db.Reply.findByPk(data.id).then(reply => { + expect(reply).to.be.equal(null) done() }) }) }) }) - }) From f5b93e38110c46b0f3d3fba00727b82dc4324282 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 01:07:07 +0800 Subject: [PATCH 004/153] feat: add account and cover in Users column --- ...30822170021-add-account-and-cover-to-user.js | 17 +++++++++++++++++ models/user.js | 1 + 2 files changed, 18 insertions(+) create mode 100644 migrations/20230822170021-add-account-and-cover-to-user.js diff --git a/migrations/20230822170021-add-account-and-cover-to-user.js b/migrations/20230822170021-add-account-and-cover-to-user.js new file mode 100644 index 000000000..9d200fbd1 --- /dev/null +++ b/migrations/20230822170021-add-account-and-cover-to-user.js @@ -0,0 +1,17 @@ +'use strict' + +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.addColumn('Users', 'account', { + type: Sequelize.STRING + }) + await queryInterface.addColumn('Users', 'cover', { + type: Sequelize.STRING + }) + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.removeColumn('Users', 'account') + await queryInterface.removeColumn('Users', 'cover') + } +} diff --git a/models/user.js b/models/user.js index bd0ccc976..e7f65eb1d 100644 --- a/models/user.js +++ b/models/user.js @@ -27,6 +27,7 @@ module.exports = (sequelize, DataTypes) => { } }; User.init({ + account: DataTypes.STRING, name: DataTypes.STRING, email: DataTypes.STRING, password: DataTypes.STRING, From 65b24cbd4e318a80a334ed4ce47c2a8385c7749c Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 01:36:14 +0800 Subject: [PATCH 005/153] feat: add admin seed file fix: add role in admin seed file fix: delete admin only when admin seed reverted --- package-lock.json | 5 +++++ package.json | 1 + seeders/20230822160608-admin-seed-file.js | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 seeders/20230822160608-admin-seed-file.js diff --git a/package-lock.json b/package-lock.json index fcde41c6a..7f02f1324 100644 --- a/package-lock.json +++ b/package-lock.json @@ -578,6 +578,11 @@ "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", diff --git a/package.json b/package.json index 8beb8b1d3..4249487c6 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "license": "ISC", "dependencies": { "bcrypt-nodejs": "0.0.3", + "bcryptjs": "^2.4.3", "body-parser": "^1.18.3", "chai": "^4.2.0", "connect-flash": "^0.1.1", diff --git a/seeders/20230822160608-admin-seed-file.js b/seeders/20230822160608-admin-seed-file.js new file mode 100644 index 000000000..2ea9c6e65 --- /dev/null +++ b/seeders/20230822160608-admin-seed-file.js @@ -0,0 +1,19 @@ +'use strict' +const bcrypt = require('bcryptjs') +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.bulkInsert('Users', [{ + account: 'root', + name: 'root', + email: 'root@example.com', + password: await bcrypt.hash('12345678', 10), + role: 'admin', + created_at: new Date(), + updated_at: new Date() + }], {}) + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.bulkDelete('Users', { role: 'admin' }) + } +} From 843969b416ce35c26b2207367d42de76dc8beed8 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 10:14:01 +0800 Subject: [PATCH 006/153] feat: add user seed file --- seeders/20230823013207-users-seed-file.js | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 seeders/20230823013207-users-seed-file.js diff --git a/seeders/20230823013207-users-seed-file.js b/seeders/20230823013207-users-seed-file.js new file mode 100644 index 000000000..18b47ab75 --- /dev/null +++ b/seeders/20230823013207-users-seed-file.js @@ -0,0 +1,51 @@ +'use strict' +const bcrypt = require('bcryptjs') +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.bulkInsert('Users', [{ + account: 'user1', + name: 'user1', + email: 'user1@example.com', + password: await bcrypt.hash('12345678', 10), + role: 'user', + created_at: new Date(), + updated_at: new Date() + }, { + account: 'user2', + name: 'user2', + email: 'user2@example.com', + password: await bcrypt.hash('12345678', 10), + role: 'user', + created_at: new Date(), + updated_at: new Date() + }, { + account: 'user3', + name: 'user3', + email: 'user3@example.com', + password: await bcrypt.hash('12345678', 10), + role: 'user', + created_at: new Date(), + updated_at: new Date() + }, { + account: 'user4', + name: 'user4', + email: 'user4@example.com', + password: await bcrypt.hash('12345678', 10), + role: 'user', + created_at: new Date(), + updated_at: new Date() + }, { + account: 'user5', + name: 'user5', + email: 'user5@example.com', + role: 'user', + password: await bcrypt.hash('12345678', 10), + created_at: new Date(), + updated_at: new Date() + }], {}) + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.bulkDelete('Users', { role: 'user' }) + } +} From 57464692b86ff4f9f0d07add1d71f4db54c447da Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Wed, 23 Aug 2023 10:22:53 +0800 Subject: [PATCH 007/153] refactor: notation --- migrations/20190115071421-create-user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/migrations/20190115071421-create-user.js b/migrations/20190115071421-create-user.js index 8e51d4a7a..6c30c1abd 100644 --- a/migrations/20190115071421-create-user.js +++ b/migrations/20190115071421-create-user.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Users', { @@ -34,9 +34,9 @@ module.exports = { allowNull: false, type: Sequelize.DATE } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Users'); + return queryInterface.dropTable('Users') } -}; \ No newline at end of file +} From 3fc5f18a18f59618b383e5838ac549d538867ea4 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 10:53:07 +0800 Subject: [PATCH 008/153] feat: add tweet seed file --- seeders/20230823021854-tweets-seed-file.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 seeders/20230823021854-tweets-seed-file.js diff --git a/seeders/20230823021854-tweets-seed-file.js b/seeders/20230823021854-tweets-seed-file.js new file mode 100644 index 000000000..7fb77822c --- /dev/null +++ b/seeders/20230823021854-tweets-seed-file.js @@ -0,0 +1,22 @@ +'use strict' +const faker = require('faker') +module.exports = { + up: async (queryInterface, Sequelize) => { + const users = await queryInterface.sequelize.query( + "SELECT id FROM Users WHERE role='user';", + { type: queryInterface.sequelize.QueryTypes.SELECT } + ) + await queryInterface.bulkInsert('Tweets', + Array.from({ length: users.length * 10 }, (_, i) => ({ + description: faker.lorem.text().substring(0, 140), + created_at: new Date(), + updated_at: new Date(), + user_id: users[i % users.length].id + })) + ) + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.bulkDelete('Tweets', {}) + } +} From 3a0952a6156b96459adf37a521d78fd95524cc30 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 11:08:13 +0800 Subject: [PATCH 009/153] feat: add reply seed file --- seeders/20230823025452-replies-seed-file.js | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 seeders/20230823025452-replies-seed-file.js diff --git a/seeders/20230823025452-replies-seed-file.js b/seeders/20230823025452-replies-seed-file.js new file mode 100644 index 000000000..fd82562e1 --- /dev/null +++ b/seeders/20230823025452-replies-seed-file.js @@ -0,0 +1,27 @@ +'use strict' +const faker = require('faker') +module.exports = { + up: async (queryInterface, Sequelize) => { + const users = await queryInterface.sequelize.query( + "SELECT id FROM Users WHERE role='user';", + { type: queryInterface.sequelize.QueryTypes.SELECT } + ) + const tweets = await queryInterface.sequelize.query( + 'SELECT id FROM Tweets;', + { type: queryInterface.sequelize.QueryTypes.SELECT } + ) + await queryInterface.bulkInsert('Replies', + Array.from({ length: tweets.length * 3 }, (_, i) => ({ + comment: faker.lorem.text().substring(0, 50), + created_at: new Date(), + updated_at: new Date(), + user_id: users[Math.floor(Math.random() * users.length)].id, + tweet_id: tweets[i % tweets.length].id + })) + ) + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.bulkDelete('Replies', {}) + } +} From 6dadd597a5c0b8fc1d6027c0723f7d26086f52ef Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Wed, 23 Aug 2023 11:26:02 +0800 Subject: [PATCH 010/153] init: routes&controllers --- app.js | 14 ++++++++++---- controllers/admin-controller.js | 7 +++++++ controllers/reply-controller.js | 7 +++++++ controllers/tweet-controller.js | 7 +++++++ controllers/user-controller.js | 7 +++++++ routes/index.js | 16 ++++++++++++++++ routes/modules/admin.js | 8 ++++++++ 7 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 controllers/admin-controller.js create mode 100644 controllers/reply-controller.js create mode 100644 controllers/tweet-controller.js create mode 100644 controllers/user-controller.js create mode 100644 routes/index.js create mode 100644 routes/modules/admin.js diff --git a/app.js b/app.js index 80ee0bbf8..3797913a6 100644 --- a/app.js +++ b/app.js @@ -1,13 +1,19 @@ const express = require('express') -const helpers = require('./_helpers'); +const routes = require('./routes') + +const helpers = require('./_helpers') const app = express() -const port = 3000 +const port = process.env.PORT || 3000 // use helpers.getUser(req) to replace req.user // use helpers.ensureAuthenticated(req) to replace req.isAuthenticated() -app.get('/', (req, res) => res.send('Hello World!')) -app.listen(port, () => console.log(`Example app listening on port ${port}!`)) +app.use(routes) + + +app.listen(port, () => { + console.info(`Example app listening on port ${port}!`) +}) module.exports = app diff --git a/controllers/admin-controller.js b/controllers/admin-controller.js new file mode 100644 index 000000000..c3b128dca --- /dev/null +++ b/controllers/admin-controller.js @@ -0,0 +1,7 @@ +const { } = require('../models') + +const adminController = { +// add controller action here +} + +module.exports = adminController diff --git a/controllers/reply-controller.js b/controllers/reply-controller.js new file mode 100644 index 000000000..686646e35 --- /dev/null +++ b/controllers/reply-controller.js @@ -0,0 +1,7 @@ +const { } = require('../models') + +const replyController = { +// add controller action here +} + +module.exports = replyController diff --git a/controllers/tweet-controller.js b/controllers/tweet-controller.js new file mode 100644 index 000000000..a32ebd72e --- /dev/null +++ b/controllers/tweet-controller.js @@ -0,0 +1,7 @@ +const { } = require('../models') + +const tweetController = { +// add controller action here +} + +module.exports = tweetController diff --git a/controllers/user-controller.js b/controllers/user-controller.js new file mode 100644 index 000000000..6808faf40 --- /dev/null +++ b/controllers/user-controller.js @@ -0,0 +1,7 @@ +const { } = require('../models') + +const userController = { +// add controller action here +} + +module.exports = userController diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 000000000..c42dfe7b1 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,16 @@ +const express = require('express') +const router = express.Router() + +const admin = require('./modules/admin') +const tweetController = require('../controllers/tweet-controller') +const userController = require('../controllers/user-controller') +const replyController = require('../controllers/reply-controller') + +router.use('/admin', admin) + +router.get('/', (req, res) => res.send('Hello World!')) +// add routes here + +router.use('/', (req, res) => res.redirect('/tweets')) + +module.exports = router diff --git a/routes/modules/admin.js b/routes/modules/admin.js new file mode 100644 index 000000000..37e0755df --- /dev/null +++ b/routes/modules/admin.js @@ -0,0 +1,8 @@ +const express = require('express') +const router = express.Router() +const adminController = require('../../controllers/admin-controller') + +// add routes here +router.use('', (req, res) => res.redirect('/admin/tweets')) + +module.exports = router From 56f356a0ebe7e307bd99b868dc6a5beb504c2d36 Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Wed, 23 Aug 2023 13:36:39 +0800 Subject: [PATCH 011/153] setting_app.js --- app.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 3797913a6..9ecce42cb 100644 --- a/app.js +++ b/app.js @@ -1,17 +1,22 @@ const express = require('express') const routes = require('./routes') - +const handlebars = require('express-handlebars') +const flash = require('connect-flash') const helpers = require('./_helpers') - +const methodOverride = require('method-override') const app = express() const port = process.env.PORT || 3000 +app.engine('hbs', handlebars({ extname: '.hbs' })) +app.set('view engine', 'hbs') +app.use(express.urlencoded({ extended: true })) +app.use(flash()) +app.use(methodOverride('_method')) // use helpers.getUser(req) to replace req.user // use helpers.ensureAuthenticated(req) to replace req.isAuthenticated() app.use(routes) - app.listen(port, () => { console.info(`Example app listening on port ${port}!`) }) From d532831caddcadc7d3d6d660cf9147a11e1daba1 Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Wed, 23 Aug 2023 13:52:30 +0800 Subject: [PATCH 012/153] feature: finish hbs setting --- app.js | 2 +- controllers/tweet-controller.js | 6 +++++- routes/index.js | 4 +++- views/layouts/main.hbs | 21 +++++++++++++++++++++ views/tweets.hbs | 11 +++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 views/layouts/main.hbs create mode 100644 views/tweets.hbs diff --git a/app.js b/app.js index 9ecce42cb..13476078f 100644 --- a/app.js +++ b/app.js @@ -2,7 +2,7 @@ const express = require('express') const routes = require('./routes') const handlebars = require('express-handlebars') const flash = require('connect-flash') -const helpers = require('./_helpers') +// const helpers = require('./_helpers') const methodOverride = require('method-override') const app = express() const port = process.env.PORT || 3000 diff --git a/controllers/tweet-controller.js b/controllers/tweet-controller.js index a32ebd72e..0ab0412fa 100644 --- a/controllers/tweet-controller.js +++ b/controllers/tweet-controller.js @@ -1,7 +1,11 @@ -const { } = require('../models') +const { Tweet } = require('../models') const tweetController = { // add controller action here + getTweets: (req, res, next) => { + Tweet.findAll({ raw: true }) + .then(tweet => res.render('tweets', { tweet })) + } } module.exports = tweetController diff --git a/routes/index.js b/routes/index.js index c42dfe7b1..1a982d945 100644 --- a/routes/index.js +++ b/routes/index.js @@ -6,10 +6,12 @@ const tweetController = require('../controllers/tweet-controller') const userController = require('../controllers/user-controller') const replyController = require('../controllers/reply-controller') +// test +router.get('/tweets', tweetController.getTweets) + router.use('/admin', admin) router.get('/', (req, res) => res.send('Hello World!')) -// add routes here router.use('/', (req, res) => res.redirect('/tweets')) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs new file mode 100644 index 000000000..99a042903 --- /dev/null +++ b/views/layouts/main.hbs @@ -0,0 +1,21 @@ + + + + + + + Twitter + + + + + + {{{body}}} + + + + + \ No newline at end of file diff --git a/views/tweets.hbs b/views/tweets.hbs new file mode 100644 index 000000000..8b9ca08d1 --- /dev/null +++ b/views/tweets.hbs @@ -0,0 +1,11 @@ +
+
首頁
+
test
+
+
+ +

有什麼新鮮事?

+
+ 推文 +
+
\ No newline at end of file From 6832746387773599d67fc04977c18a6d28d009db Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 16:27:58 +0800 Subject: [PATCH 013/153] feat: add auth middleware and helper and add passport --- _helpers.js | 12 ------------ app.js | 18 ++++++++++++++++-- config/passport.js | 39 +++++++++++++++++++++++++++++++++++++++ helpers/auth-helpers.js | 12 ++++++++++++ middleware/auth.js | 16 ++++++++++++++++ package-lock.json | 6 ++++++ package.json | 1 + 7 files changed, 90 insertions(+), 14 deletions(-) delete mode 100644 _helpers.js create mode 100644 config/passport.js create mode 100644 helpers/auth-helpers.js create mode 100644 middleware/auth.js diff --git a/_helpers.js b/_helpers.js deleted file mode 100644 index 798e53258..000000000 --- a/_helpers.js +++ /dev/null @@ -1,12 +0,0 @@ -function ensureAuthenticated(req) { - return req.isAuthenticated(); -} - -function getUser(req) { - return req.user; -} - -module.exports = { - ensureAuthenticated, - getUser, -}; \ No newline at end of file diff --git a/app.js b/app.js index 13476078f..07e729e73 100644 --- a/app.js +++ b/app.js @@ -2,8 +2,14 @@ const express = require('express') const routes = require('./routes') const handlebars = require('express-handlebars') const flash = require('connect-flash') -// const helpers = require('./_helpers') const methodOverride = require('method-override') +const session = require('express-session') +const passport = require('./config/passport') +const { getUser } = require('./helpers/auth-helpers') +if (process.env.NODE_ENV !== 'production') { + require('dotenv').config() +} + const app = express() const port = process.env.PORT || 3000 @@ -12,9 +18,17 @@ app.set('view engine', 'hbs') app.use(express.urlencoded({ extended: true })) app.use(flash()) app.use(methodOverride('_method')) +app.use(session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false })) +app.use(passport.initialize()) +app.use(passport.session()) // use helpers.getUser(req) to replace req.user // use helpers.ensureAuthenticated(req) to replace req.isAuthenticated() - +app.use((req, res, next) => { + res.locals.success_messages = req.flash('success_messages') + res.locals.error_messages = req.flash('error_messages') + res.locals.user = getUser(req) + next() +}) app.use(routes) app.listen(port, () => { diff --git a/config/passport.js b/config/passport.js new file mode 100644 index 000000000..101f6b3df --- /dev/null +++ b/config/passport.js @@ -0,0 +1,39 @@ +const passport = require('passport') +const LocalStrategy = require('passport-local') +const bcrypt = require('bcryptjs') +const { User } = require('../models') +// set up Passport strategy +passport.use(new LocalStrategy( + // customize user field + { + usernameField: 'account', + passwordField: 'password', + passReqToCallback: true + }, + // authenticate user + (req, account, password, cb) => { + User.findOne({ where: { account } }) + .then(user => { + if (!user) return cb(null, false, req.flash('error_messages', '帳號或密碼輸入錯誤!')) + bcrypt.compare(password, user.password).then(res => { + if (!res) return cb(null, false, req.flash('error_messages', '帳號或密碼輸入錯誤!')) + return cb(null, user) + }) + }) + } +)) +// serialize and deserialize user +passport.serializeUser((user, cb) => { + cb(null, user.id) +}) +passport.deserializeUser((id, cb) => { + return User.findByPk(id, { + include: [ + { model: User, as: 'Followers' }, + { model: User, as: 'Followings' } + ] + }) + .then(user => cb(null, user.toJSON())) + .catch(err => cb(err)) +}) +module.exports = passport diff --git a/helpers/auth-helpers.js b/helpers/auth-helpers.js new file mode 100644 index 000000000..c55da8c5f --- /dev/null +++ b/helpers/auth-helpers.js @@ -0,0 +1,12 @@ +function ensureAuthenticated (req) { + return req.isAuthenticated() +} + +function getUser (req) { + return req.user || null +} + +module.exports = { + ensureAuthenticated, + getUser +} diff --git a/middleware/auth.js b/middleware/auth.js new file mode 100644 index 000000000..8e382083d --- /dev/null +++ b/middleware/auth.js @@ -0,0 +1,16 @@ +const helpers = require('../helpers/auth-helpers') +const authenticated = (req, res, next) => { + if (helpers.ensureAuthenticated(req)) return next() + res.redirect('/signin') +} +const authenticatedAdmin = (req, res, next) => { + if (helpers.ensureAuthenticated(req)) { + if (helpers.getUser(req).role === 'admin') return next() + res.redirect('/admin/signin') + } + res.redirect('/admin/signin') +} +module.exports = { + authenticated, + authenticatedAdmin +} diff --git a/package-lock.json b/package-lock.json index 7f02f1324..b590d422e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -917,6 +917,12 @@ "esutils": "^2.0.2" } }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true + }, "dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", diff --git a/package.json b/package.json index 4249487c6..bfdf0f7c3 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "sinon-chai": "^3.3.0" }, "devDependencies": { + "dotenv": "^16.3.1", "proxyquire": "^2.1.3", "sequelize-test-helpers": "^1.4.2", "supertest": "^3.3.0" From 782c3cc6396fa133704639e210861c9419d4eea4 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Wed, 23 Aug 2023 18:19:33 +0800 Subject: [PATCH 014/153] feat: complete login MVC and add error handler --- _helpers.js | 12 ++++ controllers/login-controller.js | 44 ++++++++++++++ middleware/error-handler.js | 11 ++++ models/index.js | 2 +- routes/index.js | 20 +++--- test/requests/login.spec.js | 104 +++++++++++++++----------------- views/layouts/main.hbs | 11 +++- views/logins/signin.hbs | 20 ++++++ views/logins/signup.hbs | 30 +++++++++ views/partials/messages.hbs | 18 ++++++ 10 files changed, 206 insertions(+), 66 deletions(-) create mode 100644 _helpers.js create mode 100644 controllers/login-controller.js create mode 100644 middleware/error-handler.js create mode 100644 views/logins/signin.hbs create mode 100644 views/logins/signup.hbs create mode 100644 views/partials/messages.hbs diff --git a/_helpers.js b/_helpers.js new file mode 100644 index 000000000..c55da8c5f --- /dev/null +++ b/_helpers.js @@ -0,0 +1,12 @@ +function ensureAuthenticated (req) { + return req.isAuthenticated() +} + +function getUser (req) { + return req.user || null +} + +module.exports = { + ensureAuthenticated, + getUser +} diff --git a/controllers/login-controller.js b/controllers/login-controller.js new file mode 100644 index 000000000..386bcd1ee --- /dev/null +++ b/controllers/login-controller.js @@ -0,0 +1,44 @@ +const { User } = require('../models') +const bcrypt = require('bcryptjs') +const loginController = { + signUpPage: (req, res) => { + return res.render('logins/signup') + }, + signUp: (req, res, next) => { + if (req.body.password !== req.body.passwordCheck) throw new Error('Passwords do not match!') + + return Promise.all([User.findOne({ where: { email: req.body.email } }), User.findOne({ where: { account: req.body.account } })]) + .then(([sameEmailUser, sameAccountUser]) => { + if (sameEmailUser) throw new Error('Email already exists!') + if (sameAccountUser) throw new Error('Account already exists!') + if (req.body.name.length > 50) throw new Error('Name length should be equal or less than 50!') + return bcrypt.hash(req.body.password, 10) + }) + .then(hash => User.create({ + account: req.body.account, + name: req.body.name, + email: req.body.email, + password: hash, + role: 'user' + })) + .then(() => { + req.flash('success_messages', '成功註冊帳號!') + return res.redirect('/signin') + }) + .catch(err => next(err)) + }, + signInPage: (req, res) => { + return res.render('logins/signin') + }, + signIn: (req, res) => { + req.flash('success_messages', '成功登入!') + return res.redirect('/tweets') + }, + logout: (req, res) => { + req.flash('success_messages', '登出成功!') + req.logout() + return res.redirect('/signin') + } +} + +module.exports = loginController diff --git a/middleware/error-handler.js b/middleware/error-handler.js new file mode 100644 index 000000000..9fd563715 --- /dev/null +++ b/middleware/error-handler.js @@ -0,0 +1,11 @@ +module.exports = { + generalErrorHandler (err, req, res, next) { + if (err instanceof Error) { + req.flash('error_messages', `${err.name}: ${err.message}`) + } else { + req.flash('error_messages', `${err}`) + } + res.redirect('back') + next(err) + } +} diff --git a/models/index.js b/models/index.js index e92dffac8..427848cb0 100644 --- a/models/index.js +++ b/models/index.js @@ -5,7 +5,7 @@ const path = require('path') const Sequelize = require('sequelize') const basename = path.basename(__filename) const env = process.env.NODE_ENV || 'development' -const config = require(__dirname + '/../config/config.json')[env] +const config = require(path.resolve(__dirname, '../config/config.json'))[env] const db = {} let sequelize diff --git a/routes/index.js b/routes/index.js index 1a982d945..95ff51e5c 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,18 +1,22 @@ const express = require('express') const router = express.Router() - +const passport = require('../config/passport') +const { authenticated, authenticatedAdmin } = require('../middleware/auth') +const { generalErrorHandler } = require('../middleware/error-handler') const admin = require('./modules/admin') const tweetController = require('../controllers/tweet-controller') const userController = require('../controllers/user-controller') const replyController = require('../controllers/reply-controller') - -// test -router.get('/tweets', tweetController.getTweets) +const loginController = require('../controllers/login-controller') router.use('/admin', admin) - -router.get('/', (req, res) => res.send('Hello World!')) - -router.use('/', (req, res) => res.redirect('/tweets')) +router.get('/tweets', authenticated, tweetController.getTweets) // test +router.get('/signup', loginController.signUpPage) +router.post('/signup', loginController.signUp) +router.get('/signin', loginController.signInPage) +router.post('/signin', passport.authenticate('local', { failureRedirect: '/signin', failureFlash: true }), loginController.signIn) +router.get('/logout', loginController.logout) +router.get('/', (req, res) => res.redirect('/tweets')) +router.use('/', generalErrorHandler) module.exports = router diff --git a/test/requests/login.spec.js b/test/requests/login.spec.js index dd23175ba..444d515ff 100644 --- a/test/requests/login.spec.js +++ b/test/requests/login.spec.js @@ -1,12 +1,12 @@ const chai = require('chai') const request = require('supertest') const sinon = require('sinon') -const should = chai.should(); -const expect = chai.expect; +const should = chai.should() +const expect = chai.expect const bcrypt = require('bcrypt-nodejs') const app = require('../../app') -const helpers = require('../../_helpers'); +const helpers = require('../../_helpers') const db = require('../../models') // 登入功能檢查測試 @@ -14,28 +14,28 @@ describe('# login request', () => { context('go to login page', () => { // 檢查是否可以透過 POST /signin 登入 describe('if user want to signin', () => { - before(async() => { + before(async () => { // 在測試資料庫中新增 User1 資料 await db.User.create({ - name: 'User1', - email: 'User1', + name: 'User1', + email: 'User1', account: 'User1', - password: bcrypt.hashSync('User1', bcrypt.genSaltSync(10)), + password: bcrypt.hashSync('User1', bcrypt.genSaltSync(10)) }) }) - it('can render index', (done) => { + it('can render index', done => { // 確認可以顯示 GET /signin 的頁面 request(app) .get('/signin') .expect(200) - .end(function(err, res) { - if (err) return done(err); - done(); - }); + .end(function (err, res) { + if (err) return done(err) + done() + }) }) - it('login successfully', (done) => { + it('login successfully', done => { // 送出 request POST /signin request(app) .post('/signin') @@ -43,77 +43,71 @@ describe('# login request', () => { .set('Accept', 'application/json') .expect(302) // 登入成功後,應該要回傳 302 http status code .expect('Location', '/tweets') // 登入成功後,應該要到 /tweets 頁面 - .end(function(err, res) { - if (err) return done(err); - return done(); + .end(function (err, res) { + if (err) return done(err) + return done() }) - }); + }) // 測試: 登入失敗是否會回到 /signin 頁面 - it('login fail', (done) => { - // 送出 request POST /signin + it('login fail', done => { + // 送出 request POST /signin request(app) .post('/signin') .send('') // 沒有帶任何資料 .set('Accept', 'application/json') .expect(302) .expect('Location', '/signin') // 回到登入頁面 - .end(function(err, res) { - if (err) return done(err); - return done(); - }) - }); - + .end(function (err, res) { + if (err) return done(err) + return done() + }) + }) + after(async () => { // 清除測試 db 中的 User 資料 - await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true }); - await db.User.destroy({where: {},truncate: true, force: true}) - await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true }); + await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true }) + await db.User.destroy({ where: {}, truncate: true, force: true }) + await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true }) }) - - }); - - }); + }) + }) context('go to signup page', () => { // 可以前往 signup 頁面 describe('if user want to signup', () => { - it('can render index', (done) => { - // 送出 request GET /signup + it('can render index', done => { + // 送出 request GET /signup request(app) .get('/signup') .expect(200) - .end(function(err, res) { - if (err) return done(err); - done(); - }); + .end(function (err, res) { + if (err) return done(err) + done() + }) }) // 可以順利完成註冊 - it('signup successfully', (done) => { - // 送出 request POST /signup + it('signup successfully', done => { + // 送出 request POST /signup request(app) .post('/signup') .send('account=User1&name=User1&email=User1@example.com&password=User1&checkPassword=User1') // 註冊資料 .set('Accept', 'application/json') .expect(302) .expect('Location', '/signin') // 回到登入頁面 - .end(function(err, res) { - if (err) return done(err); - return done(); - }) - }); + .end(function (err, res) { + if (err) return done(err) + return done() + }) + }) after(async () => { // 清除測試 db 中的 User 資料 - await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true }); - await db.User.destroy({where: {},truncate: true, force: true}) - await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true }); + await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true }) + await db.User.destroy({ where: {}, truncate: true, force: true }) + await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true }) }) - - }); - - }); - - -}); \ No newline at end of file + }) + }) +}) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 99a042903..489600dee 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -10,8 +10,15 @@ integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> - - {{{body}}} + +
+
+
+ {{> messages}} + {{{body}}} +
+
+
+ + \ No newline at end of file From c7e171cf00546e3099877c61eccc82bb0c660c17 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Sun, 27 Aug 2023 01:04:09 +0800 Subject: [PATCH 052/153] fix: conflict bug --- views/tweet.hbs | 3 --- 1 file changed, 3 deletions(-) diff --git a/views/tweet.hbs b/views/tweet.hbs index 6244918f1..d83bcc535 100644 --- a/views/tweet.hbs +++ b/views/tweet.hbs @@ -63,9 +63,6 @@ - -{{/each}} - {{>top-users-bar}} From 7e05a1257a0aaa5e0499d323a9689365218e0843 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Sun, 27 Aug 2023 12:54:42 +0800 Subject: [PATCH 053/153] feat: complete admin users view page --- package.json | 2 +- views/admins/tweets.hbs | 2 +- views/admins/users.hbs | 48 ++++++++++++++++++++++++++++++++++++ views/partials/like-icon.hbs | 5 ++++ views/partials/post-icon.hbs | 5 ++++ 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 views/partials/like-icon.hbs create mode 100644 views/partials/post-icon.hbs diff --git a/package.json b/package.json index 9850902ab..8f257eabd 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "start": "NODE_ENV=development node app.js", - "dev": "cross-env nodemon app.js", + "dev": "nodemon app.js", "test": "mocha test --exit --recursive --timeout 5000" }, "author": "", diff --git a/views/admins/tweets.hbs b/views/admins/tweets.hbs index 0e045c085..a26815ff1 100644 --- a/views/admins/tweets.hbs +++ b/views/admins/tweets.hbs @@ -8,7 +8,7 @@
{{!-- 先用網路圖片代替頭像 --}} - icon + icon
diff --git a/views/admins/users.hbs b/views/admins/users.hbs index 9f3c05906..1c6276706 100644 --- a/views/admins/users.hbs +++ b/views/admins/users.hbs @@ -3,4 +3,52 @@

使用者列表

+
+ {{#each users}} +
+
+
+ cover +
+
+ avatar +
+
+
+
+

{{this.name}}

+ +

@{{this.account}}

+
+
+ +
+
+ + {{>post-icon}} + + + {{this.tweetCount}}30 + +
+
+ + {{>like-icon w=24 h=24}} + + + {{this.likeCount}}10 + +
+
+
+ {{this.followingCount}}20 個跟隨中 + {{this.followerCount}}20 個跟隨者 +
+
+
+ {{/each}} +
\ No newline at end of file diff --git a/views/partials/like-icon.hbs b/views/partials/like-icon.hbs new file mode 100644 index 000000000..03f874c24 --- /dev/null +++ b/views/partials/like-icon.hbs @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/views/partials/post-icon.hbs b/views/partials/post-icon.hbs new file mode 100644 index 000000000..e0bea94fc --- /dev/null +++ b/views/partials/post-icon.hbs @@ -0,0 +1,5 @@ + + + \ No newline at end of file From b4f6f0d9d7c00d60edee3017ef09d2947524cedd Mon Sep 17 00:00:00 2001 From: tingul4 Date: Sun, 27 Aug 2023 15:50:48 +0800 Subject: [PATCH 054/153] feat: complete admin users but not pass test --- controllers/admin-controller.js | 16 ++++++++++++---- helpers/unit-convert-helpers.js | 12 ++++++++++++ models/like.js | 4 ++-- views/admins/users.hbs | 20 ++++++++++---------- 4 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 helpers/unit-convert-helpers.js diff --git a/controllers/admin-controller.js b/controllers/admin-controller.js index de9b5a1b4..6a5caa0c7 100644 --- a/controllers/admin-controller.js +++ b/controllers/admin-controller.js @@ -1,4 +1,5 @@ const { Tweet, User, Like } = require('../models') + const adminController = { signInPage: (req, res) => { res.render('admins/signin') @@ -44,17 +45,24 @@ const adminController = { try { const users = await User.findAll({ include: [ - { model: Like }, - { model: Tweet }, + Like, + Tweet, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ], - raw: true, nest: true }) if (!users) throw new Error('沒有使用者可顯示!') + const userInfos = users.filter(user => user.toJSON().role === 'user').map(user => { + const userInfo = user.toJSON() + userInfo.tweetCount = userInfo.Tweets.length + userInfo.likeCount = userInfo.Likes.length + userInfo.followerCount = userInfo.Followers.length + userInfo.followingCount = userInfo.Followings.length + return userInfo + }) res.render('admins/users', { - users, + userInfos, route: 'users' }) } catch (err) { diff --git a/helpers/unit-convert-helpers.js b/helpers/unit-convert-helpers.js new file mode 100644 index 000000000..fe9cd18b9 --- /dev/null +++ b/helpers/unit-convert-helpers.js @@ -0,0 +1,12 @@ +module.exports = { + unitConvertor: num => { + const sign = { '': 1, k: 1000, m: 1000000, b: 1000000000 } + for (const [key, value] of Object.entries(sign)) { + const dividedNum = num / value + if (dividedNum >= 1 && dividedNum < 1000) { + return dividedNum.toString() + key + } + } + return '0' + } +} diff --git a/models/like.js b/models/like.js index 7693608ac..bcedb711d 100644 --- a/models/like.js +++ b/models/like.js @@ -11,8 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate (models) { // define association here - Like.belongsTo(models.User) - Like.belongsTo(models.Tweet) + Like.belongsTo(models.User, { foreignKey: 'userId' }) + Like.belongsTo(models.Tweet, { foreignKey: 'tweetId' }) } }; Like.init({ diff --git a/views/admins/users.hbs b/views/admins/users.hbs index 1c6276706..e251b6ace 100644 --- a/views/admins/users.hbs +++ b/views/admins/users.hbs @@ -4,7 +4,7 @@

使用者列表

- {{#each users}} + {{#each userInfos}}
@@ -25,27 +25,27 @@
-
-
- +
+
+ {{>post-icon}} - {{this.tweetCount}}30 + {{this.tweetCount}}
-
- +
+ {{>like-icon w=24 h=24}} - {{this.likeCount}}10 + {{this.likeCount}}
- {{this.followingCount}}20 個跟隨中 - {{this.followerCount}}20 個跟隨者 + {{this.followingCount}} 個跟隨中 + {{this.followerCount}} 個跟隨者
From bb09029964519e48f0d6ade2886a9a27b033f716 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Sun, 27 Aug 2023 17:32:34 +0800 Subject: [PATCH 055/153] feat: order by tweetCount and fix delete bug --- controllers/admin-controller.js | 18 ++++++++++-------- views/admins/tweets.hbs | 8 ++++---- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/controllers/admin-controller.js b/controllers/admin-controller.js index 6a5caa0c7..12587157a 100644 --- a/controllers/admin-controller.js +++ b/controllers/admin-controller.js @@ -53,14 +53,16 @@ const adminController = { nest: true }) if (!users) throw new Error('沒有使用者可顯示!') - const userInfos = users.filter(user => user.toJSON().role === 'user').map(user => { - const userInfo = user.toJSON() - userInfo.tweetCount = userInfo.Tweets.length - userInfo.likeCount = userInfo.Likes.length - userInfo.followerCount = userInfo.Followers.length - userInfo.followingCount = userInfo.Followings.length - return userInfo - }) + const userInfos = users.filter(user => user.toJSON().role === 'user') + .map(user => { + const userInfo = user.toJSON() + userInfo.tweetCount = userInfo.Tweets.length + userInfo.likeCount = userInfo.Likes.length + userInfo.followerCount = userInfo.Followers.length + userInfo.followingCount = userInfo.Followings.length + return userInfo + }) + .sort((a, b) => b.tweetCount - a.tweetCount) res.render('admins/users', { userInfos, route: 'users' diff --git a/views/admins/tweets.hbs b/views/admins/tweets.hbs index a26815ff1..5f248ae70 100644 --- a/views/admins/tweets.hbs +++ b/views/admins/tweets.hbs @@ -16,8 +16,8 @@ {{this.User.name}} @{{this.User.account}}・{{relativeTimeFromNow this.createdAt}}
-
-
-
-
diff --git a/views/logins/signup.hbs b/views/logins/signup.hbs index 426a3f8e2..bf6042996 100644 --- a/views/logins/signup.hbs +++ b/views/logins/signup.hbs @@ -18,7 +18,7 @@
- diff --git a/views/partials/personaldata-modal.hbs b/views/partials/personaldata-modal.hbs index 4c9e72d6e..2cc1517ce 100644 --- a/views/partials/personaldata-modal.hbs +++ b/views/partials/personaldata-modal.hbs @@ -1,43 +1,39 @@ \ No newline at end of file From e9f195a64daaef89ddb6d36f038a1ab4b164346d Mon Sep 17 00:00:00 2001 From: tingul4 Date: Sun, 27 Aug 2023 21:02:39 +0800 Subject: [PATCH 057/153] feat: can upload cover and avatar --- .gitignore | 4 +- app.js | 3 - controllers/reply-controller.js | 2 +- controllers/user-controller.js | 39 ++- helpers/file-helpers.js | 33 +++ middleware/multer.js | 3 + package-lock.json | 374 ++++++++++++++++++++++++-- package.json | 2 + routes/modules/api.js | 3 +- views/layouts/main.hbs | 4 +- views/partials/add-photo-icon.hbs | 8 + views/partials/personaldata-modal.hbs | 14 +- views/partials/userpage-info.hbs | 4 +- 13 files changed, 450 insertions(+), 43 deletions(-) create mode 100644 helpers/file-helpers.js create mode 100644 middleware/multer.js create mode 100644 views/partials/add-photo-icon.hbs diff --git a/.gitignore b/.gitignore index 4daff2366..8a947921f 100644 --- a/.gitignore +++ b/.gitignore @@ -84,4 +84,6 @@ typings/ .fusebox/ # DynamoDB Local files -.dynamodb/ \ No newline at end of file +.dynamodb/ + +temp/ \ No newline at end of file diff --git a/app.js b/app.js index f4ea190b7..d5e6113a7 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,3 @@ -if (process.env.NODE_ENV !== 'production') { - require('dotenv').config() -} const express = require('express') const routes = require('./routes') const handlebars = require('express-handlebars') diff --git a/controllers/reply-controller.js b/controllers/reply-controller.js index e2b467977..411bdfd0c 100644 --- a/controllers/reply-controller.js +++ b/controllers/reply-controller.js @@ -1,5 +1,5 @@ const { User, Tweet, Reply, Like } = require('../models') - +const helpers = require('../helpers/auth-helpers') const replyController = { // add controller action here diff --git a/controllers/user-controller.js b/controllers/user-controller.js index bb377237e..2dc023604 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -1,6 +1,8 @@ const { User, Tweet, Like, Reply, Followship } = require('../models') const bcrypt = require('bcryptjs') const helpers = require('../helpers/auth-helpers') +const { imgurFileHandler } = require('../helpers/file-helpers') + const userController = { getEditPage: async (req, res, next) => { try { @@ -14,27 +16,40 @@ const userController = { editUser: async (req, res, next) => { try { if (Number(req.params.id) !== helpers.getUser(req).id) throw new Error('沒有編輯權限!') - const { name, account, email, password, checkPassword } = req.body + const { name, account, email, password, checkPassword, introduction } = req.body if (password !== checkPassword) throw new Error('密碼不相符!') if (name.length > 50) throw new Error('暱稱長度不可超過50個字!') - const sameAccountUser = await User.findOne({ where: { account } }) - const sameEmailUser = await User.findOne({ where: { email } }) - if (sameEmailUser && sameEmailUser.id !== Number(req.params.id)) throw new Error('該Email已被使用!') - if (sameAccountUser && sameAccountUser.id !== Number(req.params.id)) throw new Error('該帳號名稱已被使用!') - const user = await User.findByPk(Number(req.params.id)) if (!user) throw new Error('使用者不存在!') + const updateInfo = {} - if (password) { - updateInfo.password = await bcrypt.hash(password, 10) - } - if (account) updateInfo.account = account if (name) updateInfo.name = name - if (email) updateInfo.email = email + if (password) updateInfo.password = await bcrypt.hash(password, 10) + if (introduction) updateInfo.introduction = introduction + if (account) { + const sameAccountUser = await User.findOne({ where: { account } }) + if (sameAccountUser && sameAccountUser.id !== Number(req.params.id)) throw new Error('該帳號名稱已被使用!') + updateInfo.account = account + } + if (email) { + const sameEmailUser = await User.findOne({ where: { email } }) + if (sameEmailUser && sameEmailUser.id !== Number(req.params.id)) throw new Error('該Email已被使用!') + updateInfo.email = email + } + + const { avatar, cover } = req.files + if (avatar) { + const avatarFilePath = await imgurFileHandler(...avatar) + updateInfo.avatar = avatarFilePath + } + if (cover) { + const coverFilePath = await imgurFileHandler(...cover) + updateInfo.cover = coverFilePath + } await user.update(updateInfo) req.flash('success_messages', '使用者資料編輯成功') - res.redirect(`/api/users/${req.params.id}`) + res.redirect('back') } catch (err) { next(err) } diff --git a/helpers/file-helpers.js b/helpers/file-helpers.js new file mode 100644 index 000000000..375dcdd24 --- /dev/null +++ b/helpers/file-helpers.js @@ -0,0 +1,33 @@ +if (process.env.NODE_ENV !== 'production') { + require('dotenv').config() +} +const fs = require('fs') // 引入 fs 模組 +const imgur = require('imgur') +const IMGUR_CLIENT_ID = process.env.IMGUR_CLIENT_ID +imgur.setClientId(IMGUR_CLIENT_ID) + +const localFileHandler = file => { // file 是 multer 處理完的檔案 + return new Promise((resolve, reject) => { + if (!file) return resolve(null) + const fileName = `upload/${file.originalname}` + return fs.promises.readFile(file.path) + .then(data => fs.promises.writeFile(fileName, data)) + .then(() => resolve(`/${fileName}`)) + .catch(err => reject(err)) + }) +} +const imgurFileHandler = file => { + return new Promise((resolve, reject) => { + if (!file) return resolve(null) + return imgur.uploadFile(file.path) + .then(img => { + resolve(img?.link || null) // 檢查 img 是否存在 + }) + .catch(err => reject(err)) + }) +} + +module.exports = { + localFileHandler, + imgurFileHandler +} diff --git a/middleware/multer.js b/middleware/multer.js new file mode 100644 index 000000000..bc39d1b6e --- /dev/null +++ b/middleware/multer.js @@ -0,0 +1,3 @@ +const multer = require('multer') +const upload = multer({ dest: 'temp/' }) +module.exports = upload diff --git a/package-lock.json b/package-lock.json index 0cec683c1..e861dcb74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,6 +98,11 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -129,6 +134,25 @@ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -137,11 +161,24 @@ "@types/ms": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -152,6 +189,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, "@types/validator": { "version": "13.7.2", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.2.tgz", @@ -210,6 +255,11 @@ "color-convert": "^1.9.0" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -560,8 +610,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "available-typed-arrays": { "version": "1.0.5", @@ -621,11 +670,67 @@ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -732,6 +837,14 @@ } } }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -749,7 +862,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -770,6 +882,17 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -816,8 +939,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cross-spawn": { "version": "7.0.3", @@ -866,6 +988,21 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -879,6 +1016,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -891,8 +1033,7 @@ "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 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "denque": { "version": "1.5.1", @@ -909,6 +1050,38 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -975,6 +1148,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, "enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -1912,6 +2093,14 @@ "has-symbols": "^1.0.1" } }, + "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==", + "requires": { + "pump": "^3.0.0" + } + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -1979,6 +2168,24 @@ } } }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -2055,6 +2262,11 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -2074,6 +2286,15 @@ } } }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2087,6 +2308,33 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "imgur": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/imgur/-/imgur-1.0.2.tgz", + "integrity": "sha512-bZJkRpa3ReR7lSEzAOjO4PPl9OIDQPuiKoG2aOh36PrTBQCrZL/oTcc6VClyyXEg9O6rEMpsuCloxfhqybpfZA==", + "requires": { + "commander": "^7.1.0", + "form-data": "^4.0.0", + "got": "^11.8.1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2315,8 +2563,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -2348,6 +2595,11 @@ "esprima": "^4.0.0" } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "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", @@ -2384,6 +2636,14 @@ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "requires": { + "json-buffer": "3.0.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2454,6 +2714,11 @@ "get-func-name": "^2.0.0" } }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2539,6 +2804,11 @@ "mime-db": "1.52.0" } }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2661,6 +2931,21 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz", + "integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, "mysql2": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.7.0.tgz", @@ -2785,6 +3070,16 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -2986,6 +3281,11 @@ "type-check": "^0.4.0" } }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -3160,8 +3460,7 @@ "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 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -3206,6 +3505,15 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -3219,6 +3527,11 @@ "side-channel": "^1.0.4" } }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -3303,7 +3616,6 @@ "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, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3317,8 +3629,7 @@ "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 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -3373,11 +3684,24 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, "retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", @@ -3778,6 +4102,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3945,7 +4274,6 @@ "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" }, @@ -3953,8 +4281,7 @@ "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 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -4227,6 +4554,11 @@ "is-typed-array": "^1.1.9" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "uglify-js": { "version": "3.15.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", @@ -4281,8 +4613,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -4416,6 +4747,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", diff --git a/package.json b/package.json index 8f257eabd..061e374e5 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,11 @@ "express-handlebars": "^3.0.0", "express-session": "^1.15.6", "faker": "^4.1.0", + "imgur": "^1.0.2", "install": "^0.13.0", "method-override": "^3.0.0", "mocha": "^6.0.2", + "multer": "^1.4.3", "mysql2": "^1.6.4", "passport": "^0.4.0", "passport-local": "^1.0.0", diff --git a/routes/modules/api.js b/routes/modules/api.js index 2999afa1e..cda92b8c6 100644 --- a/routes/modules/api.js +++ b/routes/modules/api.js @@ -2,8 +2,9 @@ const express = require('express') const router = express.Router() const userController = require('../../controllers/user-controller') const { authenticated } = require('../../middleware/auth') +const upload = require('../../middleware/multer') router.get('/users/:id', authenticated, userController.getEditPage) -router.post('/users/:id', authenticated, userController.editUser) +router.post('/users/:id', authenticated, upload.fields([{ name: 'avatar' }, { name: 'cover' }]), userController.editUser) module.exports = router diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 0bb8db65c..50fddce4d 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -17,7 +17,9 @@
{{!--
--}} - {{> messages}} +
+ {{> messages}} +
{{{body}}}
diff --git a/views/partials/add-photo-icon.hbs b/views/partials/add-photo-icon.hbs new file mode 100644 index 000000000..6200695f7 --- /dev/null +++ b/views/partials/add-photo-icon.hbs @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/views/partials/personaldata-modal.hbs b/views/partials/personaldata-modal.hbs index 2cc1517ce..dc3ddd86a 100644 --- a/views/partials/personaldata-modal.hbs +++ b/views/partials/personaldata-modal.hbs @@ -17,14 +17,22 @@
- ... + ... + +
- ... + ... + +
-
+
diff --git a/views/partials/userpage-info.hbs b/views/partials/userpage-info.hbs index 1ba38d9fd..6db530677 100644 --- a/views/partials/userpage-info.hbs +++ b/views/partials/userpage-info.hbs @@ -15,11 +15,11 @@
- ...
- ...
From 761b86f8dca680de4e089696c6613d6b0f7e1a93 Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Sun, 27 Aug 2023 21:12:16 +0800 Subject: [PATCH 058/153] user/followerpage&user/followingpage function --- controllers/user-controller.js | 90 ++++++++++++++++++++++++++++++-- routes/index.js | 8 +-- views/partials/userpage-info.hbs | 4 +- 3 files changed, 94 insertions(+), 8 deletions(-) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index bb377237e..7c0f39420 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -39,7 +39,7 @@ const userController = { next(err) } }, - getUser: (req, res, next) => { + getUserTweetsPage: (req, res, next) => { const id = req.params.userId return Promise.all([ User.findByPk(id, { @@ -69,7 +69,7 @@ const userController = { }) .catch(err => next(err)) }, - getUserReplies: (req, res, next) => { + getUserRepliesPage: (req, res, next) => { const id = req.params.userId return Promise.all([ User.findByPk(id, { @@ -108,7 +108,7 @@ const userController = { }) .catch(err => next(err)) }, - getUserLikes: (req, res, next) => { + getUserLikesPage: (req, res, next) => { const id = req.params.userId return Promise.all([ User.findByPk(id, { @@ -138,6 +138,90 @@ const userController = { }) .catch(err => next(err)) }, + getUserFollowingsPage: async (req, res, next) => { + try { + const { userId } = req.params + + const users = await User.findAll({ include: [{ model: User, as: 'Followers', include: Tweet }] }) + const topUsers = await users + .map(u => ({ + // 整理格式 + ...u.toJSON(), + name: u.name.substring(0, 20), + account: u.account.substring(0, 20), + // 計算追蹤者人數 + followerCount: u.Followers.length, + // 判斷目前登入使用者是否已追蹤該 user 物件 + isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) + })) + .sort((a, b) => b.followerCount - a.followerCount) + + const followships = await Followship.findAll({ + attributes: ['followingId'], + where: { followerId: userId }, + raw: true + }) + const followIdArr = [] + for (let i = 0; i < followships.length; i++) { + followIdArr.push(Object.values(followships[i])) + } + const followId = await followIdArr.flat() + + const followingsTweets = await Tweet.findAll({ + include: User, + where: { UserId: followId }, + raw: true, + nest: true, + order: [['createdAt', 'DESC']] + }) + + return res.render('users/followings', { followingsTweets, topUsers }) + } catch (err) { + next(err) + } + }, + getUserFollowersPage: async (req, res, next) => { + try { + const { userId } = req.params + + const users = await User.findAll({ include: [{ model: User, as: 'Followers', include: Tweet }] }) + const topUsers = await users + .map(u => ({ + // 整理格式 + ...u.toJSON(), + name: u.name.substring(0, 20), + account: u.account.substring(0, 20), + // 計算追蹤者人數 + followerCount: u.Followers.length, + // 判斷目前登入使用者是否已追蹤該 user 物件 + isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) + })) + .sort((a, b) => b.followerCount - a.followerCount) + + const followships = await Followship.findAll({ + attributes: ['followerId'], + where: { followingId: userId }, + raw: true + }) + const followIdArr = [] + for (let i = 0; i < followships.length; i++) { + followIdArr.push(Object.values(followships[i])) + } + const followId = await followIdArr.flat() + + const followersTweets = await Tweet.findAll({ + include: User, + where: { UserId: followId }, + raw: true, + nest: true, + order: [['createdAt', 'DESC']] + }) + + return res.render('users/followers', { followersTweets, topUsers }) + } catch (err) { + next(err) + } + }, addFollowing: (req, res, next) => { const { userId } = req.params return Promise.all([ diff --git a/routes/index.js b/routes/index.js index 1315761f7..42baf37de 100644 --- a/routes/index.js +++ b/routes/index.js @@ -20,9 +20,11 @@ router.post('/signin', passport.authenticate('local', { failureRedirect: '/signi router.get('/logout', loginController.logout) -router.get('/users/:userId/tweets', authenticated, userController.getUser) -router.get('/users/:userId/likes', authenticated, userController.getUserLikes) -router.get('/users/:userId/replies', authenticated, userController.getUserReplies) +router.get('/users/:userId/tweets', authenticated, userController.getUserTweetsPage) +router.get('/users/:userId/likes', authenticated, userController.getUserLikesPage) +router.get('/users/:userId/replies', authenticated, userController.getUserRepliesPage) +router.get('/users/:userId/followings', authenticated, userController.getUserFollowingsPage) +router.get('/users/:userId/followers', authenticated, userController.getUserFollowersPage) router.get('/tweets/replies', authenticated, tweetController.getTweetsReply) // test router.get('/tweets', authenticated, tweetController.getTweets) // test diff --git a/views/partials/userpage-info.hbs b/views/partials/userpage-info.hbs index 1ba38d9fd..c2b15aa49 100644 --- a/views/partials/userpage-info.hbs +++ b/views/partials/userpage-info.hbs @@ -39,7 +39,7 @@

{{user.name}}

@{{user.account}}

{{user.introduction}}

- {{user.Followings.length}} 個跟隨中 - {{user.Followers.length}} 個跟隨者 + {{user.Followings.length}} 個跟隨中 + {{user.Followers.length}} 個跟隨者
\ No newline at end of file From 739b477ff6b9d8af1ff14cc60256d2cb785e3085 Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Sun, 27 Aug 2023 22:02:09 +0800 Subject: [PATCH 059/153] userpage/partials adjust --- controllers/user-controller.js | 22 ++++++++- views/partials/userpage-info.hbs | 76 +++++++++++++------------------- views/partials/userpage-tabs.hbs | 16 ------- views/users/likes.hbs | 3 +- views/users/replies.hbs | 3 +- views/users/tweets.hbs | 3 +- 6 files changed, 57 insertions(+), 66 deletions(-) delete mode 100644 views/partials/userpage-tabs.hbs diff --git a/controllers/user-controller.js b/controllers/user-controller.js index 7c0f39420..4a1e0ea6d 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -142,6 +142,15 @@ const userController = { try { const { userId } = req.params + const user = await User.findByPk(userId, { + include: [ + { model: Tweet, include: Like }, + { model: Tweet, include: Reply }, + { model: User, as: 'Followers' }, + { model: User, as: 'Followings' } + ] + }) + const users = await User.findAll({ include: [{ model: User, as: 'Followers', include: Tweet }] }) const topUsers = await users .map(u => ({ @@ -175,7 +184,7 @@ const userController = { order: [['createdAt', 'DESC']] }) - return res.render('users/followings', { followingsTweets, topUsers }) + return res.render('users/followings', { user: user.toJSON(), followingsTweets, topUsers }) } catch (err) { next(err) } @@ -184,6 +193,15 @@ const userController = { try { const { userId } = req.params + const user = await User.findByPk(userId, { + include: [ + { model: Tweet, include: Like }, + { model: Tweet, include: Reply }, + { model: User, as: 'Followers' }, + { model: User, as: 'Followings' } + ] + }) + const users = await User.findAll({ include: [{ model: User, as: 'Followers', include: Tweet }] }) const topUsers = await users .map(u => ({ @@ -217,7 +235,7 @@ const userController = { order: [['createdAt', 'DESC']] }) - return res.render('users/followers', { followersTweets, topUsers }) + return res.render('users/followers', { user: user.toJSON(), followersTweets, topUsers }) } catch (err) { next(err) } diff --git a/views/partials/userpage-info.hbs b/views/partials/userpage-info.hbs index c2b15aa49..95f9eee80 100644 --- a/views/partials/userpage-info.hbs +++ b/views/partials/userpage-info.hbs @@ -1,45 +1,31 @@ - -
-
- ... -
- ... -
-
-
- {{!-- - ... - - - ... - --}} - 編輯個人資料 -
-
-

{{user.name}}

-

@{{user.account}}

-

{{user.introduction}}

- {{user.Followings.length}} 個跟隨中 - {{user.Followers.length}} 個跟隨者 -
-
\ No newline at end of file +
+
+ ... +
+ ... +
+
+
+ {{!-- + ... + + + ... + --}} + 編輯個人資料 +
+
+

{{user.name}}

+

@{{user.account}}

+

{{user.introduction}}

+ {{user.Followings.length}} 個跟隨中 + {{user.Followers.length}} 個跟隨者 +
+
\ No newline at end of file diff --git a/views/partials/userpage-tabs.hbs b/views/partials/userpage-tabs.hbs deleted file mode 100644 index 7538a0840..000000000 --- a/views/partials/userpage-tabs.hbs +++ /dev/null @@ -1,16 +0,0 @@ -
- -
\ No newline at end of file diff --git a/views/users/likes.hbs b/views/users/likes.hbs index 66d891ed3..cc12f45b7 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -2,8 +2,9 @@
+ {{>header}} {{>userpage-info}} - {{>userpage-tabs route='likes'}} + {{>user-page-tabs route='likes'}}
{{!-- 留言 --}} {{#each user.Likes}} diff --git a/views/users/replies.hbs b/views/users/replies.hbs index 9e43c64e9..ea31e187a 100644 --- a/views/users/replies.hbs +++ b/views/users/replies.hbs @@ -2,8 +2,9 @@
+ {{>header}} {{>userpage-info}} - {{>userpage-tabs route='replies'}} + {{>user-page-tabs route='replies'}}
{{#each user.Replies}} diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 67b8ec469..6e4443d3e 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -2,8 +2,9 @@
+ {{>header}} {{>userpage-info}} - {{>userpage-tabs route='tweets'}} + {{>user-page-tabs route='tweets'}}
{{!-- 留言 --}} {{#each user.Tweets}} From b29c46e178f57f05c9db5488a3183ea99f94522b Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Sun, 27 Aug 2023 23:31:16 +0800 Subject: [PATCH 060/153] feat: refactor modal --- views/layouts/main.hbs | 6 +- views/replies.hbs | 19 ++++-- views/tweet.hbs | 139 ++++++++++++++++------------------------- 3 files changed, 70 insertions(+), 94 deletions(-) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 0bb8db65c..0ef27b233 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -15,15 +15,13 @@
- {{!--
-
--}} {{> messages}}
{{{body}}}
- {{!--
-
--}}
+ + diff --git a/views/replies.hbs b/views/replies.hbs index 9f3bad2f1..50a250aee 100644 --- a/views/replies.hbs +++ b/views/replies.hbs @@ -1,5 +1,7 @@ -{{!-- 貼文 --}} -
+
+ + {{!-- 貼文 --}} +
-
+
{{!-- 貼文回覆 --}} -{{#each replies}} -
+ -{{/each}} + {{!-- modal --}} {{!-- 留言 --}} -
-
-
- - - -

Christofu

- @account - . 3小時 -
- - -
-

Voluptatem cumque non quibusdam. Repudiandae consequatur veritatis ducimus ut. Quia quae harum fuga et - rerum eos neque ut. Aut unde aliquam

-
+
+ {{#each tweets}} +
+
+
+ + +

{{this.User.name}}

+ @{{this.User.account}} + ・{{relativeTimeFromNow this.createdAt}} +
-
+ +
+

{{this.description}}

+
+
-
- - 10 -
+
+
+ + 10 +
-
- - - - 20 -
+
+ {{#if isLiked}} + + + + {{else}} +
+ +
+ {{/if}} + 20
+
+ {{/each}} +
{{>top-users-bar}} -{{!-- modal 主頁欄 --}} +{{!-- modal 主頁 --}} - {{!-- {{#if error_messages}} {{error_messages}} {{/if}} --}} +
-{{!-- modal sidecolumn --}} - -{{!-- - - --}} - {{!-- 留言modal --}} - -
- +
From c34a08f4689d6072dc04642dab1b290a0469dfea Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 00:08:40 +0800 Subject: [PATCH 062/153] likepage controller --- controllers/user-controller.js | 65 ++++++++++++++++++++++------------ views/users/likes.hbs | 12 +++---- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index 4a1e0ea6d..c1263b617 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -108,35 +108,56 @@ const userController = { }) .catch(err => next(err)) }, - getUserLikesPage: (req, res, next) => { - const id = req.params.userId - return Promise.all([ - User.findByPk(id, { + getUserLikesPage: async (req, res, next) => { + try { + const { userId } = req.params + + const user = await User.findByPk(userId, { include: [ { model: Tweet, include: Like }, { model: Tweet, include: Reply }, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ] - }), - User.findAll({ include: [{ model: User, as: 'Followers' }] }) - ]) - .then(([user, users]) => { - const topUsers = users - .map(u => ({ - // 整理格式 - ...u.toJSON(), - name: u.name.substring(0, 20), - account: u.account.substring(0, 20), - // 計算追蹤者人數 - followerCount: u.Followers.length, - // 判斷目前登入使用者是否已追蹤該 user 物件 - isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) - })) - .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/likes', { user: user.toJSON(), topUsers }) }) - .catch(err => next(err)) + + const users = await User.findAll({ include: [{ model: User, as: 'Followers' }] }) + const topUsers = await users + .map(u => ({ + // 整理格式 + ...u.toJSON(), + name: u.name.substring(0, 20), + account: u.account.substring(0, 20), + // 計算追蹤者人數 + followerCount: u.Followers.length, + // 判斷目前登入使用者是否已追蹤該 user 物件 + isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) + })) + .sort((a, b) => b.followerCount - a.followerCount) + + const likes = await Like.findAll({ + attributes: ['TweetId'], + where: { UserId: userId }, + raw: true + }) + const likeIdArr = [] + for (let i = 0; i < likes.length; i++) { + likeIdArr.push(Object.values(likes[i])) + } + const likeId = await likeIdArr.flat() + + const likesTweets = await Tweet.findAll({ + include: [User, Like, Reply], + where: { UserId: likeId }, + raw: true, + nest: true, + order: [['createdAt', 'DESC']] + }) + + return res.render('users/likes', { user: user.toJSON(), likesTweets, topUsers }) + } catch (err) { + next(err) + } }, getUserFollowingsPage: async (req, res, next) => { try { diff --git a/views/users/likes.hbs b/views/users/likes.hbs index cc12f45b7..37fe5be5b 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -7,7 +7,7 @@ {{>user-page-tabs route='likes'}}
{{!-- 留言 --}} - {{#each user.Likes}} + {{#each likesTweets}}
@@ -16,14 +16,14 @@ src="https://assets-lighthouse.alphacamp.co/uploads/image/file/14990/Bernard_keyer.png" alt="" width="40px" height="40px" style="background-color:#FF6600; border-radius: 30px"> -

{{this.Tweet.User.name}}

- @{{this.Tweet.User.account}} +

{{this.User.name}}

+ @{{this.User.account}} • {{relativeTimeFromNow this.createdAt}}
-

{{this.Tweet.description}}

+

{{this.description}}

@@ -35,14 +35,14 @@ data-bs-toggle="modal" data-bs-target="#ModalReply" data-id="{{this.Replies.id}}"> - {{this.Tweet.Replies.length}} + {{this.Replies.length}}
- {{this.Tweet.Likes.length}} + {{this.Likes.length}}
From 9dd4d7303c88c972c56c003bba81d46c23443b31 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Mon, 28 Aug 2023 12:29:40 +0800 Subject: [PATCH 063/153] feat: complete avatar display without background --- views/partials/add-photo-icon.hbs | 4 ++-- views/partials/personaldata-modal.hbs | 19 ++++++++++--------- views/partials/userpage-info.hbs | 7 +++---- views/users/tweets.hbs | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/views/partials/add-photo-icon.hbs b/views/partials/add-photo-icon.hbs index 6200695f7..0f91f795e 100644 --- a/views/partials/add-photo-icon.hbs +++ b/views/partials/add-photo-icon.hbs @@ -1,8 +1,8 @@ + fill={{color}} /> + fill={{color}} /> \ No newline at end of file diff --git a/views/partials/personaldata-modal.hbs b/views/partials/personaldata-modal.hbs index c90ef3b10..d93046cf2 100644 --- a/views/partials/personaldata-modal.hbs +++ b/views/partials/personaldata-modal.hbs @@ -17,17 +17,18 @@
- ... - - -
- ... +
+ cover + + +
+
+ avatar
diff --git a/views/partials/userpage-info.hbs b/views/partials/userpage-info.hbs index 95f9eee80..f02fc45d7 100644 --- a/views/partials/userpage-info.hbs +++ b/views/partials/userpage-info.hbs @@ -1,10 +1,9 @@
- ... + cover
- ... + class="position-absolute top-100 start-0 translate-middle-y rounded-circle ms-3 overflow-hidden border border-4 border-white"> + avatar
diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 6e4443d3e..f46cbe5cb 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -2,9 +2,9 @@
- {{>header}} + {{!-- {{>header}} --}} {{>userpage-info}} - {{>user-page-tabs route='tweets'}} + {{!-- {{>user-page-tabs route='tweets'}} --}}
{{!-- 留言 --}} {{#each user.Tweets}} From c80276664b976fbc88b142d1284edaae18fd5def Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 13:33:38 +0800 Subject: [PATCH 064/153] adjust user tweets page with like function --- controllers/user-controller.js | 98 ++++++++++++++++++++-------------- views/users/likes.hbs | 4 +- views/users/tweets.hbs | 23 ++++++-- 3 files changed, 77 insertions(+), 48 deletions(-) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index c1263b617..45b3ffb01 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -39,35 +39,59 @@ const userController = { next(err) } }, - getUserTweetsPage: (req, res, next) => { - const id = req.params.userId - return Promise.all([ - User.findByPk(id, { + getUserTweetsPage: async (req, res, next) => { + try { + const { userId } = req.params + // info area + const user = await User.findByPk(userId, { include: [ - { model: Tweet, include: Like }, - { model: Tweet, include: Reply }, + { model: Tweet }, + // { model: Tweet, include: Reply }, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ] - }), - User.findAll({ include: [{ model: User, as: 'Followers' }] }) - ]) - .then(([user, users]) => { - const topUsers = users - .map(u => ({ - // 整理格式 - ...u.toJSON(), - name: u.name.substring(0, 20), - account: u.account.substring(0, 20), - // 計算追蹤者人數 - followerCount: u.Followers.length, - // 判斷目前登入使用者是否已追蹤該 user 物件 - isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) - })) - .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/tweets', { user: user.toJSON(), topUsers }) }) - .catch(err => next(err)) + + // tweet area + const tweets = await Tweet.findAll({ + order: [['createdAt', 'DESC']], + include: [User, Reply, Like], + where: { userId: userId } + // raw: true, + // nest: true + }) + + const likes = await Like.findAll({ + where: { userId: req.user.id }, + raw: true, + nest: true // + }) + const likedTweetsId = likes.map(like => like.tweetId) + const tweetsresult = tweets + .map(t => ({ + ...t.toJSON(), + isLiked: likedTweetsId.includes(t.id) + })) + + // top10users area + const users = await User.findAll({ include: [{ model: User, as: 'Followers' }] }) + const topUsers = users + .map(u => ({ + // 整理格式 + ...u.toJSON(), + name: u.name.substring(0, 20), + account: u.account.substring(0, 20), + // 計算追蹤者人數 + followerCount: u.Followers.length, + // 判斷目前登入使用者是否已追蹤該 user 物件 + isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) + })) + .sort((a, b) => b.followerCount - a.followerCount) + + return res.render('users/tweets', { user: user.toJSON(), tweets: tweetsresult, topUsers }) + } catch (err) { + next(err) + } }, getUserRepliesPage: (req, res, next) => { const id = req.params.userId @@ -124,7 +148,7 @@ const userController = { const users = await User.findAll({ include: [{ model: User, as: 'Followers' }] }) const topUsers = await users .map(u => ({ - // 整理格式 + // 整理格式 ...u.toJSON(), name: u.name.substring(0, 20), account: u.account.substring(0, 20), @@ -136,25 +160,17 @@ const userController = { .sort((a, b) => b.followerCount - a.followerCount) const likes = await Like.findAll({ - attributes: ['TweetId'], - where: { UserId: userId }, - raw: true - }) - const likeIdArr = [] - for (let i = 0; i < likes.length; i++) { - likeIdArr.push(Object.values(likes[i])) - } - const likeId = await likeIdArr.flat() - - const likesTweets = await Tweet.findAll({ - include: [User, Like, Reply], - where: { UserId: likeId }, + include: [ + { model: Tweet, include: [User, Like] } + ], + where: { userId: userId }, + order: [['createdAt', 'DESC']], raw: true, - nest: true, - order: [['createdAt', 'DESC']] + nest: true }) + console.log(likes) - return res.render('users/likes', { user: user.toJSON(), likesTweets, topUsers }) + return res.render('users/likes', { user: user.toJSON(), likes, topUsers }) } catch (err) { next(err) } diff --git a/views/users/likes.hbs b/views/users/likes.hbs index 37fe5be5b..1c0a5627f 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -7,7 +7,7 @@ {{>user-page-tabs route='likes'}}
{{!-- 留言 --}} - {{#each likesTweets}} + {{#each likes.Tweet}}
@@ -32,7 +32,7 @@
{{this.Replies.length}} diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 6e4443d3e..92e43c560 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -7,7 +7,7 @@ {{>user-page-tabs route='tweets'}}
{{!-- 留言 --}} - {{#each user.Tweets}} + {{#each tweets}}
@@ -38,10 +38,23 @@ {{this.Replies.length}}
-
- - - + +
+ {{#if isLiked}} +
+ +
+ {{else}} +
+ +
+ {{/if}} {{this.Likes.length}}
From b462a3d2f404a498c2cc1b5cc6bd3da7fd95cdfd Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Mon, 28 Aug 2023 14:16:32 +0800 Subject: [PATCH 065/153] refactor: count func --- controllers/reply-controller.js | 8 ++++---- controllers/tweet-controller.js | 12 +++++------- error.msg.js | 30 ++++++++++++++++++++++++++++++ views/layouts/main.hbs | 3 ++- views/replies.hbs | 4 ++-- views/tweet.hbs | 19 ++++++++++++------- views/users/likes.hbs | 4 ++-- views/users/replies.hbs | 4 ++-- views/users/tweets.hbs | 4 ++-- 9 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 error.msg.js diff --git a/controllers/reply-controller.js b/controllers/reply-controller.js index e2b467977..87889d84c 100644 --- a/controllers/reply-controller.js +++ b/controllers/reply-controller.js @@ -8,9 +8,9 @@ const replyController = { Promise.all([ Tweet.findByPk(id, { - include: [{ model: User }], - raw: true, - nest: true + include: [{ model: User }, { model: Reply }, { model: Like }] + // raw: true, + // nest: true }), Reply.findAll({ where: { tweetId: id }, @@ -28,7 +28,7 @@ const replyController = { const likedTweets = likes.map(like => like.tweetId) // console.log(likes)可能更測試檔沒過有關 const isLiked = likedTweets.includes(tweet.id) - res.render('replies', { tweet, replies, isLiked }) + res.render('replies', { tweet: tweet.toJSON(), replies, isLiked }) }) .catch(err => next(err)) }, diff --git a/controllers/tweet-controller.js b/controllers/tweet-controller.js index 83662fc0a..2dbcd9846 100644 --- a/controllers/tweet-controller.js +++ b/controllers/tweet-controller.js @@ -1,4 +1,4 @@ -const { User, Tweet, Like } = require('../models') +const { User, Tweet, Like, Reply } = require('../models') const tweetController = { // add controller action here @@ -6,9 +6,7 @@ const tweetController = { return Promise.all([ Tweet.findAll({ order: [['createdAt', 'DESC']], - include: [User], - raw: true, - nest: true + include: [{ model: User }, { model: Reply }, { model: Like }] }), Like.findAll({ where: { @@ -18,10 +16,9 @@ const tweetController = { }) ]) .then(([tweets, like]) => { - // console.log(like) const likedTweets = like.map(like => like.tweetId) const data = tweets.map(t => ({ - ...t, + ...t.toJSON(), isLiked: likedTweets.includes(t.id) })) // console.log(data) @@ -32,7 +29,8 @@ const tweetController = { postTweets: (req, res, next) => { const { description } = req.body const UserId = req.user.id - if (!description) throw new Error('內容不可空白') + // if (!description) throw new Error('內容不可空白') + // if (description.length > 140) throw new Error('不可超過140字') User.findByPk(UserId) .then(user => { if (!user) throw new Error("User didn't exist!") diff --git a/error.msg.js b/error.msg.js new file mode 100644 index 000000000..9e0475b58 --- /dev/null +++ b/error.msg.js @@ -0,0 +1,30 @@ +document.addEventListener('DOMContentLoaded', function () { + const submitButton = document.getElementById('submitBtn') + const contentInput = document.getElementById('contentInput') + const emptyContentMessage = document.getElementById('emptyContentMessage') + + submitButton.addEventListener('click', function () { + if (contentInput.value.trim() === '') { + emptyContentMessage.textContent = '内容不能为空,不可提交' + } else { + emptyContentMessage.textContent = '' // 清除提示信息 + // 进行其他提交逻辑 + } + }) +}) + +// document.addEventListener('DOMContentLoaded', function () { +// const submitButton = document.getElementById('submitBtnTest') +// const contentInput = document.getElementById('contentInputTest') + +// submitButton.addEventListener('click', function () { +// contentInput.textContent = '内容不能为空,不可提交' + +// // if (contentInput.value.trim() === '') { +// // emptyContentMessage.textContent = '内容不能为空,不可提交' +// // } else { +// // emptyContentMessage.textContent = '' // 清除提示信息 +// // // 进行其他提交逻辑 +// // } +// }) +// }) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 0ef27b233..a94eca672 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -21,7 +21,6 @@
- @@ -30,4 +29,6 @@ integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"> + + \ No newline at end of file diff --git a/views/replies.hbs b/views/replies.hbs index 50a250aee..35c2e5c53 100644 --- a/views/replies.hbs +++ b/views/replies.hbs @@ -28,8 +28,8 @@

- 66 回覆 - 888 喜歡次數 + {{tweet.Replies.length}}回覆 + {{tweet.Likes.length}}喜歡次數

diff --git a/views/tweet.hbs b/views/tweet.hbs index ce5b62b1e..a0ff4cb3c 100644 --- a/views/tweet.hbs +++ b/views/tweet.hbs @@ -1,4 +1,4 @@ -{{>navigation route='tweets'}} +{{!-- {{>navigation route='tweets'}} --}}
{{!-- 發文 --}} @@ -47,7 +47,7 @@ - 10 + {{this.Replies.length}}
@@ -65,7 +65,7 @@ {{/if}} - 20 + {{this.Likes.length}}
@@ -74,10 +74,15 @@ +
+ +

+
+ {{>top-users-bar}} -{{!-- modal 主頁 --}} +{{!-- modal 首頁的推文 --}} - +
-
diff --git a/views/users/likes.hbs b/views/users/likes.hbs index cc12f45b7..95ec30102 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -2,9 +2,9 @@
- {{>header}} + {{!-- {{>header}} --}} {{>userpage-info}} - {{>user-page-tabs route='likes'}} + {{!-- {{>user-page-tabs route='likes'}} --}}
{{!-- 留言 --}} {{#each user.Likes}} diff --git a/views/users/replies.hbs b/views/users/replies.hbs index ea31e187a..4db3dccd7 100644 --- a/views/users/replies.hbs +++ b/views/users/replies.hbs @@ -2,9 +2,9 @@
- {{>header}} + {{!-- {{>header}} --}} {{>userpage-info}} - {{>user-page-tabs route='replies'}} + {{!-- {{>user-page-tabs route='replies'}} --}}
{{#each user.Replies}} diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 6e4443d3e..f46cbe5cb 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -2,9 +2,9 @@
- {{>header}} + {{!-- {{>header}} --}} {{>userpage-info}} - {{>user-page-tabs route='tweets'}} + {{!-- {{>user-page-tabs route='tweets'}} --}}
{{!-- 留言 --}} {{#each user.Tweets}} From d5c41ef98e4a84422a48b681a55bc8e9aa89e166 Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 15:18:34 +0800 Subject: [PATCH 066/153] fix like logic @user tweet page --- config/passport.js | 6 +-- controllers/user-controller.js | 73 +++++++++++++++++++--------------- models/tweet.js | 7 +++- models/user.js | 7 +++- views/users/likes.hbs | 22 +++++++--- views/users/tweets.hbs | 6 +-- 6 files changed, 76 insertions(+), 45 deletions(-) diff --git a/config/passport.js b/config/passport.js index ed9a37de0..9e35b0540 100644 --- a/config/passport.js +++ b/config/passport.js @@ -1,7 +1,7 @@ const passport = require('passport') const LocalStrategy = require('passport-local') const bcrypt = require('bcryptjs') -const { User } = require('../models') +const { User, Tweet } = require('../models') // set up Passport strategy passport.use(new LocalStrategy( // customize user field @@ -30,8 +30,8 @@ passport.deserializeUser((id, cb) => { return User.findByPk(id, { include: [ { model: User, as: 'Followers' }, - { model: User, as: 'Followings' } - // { model: Tweet, as: 'LikedTweets' } + { model: User, as: 'Followings' }, + { model: Tweet, as: 'LikedTweets' } ] }) .then(user => cb(null, user.toJSON())) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index 45b3ffb01..be7b0619c 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -46,38 +46,29 @@ const userController = { const user = await User.findByPk(userId, { include: [ { model: Tweet }, - // { model: Tweet, include: Reply }, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ] }) - // tweet area const tweets = await Tweet.findAll({ order: [['createdAt', 'DESC']], - include: [User, Reply, Like], + include: [User, Reply, { model: User, as: 'LikedUsers' }], + // include: [User, Reply], where: { userId: userId } - // raw: true, - // nest: true }) - const likes = await Like.findAll({ - where: { userId: req.user.id }, - raw: true, - nest: true // - }) - const likedTweetsId = likes.map(like => like.tweetId) - const tweetsresult = tweets + const tweetsResult = tweets .map(t => ({ ...t.toJSON(), - isLiked: likedTweetsId.includes(t.id) + likesCount: t.LikedUsers.length, + isLiked: req.user && req.user.LikedTweets.some(l => l.id === t.id) })) - + console.log('tweetsResult:', tweetsResult) // top10users area const users = await User.findAll({ include: [{ model: User, as: 'Followers' }] }) const topUsers = users .map(u => ({ - // 整理格式 ...u.toJSON(), name: u.name.substring(0, 20), account: u.account.substring(0, 20), @@ -88,7 +79,7 @@ const userController = { })) .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/tweets', { user: user.toJSON(), tweets: tweetsresult, topUsers }) + return res.render('users/tweets', { user: user.toJSON(), tweets: tweetsResult, topUsers }) } catch (err) { next(err) } @@ -135,16 +126,45 @@ const userController = { getUserLikesPage: async (req, res, next) => { try { const { userId } = req.params - + // info area const user = await User.findByPk(userId, { include: [ - { model: Tweet, include: Like }, - { model: Tweet, include: Reply }, + { model: Tweet }, + // { model: Tweet, include: Like }, + // { model: Tweet, include: Reply }, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ] }) - + // likedtweet area + const likes = await Like.findAll({ + where: { userId: userId }, + raw: true, + nest: true // + }) + const likedTweetsId = likes.map(like => like.tweetId) + const myLikedTweetsId = req.user && req.user.LikedTweets.map(like => like.id) + const tweets = await Tweet.findAll({ + order: [['createdAt', 'DESC']], + include: [User, Reply, Like], + where: { id: likedTweetsId } + }) + const tweetsResult = tweets + .map(t => ({ + ...t.toJSON(), + isLiked: myLikedTweetsId.includes(t.id) + })) + // const likes = await Like.findAll({ + // include: [ + // { model: Tweet, include: [User, Like] } + // ], + // where: { userId: userId }, + // order: [['createdAt', 'DESC']], + // raw: true, + // nest: true + // }) + console.log(tweets) + // top10users area const users = await User.findAll({ include: [{ model: User, as: 'Followers' }] }) const topUsers = await users .map(u => ({ @@ -159,18 +179,7 @@ const userController = { })) .sort((a, b) => b.followerCount - a.followerCount) - const likes = await Like.findAll({ - include: [ - { model: Tweet, include: [User, Like] } - ], - where: { userId: userId }, - order: [['createdAt', 'DESC']], - raw: true, - nest: true - }) - console.log(likes) - - return res.render('users/likes', { user: user.toJSON(), likes, topUsers }) + return res.render('users/likes', { user: user.toJSON(), tweets: tweetsResult, topUsers }) } catch (err) { next(err) } diff --git a/models/tweet.js b/models/tweet.js index 43a87699c..5431649c0 100644 --- a/models/tweet.js +++ b/models/tweet.js @@ -12,8 +12,13 @@ module.exports = (sequelize, DataTypes) => { static associate (models) { // define association here Tweet.hasMany(models.Reply, { foreignKey: 'tweetId' }) - Tweet.hasMany(models.Like, { foreignKey: 'tweetId' }) + // Tweet.hasMany(models.Like, { foreignKey: 'tweetId' }) Tweet.belongsTo(models.User, { foreignKey: 'userId' }) + Tweet.belongsToMany(models.User, { + through: models.Like, + foreignKey: 'tweetId', + as: 'LikedUsers' + }) } }; Tweet.init({ diff --git a/models/user.js b/models/user.js index 223594abf..1a04c8aee 100644 --- a/models/user.js +++ b/models/user.js @@ -13,7 +13,7 @@ module.exports = (sequelize, DataTypes) => { // define association here User.hasMany(models.Reply, { foreignKey: 'userId' }) User.hasMany(models.Tweet, { foreignKey: 'userId' }) - User.hasMany(models.Like, { foreignKey: 'userId' }) + // User.hasMany(models.Like, { foreignKey: 'userId' }) User.belongsToMany(User, { through: models.Followship, foreignKey: 'followingId', @@ -24,6 +24,11 @@ module.exports = (sequelize, DataTypes) => { foreignKey: 'followerId', as: 'Followings' }) + User.belongsToMany(models.Tweet, { + through: models.Like, + foreignKey: 'userId', + as: 'LikedTweets' + }) } }; User.init({ diff --git a/views/users/likes.hbs b/views/users/likes.hbs index 1c0a5627f..22adeb35e 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -7,7 +7,7 @@ {{>user-page-tabs route='likes'}}
{{!-- 留言 --}} - {{#each likes.Tweet}} + {{#each tweets}}
@@ -38,10 +38,22 @@ {{this.Replies.length}}
-
- - - +
+ {{#if isLiked}} +
+ +
+ {{else}} +
+ +
+ {{/if}} {{this.Likes.length}}
diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 92e43c560..fbf6a6361 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -16,8 +16,8 @@ src="https://assets-lighthouse.alphacamp.co/uploads/image/file/14990/Bernard_keyer.png" alt="" width="40px" height="40px" style="background-color:#FF6600; border-radius: 30px"> -

{{../user.name}}

- @{{../user.account}} +

{{this.User.name}}

+ @{{this.User.account}} • {{relativeTimeFromNow this.createdAt}}
@@ -55,7 +55,7 @@ {{/if}} - {{this.Likes.length}} + {{this.likesCount}}
From 8cd240cd2923e2b7996ef25195ad5d5f8aab890a Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 15:35:10 +0800 Subject: [PATCH 067/153] fix like logic @user like page --- controllers/user-controller.js | 21 +++++---------------- views/users/likes.hbs | 2 +- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index be7b0619c..048b5615b 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -54,7 +54,6 @@ const userController = { const tweets = await Tweet.findAll({ order: [['createdAt', 'DESC']], include: [User, Reply, { model: User, as: 'LikedUsers' }], - // include: [User, Reply], where: { userId: userId } }) @@ -130,8 +129,6 @@ const userController = { const user = await User.findByPk(userId, { include: [ { model: Tweet }, - // { model: Tweet, include: Like }, - // { model: Tweet, include: Reply }, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ] @@ -143,32 +140,24 @@ const userController = { nest: true // }) const likedTweetsId = likes.map(like => like.tweetId) - const myLikedTweetsId = req.user && req.user.LikedTweets.map(like => like.id) const tweets = await Tweet.findAll({ order: [['createdAt', 'DESC']], - include: [User, Reply, Like], + include: [User, Reply, { model: User, as: 'LikedUsers' }], where: { id: likedTweetsId } }) const tweetsResult = tweets .map(t => ({ ...t.toJSON(), - isLiked: myLikedTweetsId.includes(t.id) + likesCount: t.LikedUsers.length, + isLiked: req.user && req.user.LikedTweets.some(l => l.id === t.id) })) - // const likes = await Like.findAll({ - // include: [ - // { model: Tweet, include: [User, Like] } - // ], - // where: { userId: userId }, - // order: [['createdAt', 'DESC']], - // raw: true, - // nest: true - // }) + console.log(tweets) // top10users area const users = await User.findAll({ include: [{ model: User, as: 'Followers' }] }) const topUsers = await users .map(u => ({ - // 整理格式 + // 整理格式 ...u.toJSON(), name: u.name.substring(0, 20), account: u.account.substring(0, 20), diff --git a/views/users/likes.hbs b/views/users/likes.hbs index 22adeb35e..6fc588611 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -54,7 +54,7 @@ {{/if}} - {{this.Likes.length}} + {{this.likesCount}}
From 50bc7a47a145c5c39975dc67705b4414c13307bc Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 16:01:07 +0800 Subject: [PATCH 068/153] remove find like model in user reply page --- controllers/user-controller.js | 9 --------- views/users/tweets.hbs | 4 ++-- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index bddeacdc1..aaa5ddb68 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -103,17 +103,8 @@ const userController = { return Promise.all([ User.findByPk(id, { include: [ - { model: Tweet, include: Like }, { model: Tweet, include: Reply }, { model: Reply, include: { model: Tweet, include: User } }, - { - model: Like, - include: [ - { model: Tweet, include: User }, - { model: Tweet, include: Reply }, - { model: Tweet, include: Like } - ] - }, { model: User, as: 'Followers' }, { model: User, as: 'Followings' } ] diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 36553c277..fbf6a6361 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -2,9 +2,9 @@
- {{!-- {{>header}} --}} + {{>header}} {{>userpage-info}} - {{!-- {{>user-page-tabs route='tweets'}} --}} + {{>user-page-tabs route='tweets'}}
{{!-- 留言 --}} {{#each tweets}} From 1e1cfe5c0a22ccd6e12f08d72d771653bcb02fe9 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Mon, 28 Aug 2023 16:23:32 +0800 Subject: [PATCH 069/153] feat: add logo on title and link google font --- public/icon/logo.png | Bin 0 -> 193795 bytes public/stylesheets/style.css | 8 ++++++++ views/layouts/main.hbs | 7 ++++++- views/partials/personaldata-modal.hbs | 6 +++--- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 public/icon/logo.png diff --git a/public/icon/logo.png b/public/icon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6c14e673e97f173d3c77c9075df44e5ba40d82 GIT binary patch literal 193795 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

ZkS)1vqR00F3#`|^k1Iyg}1<{*f7jWftz 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�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 Twitter + + + + - diff --git a/views/partials/personaldata-modal.hbs b/views/partials/personaldata-modal.hbs index d93046cf2..dd2629b0c 100644 --- a/views/partials/personaldata-modal.hbs +++ b/views/partials/personaldata-modal.hbs @@ -1,4 +1,4 @@ -

+ {{!--留言modal--}} + {{/each}}
From 562fd6e625085fd5ac524a34e354ce0ec942194f Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 17:42:02 +0800 Subject: [PATCH 073/153] add navigation & top10user side columns --- views/replies.hbs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/views/replies.hbs b/views/replies.hbs index 50a250aee..62acc1fc3 100644 --- a/views/replies.hbs +++ b/views/replies.hbs @@ -1,5 +1,6 @@ -
+{{>navigation route='tweets'}} +
{{!-- 貼文 --}}
@@ -129,4 +130,5 @@
-
\ No newline at end of file +
+{{>top-users-bar}} \ No newline at end of file From 2fe1ccc68b497a9a1065da12d6ee572ffc378a97 Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 18:02:50 +0800 Subject: [PATCH 074/153] const reqUser in everypage for navigation --- controllers/reply-controller.js | 3 ++- controllers/tweet-controller.js | 3 ++- controllers/user-controller.js | 18 ++++++++++++------ routes/index.js | 2 +- routes/modules/api.js | 4 ++-- views/partials/navigation.hbs | 12 ++++++------ 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/controllers/reply-controller.js b/controllers/reply-controller.js index 411bdfd0c..b345b2896 100644 --- a/controllers/reply-controller.js +++ b/controllers/reply-controller.js @@ -4,6 +4,7 @@ const replyController = { // add controller action here getTweetReplies: (req, res, next) => { + const reqUser = req.user const { id } = req.params Promise.all([ @@ -28,7 +29,7 @@ const replyController = { const likedTweets = likes.map(like => like.tweetId) // console.log(likes)可能更測試檔沒過有關 const isLiked = likedTweets.includes(tweet.id) - res.render('replies', { tweet, replies, isLiked }) + res.render('replies', { tweet, replies, isLiked, reqUser }) }) .catch(err => next(err)) }, diff --git a/controllers/tweet-controller.js b/controllers/tweet-controller.js index 83662fc0a..5b3271d24 100644 --- a/controllers/tweet-controller.js +++ b/controllers/tweet-controller.js @@ -3,6 +3,7 @@ const { User, Tweet, Like } = require('../models') const tweetController = { // add controller action here getTweets: (req, res, next) => { + const reqUser = req.user return Promise.all([ Tweet.findAll({ order: [['createdAt', 'DESC']], @@ -25,7 +26,7 @@ const tweetController = { isLiked: likedTweets.includes(t.id) })) // console.log(data) - res.render('tweet', { tweets: data }) + res.render('tweet', { tweets: data, reqUser }) }) .catch(err => next(err)) }, diff --git a/controllers/user-controller.js b/controllers/user-controller.js index 5df41d195..ef32b0458 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -7,8 +7,9 @@ const userController = { getEditPage: async (req, res, next) => { try { if (Number(req.params.id) !== helpers.getUser(req).id) throw new Error('沒有瀏覽權限!') + const reqUser = req.user const user = await User.findByPk(req.params.id, { raw: true }) - return res.render('users/edit', { user }) + return res.render('users/edit', { user, reqUser }) } catch (err) { next(err) } @@ -56,6 +57,7 @@ const userController = { }, getUserTweetsPage: async (req, res, next) => { try { + const reqUser = req.user const { userId } = req.params // info area const user = await User.findByPk(userId, { @@ -92,12 +94,13 @@ const userController = { })) .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/tweets', { user: user.toJSON(), tweets: tweetsResult, topUsers }) + return res.render('users/tweets', { user: user.toJSON(), tweets: tweetsResult, topUsers, reqUser }) } catch (err) { next(err) } }, getUserRepliesPage: (req, res, next) => { + const reqUser = req.user const id = req.params.userId return Promise.all([ User.findByPk(id, { @@ -123,12 +126,13 @@ const userController = { isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) })) .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/replies', { user: user.toJSON(), topUsers }) + return res.render('users/replies', { user: user.toJSON(), topUsers, reqUser }) }) .catch(err => next(err)) }, getUserLikesPage: async (req, res, next) => { try { + const reqUser = req.user const { userId } = req.params // info area const user = await User.findByPk(userId, { @@ -171,13 +175,14 @@ const userController = { })) .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/likes', { user: user.toJSON(), tweets: tweetsResult, topUsers }) + return res.render('users/likes', { user: user.toJSON(), tweets: tweetsResult, topUsers, reqUser }) } catch (err) { next(err) } }, getUserFollowingsPage: async (req, res, next) => { try { + const reqUser = req.user const { userId } = req.params // header area const user = await User.findByPk(userId, { @@ -214,13 +219,14 @@ const userController = { })) .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/followings', { user: user.toJSON(), tweets: tweetsResult, topUsers }) + return res.render('users/followings', { user: user.toJSON(), tweets: tweetsResult, topUsers, reqUser }) } catch (err) { next(err) } }, getUserFollowersPage: async (req, res, next) => { try { + const reqUser = req.user const { userId } = req.params // header area const user = await User.findByPk(userId, { @@ -257,7 +263,7 @@ const userController = { })) .sort((a, b) => b.followerCount - a.followerCount) - return res.render('users/followers', { user: user.toJSON(), tweets: tweetsResult, topUsers }) + return res.render('users/followers', { user: user.toJSON(), tweets: tweetsResult, topUsers, reqUser }) } catch (err) { next(err) } diff --git a/routes/index.js b/routes/index.js index fd01482b4..a4646454d 100644 --- a/routes/index.js +++ b/routes/index.js @@ -10,7 +10,7 @@ const userController = require('../controllers/user-controller') const replyController = require('../controllers/reply-controller') const loginController = require('../controllers/login-controller') -router.use('/api', api) +router.use('/api', authenticated, api) router.use('/admin', admin) router.get('/signup', loginController.signUpPage) diff --git a/routes/modules/api.js b/routes/modules/api.js index cda92b8c6..83f1a1a64 100644 --- a/routes/modules/api.js +++ b/routes/modules/api.js @@ -4,7 +4,7 @@ const userController = require('../../controllers/user-controller') const { authenticated } = require('../../middleware/auth') const upload = require('../../middleware/multer') -router.get('/users/:id', authenticated, userController.getEditPage) -router.post('/users/:id', authenticated, upload.fields([{ name: 'avatar' }, { name: 'cover' }]), userController.editUser) +router.get('/users/:id', userController.getEditPage) +router.post('/users/:id', upload.fields([{ name: 'avatar' }, { name: 'cover' }]), userController.editUser) module.exports = router diff --git a/views/partials/navigation.hbs b/views/partials/navigation.hbs index d77fcd061..8f2001f56 100644 --- a/views/partials/navigation.hbs +++ b/views/partials/navigation.hbs @@ -10,13 +10,13 @@
- + {{>cog-icon}} 設定 @@ -31,13 +31,13 @@
- + {{>cog-icon}} 設定 @@ -52,13 +52,13 @@
- + {{>cog-icon active=true}} 設定 From 4ea1686f7048129879da9ffb1a93244db86aa6e7 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Mon, 28 Aug 2023 18:08:16 +0800 Subject: [PATCH 075/153] feat: adjust admin pages' view --- public/icon/avatar.jpg | Bin 0 -> 59401 bytes views/admins/tweets.hbs | 14 +++++++------- views/admins/users.hbs | 19 ++++++++----------- views/partials/admin-left-column.hbs | 2 +- views/partials/close-icon.hbs | 2 +- 5 files changed, 17 insertions(+), 20 deletions(-) create mode 100644 public/icon/avatar.jpg diff --git a/public/icon/avatar.jpg b/public/icon/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9398ae55a6eac1621a576bf6a88d7b257e7461d GIT binary patch literal 59401 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 literal 0 HcmV?d00001 diff --git a/views/admins/tweets.hbs b/views/admins/tweets.hbs index 5f248ae70..7c1442039 100644 --- a/views/admins/tweets.hbs +++ b/views/admins/tweets.hbs @@ -1,17 +1,17 @@ {{> admin-left-column}} -
+

推文清單

{{#each tweets}} -
+
-
- {{!-- 先用網路圖片代替頭像 --}} - icon +
+ avatar
-
-
+
+
{{this.User.name}} @{{this.User.account}}・{{relativeTimeFromNow this.createdAt}} diff --git a/views/admins/users.hbs b/views/admins/users.hbs index e251b6ace..74abe40fd 100644 --- a/views/admins/users.hbs +++ b/views/admins/users.hbs @@ -1,24 +1,21 @@ {{> admin-left-column}} -
+

使用者列表

{{#each userInfos}}
-
-
- cover +
+
+ cover
-
- avatar +
+ avatar
-
-
+
+

{{this.name}}

@{{this.account}}

diff --git a/views/partials/admin-left-column.hbs b/views/partials/admin-left-column.hbs index 5b4a125fb..c992de810 100644 --- a/views/partials/admin-left-column.hbs +++ b/views/partials/admin-left-column.hbs @@ -1,4 +1,4 @@ -
+
{{>ac-logo}} diff --git a/views/partials/close-icon.hbs b/views/partials/close-icon.hbs index 596cf6438..18a15e589 100644 --- a/views/partials/close-icon.hbs +++ b/views/partials/close-icon.hbs @@ -1,5 +1,5 @@ + fill="#696974" /> \ No newline at end of file From baa7eea68b446cd105bec3167ef780bf286bf20e Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Mon, 28 Aug 2023 18:23:53 +0800 Subject: [PATCH 076/153] feat: modal error message --- controllers/tweet-controller.js | 4 ++-- error.msg.js | 30 ------------------------- public/javascript/error.msg.js | 36 ++++++++++++++++++++++++++++++ public/javascript/error_reply.js | 17 ++++++++++++++ views/layouts/main.hbs | 12 +++++----- views/replies.hbs | 38 +++++++++++++++++--------------- views/tweet.hbs | 20 ++++++++--------- views/users/likes.hbs | 4 ++-- views/users/replies.hbs | 4 ++-- views/users/tweets.hbs | 4 ++-- 10 files changed, 96 insertions(+), 73 deletions(-) delete mode 100644 error.msg.js create mode 100644 public/javascript/error.msg.js create mode 100644 public/javascript/error_reply.js diff --git a/controllers/tweet-controller.js b/controllers/tweet-controller.js index 2dbcd9846..b13e654e8 100644 --- a/controllers/tweet-controller.js +++ b/controllers/tweet-controller.js @@ -29,8 +29,8 @@ const tweetController = { postTweets: (req, res, next) => { const { description } = req.body const UserId = req.user.id - // if (!description) throw new Error('內容不可空白') - // if (description.length > 140) throw new Error('不可超過140字') + if (!description) throw new Error('內容不可空白') + if (description.length > 140) throw new Error('不可超過140字') User.findByPk(UserId) .then(user => { if (!user) throw new Error("User didn't exist!") diff --git a/error.msg.js b/error.msg.js deleted file mode 100644 index 9e0475b58..000000000 --- a/error.msg.js +++ /dev/null @@ -1,30 +0,0 @@ -document.addEventListener('DOMContentLoaded', function () { - const submitButton = document.getElementById('submitBtn') - const contentInput = document.getElementById('contentInput') - const emptyContentMessage = document.getElementById('emptyContentMessage') - - submitButton.addEventListener('click', function () { - if (contentInput.value.trim() === '') { - emptyContentMessage.textContent = '内容不能为空,不可提交' - } else { - emptyContentMessage.textContent = '' // 清除提示信息 - // 进行其他提交逻辑 - } - }) -}) - -// document.addEventListener('DOMContentLoaded', function () { -// const submitButton = document.getElementById('submitBtnTest') -// const contentInput = document.getElementById('contentInputTest') - -// submitButton.addEventListener('click', function () { -// contentInput.textContent = '内容不能为空,不可提交' - -// // if (contentInput.value.trim() === '') { -// // emptyContentMessage.textContent = '内容不能为空,不可提交' -// // } else { -// // emptyContentMessage.textContent = '' // 清除提示信息 -// // // 进行其他提交逻辑 -// // } -// }) -// }) diff --git a/public/javascript/error.msg.js b/public/javascript/error.msg.js new file mode 100644 index 000000000..6180cd631 --- /dev/null +++ b/public/javascript/error.msg.js @@ -0,0 +1,36 @@ +// document.addEventListener('DOMContentLoaded', function () { +const submitBtn = document.getElementById('submitBtn') +const contentInput = document.getElementById('contentInput') +const contentMessage = document.getElementById('emptyContentMessage') + +// const replySubmitBtn = document.querySelectorAll('.replySubmitBtn') +// const replyContentInput = document.querySelectorAll('.replyContentInput') +// const replyEmptyContentMessage = document.querySelectorAll('.replyEmptyContentMessage') +// console.log(replyEmptyContentMessage) + +submitBtn.addEventListener('click', function (event) { + if (contentInput.value.trim() === '') { + contentMessage.textContent = '內容不可空白' + event.preventDefault() + } else { + contentMessage.textContent = '' + } + if (contentInput.value.length > 140) { + contentMessage.textContent = '字數不可超過 140 字' + event.preventDefault() + } +}) + +// replySubmitBtn[0].addEventListener('click', function (event) { +// if (replyContentInput[0].value.trim() === '') { +// replyEmptyContentMessage[0].textContent = '內容不可空白' +// event.preventDefault() +// } else { +// replyEmptyContentMessage.textContent = '' +// } +// if (replyContentInput.value.length > 140) { +// replyEmptyContentMessage.textContent = '字數不可超過 140 字' +// event.preventDefault() +// } +// }) +// }) diff --git a/public/javascript/error_reply.js b/public/javascript/error_reply.js new file mode 100644 index 000000000..fbe7ba37d --- /dev/null +++ b/public/javascript/error_reply.js @@ -0,0 +1,17 @@ +// document.addEventListener('DOMContentLoaded', function () { }) +const submitBtn2 = document.getElementById('submitBtn2') +const contentInput2 = document.getElementById('contentInput2') +const contentMessage2 = document.getElementById('contentMessage2') + +submitBtn2.addEventListener('click', function (event) { + if (contentInput2.value.trim() === '') { + contentMessage2.textContent = '內容不可空白' + event.preventDefault() + } else { + contentMessage2.textContent = '' + } + if (contentInput2.value.length > 140) { + contentMessage2.textContent = '字數不可超過 140 字' + event.preventDefault() + } +}) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index a94eca672..c487351f7 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -10,7 +10,6 @@ integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> - @@ -20,15 +19,14 @@ {{{body}}}
- - - - + - + + - \ No newline at end of file diff --git a/views/replies.hbs b/views/replies.hbs index 35c2e5c53..4a738b701 100644 --- a/views/replies.hbs +++ b/views/replies.hbs @@ -36,8 +36,8 @@
-
@@ -64,21 +64,22 @@
{{#each replies}}
-
-
- - ... - -

{{this.User.name}}

- @{{this.User.account}} - ・{{relativeTimeFromNow this.createdAt}} -
+
+
+ + ... + +

{{this.User.name}}

+ @{{this.User.account}} + ・{{relativeTimeFromNow this.createdAt}} +
- 回覆 - @{{this.Tweet.User.name}} -

{{this.comment}}

-
+ 回覆 + @{{this.Tweet.User.name}} + +

{{this.comment}}

+
{{/each}}
@@ -117,14 +118,15 @@ - +
- +
diff --git a/views/tweet.hbs b/views/tweet.hbs index a0ff4cb3c..cadebb934 100644 --- a/views/tweet.hbs +++ b/views/tweet.hbs @@ -1,4 +1,4 @@ -{{!-- {{>navigation route='tweets'}} --}} +{{>navigation route='tweets'}}
{{!-- 發文 --}} @@ -21,6 +21,7 @@
+ {{!-- 留言 --}}
{{#each tweets}} @@ -44,7 +45,7 @@
- {{this.Replies.length}} @@ -74,10 +75,6 @@
-
- -

-
{{>top-users-bar}} @@ -99,16 +96,18 @@ - +
-
+
+ + {{!-- DOM render --}} +
-
@@ -148,7 +147,7 @@ - +
@@ -157,6 +156,7 @@ type="submit"> 回覆 +
diff --git a/views/users/likes.hbs b/views/users/likes.hbs index 95ec30102..cc12f45b7 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -2,9 +2,9 @@
- {{!-- {{>header}} --}} + {{>header}} {{>userpage-info}} - {{!-- {{>user-page-tabs route='likes'}} --}} + {{>user-page-tabs route='likes'}}
{{!-- 留言 --}} {{#each user.Likes}} diff --git a/views/users/replies.hbs b/views/users/replies.hbs index 4db3dccd7..ea31e187a 100644 --- a/views/users/replies.hbs +++ b/views/users/replies.hbs @@ -2,9 +2,9 @@
- {{!-- {{>header}} --}} + {{>header}} {{>userpage-info}} - {{!-- {{>user-page-tabs route='replies'}} --}} + {{>user-page-tabs route='replies'}}
{{#each user.Replies}} diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index f46cbe5cb..6e4443d3e 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -2,9 +2,9 @@
- {{!-- {{>header}} --}} + {{>header}} {{>userpage-info}} - {{!-- {{>user-page-tabs route='tweets'}} --}} + {{>user-page-tabs route='tweets'}}
{{!-- 留言 --}} {{#each user.Tweets}} From bf00d83e36a32ea62c9c3736eb6b4cba10397b8e Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 18:47:37 +0800 Subject: [PATCH 077/153] make tweet-card partial --- views/partials/top-users-bar.hbs | 16 ++- views/partials/userpage-info.hbs | 8 +- views/users/likes.hbs | 105 +---------------- views/users/tweets.hbs | 196 +------------------------------ 4 files changed, 22 insertions(+), 303 deletions(-) diff --git a/views/partials/top-users-bar.hbs b/views/partials/top-users-bar.hbs index 250f3360f..978c57429 100644 --- a/views/partials/top-users-bar.hbs +++ b/views/partials/top-users-bar.hbs @@ -7,12 +7,22 @@ {{#each topUsers}}
-
+ +
+ + avatar + +
+ + {{!--
-
+
--}} -
+
{{this.name}}

@{{this.account}}

diff --git a/views/partials/userpage-info.hbs b/views/partials/userpage-info.hbs index f02fc45d7..7d1f60b4b 100644 --- a/views/partials/userpage-info.hbs +++ b/views/partials/userpage-info.hbs @@ -1,9 +1,13 @@
- cover + cover
- avatar + avatar
diff --git a/views/users/likes.hbs b/views/users/likes.hbs index 9694ddf08..80d0dab96 100644 --- a/views/users/likes.hbs +++ b/views/users/likes.hbs @@ -8,110 +8,7 @@
{{!-- 留言 --}} {{#each tweets}} -
-
-
- - - -

{{this.User.name}}

- @{{this.User.account}} - • {{relativeTimeFromNow this.createdAt}} -
- - -
-

{{this.description}}

-
-
- -
- -
- - {{this.Replies.length}} -
- -
- {{#if isLiked}} -
- -
- {{else}} -
- -
- {{/if}} - {{this.likesCount}} -
- -
-
-
- {{!--留言modal--}} - + {{>tweet-card}} {{/each}}
diff --git a/views/users/tweets.hbs b/views/users/tweets.hbs index 4f7ecf785..ec06885df 100644 --- a/views/users/tweets.hbs +++ b/views/users/tweets.hbs @@ -4,205 +4,13 @@
{{>header}} {{>userpage-info}} + {{>personaldata-modal}} {{>user-page-tabs route='tweets'}}
{{!-- 留言 --}} {{#each tweets}} -
-
-
- - - -

{{this.User.name}}

- @{{this.User.account}} - • {{relativeTimeFromNow this.createdAt}} -
- - -
-

{{this.description}}

-
-
- -
- -
- - {{this.Replies.length}} -
- - -
- {{#if isLiked}} -
- -
- {{else}} -
- -
- {{/if}} - {{this.likesCount}} -
- -
-
-
- {{!--留言modal--}} - + {{>tweet-card}} {{/each}}
{{>top-users-bar}} - - -{{!-- modal 主頁欄 --}} - - - -{{!-- 留言modal --}} - - - -{{>personaldata-modal}} \ No newline at end of file From cedb04bc2bd53d3031d17035aebcadedec646596 Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 19:25:13 +0800 Subject: [PATCH 078/153] add direct back on header icon --- views/partials/header.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/partials/header.hbs b/views/partials/header.hbs index 4f3d23b01..555692954 100644 --- a/views/partials/header.hbs +++ b/views/partials/header.hbs @@ -1,7 +1,7 @@ {{#each topUsers}}
- - -
- - avatar - -
- - {{!--
- -
--}} - +
+ + avatar + +
-
{{this.name}}
- -

@{{this.account}}

-
+
+ {{this.name}}
+ +

@{{this.account}}

+
- -
+
{{#if this.isFollowed }}
{{/if}} diff --git a/views/partials/user-followpage-tweet-card.hbs b/views/partials/user-followpage-tweet-card.hbs new file mode 100644 index 000000000..4db2f467b --- /dev/null +++ b/views/partials/user-followpage-tweet-card.hbs @@ -0,0 +1,38 @@ +
+
+
+ +
+ avatar +
+
+

{{this.User.name}}

+ @{{this.User.account}} + • {{relativeTimeFromNow this.createdAt}} +
+ {{#if this.isFollowed }} +
+ +
+ {{else}} +
+ +
+ {{/if}} +
+
+ + +
+

{{this.description}}

+
+
+ +
+
\ No newline at end of file diff --git a/views/users/followers.hbs b/views/users/followers.hbs index 38216ecf3..f9c9b9b74 100644 --- a/views/users/followers.hbs +++ b/views/users/followers.hbs @@ -6,43 +6,7 @@
{{!-- 留言 --}} {{#each tweets}} -
-
-
- - - -

{{this.User.name}}

- @{{this.User.account}} - • {{relativeTimeFromNow this.createdAt}} - {{!--
--}} - {{#if this.isFollowed }} -
- -
- {{else}} -
- -
- {{/if}} - {{!-- -
--}} -
- - -
-

{{this.description}}

-
-
- -
-
+ {{>user-followpage-tweet-card}} {{/each}}
{{>top-users-bar}} \ No newline at end of file diff --git a/views/users/followings.hbs b/views/users/followings.hbs index 968ceac6d..41a7e537d 100644 --- a/views/users/followings.hbs +++ b/views/users/followings.hbs @@ -6,43 +6,7 @@
{{!-- 留言 --}} {{#each tweets}} -
-
-
- - - -

{{this.User.name}}

- @{{this.User.account}} - • {{relativeTimeFromNow this.createdAt}} - {{!--
--}} - {{#if this.isFollowed }} -
- -
- {{else}} -
- -
- {{/if}} - {{!-- -
--}} -
- - -
-

{{this.description}}

-
-
- -
-
+ {{>user-followpage-tweet-card}} {{/each}}
{{>top-users-bar}} \ No newline at end of file From cfd0ecf3c9f2547076ea33ee13f3fb5b98d3d753 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Mon, 28 Aug 2023 21:40:11 +0800 Subject: [PATCH 083/153] feat: adjust admin user card details --- views/admins/users.hbs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/views/admins/users.hbs b/views/admins/users.hbs index 74abe40fd..20c277d89 100644 --- a/views/admins/users.hbs +++ b/views/admins/users.hbs @@ -5,37 +5,37 @@
{{#each userInfos}} -
+
- cover + cover
avatar
-
-
-

{{this.name}}

+
+
+

{{this.name}}

-

@{{this.account}}

+

@{{this.account}}

-
- +
+ {{>post-icon}} - + {{this.tweetCount}}
- + {{>like-icon w=24 h=24}} - + {{this.likeCount}}
From 52bef94591e59bd1fac2044d60d5912e31359151 Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Mon, 28 Aug 2023 21:47:31 +0800 Subject: [PATCH 084/153] tweet card view adjust --- views/partials/tweet-card.hbs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/partials/tweet-card.hbs b/views/partials/tweet-card.hbs index d37c7025a..3973677d3 100644 --- a/views/partials/tweet-card.hbs +++ b/views/partials/tweet-card.hbs @@ -1,9 +1,9 @@ {{!--留言modal--}}
-

{{tweet.description}}

+

{{tweet.description}}

- +
From aed7b5bc643a3d6e761c9211873b1da73616b299 Mon Sep 17 00:00:00 2001 From: tingul4 Date: Tue, 29 Aug 2023 11:39:07 +0800 Subject: [PATCH 087/153] feat: add CSS in error message --- views/layouts/main.hbs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 5d88ccf25..d328da198 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -19,10 +19,12 @@
- {{> messages}} -
- {{{body}}} -
+
+ {{> messages}} +
+
+ {{{body}}} +
From b0f6dc0f80650a72936cc3aaccac3b60f27b371c Mon Sep 17 00:00:00 2001 From: RobertOu0213 Date: Tue, 29 Aug 2023 11:42:45 +0800 Subject: [PATCH 088/153] feat: click avatar to another page --- controllers/tweet-controller.js | 4 +++- views/replies.hbs | 4 ++-- views/tweet.hbs | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/controllers/tweet-controller.js b/controllers/tweet-controller.js index 52b77756b..6b97ddc9d 100644 --- a/controllers/tweet-controller.js +++ b/controllers/tweet-controller.js @@ -28,7 +28,8 @@ const tweetController = { const likedTweets = like.map(like => like.tweetId) const data = tweets.map(t => ({ ...t.toJSON(), - isLiked: likedTweets.includes(t.id) + isLiked: likedTweets.includes(t.id), + // userId: req.user.id })) // topUser const topUsers = users @@ -42,6 +43,7 @@ const tweetController = { isFollowed: req.user && req.user.Followings.some(f => f.id === u.id) })) .sort((a, b) => b.followerCount - a.followerCount) + // console.log(data) res.render('tweet', { tweets: data, reqUser, topUsers }) }) .catch(err => next(err)) diff --git a/views/replies.hbs b/views/replies.hbs index 424231058..f4c856888 100644 --- a/views/replies.hbs +++ b/views/replies.hbs @@ -67,7 +67,7 @@
- + ... @@ -110,7 +110,7 @@
-

{{tweet.description}}

+

{{tweet.description}}

回覆給@{{tweet.User.account}}

diff --git a/views/tweet.hbs b/views/tweet.hbs index 93e5d723c..7cd3c060e 100644 --- a/views/tweet.hbs +++ b/views/tweet.hbs @@ -28,8 +28,8 @@
- - +

{{this.User.name}}

@@ -93,7 +93,7 @@
- @@ -138,7 +138,7 @@
-

{{this.description}}

+

{{this.description}}

回覆給@{{this.User.account}}

From 388148490ea2acc037633ec55defe8d28795832a Mon Sep 17 00:00:00 2001 From: tingul4 Date: Tue, 29 Aug 2023 12:30:24 +0800 Subject: [PATCH 089/153] feat: add error message in auth and fix edit user bugs --- controllers/user-controller.js | 46 ++++++++++++++++++++-------------- middleware/auth.js | 11 ++++---- routes/index.js | 2 +- routes/modules/api.js | 4 +-- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/controllers/user-controller.js b/controllers/user-controller.js index b66e850bc..68603f60b 100644 --- a/controllers/user-controller.js +++ b/controllers/user-controller.js @@ -1,15 +1,15 @@ const { User, Tweet, Like, Reply, Followship } = require('../models') const bcrypt = require('bcryptjs') -const helpers = require('../helpers/auth-helpers') +const helpers = require('../_helpers') const { imgurFileHandler } = require('../helpers/file-helpers') const userController = { getEditPage: async (req, res, next) => { try { if (Number(req.params.id) !== helpers.getUser(req).id) throw new Error('沒有瀏覽權限!') - const reqUser = req.user const user = await User.findByPk(req.params.id, { raw: true }) - return res.render('users/edit', { user, reqUser }) + if (!user) throw new Error('使用者不存在!') + res.render('users/edit', { user }) } catch (err) { next(err) } @@ -17,17 +17,23 @@ const userController = { editUser: async (req, res, next) => { try { if (Number(req.params.id) !== helpers.getUser(req).id) throw new Error('沒有編輯權限!') - const { name, account, email, password, checkPassword, introduction } = req.body - if (password !== checkPassword) throw new Error('密碼不相符!') - if (name.length > 50) throw new Error('暱稱長度不可超過50個字!') - - const user = await User.findByPk(Number(req.params.id)) + const user = await User.findByPk(req.params.id) if (!user) throw new Error('使用者不存在!') + const { name, account, email, password, checkPassword, introduction } = req.body const updateInfo = {} - if (name) updateInfo.name = name - if (password) updateInfo.password = await bcrypt.hash(password, 10) - if (introduction) updateInfo.introduction = introduction + if (name) { + if (name.length > 50) throw new Error('暱稱長度不可超過50個字!') + updateInfo.name = name + } + if (password) { + if (password !== checkPassword) throw new Error('密碼不相符!') + updateInfo.password = await bcrypt.hash(password, 10) + } + if (introduction) { + if (introduction.length > 160) throw new Error('自我介紹長度不可超過160個字!') + updateInfo.introduction = introduction + } if (account) { const sameAccountUser = await User.findOne({ where: { account } }) if (sameAccountUser && sameAccountUser.id !== Number(req.params.id)) throw new Error('該帳號名稱已被使用!') @@ -39,14 +45,16 @@ const userController = { updateInfo.email = email } - const { avatar, cover } = req.files - if (avatar) { - const avatarFilePath = await imgurFileHandler(...avatar) - updateInfo.avatar = avatarFilePath - } - if (cover) { - const coverFilePath = await imgurFileHandler(...cover) - updateInfo.cover = coverFilePath + if (req.files) { + const { avatar, cover } = req.files + if (avatar) { + const avatarFilePath = await imgurFileHandler(...avatar) + updateInfo.avatar = avatarFilePath + } + if (cover) { + const coverFilePath = await imgurFileHandler(...cover) + updateInfo.cover = coverFilePath + } } await user.update(updateInfo) req.flash('success_messages', '使用者資料編輯成功') diff --git a/middleware/auth.js b/middleware/auth.js index a51d40533..1b6a36571 100644 --- a/middleware/auth.js +++ b/middleware/auth.js @@ -2,23 +2,22 @@ const helpers = require('../helpers/auth-helpers') const authenticated = (req, res, next) => { if (helpers.ensureAuthenticated(req)) { if (helpers.getUser(req).role === 'user') return next() + req.flash('error_messages', '管理員無法登入前台!') res.redirect('/signin') } + req.flash('error_messages', '請先登入使用者帳號!') res.redirect('/signin') } const authenticatedAdmin = (req, res, next) => { if (helpers.ensureAuthenticated(req)) { if (helpers.getUser(req).role === 'admin') return next() + req.flash('error_messages', '使用者無法登入後台!') res.redirect('/admin/signin') } + req.flash('error_messages', '請先登入管理員帳號!') res.redirect('/admin/signin') } -const authenticatedSelfOnly = (req, res, next) => { - if (helpers.getUser(req).id === Number(req.params.userId)) return next() - throw new Error('Invalid authorization!') -} module.exports = { authenticated, - authenticatedAdmin, - authenticatedSelfOnly + authenticatedAdmin } diff --git a/routes/index.js b/routes/index.js index a4646454d..fd01482b4 100644 --- a/routes/index.js +++ b/routes/index.js @@ -10,7 +10,7 @@ const userController = require('../controllers/user-controller') const replyController = require('../controllers/reply-controller') const loginController = require('../controllers/login-controller') -router.use('/api', authenticated, api) +router.use('/api', api) router.use('/admin', admin) router.get('/signup', loginController.signUpPage) diff --git a/routes/modules/api.js b/routes/modules/api.js index 83f1a1a64..cda92b8c6 100644 --- a/routes/modules/api.js +++ b/routes/modules/api.js @@ -4,7 +4,7 @@ const userController = require('../../controllers/user-controller') const { authenticated } = require('../../middleware/auth') const upload = require('../../middleware/multer') -router.get('/users/:id', userController.getEditPage) -router.post('/users/:id', upload.fields([{ name: 'avatar' }, { name: 'cover' }]), userController.editUser) +router.get('/users/:id', authenticated, userController.getEditPage) +router.post('/users/:id', authenticated, upload.fields([{ name: 'avatar' }, { name: 'cover' }]), userController.editUser) module.exports = router From 92615ddfcd993b44dbcf633a55f525bcd4aa02fd Mon Sep 17 00:00:00 2001 From: pupss91090 Date: Tue, 29 Aug 2023 12:34:45 +0800 Subject: [PATCH 090/153] align three-column layout & border --- views/layouts/main.hbs | 2 +- views/partials/header.hbs | 2 +- views/partials/navigation.hbs | 5 ++++- views/partials/top-users-bar.hbs | 7 ++++--- views/partials/tweet-card.hbs | 2 +- views/partials/user-followpage-tabs.hbs | 2 +- views/partials/user-followpage-tweet-card.hbs | 2 +- views/partials/user-page-tabs.hbs | 2 +- views/users/edit.hbs | 12 ++++++++---- views/users/followers.hbs | 5 +++-- views/users/followings.hbs | 5 +++-- views/users/likes.hbs | 5 +++-- views/users/replies.hbs | 7 ++++--- views/users/tweets.hbs | 5 +++-- 14 files changed, 38 insertions(+), 25 deletions(-) diff --git a/views/layouts/main.hbs b/views/layouts/main.hbs index 5d88ccf25..e307960b3 100644 --- a/views/layouts/main.hbs +++ b/views/layouts/main.hbs @@ -18,7 +18,7 @@ -
+
{{> messages}}
{{{body}}} diff --git a/views/partials/header.hbs b/views/partials/header.hbs index 555692954..cbda7615b 100644 --- a/views/partials/header.hbs +++ b/views/partials/header.hbs @@ -1,4 +1,4 @@ -