From f9c577364be4527ae539be58d18b9ae44cf4448c Mon Sep 17 00:00:00 2001 From: dongE <68381747+Daae-Kim@users.noreply.github.com> Date: Sun, 25 Jul 2021 00:11:12 +0900 Subject: [PATCH 01/16] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85,=EA=B2=8C=EC=8B=9C=EA=B8=80?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env | 1 + backend/app.js | 73 + backend/config/config.json | 23 + backend/models/hashtag.js | 27 + backend/models/index.js | 26 + backend/models/post.js | 30 + backend/models/user.js | 57 + backend/package-lock.json | 2824 +++++++++++++++++ backend/package.json | 31 + backend/passport/index.js | 19 + backend/passport/localStrategy.js | 30 + backend/routes/auth.js | 62 + backend/routes/middlewares.js | 17 + backend/routes/page.js | 42 + backend/routes/post.js | 62 + backend/routes/user.js | 0 ...\354\235\264\353\270\2241627135434953.PNG" | Bin 0 -> 10694 bytes ...\353\243\250\354\247\2011627135861101.jpg" | Bin 0 -> 5806 bytes ...\353\243\250\354\247\2011627137619779.jpg" | Bin 0 -> 5806 bytes ...353\243\250\354\247\20121627135902037.jpg" | Bin 0 -> 28111 bytes ...353\243\250\354\247\20121627137675882.jpg" | Bin 0 -> 28111 bytes backend/views/error.html | 7 + backend/views/join.html | 29 + backend/views/layout.html | 53 + backend/views/main.html | 65 + 25 files changed, 3478 insertions(+) create mode 100644 backend/.env create mode 100644 backend/app.js create mode 100644 backend/config/config.json create mode 100644 backend/models/hashtag.js create mode 100644 backend/models/index.js create mode 100644 backend/models/post.js create mode 100644 backend/models/user.js create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/passport/index.js create mode 100644 backend/passport/localStrategy.js create mode 100644 backend/routes/auth.js create mode 100644 backend/routes/middlewares.js create mode 100644 backend/routes/page.js create mode 100644 backend/routes/post.js create mode 100644 backend/routes/user.js create mode 100644 "backend/uploads/\354\274\200\354\235\264\353\270\2241627135434953.PNG" create mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\2011627135861101.jpg" create mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\2011627137619779.jpg" create mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\20121627135902037.jpg" create mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\20121627137675882.jpg" create mode 100644 backend/views/error.html create mode 100644 backend/views/join.html create mode 100644 backend/views/layout.html create mode 100644 backend/views/main.html diff --git a/backend/.env b/backend/.env new file mode 100644 index 0000000..c7fbc11 --- /dev/null +++ b/backend/.env @@ -0,0 +1 @@ +COOKIE_SECRET=cookiesecret \ No newline at end of file diff --git a/backend/app.js b/backend/app.js new file mode 100644 index 0000000..ec9c518 --- /dev/null +++ b/backend/app.js @@ -0,0 +1,73 @@ +const express = require("express"); +const cookieParser = require("cookie-parser"); +const morgan = require("morgan"); +const path = require("path"); +const session = require("express-session"); +const nunjucks = require("nunjucks"); +const dotenv = require("dotenv"); +const passport = require("passport"); +dotenv.config(); +const pageRouter = require("./routes/page"); +const authRouter = require("./routes/auth"); +const postRouter = require("./routes/post"); +const { sequelize } = require("./models"); +const passportConfig = require("./passport"); + +const app = express(); +passportConfig(); +app.set("port", process.env.PORT || 8001); +app.set("view engine", "html"); +nunjucks.configure("views", { + express: app, + watch: true, +}); +sequelize + .sync({ force: false }) //sequelize가 초기화 될 때 DB에 필요한 테이블 생성 + .then(() => { + console.log("데이터베이스 연결 성공"); + }) + .catch((err) => { + console.error(err); + }); + +app.use(morgan("dev")); +app.use(express.static(path.join(__dirname, "public"))); +app.use('/img', express.static(path.join(__dirname, "uploads"))); + +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); +app.use(cookieParser(process.env.COOKIE_SECRET)); +app.use( + session({ + resave: false, + saveUninitialized: false, + secret: process.env.COOKIE_SECRET, + cookie: { + httpOnly: true, + secure: false, + }, + }) +); +app.use(passport.initialize()); +app.use(passport.session()); +app.use("/", pageRouter); +app.use("/auth", authRouter); +app.use("/post", postRouter); +//app.use("/user", userRouter); + +app.use((req, res, next) => { + const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); + error.status = 404; + next(error); +}); + +app.use((err, req, res, next) => { + res.locals.message = err.message; + res.locals.error = process.env.NODE_ENV !== "production" ? err : {}; + res.status(err.status || 500); + res.render("error"); +}); + +app.listen(app.get("port"), () => { + console.log(app.get("port"), "번 포트에서 대기중"); +}); diff --git a/backend/config/config.json b/backend/config/config.json new file mode 100644 index 0000000..3a7f744 --- /dev/null +++ b/backend/config/config.json @@ -0,0 +1,23 @@ +{ + "development": { + "username": "root", + "password": "daaeda", + "database": "collusic", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "test": { + "username": "root", + "password": null, + "database": "database_test", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "production": { + "username": "root", + "password": null, + "database": "database_production", + "host": "127.0.0.1", + "dialect": "mysql" + } +} diff --git a/backend/models/hashtag.js b/backend/models/hashtag.js new file mode 100644 index 0000000..0df3476 --- /dev/null +++ b/backend/models/hashtag.js @@ -0,0 +1,27 @@ +const Sequelize = require('sequelize'); + +module.exports = class Hashtag extends Sequelize.Model { + static init(sequelize) { + return super.init({ + title: {//해시태그 이름만 + type: Sequelize.STRING(15), + allowNull: false, + unique: true, + }, + }, { + sequelize, + timestamps: true, + underscored: false, + modelName: 'Hashtag', + tableName: 'hashtags', + paranoid: false, + charset: 'utf8mb4', + collate: 'utf8mb4_general_ci', + }); + } + + static associate(db) { + db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' }); + } +}; + diff --git a/backend/models/index.js b/backend/models/index.js new file mode 100644 index 0000000..9545b97 --- /dev/null +++ b/backend/models/index.js @@ -0,0 +1,26 @@ +const Sequelize = require('sequelize'); +const env = process.env.NODE_ENV || 'development'; //config.json의 development 가져오기 +const config = require('../config/config')[env]; //config.json의 development 가져오기 +const User = require('./user'); +const Post = require('./post'); +const Hashtag = require('./hashtag'); + +const db = {}; +const sequelize = new Sequelize( + config.database, config.username, config.password, config, +); + +db.sequelize = sequelize; +db.User = User; +db.Post = Post; +db.Hashtag = Hashtag; +//사람과 게시글은 1:1관계, 게시글과 해시태그는 1:N 관계 +User.init(sequelize); +Post.init(sequelize); +Hashtag.init(sequelize); + +User.associate(db); +Post.associate(db); +Hashtag.associate(db); + +module.exports = db; \ No newline at end of file diff --git a/backend/models/post.js b/backend/models/post.js new file mode 100644 index 0000000..30411b3 --- /dev/null +++ b/backend/models/post.js @@ -0,0 +1,30 @@ +const Sequelize = require('sequelize'); + +module.exports = class Post extends Sequelize.Model { + static init(sequelize) { + return super.init({ + content: {//id 생략. -> sequlize에서는 id가 생략될 수 있음. + type: Sequelize.STRING(140), + allowNull: false, + }, + img: { + type: Sequelize.STRING(200), + allowNull: true, + },//img 한개만 올릴 수 있음. + }, { + sequelize, + timestamps: true, + underscored: false, + modelName: 'Post', + tableName: 'posts', + paranoid: false, //deleted at false -> 게시글 삭제시 완전 삭제 + charset: 'utf8mb4', //이모티콘 + collate: 'utf8mb4_general_ci', + }); + } + + static associate(db) { + db.Post.belongsTo(db.User);//post belongs to many user , has many 만 있어도 되지만 둘다 쓰는게 좋음. + db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });//belongs to many 는 N:N 관계 + }// through: 'PostHashtag'는 중간 테이블 이름. N:N관계는 중간테이블이 생김. +}; diff --git a/backend/models/user.js b/backend/models/user.js new file mode 100644 index 0000000..42479ac --- /dev/null +++ b/backend/models/user.js @@ -0,0 +1,57 @@ +const Sequelize = require('sequelize'); +//db 테이블과 sequelize 연동을 위한 코드 +module.exports = class User extends Sequelize.Model { + static init(sequelize) { + return super.init({ + email: { + type: Sequelize.STRING(40), + allowNull: true, + unique: true, + }, + nick: { + type: Sequelize.STRING(15), + allowNull: false,//sns 로그인인경우 없음. + }, + password: { + type: Sequelize.STRING(100), + allowNull: true, + }, + provider: {//로그인 제공자 + type: Sequelize.STRING(10), + allowNull: false, + defaultValue: 'local',//local을 통해 로그인 한 상태 카카오면 kakao + }, + introduce: { + type: Sequelize.TEXT, + allowNull: true, + }, + imagePath: { + type: Sequelize.STRING(100), + allowNull: true + } + }, { + sequelize, + timestamps: true, //생성일 수정일 삭제일이 기록 + underscored: false, + modelName: 'User', + tableName: 'users', + paranoid: true, //deleted at 삭제한척하는 + charset: 'utf8', + collate: 'utf8_general_ci', //한글 지원 + }); + } + + static associate(db) { + db.User.hasMany(db.Post);//user has many db.post + db.User.belongsToMany(db.User, { + foreignKey: 'followingId', //둘다 foreignkey가 userid이면 모르니까. 선언. + as: 'Followers', + through: 'Follow', + });//사용자와 사용자간의 관계: 팔로잉 팔로워 관계 + db.User.belongsToMany(db.User, { + foreignKey: 'followerId', + as: 'Followings', + through: 'Follow', + }); + } +}; diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..62e5529 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,2824 @@ +{ + "name": "collusic", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "dependencies": { + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/node": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", + "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==" + }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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==" + } + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bcrypt": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", + "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^3.1.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "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==", + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "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==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "encode32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/encode32/-/encode32-1.1.0.tgz", + "integrity": "sha1-DFS0X7MUrVUC48Iwy5Ws3F5c0d0=" + }, + "encodeurl": { + "version": "1.0.2", + "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==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.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-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express-session": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", + "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", + "requires": { + "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" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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==" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "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==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "requires": { + "ini": "1.3.7" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflection": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", + "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "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==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "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==" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "js-beautify": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", + "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "nopt": "^5.0.0" + }, + "dependencies": { + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "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" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "requires": { + "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" + }, + "dependencies": { + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.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==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "moment-timezone": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", + "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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 + }, + "multer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "mysql2": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", + "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", + "requires": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.2", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "nodemon": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", + "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + } + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "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==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-kakao": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/passport-kakao/-/passport-kakao-1.0.1.tgz", + "integrity": "sha512-uItaYRVrTHL6iGPMnMZvPa/O1GrAdh/V6EMjOHcFlQcVroZ9wgG7BZ5PonMNJCxfHQ3L2QVNRnzhKWUzSsumbw==", + "requires": { + "passport-oauth2": "~1.1.2", + "pkginfo": "~0.3.0" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-oauth2": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.1.2.tgz", + "integrity": "sha1-vXFjsbYJA3GGjcTvb58uHkzEuUg=", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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=" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "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==" + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "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==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "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==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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==" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "^1.3.0" + } + }, + "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-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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==" + } + } + }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, + "sequelize": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.6.5.tgz", + "integrity": "sha512-QyRrJrDRiwuiILqTMHUA1yWOPIL12KlfmgZ3hnzQwbMvp2vJ6fzu9bYJQB+qPMosck4mBUggY4Cjoc6Et8FBIQ==", + "requires": { + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.13.1", + "lodash": "^4.17.20", + "moment": "^2.26.0", + "moment-timezone": "^0.5.31", + "retry-as-promised": "^3.2.0", + "semver": "^7.3.2", + "sequelize-pool": "^6.0.0", + "toposort-class": "^1.0.1", + "uuid": "^8.1.0", + "validator": "^13.6.0", + "wkx": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "sequelize-cli": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.2.0.tgz", + "integrity": "sha512-6WQ2x91hg30dUn66mXHnzvHATZ4pyI1GHSNbS/TNN/vRR4BLRSLijadeMgC8zqmKDsL0VqzVVopJWfJakuP++Q==", + "requires": { + "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.3.0", + "yargs": "^13.1.0" + } + }, + "sequelize-pool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", + "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sqlstring": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" + }, + "statuses": { + "version": "1.5.0", + "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": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", + "requires": { + "bluebird": "^3.7.2" + } + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "uuid-apikey": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/uuid-apikey/-/uuid-apikey-1.5.3.tgz", + "integrity": "sha512-v28vGJ1hRDzqLm6ufZ7b098Kmk159PInIHYWXfB47r3xOACZ5nRIAWe9VxFjvSW0MwckQYAnS1ucWUAXGKo95w==", + "requires": { + "colors": "^1.4.0", + "commander": "^8.0.0", + "encode32": "^1.1.0", + "uuid": "^8.3.1" + }, + "dependencies": { + "commander": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.0.0.tgz", + "integrity": "sha512-Xvf85aAtu6v22+E5hfVoLHqyul/jyxh91zvqk/ioJTQuJR7Z78n7H558vMPKanPSRgIEeZemT92I2g9Y8LPbSQ==" + } + } + }, + "validator": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", + "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "requires": { + "@types/node": "*" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "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", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..9c489b0 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,31 @@ +{ + "name": "collusic", + "version": "1.0.0", + "description": "", + "main": "app.js", + "scripts": { + "start": "nodemon app" + }, + "author": "Daae", + "license": "MIT", + "devDependencies": { + "nodemon": "^2.0.7" + }, + "dependencies": { + "bcrypt": "^5.0.1", + "cookie-parser": "^1.4.5", + "dotenv": "^10.0.0", + "express": "^4.17.1", + "express-session": "^1.17.2", + "morgan": "^1.10.0", + "multer": "^1.4.2", + "mysql2": "^2.2.5", + "nunjucks": "^3.2.3", + "passport": "^0.4.1", + "passport-kakao": "^1.0.1", + "passport-local": "^1.0.0", + "sequelize": "^6.6.5", + "sequelize-cli": "^6.2.0", + "uuid-apikey": "^1.5.3" + } +} diff --git a/backend/passport/index.js b/backend/passport/index.js new file mode 100644 index 0000000..ec34bd4 --- /dev/null +++ b/backend/passport/index.js @@ -0,0 +1,19 @@ +const passport = require("passport"); +const local = require("./localStrategy"); +const User = require("../models/user"); + +module.exports = () => { + passport.serializeUser((user, done) => { + done(null, user.id); // 세션에 user 의 id 만 저장 + }); + + passport.deserializeUser((id, done) => { + User.findOne({ where: { id } }) + .then((user) => done(null, user)) + .catch((err) => done(err)); + }); + + local(); +}; + +//serializeuser는 diff --git a/backend/passport/localStrategy.js b/backend/passport/localStrategy.js new file mode 100644 index 0000000..06270a1 --- /dev/null +++ b/backend/passport/localStrategy.js @@ -0,0 +1,30 @@ +const passport = require('passport'); +const LocalStrategy = require('passport-local').Strategy; +const bcrypt = require('bcrypt'); + +const User = require('../models/user'); + +module.exports = () => {//로그인 로직. 모듈임. + passport.use(new LocalStrategy({ + usernameField: 'email', //req.body.email + passwordField: 'password', //req.body.password + }, async (email, password, done) => { + try { + const exUser = await User.findOne({ where: { email } });//그 email을 가진 사람이 있나 찾기 + if (exUser) { + const result = await bcrypt.compare(password, exUser.password);//brypt.compare로 비번이랑, 디비에 비번이랑 비교 + if (result) { + done(null, exUser); + } else { + done(null, false, { message: '비밀번호가 일치하지 않습니다.' }); + } + } else { + done(null, false, { message: '가입되지 않은 회원입니다.' }); + } + } catch (error) { + console.error(error); + done(error); + } + })); +}; +//email, password로 로그인하는 것을 적은 파일 \ No newline at end of file diff --git a/backend/routes/auth.js b/backend/routes/auth.js new file mode 100644 index 0000000..7d6e5ec --- /dev/null +++ b/backend/routes/auth.js @@ -0,0 +1,62 @@ +const express = require('express'); +const passport = require('passport'); +const bcrypt = require('bcrypt'); +const { isLoggedIn, isNotLoggedIn } = require('./middlewares'); +const User = require('../models/user'); + +const router = express.Router(); + +router.post('/join', isNotLoggedIn, async (req, res, next) => { + const { email, nick, password } = req.body; + try { + const exUser = await User.findOne({ where: { email } });//기존이메일로 가입한 사람이 있나? + if (exUser) { + return res.redirect('/join?error=exist');//프론트에서 이미 가입한 메일이라고 알림 + } + const hash = await bcrypt.hash(password, 12);//기존이메일이 아니면 password를 해쉬화 해서 저장 + await User.create({ + email, + nick, + password: hash, + }); + return res.redirect('/'); + } catch (error) { + console.error(error); + return next(error); + } +}); + +router.post('/login', isNotLoggedIn, (req, res, next) => { + passport.authenticate('local', (authError, user, info) => { + if (authError) { + console.error(authError); + return next(authError); + } + if (!user) {//로그인 실패한 경우 + return res.redirect(`/?loginError=${info.message}`); + } + return req.login(user, (loginError) => { + if (loginError) { + console.error(loginError); + return next(loginError); + } + return res.redirect('/'); + }); + })(req, res, next); // 미들웨어 내의 미들웨어에는 (req, res, next) 꼭 붙여야함. +}); + +router.get('/logout', isLoggedIn, (req, res) => { + req.logout(); + req.session.destroy(); + res.redirect('/'); +}); + +router.get('/kakao', passport.authenticate('kakao')); + +router.get('/kakao/callback', passport.authenticate('kakao', { + failureRedirect: '/', +}), (req, res) => { + res.redirect('/'); +}); + +module.exports = router; diff --git a/backend/routes/middlewares.js b/backend/routes/middlewares.js new file mode 100644 index 0000000..59c4fb1 --- /dev/null +++ b/backend/routes/middlewares.js @@ -0,0 +1,17 @@ +exports.isLoggedIn = (req, res, next) => { + if (req.isAuthenticated()) { + next(); + } else { + res.status(403).send('로그인 필요'); + } + }; + + exports.isNotLoggedIn = (req, res, next) => { + if (!req.isAuthenticated()) { + next(); + } else { + const message = encodeURIComponent('로그인한 상태입니다.'); + res.redirect(`/?error=${message}`); + } + }; + \ No newline at end of file diff --git a/backend/routes/page.js b/backend/routes/page.js new file mode 100644 index 0000000..9771c98 --- /dev/null +++ b/backend/routes/page.js @@ -0,0 +1,42 @@ +const express = require('express'); +const { isLoggedIn, isNotLoggedIn } = require('./middlewares'); +const { Post, User } = require('../models'); + +const router = express.Router(); + +router.use((req, res, next) => { + res.locals.user = req.user; + res.locals.followerCount = 0; + res.locals.followingCount = 0; + res.locals.followerIdList = []; + next(); +}); + +router.get('/profile', isLoggedIn, (req, res) => { + res.render('profile', { title: '내 정보 - NodeBird' }); +}); + +router.get('/join', isNotLoggedIn, (req, res) => { + res.render('join', { title: '회원가입 - NodeBird' }); +}); + +router.get('/', async (req, res, next) => { + try { + const posts = await Post.findAll({ + include: { + model: User, + attributes: ['id', 'nick'], + }, + order: [['createdAt', 'DESC']], + }); + res.render('main', { + title: 'collusic', + twits: posts, + }); + } catch (err) { + console.error(err); + next(err); + } +}); + +module.exports = router; diff --git a/backend/routes/post.js b/backend/routes/post.js new file mode 100644 index 0000000..3e5fe70 --- /dev/null +++ b/backend/routes/post.js @@ -0,0 +1,62 @@ +const express = require('express'); +const multer = require('multer'); +const path = require('path'); +const fs = require('fs'); + +const { Post, Hashtag } = require('../models'); +const { isLoggedIn } = require('./middlewares'); + +const router = express.Router(); + +try { + fs.readdirSync('uploads'); +} catch (error) { + console.error('uploads 폴더가 없어 uploads 폴더를 생성합니다.'); + fs.mkdirSync('uploads'); +} + +const upload = multer({ + storage: multer.diskStorage({ + destination(req, file, cb) { + cb(null, 'uploads/'); + }, + filename(req, file, cb) { + const ext = path.extname(file.originalname); + cb(null, path.basename(file.originalname, ext) + Date.now() + ext); + }, + }), + limits: { fileSize: 5 * 1024 * 1024 }, +}); + +router.post('/img', isLoggedIn, upload.single('img'), (req, res) => { + console.log(req.file); + res.json({ url: `/img/${req.file.filename}` }); +}); + +const upload2 = multer(); +router.post('/', isLoggedIn, upload2.none(), async (req, res, next) => { + try { + const post = await Post.create({ + content: req.body.content, + img: req.body.url, + UserId: req.user.id, + }); + const hashtags = req.body.content.match(/#[^\s#]*/g); + if (hashtags) { + const result = await Promise.all( + hashtags.map(tag => { + return Hashtag.findOrCreate({ + where: { title: tag.slice(1).toLowerCase() }, + }) + }), + ); + await post.addHashtags(result.map(r => r[0])); + } + res.redirect('/'); + } catch (error) { + console.error(error); + next(error); + } +}); + +module.exports = router; diff --git a/backend/routes/user.js b/backend/routes/user.js new file mode 100644 index 0000000..e69de29 diff --git "a/backend/uploads/\354\274\200\354\235\264\353\270\2241627135434953.PNG" "b/backend/uploads/\354\274\200\354\235\264\353\270\2241627135434953.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..a012039e5bc0fdc43be5a05aae89d0dad7bfb8e6 GIT binary patch literal 10694 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 literal 0 HcmV?d00001 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\2011627135861101.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\2011627135861101.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..4a8485970785d7e6b213639f39f131246a2b1e08 GIT binary patch literal 5806 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 literal 0 HcmV?d00001 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\2011627137619779.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\2011627137619779.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..4a8485970785d7e6b213639f39f131246a2b1e08 GIT binary patch literal 5806 zcmaiYbzGE9*YLGVEsC&9H!QuROG%2<(%q$WcZUcF($XQVG)R|-aZ`&lvZ7KdAtD`8 zQu{96_xIh;^ZxVB^}Ei@Z_dn_Gv~~l80<850f4Hb)KCBj1OOo12Vm!b7~mQagq(_s zmJ0X(T^MQU|7p?E(OtC|;ewou%zSWKdM*hrJ|U!-m>4~W^c`tYIYCh|B#4BB1WE>F zCMRbR<%9E!{$0fWssFB!|5pDrMdkh(fRw{_1272C3}V6qu>oKh2oDCr_5%z!9to~E z{kMSd@CgXPL^z}Z6aa(3U_wG7A}}Es?`l6_01t)_Cm=`4>!lOg_(V1LP*AZ6>-#QJ ziYnM&q? za3re&5>!L3W}jSONmE>$OSM9#qmj6uWwRws#*ATx`>n0{+||21iR;Uzfq76*?l`=d zb>6#sPc^(0H<%X^37viPCYSkYCZ%B&Iz-)ul2%kqc*9Iih$nvv3kV_1vq^ZDs3=>R zj2P6gz$*veVE$C!k-H@;E9^z^xKD_>u0ChFxsEJ@y}Oh=k9SpE;27jjWM%=$_=}Vw~7U|H^GWEuBEH_$eO^Gn(XLSlplO z2?>>t_X>^7UFe1=Z#%!8QB2%FRou#wXhamnxIH(+bsKHpGsH-E-*MCn&!wjMonn&F zzIJ)nfL|G%5^hmNX-6pGy2Hv2cH#}aDpxQXA2Om#J1re5tXB17Vnb@neRtlcDV-Q@-8V5Ne84H^+;2K^UNE zDDHlI$`XiDdufQH#ak7~Oan54K^;c2iiUAEo2fq96Gd@!?CNh0UC7W|w+3$ol|bH8 zBu%wz%Pps#7aV+yc$oxIF68onC?&DojDdq<;E;Z33_GX_MPzlO(AQ`8#jh^yKHKP| z)T?NN^3vG!Z=$j?fntJcQ6*N)HFL2fviYVCKPOV)#@X6iDG+_slYKJm=gXYbzFwzVD#=b z7C`(6XF3~WDGa7td-CSXr2*$<#eudAlhLtsTvnqZ_eU(CbEcBjXdsfQP}JIPT(X;&+)g+Uw*9PsbcuL}38UfgcbbAC_6 zN8{NVhId96@SaIF`dReH(D;;w&2?YLmq+TU=VLZH1*f**VhHv~RU}=iJOa`Q;&g!dgaE2v4T6 z@;6=r$*KgevSg1KOwv$y-g5`-wjW0B5Ec5yW>lWhl9r_xPiV=JcMdTov3Gb-z$K|b z(<%~f#1H6<3G77ZO(+_EyIaOIWAe4`@Wg)Kl8$+nqad-Z1}A|BXS{dFReA91-<$F4 zcFM(n>MR8d=$~>k6Fk2xIZ8!Xk`yGn>2dF;BJ{LhSMWd0nz~Dz_@T)@Ab6?Glr!rc z3A}@x-&uhbUzgQ4eQ+>eg+V)!rrNzM*1q`KtvoHY3;02Kbe(LP2&Bq;W642Bb??!J z@VA-D07}o!<5Z9R6#vjl?Gj=VXlr|8HptsCiS)gH{;u8Iv>W!^eZdOoh_?* zho5G;%`@DX$upRIkYpHSo}E^T=rpEwVs}*WKZtL|56FBRMzg6+Ji-QYR!#^>exe+s z28*d1a5?AX;ypAn3v94oofb)1s|$Mi^zc^g$}h&a9T_{ARZ$X>BhyzK<9NZGZk4C; zux7$#-9Oanq0`i7hqv;10fxn2%HBF>N6`=-XGdTG$;s)6X7)!aPM<$J>b^5Y(!bms zB&o<&SJQs3Zvm=qfVx}R$^)J>EU#aflqSQw@cCZ&H;pgAsr_z%aYus!f|~8Zv+Y)r zsEvST>Uo`j#U-jk?dN8>N<2F|FFqgVZ3eRF4R6m%bJm;J9-0NTPBAC@u&u-|dD$>x zvcfsV0%if(fza)oLKn5dHyReByPY#<+IiDkwqc{HkEPZqt?_}#B-)q+Xg{GSL6yqw z|5o&WUCuv>=42)mO>ZZZ%L>sPHq6%&^oa9H3(+(;Tx5dH=Vco3tI-&4WdrnM(Gb%oGka*T?|$@Fqq4X(d27Ic@e^aw@|wEUTRu*=ZNW2_L#~Z zRYu|~>k0z^K4#Sz{b-)rH%NYjhr>JwqS=_9B`aP&789-)M#a5CB>CN|BW&cUwb7#< zd}tsvFd^~-6FA&=I#9n#)`Zh6G^!b2yHRIq0O_4;n`HgX-{C+`6&Y-CdaVM_!-5YX zqu#`JVe8R#BfimU!N+>I$A0}59%3xQ+|4^<4bG8hW}n-+^M!~{mUTXE}iSu zt5Kt>eg+jcyM8`^Kgsju`Z>ar7@neOp+J7e$Gu9tXqGkk`v0;IKZ^dJO%J}Z=}b7A zt}X*@I|Dtc*6Eh1Bv1P4*`=)7L0}GC?Czz!fK53iE@!>hI%bW5FzwFdcdJ@zM4((DeQe(5YUN!SRuBBn?6L|ps z9W-9A=cf|xNrKMqikFsFTE5p%`*Kt2;De-!_owX1tT|XiciK+~&5;HdYWacr>+&W6 z>HcW*cz@>EGgmp`d8xy1NZQiVVOn=KETHyo9U7LEOY%)~zN{S!fIn5zsa~AGnnuUd z-r1(GZ=UuT_av33p~KX~Ct{|C-yl?pOqQ-aIPL3o#B`n{sL{Kr4cP~&*fxmK76njG z?1A2%jh66Oq2|%8or5WT+>72TlNzs@SsBPFor=-mi~TXHYcCycj}|q}?kDWV)A;Lh zu|2ba=H+3eqMwclD*3U3% zT)n_;Sd_K_|0rug<~;3KRk1abUs2`~==g~vp{%($+p8(sk&z@9Iph)SD9KffvpQ)| z6!NL775GC>GiVY`p##}Tw2-a?E{8Hx$Wxv70HKR zgv~1Kzpv+Tkwtf zBI51iTSm&FPxIv@c11oQ!(N?N<@x*Vh(7RHaH?E74*IPbbecPf!X>@xqMH75fu7_-Z$x0Ulx7tBfkI{a?9e6S0YVX3ucP@+f<5Bcm+X0;;*& zTW=$I7q4fiQHwXV51@{%wUT!rm%S{*G8{=0#9c%f8mK&R)>iUiSS@VC0O{n-r##0n`2*%t7= zdM=&m={%}wIywS%c|t?v*Vr$0GL+GWf9^u|%4?qwcPOtqdwTf)Pi zFC~}>y)brU^FN(u`;MuhQQ`$!bsazVq$YZYCT4T@%kJpHua^vX-qvd!w;0#LXnPSc z9~I8YL((0T;jq%-l(c0r#Cpw9$qbWX$bM!_kQ#?XU2CC0fWy;1$5&4`LGLb0Es1mA zr-;FPkKFb@p-#u7CQLpU^SOQh;bzR=U8yqgUN8o%=z&izl3^o-V&{%W8?si&`;w~c z;jOZ1T-%QQ>)q-|0Z4r66}YbL?u@Z0p; zk+5kxl5$-8?dcDxfy12)9wQUoKAVe_-O$yX^?Vb{;|98KlXvT4S$O>KjBEZJS43gN zTy4f{IuW+Cj6E`vDl>=5Lo;u0X`Xpa7ZXZt_}Ec=x2_`{Y^kglS4umdft!v zJ%QFOB6eoO>X!&(hG+r+-}k`%cU8j&Q#%*_qdnPP8&r!a3QuTA7uMu7T!^p?i}2;!*^q{Yg9sNV@GE zf;^8~j~WgWAfp{14_g8EU-MoAuC^L{t@bSmTub}O4c7?|tQ4o+-iQNE9{R(c5wEq> ziA^f^UAeJ9Gtn)@6#?qdl-yfVa}QR9%zyD0DL{)1h(`p_DZjHZwE8I~KBIwJmUSPp z#4;^HPt?$hkLmg#t$99NX8!(I;6L&&T$IVO?tH%7J)w!--r3I+Iut6^TS%y46r>sw zZz1`usl{({|FeHngrdcz+)_vb@jTCj^*2GxJAX5)>ZuP6B;n>xE=#I|LkCFTA!FT1 zcM^`!0Qqk$#@S*IZ-B@J%-xf%2zGX!j#&H>`mvYMNNwPu*CHrv6=#*vU{UH5*U%uA zHUD6_`tg9&t>JTRruO!=w8p6K<-1zO#w2MY8dJf^F-sDoO>)fEnQp9=9p2=2eL0Py)u-|rf zu+4?n*ux0V3|atyc*liu&ijktA`yi}&d1yKFOmynf(%lGoStDc0@RWq3Vx4O_@6!` z?PFhLOezZ-YW*d&$o>k!D-vH;|3s=z9JUZzcDGxa8ucvxDK`58=STjJt5$IZ@OC7N{E$ z?TVku&r#5G-+#Y{u91~FAj9jy0%mb1WO%(*8zLsfjWcP}6Jk}Ck7G5e5{NoNiB4z; za2TYDe3K>1VIECg%~`^yQQnW_MvQtCE|)iYy(2zFBw!8{uicW{NDHm~w%fn%7)F-( zc1BE9crjEUmO%^)Scdyk!CEa2!?{A{XnI%(^74ty%bKPmS>^JNBj8`Shy!BZi^3GD z-AK8vb3q|SKd#|_C7 zN317W-Cz6zPM%-N+5C96@5GBSp|*x#ftM+SqC8S(4XP*iX17WBL%zDo>S;6<{s9?l zL5*J1A=UTu{Pc0>ewnEG-DS77d4*k=0Um$DvX^&$5 z=YJV+tN5~ah8vtYh72XfY`Y@pe|pq-Xo&Qneu;M|ijD8~4K=#JHheXbY=};Lb zm6y+AYLX0A7lvwD(Jp0j#80n!z5k$s;*;mhN?v=6fBjwlrz7Y6R4V$k%vecWWaOU9 z7BYjoyf|)=boIiK`$U@fO7A((m-l7s(EeUKhF76dl`Sq*Qh&{@+|>5PO3@9``6@%` z6KACe?jfsmre=gE!<1dH2clp&@W*^8utJ(})+B}%tc?3{4-oip2=3W765mt-fWaY= ga0n`rtrv>B2mmhM0O6V-IOGo4&%hrJ$YE#x2g)&;b^rhX literal 0 HcmV?d00001 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\20121627135902037.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\20121627135902037.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b7cc90e3083af9c45f6159afdc49ca740d7b560e GIT binary patch literal 28111 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
  • r>Nd5e z?Vu5IH!{QB@_fB9LfMgmSd&i`Kw@oV0*z2;Mcuk{=#ibf3nL37^P^j+6SEpQaYt>7 z*WcQiD{LJi0zq&>t01^fH^pS<&|R~f(r_2 zn+LCX;(K_g3GxMDT26EPbZN?eHy=7_Mw*yLOq)6xyImhmqP$p|T{Ej$o+iX!&I^s0 z=_BmH>*CZV4PH)b)g9>`qm13CnIp+nQ|VhRi}8j-dF}M*mAsnK@z(bl>Ojs?IkK46 z0&Q4;5q&efJ%S`e=Ik8Bl;YPA#P;d1LdT|VtL$HMqS^yc3~=OH5Z_gV&eMDXxidm< zX;}!KOJ~GN{D_b~HRR0Vb-Z)KIdTI^T3ywIr8E>BO#VEFZU9YTof;S?0QwR^iWo)Lvb+K{AL~$J)Ohs}uU2JUlyLeuluw^XXz;5{uz&H>Ry(42Usin>tsRxSRFX zg@rE>JwT%2yqvZDwe!PCayvz+VHQ&*%$-KZ-JCIc>$(D5sQZ7)xJvV_$DErWnFw_S z^e|S8ULnnm?E4#dFK>lH8RrIdJ4qS&s+8G6g&N^mUOOc6x`3&d4lnnMeEM?mt*l)@qFbG- z#m4dP6={=3iSWv&4(l*DioI!Cu|Z|ra^sk$I3Vt)%uPlN-)FV10r{BS2UmTL&$l+d z6U8m|a^Xo{1T!lvsxg)M z;m*h^fG0LL3pt@2%+$sZXUuzE4Q3maFZ;w>l%Z2$B;{dxJqlm@WgHl-8a^0uTTTF^ zk`qYwWu!t614Sb_vR`Bd)Wz!0pi%(m9gxX_=*KZVn9B(}TIbz0J@CzI=n%sagk>wIL!nnn z(I2Weh)|$gv|~#ugvb^%lPI$rde=s^1DGeqFzK(;Q}EsJKNNrBlRbEMDM?~EC05|! z)CQ@3?|?1vtAzS1Hi1_+)nm(CKX$L@z0ND#VTLN}P!|_eFS-@x2diQd%^~|)U zD{#iT>3rhT(y3Wg{ABD9ajK;MbKgqx{%fDgmuf2=Y)2&6=^hjVdYp?jxbZheOA(!( zYb)|&!qX!wyRxtYDSo6KwhN6j`mIxME8A{qtdQ<&1(+T{^AWIiijjb*2&Q~N zD4m)Y`|GD%lAILWg0dRVXFK(rObJXDU-%S!Pb+gci*Dpfr20u7bG9Phi^-DU^#9Y; zRT5a`y7dR=We)LFUO^e?Op+ii$m%G#|7+i$HXRMRUAyUHvnKrcr_9!7eVQsp<;PoV zEf1YtcM{PPX{?bsQXAr1^vuJLb;(Xby<((-Zz7&qh{3xYM^g3diTz*41E6M zo{uTdQZ({x0`JdWiMqFL@$_I*|C;LkN`LI}aorOoK-vElBM1CTb4vhun55*VDSxN% zV6;$v9l0(_g?a~m$-6tHSCA`+1}6}Zt`x2?f-NzsZEoXMCeP03Yw;it)5GyLNUAd>Y&M$ zG?hEnv6)LAb!-QQiqN%HY-NWb2?_3easgSt!I+YNlEJ9~mh-%~~}OO>VZl-qQ~ul0ej|Kgi8 z?=hJ6W$X6O4vQ%X zyopoyfucxdJ51lyqr2o}y5;XvIsvfCH`!=GDZiCJC`~D+_}XrkR-Hq8a&-PHH;8H> zu0(uCFE25^Xz;e8o6|4IWm827wHQWO5AJ$h|AY5y+Eo=dclI>YSfFF{jgMsbQ(q)n2(p{b zPbn=gOe1Klwi7L1sW+#VlpR?*FMktz^iIV?ldj@%Z-1bW<+gijQ1_7v1L^x`MIJlt z=cJ5vAPCvqD!gALMDc;{;xWnIR)^I#Qssv+lJFp)lu0NjBm$?6VC=T^ zV(r81vc%j+PZ%h}D(|mee4Xwq)2c`#9fyuUHJB$sKGF&aHkT&H_3&sv`V^9FtC8N^ z;UfqV_KH0v8UuJu@f9pmnY>HZ^cJF`0op#UIRU0TAORkl`Gmgh0kmo1-rK0d&Hu@*jE~fvRr~tpR6!@;*{gr2!zGlV;*oOob=@>g zRK1qyc0gy4)r+4p!vUD?l4?~#SgKjh+XB0fA)SoL$Qgf&Xy-?|fn1;m1H7w$E83Iz zm~fDdVR9JXql`WtcsT>)Q=a?pl1nKM6}+*TzT&a;S|-_2`dHsqcpbgh#EO%IBH0Wi zJ_t9$hfzkLU`Qj;bDV2#VZD@9%OCz$b>FUrT zpjZpW2FfIHMKa_G@Yo2t5ye$Ti}T5FK&z{-^iq4zKe=!wbX0O%`WAgl8h)N*&FbiV zbRwd}^sHpU_VQVtKBg7iC zG$-HT`2MR-r-moT&#Nq7YIeLVWwj$!PVS~+y{grzP8j($iSu*;_N83{Ql6ds$MQJ6 z)v95xlRZedO$rxcO?rATU4eqNbkPq1@RRCa^v)+r|H{8!8$tWLExH%3%s5f~$ne=2 z$&j23vb~|ny8f48c&W%YURbnY04jBr&-6OvH<rOd%0USKcP zR=TqIV^hW;ejDS!T_$-g!feyeetdscWxE-+TtF$B^L#I7O2CCiFk| z>}Ku2tAyVYq5AmB`jg_?9;g!{!n&UCW@7#4L%Q(xzu?6B$piNcm7=-zE_W5tzpZ-A zYhyOS-_R9G|3bdLuQ=JHfW3vW`n}m&!Ih$J(np>K zK$i#k%1FOr9+F6^B7cBJQEnU=HsxvKkqlh?1A&y8zg+q57O7n+lY5!6JhJ5UEYG)D zbzs2!E3?027+oI|w-GoQ{Xd!MNPc6Z+l?P&h}1eAszuB-Rj1KFWtjV%{9JOLBkn+N zt2T9Jpq|!fM?7pB&>XE!zw|nnE`XUnixARmk1sFcWlcz7ruXcn1U^nYUD>=>ye{E@8P9(*Bw7)baT7v=YYU5 zbiEvhIZWlq*D6w)B)JaH3F^ydB_5s*ME1yYysoe=M{+4iVD)732Kw57vJ2$7s+VtZe)$qB-$Qhp&w4CIQ5DJ|l?N+~&IUnbU z%g|~#Gg97xpBVFvyNC_l>k@nuBO8-|+9~qdT_YrZ%uM0nT5yW!R%G15_Zw%qqmy-1 zx$l^kF-jA6B*>4d*`w;bC}>AV5;h9^7<@J>;m+yU76Jb3;vH-K6We?8qrHKnfmZBQXe}V$WYOlKyVG zUKdKT<_#ZRtKdRqWZpn0bl~KEmzec8$ca`929bwM_7=5Y@m8l@+lVJOS=zT5LS+SL zFh)MCrDXe5bX|W5V%atuyFGky(mFpj!*-&}UGszlRgMNs*1y+&>(?f52(F)oC1-O( za91*&hvyVi-@Xxf-Tx<2ntS6LUcZEzdJv1jVEMu1(4xzUt-Du357ZXz70pgtHF@#} zIN>4ZTLrsECFs6_vG99YhOc#@&6rgxxO!*F4J!->!%Qr(WRSM!cce^R*BA>7i?3k? zLpvN{?Ne&v>5{xV~8+@bw{%;XGDTQo=?_Sl0d{0jNY(zM2zq*Ax(!~qrjqfkh9 zaPO_0R9)4ed*L4ply3zL#vZgG_~AhtbYK%KDwnw+BCX}gi!kjOmmf4hLti)fSrVic zN|kU0}~ zq(nM}1QraEb;2p8CwHCU*W)lyD}AJ+*V+HZd3{eZ*gkfkg@m1lge`GL-mum5G%tH8 zT;15yU+NgQ!^GfMK8M6al@zQtlEkW( zfXVM4V}X&dk_&n@gBeOSCeA=^4@0~Vro&<$_X}BFa`b4v(^E-tBy7R!^_d|gs6GPn zhvzNqaD{qcS2FH1ooz_wut1IOlcu!@@5;AQ1usbP5={Z+Yvw=j`=_N@PC{&U6H+|1 zWr%LSsV4Kj-TRYs&|c_ES@Q_05h~({-9OH@OXX~-?Dd~#0Xk%p#F|5D-^PjN$6mau zO2~ZuUOMqs+}%&+SYiDCW4Ae?$=)E)kix}6k9kV^`P4lsI7R$@X)$>>mBC2+2qO|H zQ1O}R74Sx{I18Pc(}g$0#u8oOO(oK+Z-)f)>8!g@=>6YeLB`rLf4Fw|UjCb`Z1+I9 zlDK!9;7v}s$%3E+T*q38#p1g&9$(U6YZM0|7b$k!dV&iLv8x9cmM$AvjbvOfKDC!4 zPdQ&g5?m0+OKI1VgTHa=lkc+DNWp1T49jWtX73+q$8xFavrvME5=ZHAO-%D?iBYZC zn_OUC$sO7oJWgxS0n0hmaHK|}FC;Qpv1*Fd9OoxU6L}K*lTg+yGc!PZ1-+Be5Z-4wY z;|>yxi$C;)kvTEv`vs`E7*uJ!@}#n+45E5C~)C9pv{(H2WYWV6j0)LtB>5 zEjfDxzecUc?^D8a>)1?JQRijhP0o3K))0e(>ilCJ9hHkS964_x$^#FIC8n>8ypJrYQ+Z4A#E}2<0lqov#rrL22K{G6S9xGaSn&jt;c%lDre6Ui82- zIC43otUf_o*$Uyty!3@)bnLxtuD*6hQ$MptN!0iQ;8Uy$*RkPu#Av;U!Vh8U7sn)2 z?O-6Txs%$U!qwYvRMqx{$nC!Pc5aq|8Q9ykbAz(B=a;}JGN>2V$ zcD5a)H9U~C|L{})IxvIL%a^g*#k0>+qUtw^GuIFTsf?xiL1QvoEDs1}ux?^0q zC#aJDNw-e?@(z6e|LvlwHH3q|?4oVJLM8)t&2L9L^JA#d+py24+)X?@dN^rc=Ew!`pmR5yTD%d{)iGx={V2YFgc$;wd{P)?)`?dTA)!p>YRJ?+Bp>-F^<011kDcr_|W6T2>n(I=?|2P2E5l1V4S7>8cC--c?Cfi z0Crx=<9&RKVtR3sc%5NMdO}o7+LjTkSa^1}8#(!zK6%Ycq%9nHtb1vC{+NxnP#;FY z7vM*2w@zD={~>J+BB}}>!+k$xROJhXSKNX#y(RgN(XCOivPbie3;VdAXk#U(et)9R zeZ6m=xW|2v0>fe)I)JKN)_h@lf@Le=6o z6t;g0tq&w&-l#4Ihj*-hqOgi>*4q(0@6ac&KBzP|K};!)JV|}KTDARMSd#Ge!zpyA zn&(J0St;bcWAvA*#uy^sqt3Ib3fP_Ja)A+nE9*9Zx0_n(U7m30sZLa7>CDPqMLlb@ z#c8JP%muLDho!-f><9i9>6ca)X1T%~LVFp&7paFul-?T67nzi>A<^*wjzec^pyAQ8P=W&oRMPOG2=={wedx z%Ab~szzdxMg$5q>ATc7y=+v~E`Y@Rbo!nk;&xi&!EY zX4#{eh7@$pf^!Ze7PtP=QkWcfAxd3JhLOj!ZoJ#;P5GKdlJ*mYw%lQI8<4#{d=aH^ z^<~k9+g=Ws9fVQ(?zC3I_DqYaWI>ut>78|FT3G(~GZA@pRffAY#)pLFVh4$PEhqXJ z>So>PC-g8zIH)oN>@;q7gvIgVBcIk+WV_&+7~)AWINCSk+23i%k-_ba2U=1OO#Oprr=;|=x!l+iX3?Psgv$Hj&{{7C;_&#XV;Xxj4Pg5Y%x zU>XJ>y1}YuD{j*dx}1sp%_;QGi*LuU6~8_Agx7I`>}GqR(S8VMywH0kn0M0I?0-QF zmjFS@&8!Txk+8`e{k}APQ-4>#! zeXldWWP-JqlhJeuPg>IMBAlMIz_M{|yeq+){D6)*n6;A893Ayj=KDMqH*$HNfl~A#K2gjV%pu$6n=LTkc>vq zGnzb3;YE{&9{^|n#doOSlc$@YmM}!DIyWf%!b@oE#t`ES1zh!py;BCgr`A)VE%0Ah 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 literal 0 HcmV?d00001 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\20121627137675882.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\20121627137675882.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b7cc90e3083af9c45f6159afdc49ca740d7b560e GIT binary patch literal 28111 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
  • r>Nd5e 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%0Ah z^%dMY1Hz1W`^~ozRxBO_CdG0)lEoya$f$2{z+_ zz?>gBp_4~3z7(die0w!KdvWTFBUlUB5#|=nW~6qTbE@guUmBmkFEDra3G`&ye5?LJ ziOY%qe78DbgO_;ifF+7vw3M|GBsFX}!L(7v2=^ZPd;4XXBgKDU3{^~OUjd20>e2Z| zAAde;yPs3T`;6gBd|1w{p&9DWyf5qS)~NY3ZnbhfySwbRkF)3Z-fu|^h(UUgX^u9i z>fHo=(C}LawSMO*axY?3cG@QjubB%Z*(+7((fNU(hPJC<5~HXBNtIY^!`b<=w3Gi# z_jWpZ)K8p%rusX4UL2eic(I`GxgT%7zbENbg93l`i{E*MSo#kEllUm z&%Kg8g>yYIS-mWVpZm~PUm<{$72vw2pi_BsE1y_Y^nfnp#Z$T@2Dd0*-7}^A(IB)n zH3&Q{@|Dk8c9N3Ixe-O@3$J&DYSAj5^<2(B`&B?p26QSZE>XCNAz{1KOLKx~xj~Rw z*btmw)HK^pCDFa=2y&R)0MAm$H@P!2== zVb_o~s%-o9_t(S*V4lcFE|cW0@n5LyhL>$q(YJaLwmFi`{WYpz&A(I~qCI9%=F9pk z$fe2Oz3r}!UZ-J$E3SWQ`){npup`E>Xs?#jcn{|Hw$rVhp0m$j&u^_ao6_|o%r5|6 zY_Vt3ON^o432)oAM=$3NjNP|(H@9nRpp3rShW|uqT8GvahHL?-js8CPe1pz~^Y;p3 z^;9~qC?`e~+uLf_F3P-ss;JIglv(~ z6qwy)_e{_Kf27x7Z)5c(0wfvK;GQUi5m5D}o*h{ai)k-HjFdN@_ItAR2C#c*I;>(Bt+LuCXt3 ze&Xx=OC}eu3cF^_G@Uh@Hl&G~105+WnF@IuQ` z8AmhsaR)7Wr*JS+@gMbzTo#CpjNy|RcpS^8?5XF>sTGG2&P7dJ*MdIU4ed{&lD zptqZN=37lsXi%qzYUZp}7h^ETTl_AafRltc`{ajYdh~!>pzu$tx6zBUCVnlqv~{ zMBO;$4y(%s>PNT|_vTgGZXW5tDO_|Q(xFG=$S3jER#LSlQU6%z2-??ijqKis_P6>r zgJH%iXi8Jt@w?F8I9k}s#Dz({fdG)Nr`VH;gH7G(ao{5tL=~H8o#H@_ENc78?I&Lj z{c3!cmcXYb4EZKQMHf$kQIeMer|nloibA!ZvBIT`FU2+?imWXGY~-}-(sHvI-k>4s zN?3+wRo!KYCR=G)JcHUd8d2J=W;B>5id&Ao_0&0BX*qQ2^dYQ4go6_(@dU7{`Ilka zUi@~duH@R=ka624z%KWSv7dHJc;F2BD-F=ngbG z(3&|cXyaGDh4&@!K|$5#XfVwTp?~CpOuDI4Z2PxU2*$TC}O(R6`ucXvpGn+bKM*Z5I--4i#tzV&|6__77*6_l4a3WF9 z{A*1tD(vY`NB*+7EsAXUg~Dz>&vqL2`y)i4| z3q7pa_Gy*N6g!FUGr)ec-GE~^hdyIqdTYjwlI+xY8aqnMuS?Q0Y_p;B{dc0*9@Q|> zGjquGAKF5rJ#j&$-DQ*)@Z(~n7h9UVZVj$}9RDYX^p-D^oK6&2Go%+CuhMzlxO9KM zpW(z|Rzo|aOJ|#xyV+L@S<_NQnzxn9o!5!e$OjbiFs0xmT;?p?wp!JtHT7;_kIIc8 z^dMr3-szcB;fOPj2YbOwDlHr$io7tNw=U$VxvZ833W{dHr;>bMZCQ2=Qn@ST79+h3Q9sWo8lG8=dN?KhZqO za>u38wuum(cx}DbDz^Rnbk=)Yv^?u_Xa7lP@2^I+04S@zn5O^Oao5a_Rsd4}?5qTf zwjwW=e?8*By99q5)U7xFY(J9o{==_n``6D8mEvSnejc1x2wj{1nWh8}f>X0hL9hU@ z$J6SCXz9rkI(N7Xq8|Ny<;`DWpLqduCRZBWN>CIw$&6`6tu;70c<=q@GQFY>!^Yp}CVy(>kCl z(lI-A^_iJw`$aU+e%g@O)4HINe=^NL__jO|)%TgZY{Y{&{M>nX?YP2*pQHZ|YUS8J literal 0 HcmV?d00001 diff --git a/backend/views/error.html b/backend/views/error.html new file mode 100644 index 0000000..87cc731 --- /dev/null +++ b/backend/views/error.html @@ -0,0 +1,7 @@ +{% extends 'layout.html' %} + +{% block content %} +

    {{message}}

    +

    {{error.status}}

    +
    {{error.stack}}
    +{% endblock %} diff --git a/backend/views/join.html b/backend/views/join.html new file mode 100644 index 0000000..621a9e3 --- /dev/null +++ b/backend/views/join.html @@ -0,0 +1,29 @@ +{% extends 'layout.html' %} + +{% block content %} +
    +
    +
    + +
    +
    + +
    +
    + + +
    + +
    +
    +{% endblock %} + +{% block script %} + +{% endblock %} diff --git a/backend/views/layout.html b/backend/views/layout.html new file mode 100644 index 0000000..c46c369 --- /dev/null +++ b/backend/views/layout.html @@ -0,0 +1,53 @@ + + + + + {{title}} + + + + + +
    +
    +
    + {% if user and user.id %} +
    {{'안녕하세요! ' + user.nick + '님'}}
    + + 내 프로필 + 로그아웃 + {% else %} +
    +
    + + +
    +
    + + +
    + 회원가입 + +
    + {% endif %} +
    + +
    + {% block content %} + {% endblock %} +
    + + + {% block script %} + {% endblock %} + + diff --git a/backend/views/main.html b/backend/views/main.html new file mode 100644 index 0000000..6cda02e --- /dev/null +++ b/backend/views/main.html @@ -0,0 +1,65 @@ +{% extends 'layout.html' %} + +{% block content %} +
    + {% if user %} +
    +
    +
    + +
    +
    + + +
    +
    + + + +
    +
    +
    + {% endif %} +
    +
    + + +
    + {% for twit in twits %} +
    + + +
    {{twit.User.nick}}
    + {% if not followerIdList.includes(twit.User.id) and twit.User.id !== user.id %} + + {% endif %} +
    {{twit.content}}
    + {% if twit.img %} +
    섬네일
    + {% endif %} +
    + {% endfor %} +
    +
    +{% endblock %} + +{% block script %} + +{% endblock %} From 77212507b54014bec100a07ec9deb8460d8d18bb Mon Sep 17 00:00:00 2001 From: dongE <68381747+Daae-Kim@users.noreply.github.com> Date: Sun, 25 Jul 2021 19:06:45 +0900 Subject: [PATCH 02/16] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/models/user.js | 26 +++++++++++++------------- backend/passport/localStrategy.js | 2 +- backend/routes/auth.js | 8 -------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/backend/models/user.js b/backend/models/user.js index 42479ac..3a448d3 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -16,10 +16,10 @@ module.exports = class User extends Sequelize.Model { type: Sequelize.STRING(100), allowNull: true, }, - provider: {//로그인 제공자 + provider: {//로그인 제공자 (2021collusic에서는 local) type: Sequelize.STRING(10), allowNull: false, - defaultValue: 'local',//local을 통해 로그인 한 상태 카카오면 kakao + defaultValue: 'local', }, introduce: { type: Sequelize.TEXT, @@ -35,7 +35,7 @@ module.exports = class User extends Sequelize.Model { underscored: false, modelName: 'User', tableName: 'users', - paranoid: true, //deleted at 삭제한척하는 + paranoid: true, charset: 'utf8', collate: 'utf8_general_ci', //한글 지원 }); @@ -43,15 +43,15 @@ module.exports = class User extends Sequelize.Model { static associate(db) { db.User.hasMany(db.Post);//user has many db.post - db.User.belongsToMany(db.User, { - foreignKey: 'followingId', //둘다 foreignkey가 userid이면 모르니까. 선언. - as: 'Followers', - through: 'Follow', - });//사용자와 사용자간의 관계: 팔로잉 팔로워 관계 - db.User.belongsToMany(db.User, { - foreignKey: 'followerId', - as: 'Followings', - through: 'Follow', - }); + // db.User.belongsToMany(db.User, { + // foreignKey: 'followingId', //둘다 foreignkey가 userid이면 모르니까. 선언. + // as: 'Followers', + // through: 'Follow', + // });//사용자와 사용자간의 관계: 팔로잉 팔로워 관계 + // db.User.belongsToMany(db.User, { + // foreignKey: 'followerId', + // as: 'Followings', + // through: 'Follow', + // }); } }; diff --git a/backend/passport/localStrategy.js b/backend/passport/localStrategy.js index 06270a1..05de452 100644 --- a/backend/passport/localStrategy.js +++ b/backend/passport/localStrategy.js @@ -27,4 +27,4 @@ module.exports = () => {//로그인 로직. 모듈임. } })); }; -//email, password로 로그인하는 것을 적은 파일 \ No newline at end of file +//email, password로 로그인하는 것을 적은 파일 diff --git a/backend/routes/auth.js b/backend/routes/auth.js index 7d6e5ec..e69a97f 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -51,12 +51,4 @@ router.get('/logout', isLoggedIn, (req, res) => { res.redirect('/'); }); -router.get('/kakao', passport.authenticate('kakao')); - -router.get('/kakao/callback', passport.authenticate('kakao', { - failureRedirect: '/', -}), (req, res) => { - res.redirect('/'); -}); - module.exports = router; From e247d2327c197f3e3fca51a9b78df57fad80e24b Mon Sep 17 00:00:00 2001 From: dongE <68381747+Daae-Kim@users.noreply.github.com> Date: Sun, 25 Jul 2021 19:13:50 +0900 Subject: [PATCH 03/16] Delete user.js --- backend/routes/user.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 backend/routes/user.js diff --git a/backend/routes/user.js b/backend/routes/user.js deleted file mode 100644 index e69de29..0000000 From 86bea62d664c8d063b724e5eb9113fbbccf1bfec Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Wed, 28 Jul 2021 16:08:16 +0900 Subject: [PATCH 04/16] =?UTF-8?q?Sequelize=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app.js | 3 +- backend/controllers/index.js | 36 +++++++ backend/controllers/mypage/index.js | 30 ++++++ backend/controllers/requestProjects/index.js | 15 +++ backend/controllers/user/index.js | 2 + backend/models/comment.js | 44 +++++++++ backend/models/hashtag.js | 27 ------ backend/models/index.js | 25 ++--- backend/models/post.js | 84 ++++++++++++----- backend/models/user.js | 89 +++++++++--------- backend/routes/auth.js | 45 +++++---- backend/routes/page.js | 80 ++++++++++------ backend/routes/post.js | 34 +++---- ...alk_20210621_165128562_031627275828320.jpg | Bin 0 -> 66022 bytes 14 files changed, 344 insertions(+), 170 deletions(-) create mode 100644 backend/controllers/index.js create mode 100644 backend/controllers/mypage/index.js create mode 100644 backend/controllers/requestProjects/index.js create mode 100644 backend/controllers/user/index.js create mode 100644 backend/models/comment.js delete mode 100644 backend/models/hashtag.js create mode 100644 backend/uploads/KakaoTalk_20210621_165128562_031627275828320.jpg diff --git a/backend/app.js b/backend/app.js index ec9c518..fd16517 100644 --- a/backend/app.js +++ b/backend/app.js @@ -32,7 +32,7 @@ sequelize app.use(morgan("dev")); app.use(express.static(path.join(__dirname, "public"))); -app.use('/img', express.static(path.join(__dirname, "uploads"))); +app.use("/img", express.static(path.join(__dirname, "uploads"))); app.use(express.json()); app.use(express.urlencoded({ extended: true })); @@ -53,7 +53,6 @@ app.use(passport.session()); app.use("/", pageRouter); app.use("/auth", authRouter); app.use("/post", postRouter); -//app.use("/user", userRouter); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); diff --git a/backend/controllers/index.js b/backend/controllers/index.js new file mode 100644 index 0000000..a42326d --- /dev/null +++ b/backend/controllers/index.js @@ -0,0 +1,36 @@ +// const express = require("express"); +// const router = express.Router(); + +// const userInformationAPI = (req, res) => { +// try { +// const myinfo = await User.findOne({ +// attributes: ["email", "introduce"], +// where: { +// email: req.user.email, +// }, +// }); +// res.status(200).json({ +// email: myinfo, +// }); +// } catch (err) { +// res.status(400).json({ +// error: err, +// }); +// } +// }; + +const createContributeProjectAPI = (req, res) => {}; +const readRequestProjectsAPI = (req, res) => {}; +const readContributeProjectsAPI = (req, res) => { + if (!id) { + res.status(400).json({ error: "you don't send requestProject Id!" }); + } + + res.status(200).json({ contributeProject: projects }); +}; +module.exports = { + userInformationAPI, + createContributeProjectAPI, + readRequestProjectsAPI, + readContributeProjectsAPI, +}; diff --git a/backend/controllers/mypage/index.js b/backend/controllers/mypage/index.js new file mode 100644 index 0000000..0f6f3c9 --- /dev/null +++ b/backend/controllers/mypage/index.js @@ -0,0 +1,30 @@ +// const express = require("express"); +// const router = express.Router(); + +// const readMyPageAPI = (req, res) => { +// const User = await User.findOne({ +// attributes: ["nickname", "imagePath", "introduce", "email"], +// where: { +// nickname: req.user.nickname, +// imagePath: req.user.imagePath, +// introduce: req.user.introduce, +// email: req.user.email, +// }, +// }); + +// res.status(200).json({ +// nickname: `${nickname}`, +// imagePath: `${imagePath}`, +// introduce: `${introduce}`, +// email: `${email}`, +// }); +// }; + +// const updateUserInfoAPI = (req, res) => {}; +// const deleteUserInfoAPI = (req, res) => {}; + +// module.exports = { +// readMyPageAPI, +// updateUserInfoAPI, +// deleteUserInfoAPI, +// }; diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js new file mode 100644 index 0000000..512ca9a --- /dev/null +++ b/backend/controllers/requestProjects/index.js @@ -0,0 +1,15 @@ +// const express = require("express"); +// const router = express.Router(); + +// const readAllRequestProjectAPI = (req, res) => { +// res.status(200).json({}); +// }; + +// const deleteRequestProjectAPI = (req, res) => { +// res.status(200).json({}); +// }; + +// module.exports = { +// readAllRequestProjectAPI, +// deleteRequestProjectAPI, +// }; diff --git a/backend/controllers/user/index.js b/backend/controllers/user/index.js new file mode 100644 index 0000000..81d9240 --- /dev/null +++ b/backend/controllers/user/index.js @@ -0,0 +1,2 @@ +// const express = require("express"); +// const router = express.Router(); diff --git a/backend/models/comment.js b/backend/models/comment.js new file mode 100644 index 0000000..389ab34 --- /dev/null +++ b/backend/models/comment.js @@ -0,0 +1,44 @@ +const Sequelize = require("sequelize"); + +module.exports = class Comment extends Sequelize.Model { + static init(sequelize) { + return super.init( + { + c_description: { + type: Sequelize.TEXT, + allowNull: false, + }, + c_audioFile: { + type: Sequelize.STRING(140), + allowNull: false, + }, + c_lyrics_text: { + type: Sequelize.TEXT, + allowNull: true, + }, + selected_status: { + type: Sequelize.BOOLEAN, + allowNull: false, + }, + }, + { + sequelize, + timestamps: true, + underscored: false, + modelName: "Comment", + tableName: "comment", + paranoid: false, + charset: "utf8mb4", + collate: "utf8mb4_general_ci", + } + ); + } + + static associate(db) { + db.Comment.belongsTo(db.Post, { foreignKey: "pid", sourceKey: "id" }); + db.Comment.belongsTo(db.User, { foreignKey: "uid", sourceKey: "id" }); + } +}; +//requestid 외래키 +//uid 외래키 +//constraint uid foreign key uid references user.uid on delete cascade on update cascade diff --git a/backend/models/hashtag.js b/backend/models/hashtag.js deleted file mode 100644 index 0df3476..0000000 --- a/backend/models/hashtag.js +++ /dev/null @@ -1,27 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = class Hashtag extends Sequelize.Model { - static init(sequelize) { - return super.init({ - title: {//해시태그 이름만 - type: Sequelize.STRING(15), - allowNull: false, - unique: true, - }, - }, { - sequelize, - timestamps: true, - underscored: false, - modelName: 'Hashtag', - tableName: 'hashtags', - paranoid: false, - charset: 'utf8mb4', - collate: 'utf8mb4_general_ci', - }); - } - - static associate(db) { - db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' }); - } -}; - diff --git a/backend/models/index.js b/backend/models/index.js index 9545b97..f9110af 100644 --- a/backend/models/index.js +++ b/backend/models/index.js @@ -1,26 +1,29 @@ -const Sequelize = require('sequelize'); -const env = process.env.NODE_ENV || 'development'; //config.json의 development 가져오기 -const config = require('../config/config')[env]; //config.json의 development 가져오기 -const User = require('./user'); -const Post = require('./post'); -const Hashtag = require('./hashtag'); +const Sequelize = require("sequelize"); +const env = process.env.NODE_ENV || "development"; //config.json의 development 가져오기 +const config = require("../config/config")[env]; //config.json의 development 가져오기 +const User = require("./user"); +const Post = require("./post"); +const Comment = require("./comment"); const db = {}; const sequelize = new Sequelize( - config.database, config.username, config.password, config, + config.database, + config.username, + config.password, + config ); db.sequelize = sequelize; db.User = User; db.Post = Post; -db.Hashtag = Hashtag; +db.Comment = Comment; //사람과 게시글은 1:1관계, 게시글과 해시태그는 1:N 관계 User.init(sequelize); Post.init(sequelize); -Hashtag.init(sequelize); +Comment.init(sequelize); User.associate(db); Post.associate(db); -Hashtag.associate(db); +Comment.associate(db); -module.exports = db; \ No newline at end of file +module.exports = db; diff --git a/backend/models/post.js b/backend/models/post.js index 30411b3..5e966e1 100644 --- a/backend/models/post.js +++ b/backend/models/post.js @@ -1,30 +1,70 @@ -const Sequelize = require('sequelize'); +const Sequelize = require("sequelize"); module.exports = class Post extends Sequelize.Model { static init(sequelize) { - return super.init({ - content: {//id 생략. -> sequlize에서는 id가 생략될 수 있음. - type: Sequelize.STRING(140), - allowNull: false, + return super.init( + { + title: { + //id 생략. -> sequlize에서는 id가 생략될 수 있음. + type: Sequelize.STRING(140), + allowNull: false, + }, + description: { + type: Sequelize.TEXT, + allowNull: true, + }, + audioFile: { + type: Sequelize.STRING(140), + allowNull: false, + }, + state: { + type: Sequelize.BOOLEAN, + allowNull: false, + }, + field_free: { + type: Sequelize.BOOLEAN, + allowNull: false, + }, + lyrics_text: { + type: Sequelize.TEXT, + allowNull: true, + }, + genre: { + type: Sequelize.STRING(140), + allowNull: true, + }, + mood: { + type: Sequelize.STRING(140), + allowNull: true, + }, + music_field: { + type: Sequelize.BOOLEAN, + allowNull: true, + }, + lyrics_field: { + type: Sequelize.BOOLEAN, + allowNull: true, + }, + instrument_field: { + type: Sequelize.BOOLEAN, + allowNull: true, + }, }, - img: { - type: Sequelize.STRING(200), - allowNull: true, - },//img 한개만 올릴 수 있음. - }, { - sequelize, - timestamps: true, - underscored: false, - modelName: 'Post', - tableName: 'posts', - paranoid: false, //deleted at false -> 게시글 삭제시 완전 삭제 - charset: 'utf8mb4', //이모티콘 - collate: 'utf8mb4_general_ci', - }); + { + sequelize, + timestamps: true, + underscored: false, + modelName: "Post", + tableName: "posts", + paranoid: false, //deleted at false -> 게시글 삭제시 완전 삭제 + charset: "utf8mb4", //이모티콘 + collate: "utf8mb4_general_ci", + } + ); } static associate(db) { - db.Post.belongsTo(db.User);//post belongs to many user , has many 만 있어도 되지만 둘다 쓰는게 좋음. - db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });//belongs to many 는 N:N 관계 - }// through: 'PostHashtag'는 중간 테이블 이름. N:N관계는 중간테이블이 생김. + db.Post.belongsTo(db.User, { foreignKey: "uid", sourceKey: "id" }); + db.Post.hasMany(db.Comment, { foreignKey: "pid", targetKey: "id" }); + } }; diff --git a/backend/models/user.js b/backend/models/user.js index 3a448d3..140e5c3 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -1,57 +1,52 @@ -const Sequelize = require('sequelize'); +const Sequelize = require("sequelize"); //db 테이블과 sequelize 연동을 위한 코드 module.exports = class User extends Sequelize.Model { static init(sequelize) { - return super.init({ - email: { - type: Sequelize.STRING(40), - allowNull: true, - unique: true, + return super.init( + { + email: { + type: Sequelize.STRING(40), + allowNull: true, + unique: true, + }, + nick: { + type: Sequelize.STRING(15), + allowNull: false, + }, + password: { + type: Sequelize.STRING(100), + allowNull: true, + }, + provider: { + //로그인 제공자 + type: Sequelize.STRING(10), + allowNull: false, + defaultValue: "local", + }, + introduce: { + type: Sequelize.TEXT, + allowNull: true, + }, + imagePath: { + type: Sequelize.STRING(100), + allowNull: true, + }, }, - nick: { - type: Sequelize.STRING(15), - allowNull: false,//sns 로그인인경우 없음. - }, - password: { - type: Sequelize.STRING(100), - allowNull: true, - }, - provider: {//로그인 제공자 (2021collusic에서는 local) - type: Sequelize.STRING(10), - allowNull: false, - defaultValue: 'local', - }, - introduce: { - type: Sequelize.TEXT, - allowNull: true, - }, - imagePath: { - type: Sequelize.STRING(100), - allowNull: true + { + sequelize, + timestamps: true, //생성일 수정일 삭제일이 기록 + underscored: false, + modelName: "User", + tableName: "users", + paranoid: true, + charset: "utf8", + collate: "utf8_general_ci", //한글 지원 } - }, { - sequelize, - timestamps: true, //생성일 수정일 삭제일이 기록 - underscored: false, - modelName: 'User', - tableName: 'users', - paranoid: true, - charset: 'utf8', - collate: 'utf8_general_ci', //한글 지원 - }); + ); } static associate(db) { - db.User.hasMany(db.Post);//user has many db.post - // db.User.belongsToMany(db.User, { - // foreignKey: 'followingId', //둘다 foreignkey가 userid이면 모르니까. 선언. - // as: 'Followers', - // through: 'Follow', - // });//사용자와 사용자간의 관계: 팔로잉 팔로워 관계 - // db.User.belongsToMany(db.User, { - // foreignKey: 'followerId', - // as: 'Followings', - // through: 'Follow', - // }); + db.User.hasMany(db.Post, { foreignKey: "uid", targetKey: "id" }); + db.User.hasMany(db.Comment, { foreignKey: "uid", targetkey: "id" }); } }; diff --git a/backend/routes/auth.js b/backend/routes/auth.js index e69a97f..c659bc6 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -1,38 +1,47 @@ -const express = require('express'); -const passport = require('passport'); -const bcrypt = require('bcrypt'); -const { isLoggedIn, isNotLoggedIn } = require('./middlewares'); -const User = require('../models/user'); +const express = require("express"); +const passport = require("passport"); +const bcrypt = require("bcrypt"); +const { isLoggedIn, isNotLoggedIn } = require("./middlewares"); +const User = require("../models/user"); const router = express.Router(); -router.post('/join', isNotLoggedIn, async (req, res, next) => { +router.post("/join", isNotLoggedIn, async (req, res, next) => { const { email, nick, password } = req.body; try { - const exUser = await User.findOne({ where: { email } });//기존이메일로 가입한 사람이 있나? + const exUser = await User.findOne({ where: { email } }); //기존이메일로 가입한 사람이 있나? if (exUser) { - return res.redirect('/join?error=exist');//프론트에서 이미 가입한 메일이라고 알림 + return res.status(401).json({ + msg: "User already exist", + success: false, + }); //프론트에서 이미 가입한 메일이라고 알림 } - const hash = await bcrypt.hash(password, 12);//기존이메일이 아니면 password를 해쉬화 해서 저장 + const hash = await bcrypt.hash(password, 12); //기존이메일이 아니면 password를 해쉬화 해서 저장 await User.create({ email, nick, password: hash, }); - return res.redirect('/'); + return res.status(200).json({ + msg: "SignIn Success", + success: true, + email: req.body.email, + nick: req.body.nick, + }); } catch (error) { console.error(error); return next(error); } }); -router.post('/login', isNotLoggedIn, (req, res, next) => { - passport.authenticate('local', (authError, user, info) => { +router.post("/login", isNotLoggedIn, (req, res, next) => { + passport.authenticate("local", (authError, user, info) => { if (authError) { console.error(authError); return next(authError); } - if (!user) {//로그인 실패한 경우 + if (!user) { + //로그인 실패한 경우 return res.redirect(`/?loginError=${info.message}`); } return req.login(user, (loginError) => { @@ -40,15 +49,19 @@ router.post('/login', isNotLoggedIn, (req, res, next) => { console.error(loginError); return next(loginError); } - return res.redirect('/'); + + return res.status(200).json({ + user: user, + email: req.user, + }); }); })(req, res, next); // 미들웨어 내의 미들웨어에는 (req, res, next) 꼭 붙여야함. }); -router.get('/logout', isLoggedIn, (req, res) => { +router.get("/logout", isLoggedIn, (req, res) => { req.logout(); req.session.destroy(); - res.redirect('/'); + res.redirect("/"); }); module.exports = router; diff --git a/backend/routes/page.js b/backend/routes/page.js index 9771c98..765f67d 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -1,9 +1,12 @@ -const express = require('express'); -const { isLoggedIn, isNotLoggedIn } = require('./middlewares'); -const { Post, User } = require('../models'); - +const express = require("express"); +const { isLoggedIn, isNotLoggedIn } = require("./middlewares"); +const { Post, User } = require("../models"); const router = express.Router(); +const mypageController = require("../controllers/mypage"); +const requestProjectController = require("../controllers/requestProjects"); +const userController = require("../controllers/user"); + router.use((req, res, next) => { res.locals.user = req.user; res.locals.followerCount = 0; @@ -12,31 +15,52 @@ router.use((req, res, next) => { next(); }); -router.get('/profile', isLoggedIn, (req, res) => { - res.render('profile', { title: '내 정보 - NodeBird' }); -}); +// router.get("/mypage/:id", mypageController.userInformationAPI); +// router.put("/mypage/:id", mypageController.createContributeProjectAPI); +// router.delete("/mypage/:id", mypageController.deleteUserInfoAPI); -router.get('/join', isNotLoggedIn, (req, res) => { - res.render('join', { title: '회원가입 - NodeBird' }); -}); +// router.get("/req-projects", requestProjectController.readAllRequestProjectAPI); -router.get('/', async (req, res, next) => { - try { - const posts = await Post.findAll({ - include: { - model: User, - attributes: ['id', 'nick'], - }, - order: [['createdAt', 'DESC']], - }); - res.render('main', { - title: 'collusic', - twits: posts, - }); - } catch (err) { - console.error(err); - next(err); - } -}); +// router.get("/user/refresh", userController); +// router.get("/mypage", isLoggedIn, async (req, res, next) => { +// try { +// const myinfo = await User.findOne({ +// attributes: ["email", "introduce"], +// where: { +// email: req.user.email, +// }, +// }); +// res.status(200).json({ +// email: myinfo, +// }); +// } catch (err) { +// res.status(400).json({ +// error: err, +// }); +// } +// }); + +// router.get("/join", isNotLoggedIn, (req, res) => { +// res.render("join", { title: "회원가입 - collusic" }); +// }); + +// router.get("/", async (req, res, next) => { +// try { +// const posts = await Post.findAll({ +// include: { +// model: User, +// attributes: ["id", "nick"], +// }, +// order: [["createdAt", "DESC"]], +// }); +// res.render("main", { +// title: "collusic", +// twits: posts, +// }); +// } catch (err) { +// console.error(err); +// next(err); +// } +// }); module.exports = router; diff --git a/backend/routes/post.js b/backend/routes/post.js index 3e5fe70..579a10f 100644 --- a/backend/routes/post.js +++ b/backend/routes/post.js @@ -1,24 +1,24 @@ -const express = require('express'); -const multer = require('multer'); -const path = require('path'); -const fs = require('fs'); +const express = require("express"); +const multer = require("multer"); +const path = require("path"); +const fs = require("fs"); -const { Post, Hashtag } = require('../models'); -const { isLoggedIn } = require('./middlewares'); +const { Post, Contri } = require("../models"); +const { isLoggedIn } = require("./middlewares"); const router = express.Router(); try { - fs.readdirSync('uploads'); + fs.readdirSync("uploads"); } catch (error) { - console.error('uploads 폴더가 없어 uploads 폴더를 생성합니다.'); - fs.mkdirSync('uploads'); + console.error("uploads 폴더가 없어 uploads 폴더를 생성합니다."); + fs.mkdirSync("uploads"); } const upload = multer({ storage: multer.diskStorage({ destination(req, file, cb) { - cb(null, 'uploads/'); + cb(null, "uploads/"); }, filename(req, file, cb) { const ext = path.extname(file.originalname); @@ -28,13 +28,13 @@ const upload = multer({ limits: { fileSize: 5 * 1024 * 1024 }, }); -router.post('/img', isLoggedIn, upload.single('img'), (req, res) => { +router.post("/img", isLoggedIn, upload.single("img"), (req, res) => { console.log(req.file); res.json({ url: `/img/${req.file.filename}` }); }); const upload2 = multer(); -router.post('/', isLoggedIn, upload2.none(), async (req, res, next) => { +router.post("/", isLoggedIn, upload2.none(), async (req, res, next) => { try { const post = await Post.create({ content: req.body.content, @@ -44,15 +44,15 @@ router.post('/', isLoggedIn, upload2.none(), async (req, res, next) => { const hashtags = req.body.content.match(/#[^\s#]*/g); if (hashtags) { const result = await Promise.all( - hashtags.map(tag => { + hashtags.map((tag) => { return Hashtag.findOrCreate({ where: { title: tag.slice(1).toLowerCase() }, - }) - }), + }); + }) ); - await post.addHashtags(result.map(r => r[0])); + await post.addHashtags(result.map((r) => r[0])); } - res.redirect('/'); + res.redirect("/"); } catch (error) { console.error(error); next(error); diff --git a/backend/uploads/KakaoTalk_20210621_165128562_031627275828320.jpg b/backend/uploads/KakaoTalk_20210621_165128562_031627275828320.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65497997180c75fae462c502dc3c3e7f956f8dc9 GIT binary patch literal 66022 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 `j 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 GKmXa-7u*d1 literal 0 HcmV?d00001 From 1908969a83268c86b93479af03e32cddd0281fe3 Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Wed, 28 Jul 2021 22:50:40 +0900 Subject: [PATCH 05/16] =?UTF-8?q?requestProjects=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env | 3 +- backend/app.js | 2 + backend/config/config.json | 8 +-- backend/controllers/mypage/index.js | 56 ++++++++++---------- backend/controllers/requestProjects/index.js | 42 ++++++++++----- backend/models/index.js | 2 +- backend/models/user.js | 6 +-- backend/package-lock.json | 9 ++++ backend/package.json | 1 + backend/routes/auth.js | 21 ++++---- backend/routes/middlewares.js | 44 +++++++++------ backend/routes/page.js | 16 ++++-- 12 files changed, 130 insertions(+), 80 deletions(-) diff --git a/backend/.env b/backend/.env index c7fbc11..a8ef446 100644 --- a/backend/.env +++ b/backend/.env @@ -1 +1,2 @@ -COOKIE_SECRET=cookiesecret \ No newline at end of file +COOKIE_SECRET=cookiesecret +NODE_ENV=test \ No newline at end of file diff --git a/backend/app.js b/backend/app.js index fd16517..d6870c1 100644 --- a/backend/app.js +++ b/backend/app.js @@ -12,6 +12,7 @@ const authRouter = require("./routes/auth"); const postRouter = require("./routes/post"); const { sequelize } = require("./models"); const passportConfig = require("./passport"); +const cors = require("cors"); const app = express(); passportConfig(); @@ -33,6 +34,7 @@ sequelize app.use(morgan("dev")); app.use(express.static(path.join(__dirname, "public"))); app.use("/img", express.static(path.join(__dirname, "uploads"))); +app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); diff --git a/backend/config/config.json b/backend/config/config.json index 3a7f744..0cd72e8 100644 --- a/backend/config/config.json +++ b/backend/config/config.json @@ -7,10 +7,10 @@ "dialect": "mysql" }, "test": { - "username": "root", - "password": null, - "database": "database_test", - "host": "127.0.0.1", + "username": "collusic", + "password": "collusic3717", + "database": "collusic", + "host": "54.180.156.26", "dialect": "mysql" }, "production": { diff --git a/backend/controllers/mypage/index.js b/backend/controllers/mypage/index.js index 0f6f3c9..325db01 100644 --- a/backend/controllers/mypage/index.js +++ b/backend/controllers/mypage/index.js @@ -1,30 +1,28 @@ -// const express = require("express"); -// const router = express.Router(); +const express = require("express"); +const router = express.Router(); +const { isLoggedIn, isNotLoggedIn } = require("../../routes/middlewares"); +const { Post, User } = require("../../models"); +//field값 +const readMyPageAPI = async (req, res, next) => { + try { + const myinfo = await User.findOne({ + attributes: ["email", "introduce"], + where: { + email: req.user.email, + }, + }); + res.status(200).json({ + email: myinfo, + }); + // const postinfo = await Post.findAll({ + // attributes: ["title", "field"], + // }); + } catch (err) { + res.status(400).json({ error: err }); + } +}; +// isLoggedIn 미들웨어 어디다 넣지..? -// const readMyPageAPI = (req, res) => { -// const User = await User.findOne({ -// attributes: ["nickname", "imagePath", "introduce", "email"], -// where: { -// nickname: req.user.nickname, -// imagePath: req.user.imagePath, -// introduce: req.user.introduce, -// email: req.user.email, -// }, -// }); - -// res.status(200).json({ -// nickname: `${nickname}`, -// imagePath: `${imagePath}`, -// introduce: `${introduce}`, -// email: `${email}`, -// }); -// }; - -// const updateUserInfoAPI = (req, res) => {}; -// const deleteUserInfoAPI = (req, res) => {}; - -// module.exports = { -// readMyPageAPI, -// updateUserInfoAPI, -// deleteUserInfoAPI, -// }; +module.exports = { + readMyPageAPI: readMyPageAPI, +}; diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index 512ca9a..2a662c0 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -1,15 +1,31 @@ -// const express = require("express"); -// const router = express.Router(); +const router = require("express"); +const { isLoggedIn, isNotLoggedIn } = require("../../routes/middlewares"); +const { Post, User } = require("../../models"); +//field값 -// const readAllRequestProjectAPI = (req, res) => { -// res.status(200).json({}); -// }; +const createProjectAPI = async (req, res, next) => { + try { + const createproject = await Post.create({ + title: req.body.title, + description: req.body.description, + genre: req.body.genre, + mood: req.body.mood, + audioFile: req.file.filename, + music_field: req.body.music_field, + lyrics_field: req.body.lyrics_field, + instrument_field: req.body.instrument_field, + }); + res.status(200).json({ + createproject, + }); + } catch (err) { + console.log(err); + console.log(req.file); + res.status(400).json({ message: err }); + } +}; +// isLoggedIn 미들웨어 어디다 넣지..? -// const deleteRequestProjectAPI = (req, res) => { -// res.status(200).json({}); -// }; - -// module.exports = { -// readAllRequestProjectAPI, -// deleteRequestProjectAPI, -// }; +module.exports = { + createProjectAPI: createProjectAPI, +}; diff --git a/backend/models/index.js b/backend/models/index.js index f9110af..e77ff0a 100644 --- a/backend/models/index.js +++ b/backend/models/index.js @@ -1,5 +1,5 @@ const Sequelize = require("sequelize"); -const env = process.env.NODE_ENV || "development"; //config.json의 development 가져오기 +const env = "test" || "development"; //config.json의 development 가져오기 const config = require("../config/config")[env]; //config.json의 development 가져오기 const User = require("./user"); const Post = require("./post"); diff --git a/backend/models/user.js b/backend/models/user.js index 140e5c3..14cd16a 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -6,16 +6,16 @@ module.exports = class User extends Sequelize.Model { { email: { type: Sequelize.STRING(40), - allowNull: true, + allowNull: false, unique: true, }, nick: { type: Sequelize.STRING(15), - allowNull: false, + allowNull: true, }, password: { type: Sequelize.STRING(100), - allowNull: true, + allowNull: false, }, provider: { //로그인 제공자 diff --git a/backend/package-lock.json b/backend/package-lock.json index 62e5529..8043886 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -615,6 +615,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", diff --git a/backend/package.json b/backend/package.json index 9c489b0..2cf1c68 100644 --- a/backend/package.json +++ b/backend/package.json @@ -14,6 +14,7 @@ "dependencies": { "bcrypt": "^5.0.1", "cookie-parser": "^1.4.5", + "cors": "^2.8.5", "dotenv": "^10.0.0", "express": "^4.17.1", "express-session": "^1.17.2", diff --git a/backend/routes/auth.js b/backend/routes/auth.js index c659bc6..ff7d9bd 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -7,7 +7,7 @@ const User = require("../models/user"); const router = express.Router(); router.post("/join", isNotLoggedIn, async (req, res, next) => { - const { email, nick, password } = req.body; + const { email, password } = req.body; try { const exUser = await User.findOne({ where: { email } }); //기존이메일로 가입한 사람이 있나? if (exUser) { @@ -19,14 +19,11 @@ router.post("/join", isNotLoggedIn, async (req, res, next) => { const hash = await bcrypt.hash(password, 12); //기존이메일이 아니면 password를 해쉬화 해서 저장 await User.create({ email, - nick, password: hash, }); return res.status(200).json({ msg: "SignIn Success", success: true, - email: req.body.email, - nick: req.body.nick, }); } catch (error) { console.error(error); @@ -41,8 +38,11 @@ router.post("/login", isNotLoggedIn, (req, res, next) => { return next(authError); } if (!user) { - //로그인 실패한 경우 - return res.redirect(`/?loginError=${info.message}`); + //로그인 실패한 경우; + return res.status(200).json({ + msg: `${info.message}`, + success: false, + }); } return req.login(user, (loginError) => { if (loginError) { @@ -51,8 +51,8 @@ router.post("/login", isNotLoggedIn, (req, res, next) => { } return res.status(200).json({ - user: user, - email: req.user, + msg: "Login Sucess!", + success: true, }); }); })(req, res, next); // 미들웨어 내의 미들웨어에는 (req, res, next) 꼭 붙여야함. @@ -61,7 +61,10 @@ router.post("/login", isNotLoggedIn, (req, res, next) => { router.get("/logout", isLoggedIn, (req, res) => { req.logout(); req.session.destroy(); - res.redirect("/"); + res.status(200).json({ + msg: "Logout success", + success: true, + }); }); module.exports = router; diff --git a/backend/routes/middlewares.js b/backend/routes/middlewares.js index 59c4fb1..cecdc47 100644 --- a/backend/routes/middlewares.js +++ b/backend/routes/middlewares.js @@ -1,17 +1,29 @@ +const multer = require("multer"); + +const storage = multer.diskStorage({ + destination(req, file, cb) { + cb(null, "../uploadFiles/"); + }, + filename(req, file, cb) { + cb(null, `${file.originalname}`); + }, +}); + +exports.uploadWithOriginalFilename = multer({ storage: storage }); + exports.isLoggedIn = (req, res, next) => { - if (req.isAuthenticated()) { - next(); - } else { - res.status(403).send('로그인 필요'); - } - }; - - exports.isNotLoggedIn = (req, res, next) => { - if (!req.isAuthenticated()) { - next(); - } else { - const message = encodeURIComponent('로그인한 상태입니다.'); - res.redirect(`/?error=${message}`); - } - }; - \ No newline at end of file + if (req.isAuthenticated()) { + next(); + } else { + res.status(403).send("로그인 필요"); + } +}; + +exports.isNotLoggedIn = (req, res, next) => { + if (!req.isAuthenticated()) { + next(); + } else { + const message = encodeURIComponent("로그인한 상태입니다."); + res.redirect(`/?error=${message}`); + } +}; diff --git a/backend/routes/page.js b/backend/routes/page.js index 765f67d..969d344 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -1,12 +1,14 @@ const express = require("express"); -const { isLoggedIn, isNotLoggedIn } = require("./middlewares"); +const { + isLoggedIn, + isNotLoggedIn, + uploadWithOriginalFilename, +} = require("./middlewares"); const { Post, User } = require("../models"); const router = express.Router(); const mypageController = require("../controllers/mypage"); const requestProjectController = require("../controllers/requestProjects"); -const userController = require("../controllers/user"); - router.use((req, res, next) => { res.locals.user = req.user; res.locals.followerCount = 0; @@ -15,7 +17,13 @@ router.use((req, res, next) => { next(); }); -// router.get("/mypage/:id", mypageController.userInformationAPI); +router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); +router.post( + "/requestProject", + isLoggedIn, + uploadWithOriginalFilename.single("data"), + requestProjectController.createProjectAPI +); // router.put("/mypage/:id", mypageController.createContributeProjectAPI); // router.delete("/mypage/:id", mypageController.deleteUserInfoAPI); From e6ea23dec47047ad086d4b2a6ceebfdaab657553 Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Thu, 29 Jul 2021 16:06:39 +0900 Subject: [PATCH 06/16] =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=9E=91=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1api=20=EB=B0=8F=20=EB=A9=80=ED=84=B0=20=EC=99=84?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/contributeProjects/index.js | 0 backend/controllers/requestProjects/index.js | 42 ++++++++------- backend/models/post.js | 4 +- .../project/db\354\275\224\353\223\234.txt" | 45 ++++++++++++++++ backend/routes/middlewares.js | 23 +++++--- backend/routes/page.js | 53 ++++++++++++------- 6 files changed, 119 insertions(+), 48 deletions(-) create mode 100644 backend/controllers/contributeProjects/index.js create mode 100644 "backend/project/db\354\275\224\353\223\234.txt" diff --git a/backend/controllers/contributeProjects/index.js b/backend/controllers/contributeProjects/index.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index 2a662c0..4046db5 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -1,31 +1,35 @@ const router = require("express"); -const { isLoggedIn, isNotLoggedIn } = require("../../routes/middlewares"); +const { + isLoggedIn, + isNotLoggedIn, + upload, +} = require("../../routes/middlewares"); const { Post, User } = require("../../models"); //field값 -const createProjectAPI = async (req, res, next) => { - try { - const createproject = await Post.create({ - title: req.body.title, - description: req.body.description, - genre: req.body.genre, - mood: req.body.mood, - audioFile: req.file.filename, - music_field: req.body.music_field, - lyrics_field: req.body.lyrics_field, - instrument_field: req.body.instrument_field, +const createProjectAPI = async (req, res) => { + const post = await Post.create({ + title: req.body.title, + description: req.body.description, + genre: req.body.genre, + mood: req.body.mood, + lyrics_text: req.body.lyrics_text, + audioFile: req.file.originalname, + music_field: req.body.music_field, + lyrics_field: req.body.lyrics_field, + instrument_field: req.body.instrument_field, + }); + if (!post) { + res.status(400).json({ + success: false, }); + } else { res.status(200).json({ - createproject, + success: true, + post: post, }); - } catch (err) { - console.log(err); - console.log(req.file); - res.status(400).json({ message: err }); } }; -// isLoggedIn 미들웨어 어디다 넣지..? - module.exports = { createProjectAPI: createProjectAPI, }; diff --git a/backend/models/post.js b/backend/models/post.js index 5e966e1..7ddb9b3 100644 --- a/backend/models/post.js +++ b/backend/models/post.js @@ -19,11 +19,11 @@ module.exports = class Post extends Sequelize.Model { }, state: { type: Sequelize.BOOLEAN, - allowNull: false, + allowNull: true, }, field_free: { type: Sequelize.BOOLEAN, - allowNull: false, + allowNull: true, }, lyrics_text: { type: Sequelize.TEXT, diff --git "a/backend/project/db\354\275\224\353\223\234.txt" "b/backend/project/db\354\275\224\353\223\234.txt" new file mode 100644 index 0000000..aa4e491 --- /dev/null +++ "b/backend/project/db\354\275\224\353\223\234.txt" @@ -0,0 +1,45 @@ +CREATE DATABASE collusicdb; + +CREATE TABLE `user` +( + `email` VARCHAR(40) NOT NULL, + `password` VARCHAR(40) NOT NULL, + `user_id` INT NOT NULL AUTO_INCREMENT, + `imagePath` VARCHAR(150), + `sns` VARCHAR(20), + `introduce` TEXT, + `nickname` VARCHAR(20) NOT NULL, + PRIMARY KEY (user_id) +); +-- 기여작을 댓글로 업로드한다 가정 +CREATE TABLE `comments` +( + `comment_id` INT NOT NULL AUTO_INCREMENT, + `title` VARCHAR(20) NOT NULL, + `description` TEXT, + `comment_date` DATETIME NOT NULL DEFAULT now(), + `musicfile` VARCHAR(150), + `comment_field` VARCHAR(10), + FOREIGN KEY `project_title` REFERENCES `Project.title`, + FOREIGN KEY `project_id` REFERENCES `Project.project_id`, + FOREIGN KEY `project_field` REFERENCES `Project.field`, + PRIMARY KEY (comment_id), + CONSTRAINT `user_id` FOREIGN KEY `user_id` REFERENCES `user.user_id` ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE `Project` +( + `project_id` INT NOT NULL AUTO_INCREMENT, + `title` VARCHAR(20) NOT NULL, + `description` TEXT, + `date` DATETIME NOT NULL DEFAULT now(), + `audioFile` VARCHAR(50) NOT NULL, + `state` Boolean NOT NULL, + `field` VARCHAR(10) NOT NULL, + `genre` VARCHAR(10), + PRIMARY KEY (project_id), + CONSTRAINT `user_id` FOREIGN KEY `user_id` REFERENCES `user(user_id)` ON DELETE CASCADE ON UPDATE CASCADE +); +------------------------------------------------------------------------------------------------ +-- Table structure for table `user` +--state의 상태는 0 또는 1인가..? \ No newline at end of file diff --git a/backend/routes/middlewares.js b/backend/routes/middlewares.js index cecdc47..cb12cc7 100644 --- a/backend/routes/middlewares.js +++ b/backend/routes/middlewares.js @@ -1,15 +1,24 @@ const multer = require("multer"); -const storage = multer.diskStorage({ - destination(req, file, cb) { - cb(null, "../uploadFiles/"); +var _storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, "project/"); }, - filename(req, file, cb) { - cb(null, `${file.originalname}`); + filename: function (req, file, cb) { + cb(null, file.originalname); }, }); - -exports.uploadWithOriginalFilename = multer({ storage: storage }); +exports.upload = multer({ storage: _storage }); +//commment +var _storage2 = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, "comment_audio/"); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + }, +}); +exports.upload_commit = multer({ storage: _storage2 }); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { diff --git a/backend/routes/page.js b/backend/routes/page.js index 969d344..c820759 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -2,34 +2,47 @@ const express = require("express"); const { isLoggedIn, isNotLoggedIn, - uploadWithOriginalFilename, + upload, + upload_commit, } = require("./middlewares"); -const { Post, User } = require("../models"); +//const { Post, User } = require("../models"); const router = express.Router(); - -const mypageController = require("../controllers/mypage"); +//const mypageController = require("../controllers/mypage"); const requestProjectController = require("../controllers/requestProjects"); -router.use((req, res, next) => { - res.locals.user = req.user; - res.locals.followerCount = 0; - res.locals.followingCount = 0; - res.locals.followerIdList = []; - next(); -}); - -router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); +// router.use((req, res, next) => { +// res.locals.user = req.user; +// res.locals.followerCount = 0; +// res.locals.followingCount = 0; +// res.locals.followerIdList = []; +// next(); +// }); +//router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); router.post( - "/requestProject", - isLoggedIn, - uploadWithOriginalFilename.single("data"), + "/requestProjects", + upload.single("data"), requestProjectController.createProjectAPI ); -// router.put("/mypage/:id", mypageController.createContributeProjectAPI); -// router.delete("/mypage/:id", mypageController.deleteUserInfoAPI); -// router.get("/req-projects", requestProjectController.readAllRequestProjectAPI); +module.exports = router; +// router.get("/", async (req, res, next) => { +// try { +// const posts = await Post.findAll({ +// include: { +// model: User, +// attributes: ["id"], +// }, +// order: [["createdAt", "DESC"]], +// }); +// res.render("main", { +// title: "collusic", +// twits: posts, +// }); +// } catch (err) { +// console.error(err); +// next(err); +// } +// }); -// router.get("/user/refresh", userController); // router.get("/mypage", isLoggedIn, async (req, res, next) => { // try { // const myinfo = await User.findOne({ From 5bd8bdcb94cf2dc77a770ddd461794476bd8a18f Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Thu, 29 Jul 2021 17:43:33 +0900 Subject: [PATCH 07/16] =?UTF-8?q?s3=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env | 5 +- backend/controllers/requestProjects/index.js | 8 +- backend/package-lock.json | 139 +++++++++++++++++++ backend/package.json | 2 + backend/routes/middlewares.js | 34 ++++- 5 files changed, 177 insertions(+), 11 deletions(-) diff --git a/backend/.env b/backend/.env index a8ef446..a180ece 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,5 @@ COOKIE_SECRET=cookiesecret -NODE_ENV=test \ No newline at end of file +NODE_ENV=test +S3_ACCESS_KEY=AKIAQWGLZ6TSBFMZV4XC +S3_SECRET_KEY=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 +S3_REGION=ap-northeast-2 \ No newline at end of file diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index 4046db5..aa6fcef 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -14,10 +14,10 @@ const createProjectAPI = async (req, res) => { genre: req.body.genre, mood: req.body.mood, lyrics_text: req.body.lyrics_text, - audioFile: req.file.originalname, - music_field: req.body.music_field, - lyrics_field: req.body.lyrics_field, - instrument_field: req.body.instrument_field, + audioFile: req.file.location, + music_field: Boolean(req.body.music_field), + lyrics_field: Boolean(req.body.lyrics_field), + instrument_field: Boolean(req.body.instrument_field), }); if (!post) { res.status(400).json({ diff --git a/backend/package-lock.json b/backend/package-lock.json index 8043886..c77cff2 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -209,11 +209,39 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "aws-sdk": { + "version": "2.956.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.956.0.tgz", + "integrity": "sha512-vSzL66tjeRSBPnLR2Pkx4qS7SPqADT7K9QBjWdMhVd9BF5spyMvJ9hReIEShILp3hq99sHI+MvO+uTUm5s023g==", + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -308,6 +336,23 @@ "fill-range": "^7.0.1" } }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -859,6 +904,11 @@ "es5-ext": "~0.10.14" } }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -971,6 +1021,11 @@ } } }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1212,6 +1267,11 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -1262,6 +1322,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -1399,6 +1464,14 @@ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1416,6 +1489,11 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, "js-beautify": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", @@ -1690,6 +1768,16 @@ "xtend": "^4.0.0" } }, + "multer-s3": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/multer-s3/-/multer-s3-2.9.0.tgz", + "integrity": "sha512-qLF8pCD5HhXLLd954q49B63x3bk6Fe0jqD3eM0FVcGtqhiSVuTrchEDAo0mnO5pc34cMuX/CVCCbPkGTjX2xUA==", + "requires": { + "file-type": "^3.3.0", + "is-svg": "^2.1.0", + "run-parallel": "^1.1.6" + } + }, "mysql2": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", @@ -2030,6 +2118,11 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -2044,6 +2137,16 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -2159,6 +2262,14 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2169,6 +2280,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -2604,6 +2720,15 @@ "xdg-basedir": "^4.0.0" } }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -2776,6 +2901,20 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 2cf1c68..6406d68 100644 --- a/backend/package.json +++ b/backend/package.json @@ -12,6 +12,7 @@ "nodemon": "^2.0.7" }, "dependencies": { + "aws-sdk": "^2.956.0", "bcrypt": "^5.0.1", "cookie-parser": "^1.4.5", "cors": "^2.8.5", @@ -20,6 +21,7 @@ "express-session": "^1.17.2", "morgan": "^1.10.0", "multer": "^1.4.2", + "multer-s3": "^2.9.0", "mysql2": "^2.2.5", "nunjucks": "^3.2.3", "passport": "^0.4.1", diff --git a/backend/routes/middlewares.js b/backend/routes/middlewares.js index cb12cc7..b59b88b 100644 --- a/backend/routes/middlewares.js +++ b/backend/routes/middlewares.js @@ -1,14 +1,36 @@ const multer = require("multer"); +const multerS3 = require("multer-s3"); +const AWS = require("aws-sdk"); +require("dotenv").config(); -var _storage = multer.diskStorage({ - destination: function (req, file, cb) { - cb(null, "project/"); +const s3 = new AWS.S3({ + accessKeyId: process.env.S3_ACCESS_KEY, + secretAccessKey: process.env.S3_SECRET_KEY, + region: process.env.S3_REGION, +}); + +const storage = multerS3({ + s3: s3, + bucket: "collusic", + contentType: multerS3.AUTO_CONTENT_TYPE, + acl: "public-read", + metadata: function (req, file, cb) { + cb(null, { fieldName: file.fieldname }); }, - filename: function (req, file, cb) { - cb(null, file.originalname); + key: function (req, file, cb) { + cb(null, `requests/${Date.now()}_${file.originalname}`); }, }); -exports.upload = multer({ storage: _storage }); + +// var _storage = multer.diskStorage({ +// destination: function (req, file, cb) { +// cb(null, "project/"); +// }, +// filename: function (req, file, cb) { +// cb(null, file.originalname); +// }, +// }); +exports.upload = multer({ storage: storage }); //commment var _storage2 = multer.diskStorage({ destination: function (req, file, cb) { From 5ef50f4e042c8c5188d353057fe655ae47d54b9d Mon Sep 17 00:00:00 2001 From: dongE <68381747+Daae-Kim@users.noreply.github.com> Date: Thu, 29 Jul 2021 18:56:19 +0900 Subject: [PATCH 08/16] Update .env --- backend/.env | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/.env b/backend/.env index a180ece..8b13789 100644 --- a/backend/.env +++ b/backend/.env @@ -1,5 +1 @@ -COOKIE_SECRET=cookiesecret -NODE_ENV=test -S3_ACCESS_KEY=AKIAQWGLZ6TSBFMZV4XC -S3_SECRET_KEY=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 -S3_REGION=ap-northeast-2 \ No newline at end of file + From 565fc17b4895d8009c097c0eb7e0c2f8d1a3475e Mon Sep 17 00:00:00 2001 From: dongE <68381747+Daae-Kim@users.noreply.github.com> Date: Thu, 29 Jul 2021 18:56:43 +0900 Subject: [PATCH 09/16] Update config.json --- backend/config/config.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/backend/config/config.json b/backend/config/config.json index 0cd72e8..d578611 100644 --- a/backend/config/config.json +++ b/backend/config/config.json @@ -6,13 +6,7 @@ "host": "127.0.0.1", "dialect": "mysql" }, - "test": { - "username": "collusic", - "password": "collusic3717", - "database": "collusic", - "host": "54.180.156.26", - "dialect": "mysql" - }, + "production": { "username": "root", "password": null, From cd7c2ace129ade031a087c29c6bdd947ff571039 Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Thu, 29 Jul 2021 21:05:51 +0900 Subject: [PATCH 10/16] =?UTF-8?q?mainAPI=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/requestProjects/index.js | 24 ++++++++++++++++++++ backend/routes/page.js | 16 ++++--------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index aa6fcef..6bde6b9 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -30,6 +30,30 @@ const createProjectAPI = async (req, res) => { }); } }; + +const mainInfoAPI = async (req, res) => { + try { + const maininfo = await Post.findAll({ + attributes: [ + "uid", + "title", + "field_free", + "music_field", + "lyrics_field", + "instrument_field", + "genre", + "mood", + "audioFile", + ], + }); + res.status(200).json({ + maininfo, + }); + } catch (err) { + res.status(400).json({ error: err }); + } +}; module.exports = { createProjectAPI: createProjectAPI, + mainInfoAPI: mainInfoAPI, }; diff --git a/backend/routes/page.js b/backend/routes/page.js index c820759..d2eff8e 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -7,22 +7,16 @@ const { } = require("./middlewares"); //const { Post, User } = require("../models"); const router = express.Router(); -//const mypageController = require("../controllers/mypage"); +const mypageController = require("../controllers/mypage"); const requestProjectController = require("../controllers/requestProjects"); -// router.use((req, res, next) => { -// res.locals.user = req.user; -// res.locals.followerCount = 0; -// res.locals.followingCount = 0; -// res.locals.followerIdList = []; -// next(); -// }); -//router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); +const { request } = require("express"); +router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); router.post( "/requestProjects", upload.single("data"), requestProjectController.createProjectAPI ); - +router.get("/main", isLoggedIn, requestProjectController.mainInfoAPI); module.exports = router; // router.get("/", async (req, res, next) => { // try { @@ -83,5 +77,3 @@ module.exports = router; // next(err); // } // }); - -module.exports = router; From c5376fef9a9bf3185f974709a464000cc4639219 Mon Sep 17 00:00:00 2001 From: spiderq2697 Date: Thu, 29 Jul 2021 23:01:13 +0900 Subject: [PATCH 11/16] =?UTF-8?q?API=20=EC=9D=B8=EC=8A=A4=ED=84=B4?= =?UTF-8?q?=EC=8A=A4=20=ED=95=A0=EB=8B=B9=20=EB=AA=A8=EB=93=88=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/http/authApi.js | 1 - src/data/http/axios/api.js | 2 +- src/data/http/requestProjectApi.js | 38 -------------------------- src/presentation/page/main/Project.jsx | 20 ++++---------- 4 files changed, 6 insertions(+), 55 deletions(-) delete mode 100644 src/data/http/authApi.js delete mode 100644 src/data/http/requestProjectApi.js diff --git a/src/data/http/authApi.js b/src/data/http/authApi.js deleted file mode 100644 index ac4ba13..0000000 --- a/src/data/http/authApi.js +++ /dev/null @@ -1 +0,0 @@ -import API from "./axios/api"; diff --git a/src/data/http/axios/api.js b/src/data/http/axios/api.js index fd2539a..e7bb48b 100644 --- a/src/data/http/axios/api.js +++ b/src/data/http/axios/api.js @@ -1,7 +1,7 @@ import axios from "axios"; const API = axios.create({ - baseURL: "http://localhost:3000", + baseURL: "https://jsonplaceholder.typicode.com", headers: { "Content-Type": "application/json", }, diff --git a/src/data/http/requestProjectApi.js b/src/data/http/requestProjectApi.js deleted file mode 100644 index 1a4d6a6..0000000 --- a/src/data/http/requestProjectApi.js +++ /dev/null @@ -1,38 +0,0 @@ -import API from "./axios/api"; - -export default class requestProjectApiProvider { - async readRequestProjects() { - try { - const { data } = await API.get("/req-projects"); - return data; - } catch (err) { - console.log(err); - } - } - - async readContributeProjects() { - try { - const { data } = await API.get("/req-projects:{request_id}"); - return data; - } catch (err) { - console.log(err); - } - } - - async createContributeProject() { - try { - const { data } = await API.post("/req-projects/contributeproject"); - return data; - } catch (err) { - console.log(err); - } - } - async updateRequestProject() { - try { - const { data } = await API.put("/req-projects:{request_id}"); - return data; - } catch (err) { - console.log(err); - } - } -} diff --git a/src/presentation/page/main/Project.jsx b/src/presentation/page/main/Project.jsx index 115fb16..2917e03 100644 --- a/src/presentation/page/main/Project.jsx +++ b/src/presentation/page/main/Project.jsx @@ -12,18 +12,10 @@ import { Icon } from "@iconify/react"; import playCircle from "@iconify-icons/mdi/play-circle"; import pauseCircle from "@iconify-icons/mdi/pause-circle"; import useLastLocationHistory from "lib/history"; +import API from "data/http/axios/api"; const text = "Preview Lrics,"; -// const readRequestProjects = async () => { -// try { -// const { data } = await API.get("/req-projects"); -// return data; -// } catch (err) { -// console.log(err); -// } -// }; - function Project() { const setHistory = useLastLocationHistory(); const [projects, setProjects] = useState(null); @@ -31,22 +23,20 @@ function Project() { const [error, setError] = useState(null); useEffect(() => { - const fetchProjects = async () => { + const readRequestProjects = async () => { try { setError(null); setProjects(null); setLoading(true); - const response = await axios.get( - "https://jsonplaceholder.typicode.com/users" - ); - setProjects(response.data); + const { data } = await API.get("/users"); + setProjects(data); } catch (error) { setError(error); } setLoading(false); }; - fetchProjects(); + readRequestProjects(); }, []); if (loading) return
    로딩중...
    ; From a2f4b0ffddab347caa57521c4fc8eccd37300ce1 Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Thu, 29 Jul 2021 23:13:21 +0900 Subject: [PATCH 12/16] =?UTF-8?q?=EB=A9=94=EC=9D=B8,=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=9E=91=20=EC=83=9D=EC=84=B1,=20=EC=9A=94=EC=B2=AD=EC=9E=91?= =?UTF-8?q?=20=EC=83=81=EC=84=B8(=EC=A7=84=ED=96=89=EC=A4=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/mypage/index.js | 4 - backend/controllers/requestProjects/index.js | 103 +++++++++++++------ backend/routes/page.js | 11 +- 3 files changed, 81 insertions(+), 37 deletions(-) diff --git a/backend/controllers/mypage/index.js b/backend/controllers/mypage/index.js index 325db01..d0f0468 100644 --- a/backend/controllers/mypage/index.js +++ b/backend/controllers/mypage/index.js @@ -14,14 +14,10 @@ const readMyPageAPI = async (req, res, next) => { res.status(200).json({ email: myinfo, }); - // const postinfo = await Post.findAll({ - // attributes: ["title", "field"], - // }); } catch (err) { res.status(400).json({ error: err }); } }; -// isLoggedIn 미들웨어 어디다 넣지..? module.exports = { readMyPageAPI: readMyPageAPI, diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index 6bde6b9..dd88dbd 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -4,56 +4,95 @@ const { isNotLoggedIn, upload, } = require("../../routes/middlewares"); -const { Post, User } = require("../../models"); +const { Post, User, Comment } = require("../../models"); //field값 const createProjectAPI = async (req, res) => { - const post = await Post.create({ - title: req.body.title, - description: req.body.description, - genre: req.body.genre, - mood: req.body.mood, - lyrics_text: req.body.lyrics_text, - audioFile: req.file.location, - music_field: Boolean(req.body.music_field), - lyrics_field: Boolean(req.body.lyrics_field), - instrument_field: Boolean(req.body.instrument_field), + if (req.file) { + const post = await Post.create({ + title: req.body.title, + description: req.body.description, + genre: req.body.genre, + mood: req.body.mood, + lyrics_text: req.body.lyrics_text, + audioFile: req.file.location, + music_field: Boolean(req.body.music_field), + lyrics_field: Boolean(req.body.lyrics_field), + instrument_field: Boolean(req.body.instrument_field), + }); + if (!post) { + res.status(400).json({ + success: false, + post: post, + }); + } else { + const post = await Post.create({ + title: req.body.title, + description: req.body.description, + genre: req.body.genre, + mood: req.body.mood, + lyrics_text: req.body.lyrics_text, + music_field: req.body.music_field, + lyrics_field: req.body.lyrics_field, + instrument_field: req.body.instrument_field, + uid: req.user.id, + }); + } + if (!post) { + res.status(400).json({ + sucess: false, + }); + } else { + res.status(200).json({ + sucess: true, + post: post, + }); + } + } +}; + +const mainInfoAPI = async (req, res) => { + const maininfo = await Post.findAll({ + attributes: [ + "uid", + "title", + "field_free", + "music_field", + "lyrics_field", + "instrument_field", + "genre", + "mood", + "audioFile", + ], }); - if (!post) { + if (!maininfo) { res.status(400).json({ success: false, }); } else { - res.status(200).json({ - success: true, - post: post, - }); + res.status(200).json({ maininfo: maininfo }); } }; -const mainInfoAPI = async (req, res) => { +const commentsAPI = async (res, req, next) => { try { - const maininfo = await Post.findAll({ - attributes: [ - "uid", - "title", - "field_free", - "music_field", - "lyrics_field", - "instrument_field", - "genre", - "mood", - "audioFile", - ], + const comments = await Comment.findAll({ + include: { + model: Post, + where: { id: req.params.id }, + }, }); - res.status(200).json({ - maininfo, + const project = await Post.findAll({ + where: { id: req.params.id }, }); + res.json(comments, project); } catch (err) { - res.status(400).json({ error: err }); + next(err); } }; + module.exports = { createProjectAPI: createProjectAPI, mainInfoAPI: mainInfoAPI, + commentsAPI: commentsAPI, }; diff --git a/backend/routes/page.js b/backend/routes/page.js index d2eff8e..63fb7b2 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -16,7 +16,16 @@ router.post( upload.single("data"), requestProjectController.createProjectAPI ); -router.get("/main", isLoggedIn, requestProjectController.mainInfoAPI); +router.get( + "/requestProjects", + isLoggedIn, + requestProjectController.mainInfoAPI +); +router.get( + "/requestProjects/:id/comments", + isLoggedIn, + requestProjectController.commentsAPI +); module.exports = router; // router.get("/", async (req, res, next) => { // try { From 337179a4dcb8d8297bd24aab1f61d9fa860ab58c Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Thu, 29 Jul 2021 23:28:33 +0900 Subject: [PATCH 13/16] =?UTF-8?q?=EB=A9=94=EC=9D=B8,=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=9E=91=EC=83=9D=EC=84=B1,=20=EA=B8=B0=EC=97=AC=EC=9E=91=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20=EC=9A=94=EC=B2=AD=EC=9E=91=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80(=EC=A7=84=ED=96=89?= =?UTF-8?q?=EC=A4=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env | 6 +++- backend/config/config.json | 10 ++++-- .../controllers/contributeProjects/index.js | 33 +++++++++++++++++++ backend/routes/page.js | 6 ++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/backend/.env b/backend/.env index 8b13789..a180ece 100644 --- a/backend/.env +++ b/backend/.env @@ -1 +1,5 @@ - +COOKIE_SECRET=cookiesecret +NODE_ENV=test +S3_ACCESS_KEY=AKIAQWGLZ6TSBFMZV4XC +S3_SECRET_KEY=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 +S3_REGION=ap-northeast-2 \ No newline at end of file diff --git a/backend/config/config.json b/backend/config/config.json index d578611..68d0bf5 100644 --- a/backend/config/config.json +++ b/backend/config/config.json @@ -6,7 +6,13 @@ "host": "127.0.0.1", "dialect": "mysql" }, - + "test": { + "username": "collusic", + "password": "collusic3717", + "database": "collusic", + "host": "54.180.156.26", + "dialect": "mysql" + }, "production": { "username": "root", "password": null, @@ -14,4 +20,4 @@ "host": "127.0.0.1", "dialect": "mysql" } -} +} \ No newline at end of file diff --git a/backend/controllers/contributeProjects/index.js b/backend/controllers/contributeProjects/index.js index e69de29..43f9ec5 100644 --- a/backend/controllers/contributeProjects/index.js +++ b/backend/controllers/contributeProjects/index.js @@ -0,0 +1,33 @@ +const router = require("express"); +const { + isLoggedIn, + isNotLoggedIn, + upload_commit, +} = require("../../routes/middlewares"); +const { Post, User, Comment } = require("../../models"); +//field값 + +const createContriProjectAPI = async (req, res) => { + let id = req.params.id; + const commentpost = await Comment.create({ + c_description: req.body.description, + c_audioFile: req.file.filename, + c_lyrics_text: req.body.lyrics_text, + pid: id, + selected_status: false, + }); + if (!commentpost) { + res.status(400).json({ + success: false, + }); + } else { + res.status(200).json({ + success: true, + commentpost: commentpost, + }); + } +}; + +module.exports = { + createContriProjectAPI: createContriProjectAPI, +}; diff --git a/backend/routes/page.js b/backend/routes/page.js index 63fb7b2..8319b1a 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -9,6 +9,7 @@ const { const router = express.Router(); const mypageController = require("../controllers/mypage"); const requestProjectController = require("../controllers/requestProjects"); +const contributeProjectController = require("../controllers/contributeProjects"); const { request } = require("express"); router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); router.post( @@ -26,6 +27,11 @@ router.get( isLoggedIn, requestProjectController.commentsAPI ); +router.post( + "/requestProjects/:id/comments", + upload_commit.single("data"), + contributeProjectController.createContriProjectAPI +); module.exports = router; // router.get("/", async (req, res, next) => { // try { From 61669154e617997d1dd24cbd1999989986038146 Mon Sep 17 00:00:00 2001 From: spiderq2697 Date: Thu, 29 Jul 2021 23:40:27 +0900 Subject: [PATCH 14/16] =?UTF-8?q?params=20id=20=EB=B0=9B=EA=B8=B0=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/http/axios/api.js | 2 +- src/presentation/App.js | 8 ++++---- .../page/detailProject/ProjectFieldItems.jsx | 14 ++++++-------- .../page/detailProject/ProjectList.jsx | 7 +++---- src/presentation/page/detailProject/index.jsx | 2 +- .../page/{main => requestProject}/Project.jsx | 4 ++-- .../page/{main => requestProject}/index.jsx | 4 ++-- .../page/{main => requestProject}/styled.js | 0 8 files changed, 19 insertions(+), 22 deletions(-) rename src/presentation/page/{main => requestProject}/Project.jsx (97%) rename src/presentation/page/{main => requestProject}/index.jsx (94%) rename src/presentation/page/{main => requestProject}/styled.js (100%) diff --git a/src/data/http/axios/api.js b/src/data/http/axios/api.js index e7bb48b..fd2539a 100644 --- a/src/data/http/axios/api.js +++ b/src/data/http/axios/api.js @@ -1,7 +1,7 @@ import axios from "axios"; const API = axios.create({ - baseURL: "https://jsonplaceholder.typicode.com", + baseURL: "http://localhost:3000", headers: { "Content-Type": "application/json", }, diff --git a/src/presentation/App.js b/src/presentation/App.js index f5077c9..8b40179 100644 --- a/src/presentation/App.js +++ b/src/presentation/App.js @@ -1,7 +1,7 @@ import React from "react"; import { BrowserRouter as Router, Switch, Route } from "react-router-dom"; import "./App.css"; -import Main from "./page/main"; +import RequestProjects from "./page/requestProject"; import Home from "./page/home"; import NavBar from "./page/nav_bar"; import DetailProject from "./page/detailProject"; @@ -18,10 +18,10 @@ function App() { - -
    + + - + diff --git a/src/presentation/page/detailProject/ProjectFieldItems.jsx b/src/presentation/page/detailProject/ProjectFieldItems.jsx index f64ec44..6d9e4ae 100644 --- a/src/presentation/page/detailProject/ProjectFieldItems.jsx +++ b/src/presentation/page/detailProject/ProjectFieldItems.jsx @@ -1,29 +1,27 @@ import React, { useState, useEffect } from "react"; -import axios from "axios"; +import API from "data/http/axios/api"; import styled from "./styled"; -function ProjectFieldItems() { +function ProjectFieldItems({ id }) { const [requestProject, setRequestProject] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { - const fetchProjects = async () => { + const readContributeProjects = async () => { try { setError(null); setRequestProject(null); setLoading(true); - const response = await axios.get( - "https://jsonplaceholder.typicode.com/users" - ); - setRequestProject(response.data); + const { data } = await API.get("/requestprojects/" + id); + setRequestProject(data); } catch (error) { setError(error); } setLoading(false); }; - fetchProjects(); + readContributeProjects(); }, []); if (loading) return
    로딩중...
    ; diff --git a/src/presentation/page/detailProject/ProjectList.jsx b/src/presentation/page/detailProject/ProjectList.jsx index c37e35f..cb51c24 100644 --- a/src/presentation/page/detailProject/ProjectList.jsx +++ b/src/presentation/page/detailProject/ProjectList.jsx @@ -10,6 +10,7 @@ import selected from "assets/selected.png"; import { Icon } from "@iconify/react"; import playCircle from "@iconify-icons/mdi/play-circle"; import pauseCircle from "@iconify-icons/mdi/pause-circle"; +import API from "data/http/axios/api"; function ProjectList({ unselected }) { const [projects, setProjects] = useState(null); @@ -22,10 +23,8 @@ function ProjectList({ unselected }) { setError(null); setProjects(null); setLoading(true); - const response = await axios.get( - "https://jsonplaceholder.typicode.com/users" - ); - setProjects(response.data); + const { data } = await API.get("/requestprojects"); + setProjects(data); } catch (error) { setError(error); } diff --git a/src/presentation/page/detailProject/index.jsx b/src/presentation/page/detailProject/index.jsx index 1857a3d..52428d5 100644 --- a/src/presentation/page/detailProject/index.jsx +++ b/src/presentation/page/detailProject/index.jsx @@ -3,7 +3,7 @@ import styled from "./styled"; import LeftBox from "./LeftBox"; import RightBox from "./RightBox"; -function DetailProject() { +function DetailProject({ id }) { return ( <> diff --git a/src/presentation/page/main/Project.jsx b/src/presentation/page/requestProject/Project.jsx similarity index 97% rename from src/presentation/page/main/Project.jsx rename to src/presentation/page/requestProject/Project.jsx index 2917e03..6068c9c 100644 --- a/src/presentation/page/main/Project.jsx +++ b/src/presentation/page/requestProject/Project.jsx @@ -28,7 +28,7 @@ function Project() { setError(null); setProjects(null); setLoading(true); - const { data } = await API.get("/users"); + const { data } = await API.get("/requestprojects"); setProjects(data); } catch (error) { setError(error); @@ -50,7 +50,7 @@ function Project() {
    { - setHistory("/project/" + project.id); + setHistory("/requestprojects/" + project.id); }} > diff --git a/src/presentation/page/main/index.jsx b/src/presentation/page/requestProject/index.jsx similarity index 94% rename from src/presentation/page/main/index.jsx rename to src/presentation/page/requestProject/index.jsx index 5005df3..c703b68 100644 --- a/src/presentation/page/main/index.jsx +++ b/src/presentation/page/requestProject/index.jsx @@ -4,7 +4,7 @@ import Project from "./Project"; import CreateButtonImage from "assets/createButton.svg"; import useLastLocationHistory from "lib/history"; -function Main() { +function RequestProjects() { const setHistory = useLastLocationHistory(); const [isLong, setIsLong] = useState(false); @@ -36,4 +36,4 @@ function Main() { ); } -export default Main; +export default RequestProjects; diff --git a/src/presentation/page/main/styled.js b/src/presentation/page/requestProject/styled.js similarity index 100% rename from src/presentation/page/main/styled.js rename to src/presentation/page/requestProject/styled.js From b7687ac8633775a31e3b6609a71d8eb81d5eeec6 Mon Sep 17 00:00:00 2001 From: Daae-Kim Date: Fri, 30 Jul 2021 00:13:06 +0900 Subject: [PATCH 15/16] =?UTF-8?q?API-=EB=A9=94=EC=9D=B8,=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=9E=91=EC=83=9D=EC=84=B1,=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=9E=91=20=EC=83=81=EC=84=B8,=20=EA=B8=B0=EC=97=AC=EC=9E=91?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/requestProjects/index.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index dd88dbd..4dc7af0 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -54,15 +54,16 @@ const createProjectAPI = async (req, res) => { const mainInfoAPI = async (req, res) => { const maininfo = await Post.findAll({ attributes: [ - "uid", + "email", + "pid", "title", - "field_free", "music_field", "lyrics_field", "instrument_field", "genre", "mood", "audioFile", + "lyrics_text", ], }); if (!maininfo) { @@ -74,18 +75,19 @@ const mainInfoAPI = async (req, res) => { } }; -const commentsAPI = async (res, req, next) => { +const commentsAPI = async (req, res, next) => { + let id = req.params.id; try { const comments = await Comment.findAll({ include: { model: Post, - where: { id: req.params.id }, + where: { id: id }, }, }); const project = await Post.findAll({ - where: { id: req.params.id }, + where: { id: id }, }); - res.json(comments, project); + res.status(200).json({ comments, project }); } catch (err) { next(err); } From e4c0a2a6f034952b959b006e957a8e7f011e5ed3 Mon Sep 17 00:00:00 2001 From: dongE <68381747+Daae-Kim@users.noreply.github.com> Date: Fri, 30 Jul 2021 00:17:44 +0900 Subject: [PATCH 16/16] Revert "Feature/issue 53" --- backend/.env | 5 - backend/app.js | 74 - backend/config/config.json | 23 - .../controllers/contributeProjects/index.js | 33 - backend/controllers/index.js | 36 - backend/controllers/mypage/index.js | 24 - backend/controllers/requestProjects/index.js | 100 - backend/controllers/user/index.js | 2 - backend/models/comment.js | 44 - backend/models/index.js | 29 - backend/models/post.js | 70 - backend/models/user.js | 52 - backend/package-lock.json | 2972 ----------------- backend/package.json | 34 - backend/passport/index.js | 19 - backend/passport/localStrategy.js | 30 - .../project/db\354\275\224\353\223\234.txt" | 45 - backend/routes/auth.js | 70 - backend/routes/middlewares.js | 60 - backend/routes/page.js | 94 - backend/routes/post.js | 62 - ...alk_20210621_165128562_031627275828320.jpg | Bin 66022 -> 0 bytes ...\354\235\264\353\270\2241627135434953.PNG" | Bin 10694 -> 0 bytes ...\353\243\250\354\247\2011627135861101.jpg" | Bin 5806 -> 0 bytes ...\353\243\250\354\247\2011627137619779.jpg" | Bin 5806 -> 0 bytes ...353\243\250\354\247\20121627135902037.jpg" | Bin 28111 -> 0 bytes ...353\243\250\354\247\20121627137675882.jpg" | Bin 28111 -> 0 bytes backend/views/error.html | 7 - backend/views/join.html | 29 - backend/views/layout.html | 53 - backend/views/main.html | 65 - 31 files changed, 4032 deletions(-) delete mode 100644 backend/.env delete mode 100644 backend/app.js delete mode 100644 backend/config/config.json delete mode 100644 backend/controllers/contributeProjects/index.js delete mode 100644 backend/controllers/index.js delete mode 100644 backend/controllers/mypage/index.js delete mode 100644 backend/controllers/requestProjects/index.js delete mode 100644 backend/controllers/user/index.js delete mode 100644 backend/models/comment.js delete mode 100644 backend/models/index.js delete mode 100644 backend/models/post.js delete mode 100644 backend/models/user.js delete mode 100644 backend/package-lock.json delete mode 100644 backend/package.json delete mode 100644 backend/passport/index.js delete mode 100644 backend/passport/localStrategy.js delete mode 100644 "backend/project/db\354\275\224\353\223\234.txt" delete mode 100644 backend/routes/auth.js delete mode 100644 backend/routes/middlewares.js delete mode 100644 backend/routes/page.js delete mode 100644 backend/routes/post.js delete mode 100644 backend/uploads/KakaoTalk_20210621_165128562_031627275828320.jpg delete mode 100644 "backend/uploads/\354\274\200\354\235\264\353\270\2241627135434953.PNG" delete mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\2011627135861101.jpg" delete mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\2011627137619779.jpg" delete mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\20121627135902037.jpg" delete mode 100644 "backend/uploads/\354\275\234\353\243\250\354\247\20121627137675882.jpg" delete mode 100644 backend/views/error.html delete mode 100644 backend/views/join.html delete mode 100644 backend/views/layout.html delete mode 100644 backend/views/main.html diff --git a/backend/.env b/backend/.env deleted file mode 100644 index a180ece..0000000 --- a/backend/.env +++ /dev/null @@ -1,5 +0,0 @@ -COOKIE_SECRET=cookiesecret -NODE_ENV=test -S3_ACCESS_KEY=AKIAQWGLZ6TSBFMZV4XC -S3_SECRET_KEY=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 -S3_REGION=ap-northeast-2 \ No newline at end of file diff --git a/backend/app.js b/backend/app.js deleted file mode 100644 index d6870c1..0000000 --- a/backend/app.js +++ /dev/null @@ -1,74 +0,0 @@ -const express = require("express"); -const cookieParser = require("cookie-parser"); -const morgan = require("morgan"); -const path = require("path"); -const session = require("express-session"); -const nunjucks = require("nunjucks"); -const dotenv = require("dotenv"); -const passport = require("passport"); -dotenv.config(); -const pageRouter = require("./routes/page"); -const authRouter = require("./routes/auth"); -const postRouter = require("./routes/post"); -const { sequelize } = require("./models"); -const passportConfig = require("./passport"); -const cors = require("cors"); - -const app = express(); -passportConfig(); -app.set("port", process.env.PORT || 8001); -app.set("view engine", "html"); -nunjucks.configure("views", { - express: app, - watch: true, -}); -sequelize - .sync({ force: false }) //sequelize가 초기화 될 때 DB에 필요한 테이블 생성 - .then(() => { - console.log("데이터베이스 연결 성공"); - }) - .catch((err) => { - console.error(err); - }); - -app.use(morgan("dev")); -app.use(express.static(path.join(__dirname, "public"))); -app.use("/img", express.static(path.join(__dirname, "uploads"))); -app.use(cors()); - -app.use(express.json()); -app.use(express.urlencoded({ extended: true })); -app.use(cookieParser(process.env.COOKIE_SECRET)); -app.use( - session({ - resave: false, - saveUninitialized: false, - secret: process.env.COOKIE_SECRET, - cookie: { - httpOnly: true, - secure: false, - }, - }) -); -app.use(passport.initialize()); -app.use(passport.session()); -app.use("/", pageRouter); -app.use("/auth", authRouter); -app.use("/post", postRouter); - -app.use((req, res, next) => { - const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); - error.status = 404; - next(error); -}); - -app.use((err, req, res, next) => { - res.locals.message = err.message; - res.locals.error = process.env.NODE_ENV !== "production" ? err : {}; - res.status(err.status || 500); - res.render("error"); -}); - -app.listen(app.get("port"), () => { - console.log(app.get("port"), "번 포트에서 대기중"); -}); diff --git a/backend/config/config.json b/backend/config/config.json deleted file mode 100644 index 68d0bf5..0000000 --- a/backend/config/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "development": { - "username": "root", - "password": "daaeda", - "database": "collusic", - "host": "127.0.0.1", - "dialect": "mysql" - }, - "test": { - "username": "collusic", - "password": "collusic3717", - "database": "collusic", - "host": "54.180.156.26", - "dialect": "mysql" - }, - "production": { - "username": "root", - "password": null, - "database": "database_production", - "host": "127.0.0.1", - "dialect": "mysql" - } -} \ No newline at end of file diff --git a/backend/controllers/contributeProjects/index.js b/backend/controllers/contributeProjects/index.js deleted file mode 100644 index 43f9ec5..0000000 --- a/backend/controllers/contributeProjects/index.js +++ /dev/null @@ -1,33 +0,0 @@ -const router = require("express"); -const { - isLoggedIn, - isNotLoggedIn, - upload_commit, -} = require("../../routes/middlewares"); -const { Post, User, Comment } = require("../../models"); -//field값 - -const createContriProjectAPI = async (req, res) => { - let id = req.params.id; - const commentpost = await Comment.create({ - c_description: req.body.description, - c_audioFile: req.file.filename, - c_lyrics_text: req.body.lyrics_text, - pid: id, - selected_status: false, - }); - if (!commentpost) { - res.status(400).json({ - success: false, - }); - } else { - res.status(200).json({ - success: true, - commentpost: commentpost, - }); - } -}; - -module.exports = { - createContriProjectAPI: createContriProjectAPI, -}; diff --git a/backend/controllers/index.js b/backend/controllers/index.js deleted file mode 100644 index a42326d..0000000 --- a/backend/controllers/index.js +++ /dev/null @@ -1,36 +0,0 @@ -// const express = require("express"); -// const router = express.Router(); - -// const userInformationAPI = (req, res) => { -// try { -// const myinfo = await User.findOne({ -// attributes: ["email", "introduce"], -// where: { -// email: req.user.email, -// }, -// }); -// res.status(200).json({ -// email: myinfo, -// }); -// } catch (err) { -// res.status(400).json({ -// error: err, -// }); -// } -// }; - -const createContributeProjectAPI = (req, res) => {}; -const readRequestProjectsAPI = (req, res) => {}; -const readContributeProjectsAPI = (req, res) => { - if (!id) { - res.status(400).json({ error: "you don't send requestProject Id!" }); - } - - res.status(200).json({ contributeProject: projects }); -}; -module.exports = { - userInformationAPI, - createContributeProjectAPI, - readRequestProjectsAPI, - readContributeProjectsAPI, -}; diff --git a/backend/controllers/mypage/index.js b/backend/controllers/mypage/index.js deleted file mode 100644 index d0f0468..0000000 --- a/backend/controllers/mypage/index.js +++ /dev/null @@ -1,24 +0,0 @@ -const express = require("express"); -const router = express.Router(); -const { isLoggedIn, isNotLoggedIn } = require("../../routes/middlewares"); -const { Post, User } = require("../../models"); -//field값 -const readMyPageAPI = async (req, res, next) => { - try { - const myinfo = await User.findOne({ - attributes: ["email", "introduce"], - where: { - email: req.user.email, - }, - }); - res.status(200).json({ - email: myinfo, - }); - } catch (err) { - res.status(400).json({ error: err }); - } -}; - -module.exports = { - readMyPageAPI: readMyPageAPI, -}; diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js deleted file mode 100644 index 4dc7af0..0000000 --- a/backend/controllers/requestProjects/index.js +++ /dev/null @@ -1,100 +0,0 @@ -const router = require("express"); -const { - isLoggedIn, - isNotLoggedIn, - upload, -} = require("../../routes/middlewares"); -const { Post, User, Comment } = require("../../models"); -//field값 - -const createProjectAPI = async (req, res) => { - if (req.file) { - const post = await Post.create({ - title: req.body.title, - description: req.body.description, - genre: req.body.genre, - mood: req.body.mood, - lyrics_text: req.body.lyrics_text, - audioFile: req.file.location, - music_field: Boolean(req.body.music_field), - lyrics_field: Boolean(req.body.lyrics_field), - instrument_field: Boolean(req.body.instrument_field), - }); - if (!post) { - res.status(400).json({ - success: false, - post: post, - }); - } else { - const post = await Post.create({ - title: req.body.title, - description: req.body.description, - genre: req.body.genre, - mood: req.body.mood, - lyrics_text: req.body.lyrics_text, - music_field: req.body.music_field, - lyrics_field: req.body.lyrics_field, - instrument_field: req.body.instrument_field, - uid: req.user.id, - }); - } - if (!post) { - res.status(400).json({ - sucess: false, - }); - } else { - res.status(200).json({ - sucess: true, - post: post, - }); - } - } -}; - -const mainInfoAPI = async (req, res) => { - const maininfo = await Post.findAll({ - attributes: [ - "email", - "pid", - "title", - "music_field", - "lyrics_field", - "instrument_field", - "genre", - "mood", - "audioFile", - "lyrics_text", - ], - }); - if (!maininfo) { - res.status(400).json({ - success: false, - }); - } else { - res.status(200).json({ maininfo: maininfo }); - } -}; - -const commentsAPI = async (req, res, next) => { - let id = req.params.id; - try { - const comments = await Comment.findAll({ - include: { - model: Post, - where: { id: id }, - }, - }); - const project = await Post.findAll({ - where: { id: id }, - }); - res.status(200).json({ comments, project }); - } catch (err) { - next(err); - } -}; - -module.exports = { - createProjectAPI: createProjectAPI, - mainInfoAPI: mainInfoAPI, - commentsAPI: commentsAPI, -}; diff --git a/backend/controllers/user/index.js b/backend/controllers/user/index.js deleted file mode 100644 index 81d9240..0000000 --- a/backend/controllers/user/index.js +++ /dev/null @@ -1,2 +0,0 @@ -// const express = require("express"); -// const router = express.Router(); diff --git a/backend/models/comment.js b/backend/models/comment.js deleted file mode 100644 index 389ab34..0000000 --- a/backend/models/comment.js +++ /dev/null @@ -1,44 +0,0 @@ -const Sequelize = require("sequelize"); - -module.exports = class Comment extends Sequelize.Model { - static init(sequelize) { - return super.init( - { - c_description: { - type: Sequelize.TEXT, - allowNull: false, - }, - c_audioFile: { - type: Sequelize.STRING(140), - allowNull: false, - }, - c_lyrics_text: { - type: Sequelize.TEXT, - allowNull: true, - }, - selected_status: { - type: Sequelize.BOOLEAN, - allowNull: false, - }, - }, - { - sequelize, - timestamps: true, - underscored: false, - modelName: "Comment", - tableName: "comment", - paranoid: false, - charset: "utf8mb4", - collate: "utf8mb4_general_ci", - } - ); - } - - static associate(db) { - db.Comment.belongsTo(db.Post, { foreignKey: "pid", sourceKey: "id" }); - db.Comment.belongsTo(db.User, { foreignKey: "uid", sourceKey: "id" }); - } -}; -//requestid 외래키 -//uid 외래키 -//constraint uid foreign key uid references user.uid on delete cascade on update cascade diff --git a/backend/models/index.js b/backend/models/index.js deleted file mode 100644 index e77ff0a..0000000 --- a/backend/models/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const Sequelize = require("sequelize"); -const env = "test" || "development"; //config.json의 development 가져오기 -const config = require("../config/config")[env]; //config.json의 development 가져오기 -const User = require("./user"); -const Post = require("./post"); -const Comment = require("./comment"); - -const db = {}; -const sequelize = new Sequelize( - config.database, - config.username, - config.password, - config -); - -db.sequelize = sequelize; -db.User = User; -db.Post = Post; -db.Comment = Comment; -//사람과 게시글은 1:1관계, 게시글과 해시태그는 1:N 관계 -User.init(sequelize); -Post.init(sequelize); -Comment.init(sequelize); - -User.associate(db); -Post.associate(db); -Comment.associate(db); - -module.exports = db; diff --git a/backend/models/post.js b/backend/models/post.js deleted file mode 100644 index 7ddb9b3..0000000 --- a/backend/models/post.js +++ /dev/null @@ -1,70 +0,0 @@ -const Sequelize = require("sequelize"); - -module.exports = class Post extends Sequelize.Model { - static init(sequelize) { - return super.init( - { - title: { - //id 생략. -> sequlize에서는 id가 생략될 수 있음. - type: Sequelize.STRING(140), - allowNull: false, - }, - description: { - type: Sequelize.TEXT, - allowNull: true, - }, - audioFile: { - type: Sequelize.STRING(140), - allowNull: false, - }, - state: { - type: Sequelize.BOOLEAN, - allowNull: true, - }, - field_free: { - type: Sequelize.BOOLEAN, - allowNull: true, - }, - lyrics_text: { - type: Sequelize.TEXT, - allowNull: true, - }, - genre: { - type: Sequelize.STRING(140), - allowNull: true, - }, - mood: { - type: Sequelize.STRING(140), - allowNull: true, - }, - music_field: { - type: Sequelize.BOOLEAN, - allowNull: true, - }, - lyrics_field: { - type: Sequelize.BOOLEAN, - allowNull: true, - }, - instrument_field: { - type: Sequelize.BOOLEAN, - allowNull: true, - }, - }, - { - sequelize, - timestamps: true, - underscored: false, - modelName: "Post", - tableName: "posts", - paranoid: false, //deleted at false -> 게시글 삭제시 완전 삭제 - charset: "utf8mb4", //이모티콘 - collate: "utf8mb4_general_ci", - } - ); - } - - static associate(db) { - db.Post.belongsTo(db.User, { foreignKey: "uid", sourceKey: "id" }); - db.Post.hasMany(db.Comment, { foreignKey: "pid", targetKey: "id" }); - } -}; diff --git a/backend/models/user.js b/backend/models/user.js deleted file mode 100644 index 14cd16a..0000000 --- a/backend/models/user.js +++ /dev/null @@ -1,52 +0,0 @@ -const Sequelize = require("sequelize"); -//db 테이블과 sequelize 연동을 위한 코드 -module.exports = class User extends Sequelize.Model { - static init(sequelize) { - return super.init( - { - email: { - type: Sequelize.STRING(40), - allowNull: false, - unique: true, - }, - nick: { - type: Sequelize.STRING(15), - allowNull: true, - }, - password: { - type: Sequelize.STRING(100), - allowNull: false, - }, - provider: { - //로그인 제공자 - type: Sequelize.STRING(10), - allowNull: false, - defaultValue: "local", - }, - introduce: { - type: Sequelize.TEXT, - allowNull: true, - }, - imagePath: { - type: Sequelize.STRING(100), - allowNull: true, - }, - }, - { - sequelize, - timestamps: true, //생성일 수정일 삭제일이 기록 - underscored: false, - modelName: "User", - tableName: "users", - paranoid: true, - charset: "utf8", - collate: "utf8_general_ci", //한글 지원 - } - ); - } - - static associate(db) { - db.User.hasMany(db.Post, { foreignKey: "uid", targetKey: "id" }); - db.User.hasMany(db.Comment, { foreignKey: "uid", targetkey: "id" }); - } -}; diff --git a/backend/package-lock.json b/backend/package-lock.json deleted file mode 100644 index c77cff2..0000000 --- a/backend/package-lock.json +++ /dev/null @@ -1,2972 +0,0 @@ -{ - "name": "collusic", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@mapbox/node-pre-gyp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", - "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.1", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "rimraf": "^3.0.2", - "semver": "^7.3.4", - "tar": "^6.1.0" - }, - "dependencies": { - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/node": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", - "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==" - }, - "a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "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==" - } - } - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "aws-sdk": { - "version": "2.956.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.956.0.tgz", - "integrity": "sha512-vSzL66tjeRSBPnLR2Pkx4qS7SPqADT7K9QBjWdMhVd9BF5spyMvJ9hReIEShILp3hq99sHI+MvO+uTUm5s023g==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "bcrypt": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", - "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^3.1.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "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==", - "requires": { - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "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==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", - "requires": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6" - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "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==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "encode32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/encode32/-/encode32-1.1.0.tgz", - "integrity": "sha1-DFS0X7MUrVUC48Iwy5Ws3F5c0d0=" - }, - "encodeurl": { - "version": "1.0.2", - "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==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.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-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", - "requires": { - "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" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "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==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - } - } - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "requires": { - "is-property": "^1.0.2" - } - }, - "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==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "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==" - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflection": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", - "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" - }, - "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==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "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==" - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-beautify": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", - "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "nopt": "^5.0.0" - }, - "dependencies": { - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "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" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "requires": { - "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" - }, - "dependencies": { - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" - }, - "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "requires": { - "mime-db": "1.48.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==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "moment-timezone": { - "version": "0.5.33", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", - "requires": { - "moment": ">= 2.9.0" - } - }, - "morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "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 - }, - "multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "multer-s3": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/multer-s3/-/multer-s3-2.9.0.tgz", - "integrity": "sha512-qLF8pCD5HhXLLd954q49B63x3bk6Fe0jqD3eM0FVcGtqhiSVuTrchEDAo0mnO5pc34cMuX/CVCCbPkGTjX2xUA==", - "requires": { - "file-type": "^3.3.0", - "is-svg": "^2.1.0", - "run-parallel": "^1.1.6" - } - }, - "mysql2": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", - "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", - "requires": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "requires": { - "lru-cache": "^4.1.3" - }, - "dependencies": { - "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==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", - "dev": true, - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nunjucks": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", - "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", - "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - } - }, - "oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "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==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - } - }, - "passport-kakao": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/passport-kakao/-/passport-kakao-1.0.1.tgz", - "integrity": "sha512-uItaYRVrTHL6iGPMnMZvPa/O1GrAdh/V6EMjOHcFlQcVroZ9wgG7BZ5PonMNJCxfHQ3L2QVNRnzhKWUzSsumbw==", - "requires": { - "passport-oauth2": "~1.1.2", - "pkginfo": "~0.3.0" - } - }, - "passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "requires": { - "passport-strategy": "1.x.x" - } - }, - "passport-oauth2": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.1.2.tgz", - "integrity": "sha1-vXFjsbYJA3GGjcTvb58uHkzEuUg=", - "requires": { - "oauth": "0.9.x", - "passport-strategy": "1.x.x", - "uid2": "0.0.x" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "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=" - }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "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==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "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==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "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==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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==" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "retry-as-promised": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", - "requires": { - "any-promise": "^1.3.0" - } - }, - "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" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "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==" - } - } - }, - "seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" - }, - "sequelize": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.6.5.tgz", - "integrity": "sha512-QyRrJrDRiwuiILqTMHUA1yWOPIL12KlfmgZ3hnzQwbMvp2vJ6fzu9bYJQB+qPMosck4mBUggY4Cjoc6Et8FBIQ==", - "requires": { - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.13.1", - "lodash": "^4.17.20", - "moment": "^2.26.0", - "moment-timezone": "^0.5.31", - "retry-as-promised": "^3.2.0", - "semver": "^7.3.2", - "sequelize-pool": "^6.0.0", - "toposort-class": "^1.0.1", - "uuid": "^8.1.0", - "validator": "^13.6.0", - "wkx": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "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==" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "sequelize-cli": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.2.0.tgz", - "integrity": "sha512-6WQ2x91hg30dUn66mXHnzvHATZ4pyI1GHSNbS/TNN/vRR4BLRSLijadeMgC8zqmKDsL0VqzVVopJWfJakuP++Q==", - "requires": { - "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.3.0", - "yargs": "^13.1.0" - } - }, - "sequelize-pool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", - "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" - }, - "statuses": { - "version": "1.5.0", - "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": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, - "umzug": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", - "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", - "requires": { - "bluebird": "^3.7.2" - } - }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "uuid-apikey": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/uuid-apikey/-/uuid-apikey-1.5.3.tgz", - "integrity": "sha512-v28vGJ1hRDzqLm6ufZ7b098Kmk159PInIHYWXfB47r3xOACZ5nRIAWe9VxFjvSW0MwckQYAnS1ucWUAXGKo95w==", - "requires": { - "colors": "^1.4.0", - "commander": "^8.0.0", - "encode32": "^1.1.0", - "uuid": "^8.3.1" - }, - "dependencies": { - "commander": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.0.0.tgz", - "integrity": "sha512-Xvf85aAtu6v22+E5hfVoLHqyul/jyxh91zvqk/ioJTQuJR7Z78n7H558vMPKanPSRgIEeZemT92I2g9Y8LPbSQ==" - } - } - }, - "validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "wkx": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "requires": { - "@types/node": "*" - } - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "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", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/backend/package.json b/backend/package.json deleted file mode 100644 index 6406d68..0000000 --- a/backend/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "collusic", - "version": "1.0.0", - "description": "", - "main": "app.js", - "scripts": { - "start": "nodemon app" - }, - "author": "Daae", - "license": "MIT", - "devDependencies": { - "nodemon": "^2.0.7" - }, - "dependencies": { - "aws-sdk": "^2.956.0", - "bcrypt": "^5.0.1", - "cookie-parser": "^1.4.5", - "cors": "^2.8.5", - "dotenv": "^10.0.0", - "express": "^4.17.1", - "express-session": "^1.17.2", - "morgan": "^1.10.0", - "multer": "^1.4.2", - "multer-s3": "^2.9.0", - "mysql2": "^2.2.5", - "nunjucks": "^3.2.3", - "passport": "^0.4.1", - "passport-kakao": "^1.0.1", - "passport-local": "^1.0.0", - "sequelize": "^6.6.5", - "sequelize-cli": "^6.2.0", - "uuid-apikey": "^1.5.3" - } -} diff --git a/backend/passport/index.js b/backend/passport/index.js deleted file mode 100644 index ec34bd4..0000000 --- a/backend/passport/index.js +++ /dev/null @@ -1,19 +0,0 @@ -const passport = require("passport"); -const local = require("./localStrategy"); -const User = require("../models/user"); - -module.exports = () => { - passport.serializeUser((user, done) => { - done(null, user.id); // 세션에 user 의 id 만 저장 - }); - - passport.deserializeUser((id, done) => { - User.findOne({ where: { id } }) - .then((user) => done(null, user)) - .catch((err) => done(err)); - }); - - local(); -}; - -//serializeuser는 diff --git a/backend/passport/localStrategy.js b/backend/passport/localStrategy.js deleted file mode 100644 index 05de452..0000000 --- a/backend/passport/localStrategy.js +++ /dev/null @@ -1,30 +0,0 @@ -const passport = require('passport'); -const LocalStrategy = require('passport-local').Strategy; -const bcrypt = require('bcrypt'); - -const User = require('../models/user'); - -module.exports = () => {//로그인 로직. 모듈임. - passport.use(new LocalStrategy({ - usernameField: 'email', //req.body.email - passwordField: 'password', //req.body.password - }, async (email, password, done) => { - try { - const exUser = await User.findOne({ where: { email } });//그 email을 가진 사람이 있나 찾기 - if (exUser) { - const result = await bcrypt.compare(password, exUser.password);//brypt.compare로 비번이랑, 디비에 비번이랑 비교 - if (result) { - done(null, exUser); - } else { - done(null, false, { message: '비밀번호가 일치하지 않습니다.' }); - } - } else { - done(null, false, { message: '가입되지 않은 회원입니다.' }); - } - } catch (error) { - console.error(error); - done(error); - } - })); -}; -//email, password로 로그인하는 것을 적은 파일 diff --git "a/backend/project/db\354\275\224\353\223\234.txt" "b/backend/project/db\354\275\224\353\223\234.txt" deleted file mode 100644 index aa4e491..0000000 --- "a/backend/project/db\354\275\224\353\223\234.txt" +++ /dev/null @@ -1,45 +0,0 @@ -CREATE DATABASE collusicdb; - -CREATE TABLE `user` -( - `email` VARCHAR(40) NOT NULL, - `password` VARCHAR(40) NOT NULL, - `user_id` INT NOT NULL AUTO_INCREMENT, - `imagePath` VARCHAR(150), - `sns` VARCHAR(20), - `introduce` TEXT, - `nickname` VARCHAR(20) NOT NULL, - PRIMARY KEY (user_id) -); --- 기여작을 댓글로 업로드한다 가정 -CREATE TABLE `comments` -( - `comment_id` INT NOT NULL AUTO_INCREMENT, - `title` VARCHAR(20) NOT NULL, - `description` TEXT, - `comment_date` DATETIME NOT NULL DEFAULT now(), - `musicfile` VARCHAR(150), - `comment_field` VARCHAR(10), - FOREIGN KEY `project_title` REFERENCES `Project.title`, - FOREIGN KEY `project_id` REFERENCES `Project.project_id`, - FOREIGN KEY `project_field` REFERENCES `Project.field`, - PRIMARY KEY (comment_id), - CONSTRAINT `user_id` FOREIGN KEY `user_id` REFERENCES `user.user_id` ON DELETE CASCADE ON UPDATE CASCADE -); - -CREATE TABLE `Project` -( - `project_id` INT NOT NULL AUTO_INCREMENT, - `title` VARCHAR(20) NOT NULL, - `description` TEXT, - `date` DATETIME NOT NULL DEFAULT now(), - `audioFile` VARCHAR(50) NOT NULL, - `state` Boolean NOT NULL, - `field` VARCHAR(10) NOT NULL, - `genre` VARCHAR(10), - PRIMARY KEY (project_id), - CONSTRAINT `user_id` FOREIGN KEY `user_id` REFERENCES `user(user_id)` ON DELETE CASCADE ON UPDATE CASCADE -); ------------------------------------------------------------------------------------------------- --- Table structure for table `user` ---state의 상태는 0 또는 1인가..? \ No newline at end of file diff --git a/backend/routes/auth.js b/backend/routes/auth.js deleted file mode 100644 index ff7d9bd..0000000 --- a/backend/routes/auth.js +++ /dev/null @@ -1,70 +0,0 @@ -const express = require("express"); -const passport = require("passport"); -const bcrypt = require("bcrypt"); -const { isLoggedIn, isNotLoggedIn } = require("./middlewares"); -const User = require("../models/user"); - -const router = express.Router(); - -router.post("/join", isNotLoggedIn, async (req, res, next) => { - const { email, password } = req.body; - try { - const exUser = await User.findOne({ where: { email } }); //기존이메일로 가입한 사람이 있나? - if (exUser) { - return res.status(401).json({ - msg: "User already exist", - success: false, - }); //프론트에서 이미 가입한 메일이라고 알림 - } - const hash = await bcrypt.hash(password, 12); //기존이메일이 아니면 password를 해쉬화 해서 저장 - await User.create({ - email, - password: hash, - }); - return res.status(200).json({ - msg: "SignIn Success", - success: true, - }); - } catch (error) { - console.error(error); - return next(error); - } -}); - -router.post("/login", isNotLoggedIn, (req, res, next) => { - passport.authenticate("local", (authError, user, info) => { - if (authError) { - console.error(authError); - return next(authError); - } - if (!user) { - //로그인 실패한 경우; - return res.status(200).json({ - msg: `${info.message}`, - success: false, - }); - } - return req.login(user, (loginError) => { - if (loginError) { - console.error(loginError); - return next(loginError); - } - - return res.status(200).json({ - msg: "Login Sucess!", - success: true, - }); - }); - })(req, res, next); // 미들웨어 내의 미들웨어에는 (req, res, next) 꼭 붙여야함. -}); - -router.get("/logout", isLoggedIn, (req, res) => { - req.logout(); - req.session.destroy(); - res.status(200).json({ - msg: "Logout success", - success: true, - }); -}); - -module.exports = router; diff --git a/backend/routes/middlewares.js b/backend/routes/middlewares.js deleted file mode 100644 index b59b88b..0000000 --- a/backend/routes/middlewares.js +++ /dev/null @@ -1,60 +0,0 @@ -const multer = require("multer"); -const multerS3 = require("multer-s3"); -const AWS = require("aws-sdk"); -require("dotenv").config(); - -const s3 = new AWS.S3({ - accessKeyId: process.env.S3_ACCESS_KEY, - secretAccessKey: process.env.S3_SECRET_KEY, - region: process.env.S3_REGION, -}); - -const storage = multerS3({ - s3: s3, - bucket: "collusic", - contentType: multerS3.AUTO_CONTENT_TYPE, - acl: "public-read", - metadata: function (req, file, cb) { - cb(null, { fieldName: file.fieldname }); - }, - key: function (req, file, cb) { - cb(null, `requests/${Date.now()}_${file.originalname}`); - }, -}); - -// var _storage = multer.diskStorage({ -// destination: function (req, file, cb) { -// cb(null, "project/"); -// }, -// filename: function (req, file, cb) { -// cb(null, file.originalname); -// }, -// }); -exports.upload = multer({ storage: storage }); -//commment -var _storage2 = multer.diskStorage({ - destination: function (req, file, cb) { - cb(null, "comment_audio/"); - }, - filename: function (req, file, cb) { - cb(null, file.originalname); - }, -}); -exports.upload_commit = multer({ storage: _storage2 }); - -exports.isLoggedIn = (req, res, next) => { - if (req.isAuthenticated()) { - next(); - } else { - res.status(403).send("로그인 필요"); - } -}; - -exports.isNotLoggedIn = (req, res, next) => { - if (!req.isAuthenticated()) { - next(); - } else { - const message = encodeURIComponent("로그인한 상태입니다."); - res.redirect(`/?error=${message}`); - } -}; diff --git a/backend/routes/page.js b/backend/routes/page.js deleted file mode 100644 index 8319b1a..0000000 --- a/backend/routes/page.js +++ /dev/null @@ -1,94 +0,0 @@ -const express = require("express"); -const { - isLoggedIn, - isNotLoggedIn, - upload, - upload_commit, -} = require("./middlewares"); -//const { Post, User } = require("../models"); -const router = express.Router(); -const mypageController = require("../controllers/mypage"); -const requestProjectController = require("../controllers/requestProjects"); -const contributeProjectController = require("../controllers/contributeProjects"); -const { request } = require("express"); -router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); -router.post( - "/requestProjects", - upload.single("data"), - requestProjectController.createProjectAPI -); -router.get( - "/requestProjects", - isLoggedIn, - requestProjectController.mainInfoAPI -); -router.get( - "/requestProjects/:id/comments", - isLoggedIn, - requestProjectController.commentsAPI -); -router.post( - "/requestProjects/:id/comments", - upload_commit.single("data"), - contributeProjectController.createContriProjectAPI -); -module.exports = router; -// router.get("/", async (req, res, next) => { -// try { -// const posts = await Post.findAll({ -// include: { -// model: User, -// attributes: ["id"], -// }, -// order: [["createdAt", "DESC"]], -// }); -// res.render("main", { -// title: "collusic", -// twits: posts, -// }); -// } catch (err) { -// console.error(err); -// next(err); -// } -// }); - -// router.get("/mypage", isLoggedIn, async (req, res, next) => { -// try { -// const myinfo = await User.findOne({ -// attributes: ["email", "introduce"], -// where: { -// email: req.user.email, -// }, -// }); -// res.status(200).json({ -// email: myinfo, -// }); -// } catch (err) { -// res.status(400).json({ -// error: err, -// }); -// } -// }); - -// router.get("/join", isNotLoggedIn, (req, res) => { -// res.render("join", { title: "회원가입 - collusic" }); -// }); - -// router.get("/", async (req, res, next) => { -// try { -// const posts = await Post.findAll({ -// include: { -// model: User, -// attributes: ["id", "nick"], -// }, -// order: [["createdAt", "DESC"]], -// }); -// res.render("main", { -// title: "collusic", -// twits: posts, -// }); -// } catch (err) { -// console.error(err); -// next(err); -// } -// }); diff --git a/backend/routes/post.js b/backend/routes/post.js deleted file mode 100644 index 579a10f..0000000 --- a/backend/routes/post.js +++ /dev/null @@ -1,62 +0,0 @@ -const express = require("express"); -const multer = require("multer"); -const path = require("path"); -const fs = require("fs"); - -const { Post, Contri } = require("../models"); -const { isLoggedIn } = require("./middlewares"); - -const router = express.Router(); - -try { - fs.readdirSync("uploads"); -} catch (error) { - console.error("uploads 폴더가 없어 uploads 폴더를 생성합니다."); - fs.mkdirSync("uploads"); -} - -const upload = multer({ - storage: multer.diskStorage({ - destination(req, file, cb) { - cb(null, "uploads/"); - }, - filename(req, file, cb) { - const ext = path.extname(file.originalname); - cb(null, path.basename(file.originalname, ext) + Date.now() + ext); - }, - }), - limits: { fileSize: 5 * 1024 * 1024 }, -}); - -router.post("/img", isLoggedIn, upload.single("img"), (req, res) => { - console.log(req.file); - res.json({ url: `/img/${req.file.filename}` }); -}); - -const upload2 = multer(); -router.post("/", isLoggedIn, upload2.none(), async (req, res, next) => { - try { - const post = await Post.create({ - content: req.body.content, - img: req.body.url, - UserId: req.user.id, - }); - const hashtags = req.body.content.match(/#[^\s#]*/g); - if (hashtags) { - const result = await Promise.all( - hashtags.map((tag) => { - return Hashtag.findOrCreate({ - where: { title: tag.slice(1).toLowerCase() }, - }); - }) - ); - await post.addHashtags(result.map((r) => r[0])); - } - res.redirect("/"); - } catch (error) { - console.error(error); - next(error); - } -}); - -module.exports = router; diff --git a/backend/uploads/KakaoTalk_20210621_165128562_031627275828320.jpg b/backend/uploads/KakaoTalk_20210621_165128562_031627275828320.jpg deleted file mode 100644 index 65497997180c75fae462c502dc3c3e7f956f8dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66022 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 `j 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 GKmXa-7u*d1 diff --git "a/backend/uploads/\354\274\200\354\235\264\353\270\2241627135434953.PNG" "b/backend/uploads/\354\274\200\354\235\264\353\270\2241627135434953.PNG" deleted file mode 100644 index a012039e5bc0fdc43be5a05aae89d0dad7bfb8e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10694 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 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\2011627135861101.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\2011627135861101.jpg" deleted file mode 100644 index 4a8485970785d7e6b213639f39f131246a2b1e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5806 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 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\2011627137619779.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\2011627137619779.jpg" deleted file mode 100644 index 4a8485970785d7e6b213639f39f131246a2b1e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5806 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 diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\20121627135902037.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\20121627135902037.jpg" deleted file mode 100644 index b7cc90e3083af9c45f6159afdc49ca740d7b560e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28111 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
  • r>Nd5e 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%0Ah z^%dMY1Hz1W`^~ozRxBO_CdG0)lEoya$f$2{z+_ zz?>gBp_4~3z7(die0w!KdvWTFBUlUB5#|=nW~6qTbE@guUmBmkFEDra3G`&ye5?LJ ziOY%qe78DbgO_;ifF+7vw3M|GBsFX}!L(7v2=^ZPd;4XXBgKDU3{^~OUjd20>e2Z| zAAde;yPs3T`;6gBd|1w{p&9DWyf5qS)~NY3ZnbhfySwbRkF)3Z-fu|^h(UUgX^u9i z>fHo=(C}LawSMO*axY?3cG@QjubB%Z*(+7((fNU(hPJC<5~HXBNtIY^!`b<=w3Gi# z_jWpZ)K8p%rusX4UL2eic(I`GxgT%7zbENbg93l`i{E*MSo#kEllUm z&%Kg8g>yYIS-mWVpZm~PUm<{$72vw2pi_BsE1y_Y^nfnp#Z$T@2Dd0*-7}^A(IB)n zH3&Q{@|Dk8c9N3Ixe-O@3$J&DYSAj5^<2(B`&B?p26QSZE>XCNAz{1KOLKx~xj~Rw z*btmw)HK^pCDFa=2y&R)0MAm$H@P!2== zVb_o~s%-o9_t(S*V4lcFE|cW0@n5LyhL>$q(YJaLwmFi`{WYpz&A(I~qCI9%=F9pk z$fe2Oz3r}!UZ-J$E3SWQ`){npup`E>Xs?#jcn{|Hw$rVhp0m$j&u^_ao6_|o%r5|6 zY_Vt3ON^o432)oAM=$3NjNP|(H@9nRpp3rShW|uqT8GvahHL?-js8CPe1pz~^Y;p3 z^;9~qC?`e~+uLf_F3P-ss;JIglv(~ z6qwy)_e{_Kf27x7Z)5c(0wfvK;GQUi5m5D}o*h{ai)k-HjFdN@_ItAR2C#c*I;>(Bt+LuCXt3 ze&Xx=OC}eu3cF^_G@Uh@Hl&G~105+WnF@IuQ` z8AmhsaR)7Wr*JS+@gMbzTo#CpjNy|RcpS^8?5XF>sTGG2&P7dJ*MdIU4ed{&lD zptqZN=37lsXi%qzYUZp}7h^ETTl_AafRltc`{ajYdh~!>pzu$tx6zBUCVnlqv~{ zMBO;$4y(%s>PNT|_vTgGZXW5tDO_|Q(xFG=$S3jER#LSlQU6%z2-??ijqKis_P6>r zgJH%iXi8Jt@w?F8I9k}s#Dz({fdG)Nr`VH;gH7G(ao{5tL=~H8o#H@_ENc78?I&Lj z{c3!cmcXYb4EZKQMHf$kQIeMer|nloibA!ZvBIT`FU2+?imWXGY~-}-(sHvI-k>4s zN?3+wRo!KYCR=G)JcHUd8d2J=W;B>5id&Ao_0&0BX*qQ2^dYQ4go6_(@dU7{`Ilka zUi@~duH@R=ka624z%KWSv7dHJc;F2BD-F=ngbG z(3&|cXyaGDh4&@!K|$5#XfVwTp?~CpOuDI4Z2PxU2*$TC}O(R6`ucXvpGn+bKM*Z5I--4i#tzV&|6__77*6_l4a3WF9 z{A*1tD(vY`NB*+7EsAXUg~Dz>&vqL2`y)i4| z3q7pa_Gy*N6g!FUGr)ec-GE~^hdyIqdTYjwlI+xY8aqnMuS?Q0Y_p;B{dc0*9@Q|> zGjquGAKF5rJ#j&$-DQ*)@Z(~n7h9UVZVj$}9RDYX^p-D^oK6&2Go%+CuhMzlxO9KM zpW(z|Rzo|aOJ|#xyV+L@S<_NQnzxn9o!5!e$OjbiFs0xmT;?p?wp!JtHT7;_kIIc8 z^dMr3-szcB;fOPj2YbOwDlHr$io7tNw=U$VxvZ833W{dHr;>bMZCQ2=Qn@ST79+h3Q9sWo8lG8=dN?KhZqO za>u38wuum(cx}DbDz^Rnbk=)Yv^?u_Xa7lP@2^I+04S@zn5O^Oao5a_Rsd4}?5qTf zwjwW=e?8*By99q5)U7xFY(J9o{==_n``6D8mEvSnejc1x2wj{1nWh8}f>X0hL9hU@ z$J6SCXz9rkI(N7Xq8|Ny<;`DWpLqduCRZBWN>CIw$&6`6tu;70c<=q@GQFY>!^Yp}CVy(>kCl z(lI-A^_iJw`$aU+e%g@O)4HINe=^NL__jO|)%TgZY{Y{&{M>nX?YP2*pQHZ|YUS8J diff --git "a/backend/uploads/\354\275\234\353\243\250\354\247\20121627137675882.jpg" "b/backend/uploads/\354\275\234\353\243\250\354\247\20121627137675882.jpg" deleted file mode 100644 index b7cc90e3083af9c45f6159afdc49ca740d7b560e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28111 zcmbTdc~nwu^fpYRm6@59r6o^lnRAwAgF=&;nUV9DJZWlbN@^x5LS^MFS*fWdrKzbI zIp;{u<&Zh2rU-;H0uFExIDF^%z2AD@wZ6aJ_1yx?wNMuO-22}9+Shd*$#2OdZ0FU> z=9gjX*1=#`pdXlo1=GH92Xh}2dV{dykvUW?27qS8(TYj2S+DokK3MJ-gkU_ zgYSnt2*rklM?HD^EIKAO?#0VjDXD3%(=)PjKIG=*e=I00Ei136tomAA)70G3+SdO4 zM@L`(z~IpE?~zd&o$;4BH9a#s$6Z=pS>^Eo!P2Kb3-b(6LpuEcQM_YDZNPb_^xK;IpHD`}|Q17Y`qXHz6FFLF<2 z5jLRMtz%Ln$#k@l5?9wut7?(%8L?C|o5i1w`g zH5^i$PU=*fz_`F__yLpL-o3uZ4bb53nCC@u>xvDtHPSBC5CqsV2`uXxwN)GafHI@N za}yr}>!XS5rw0jPa9XDzN0cwVn&&rCv09n3AwLf)DCdeB9 z9a))|QXBfDIG{-a>(P2o5)nKJj-Kf96ODqa28=iT#<P<;%jl!=9+o7Wt@YWR_hAXUg&3i=ek(u9@^mEoo0^26;zj?E0 zt5jNw7TAq%eCfT<*c0jVv}ix!nOO^iv-*X=)@L38Wt(#MVOA**a^RtS!h^~c{~gP= z$+sLw+J%OTW^&in6>+WpC(JT!Utio6KqljNubH~8Ne^ckxqLiiCz;PA_hLo}Ji9)G z)bCFE!EiK-C_e``nR>5v;+O=McS8aTv933oq&D6}(o*8*oLf8RMp+C@-GKL$(``aM zI46OXxlNK($b3KWDk2?e@x~#>^}K_86j28mEizkcpUi&@xE*Y|Y*#-=TDt-)OJJq_ zN3$u9J-d0tnVkhW!rH=}rI9m3xt-zm=M2~SRY1-Ameti`mP#M~c#NHs`!V_Wq=3-x zF2Zi{Ael+w)d3@16oZt&7(}R{OU~=g82rV#G*OztRl-%Q!b))0shs_&`QyC%gq0jF zc$RxnufwAgPKTG)M6*JKD4bi}%QnhZW@X>~{YjmU-W$3#No^p@Rsy4ifPY9U`%6U8 zfWuF8Sso?Wlapy#6?*q0hE5KYz@8Km*hb=2^q|GJx@XGlK}P<2QIqIS5AwC-*IHKR zRCzq+op8`cUld~92^!NdzEDwrH@qhQicn)Efo(@EHOnn_zIrKvo&Pu^f&IGkdCBDU z#|;TX*U8yF4gd5_^{y7(uYMNt`}_P-g%8^~$iPx$w}-=hi!e9KII>cr{L{64j}VFb zcZlL8f$dUnBE+U82Ged{AZT5wds$qD6n#k(XNVmhUkOl6y5oAKRHlQmm?0|XMn|o{ z58MgH20IhGsxlWPurQRDj7aCE(Lz6W*%83dV;a_p{(bxQ2pV|ddwtB>PViu?gF1oY zHSnNBT8F%Y`h}V^Eac{I>k|*u&m|K_KrToUD>Nhrw%H_^Wm)h^Ug$1-YP$*v*keR8 zV!ksHt<3UM3R^M*mxh54X{vl8`>D9^kb0W1Qc&;;in+JJMChlguMsY$rsgGjeAId) z)ec=O@u)zSR|O~-wNhb;7R~5tu5t|Z?w7X?sT#F^F+8`1TDfPS=H;8cUUR2a>G$N$r};?>WJD>}AHerXI{Q%(m(5lIVheoAZvH9ac^d!;%tA^byMB`{C) zVm(g4Mf2Wg(!G<^IGAtsXV81*sMIR>%onIbX;T9UY$le3Me**D{+<@z_G)c>QaG&m zq*wzZTx=MUfs(^{J;R^y0z4!>h84!DYj`<5srKZ#6MXLFKNg*RdD(#T^^OF_YFBtC zG6EuL*uH~OrsZYQ5ZHNd_xYzZ)??(rl^k*JRk-IB99fT;N_opoZ_twC{<||ueI)s8zHn!_gM!9FZpiQ)!YO)%&I#Xc7Oprr&pm(t;IN2;;e( z5*X%6H*Kbq9?NC7P=24~c>sAmfppY%m-9h*&#WH4tRNR>!sr3i>a*TTkK+z;v=;aEcL0vQ91BMhYm%Bg?X+EFO)m=o~!;X)RM8K;-uZz zs)6ePFATtap5thL(HY>82Upho#T}i`pLBJUZu9t88tKS!@)S8Qw6FOXW3G4Y?R8i6 zC2;{EMvQ9G+w!G)dsr@fLOG7`mD=3<5x&xwUW-{=`$f{bz6yrrW1finWS?tXa*@C$ z-r?Cmfe}HLaeia(>h8Cr5Eg%LEBAc>maUEJvyBQES{lk;rZC^0mYrDreD5D+w5U`# zPz;ipQy;eXao_wpDF)`zHhw`8*lzsFNY((SzF}_2a;hMIhQ}flTz!5K-u07JE<>6i zce0684wQ?VuuqzztS<0y})+%9Z-10kxD(H)nj zu_n(wL5Fso@&vDx+0tM<@V=ztDS=ra$P}lb>As>Upivlxy9$)Zbdwql{H35>dYAi6 zEQ*)FuB8Ef%focHYKCmQ+wo{epro*&2-`#Xfm!tdJ6he!=+z1rInGYbEYq=y2g9rR zQh?s$A34|aRQV}P3G5-M%Q%?frILRVuER&E^{xc-Y9+9Je#3en=d3-m<|fmE2=(Y4 z*i@f78?L^;1QvxK6%tz3Ud$kOOwduUl9vr}CpZzHI!R8go?i(2Vi8Dfbyb#i&xX1WtrSUMqtAz#KeJQ? zsIz0=CB0C81dVeT34{lq25+9g{HFh8f7Kiy%ykpq{Xv4$myzSKpz|Q`__bJL#o>dy zLy?POrYX!o_rX-PtP-GpncMbk4UtD;nQBG?xeFcCrorC>(STnRJcY)!^^9&Y%Q$|9 zbE;;*_j2z3prz+HnE0ciUi8`<z@BmbZDf~#5MtLA&lJxI;#<%M zLn3YH2awzGJAdaDhi-+BI+Px8acUR$i>Ju>Et$iQ+y-$;4ZHMHRq4-XNh-KtK!YJW zD&Hc9g|~!~ZgC7O8s_$WeKAX^tp)7sr)gD91eoaPuR|RE!~5Uw3mqK-R7@?YEF*rV zcy0xGahXtox<>fs*H3Oc9X*hf+MlL#O8oNCUm(nWttE%OEq}kDWcfy)o@m>%o8_Z| z6Q7PkHN4!)b@KX5{^9`g1 z*2z-Gy3?QVb28@A?n+4ra{{$z*5&Vr$z7Z{alN{=KGA@fQyF1H^{o=x{{DREYt{1m zvoF~gbj{#Sc)j2{8`u-r_9o}_1@vyq3LqA_qN#aD!5A)_D?$Zg6u2zk{<&tJ=M!S2 zS*&q4rP=j!Eu%*Y>(DTf<-8>v4@!{KC0a3yHx=2W8il*FPR_+uia{`-+?*r=wx<^ep$VoMw) zsG(7grA%Rken=gat_^*5>y=3c#i|2Ha`fe<>|1I>-Ue;DvCaEmyC05ewM)|nqBu?S z_FUN(^CLqF)6rTL^TT*uzrgqygTcE3lI|d=$fLwTGvP3e8bfN!FhEylP9@tqG$D73 zaM=RG2eh;)f!~^$iUgJrzyGSEqey@I-Xq6fd8lTHbHIOevSR&d!r8H^v)1?J+1=5Q>Qq-E(6DI9kXRes)J+?H=1D$9ocgasd zsBzey<-CsRl+)BVE^`A4w8P7LFSl3+T=75^8Iydh! z(m8p@&rO>jDh&q>D?y!V(+qN_!RZzFE|(9SYqbw*#8e(-#CIW6Jer`Yw^q~fSvk=+ zD975k_so~yHNTxMSDX$ay^Srv*76A4OK$Sq%6Za`o0XkfJoKtJ;GR-6PuhyR#zjTv z*!QvzG~qo3OERHZs+@*shRimMED$$zHq(6AFQ*u%6_JZ==3xfyI~}M6z~#^pOkmZC z5ee)I6+%rFXogfjYUZG>4_AF#`*>QtCP5SnO&*Gf6x%?n++?m)EAKY`4c3GAX}BEd zgUg*u+bUiy3?F74qN5Tg)FiN{dYmAIDoVN$np)MRqa%UEgPYJ>0ZMx+9?nU~;APDQ zA8uNx_)VQxBcwclu3yp0H18C!k+K;)Xck7kOKMT1t_2jF9PggGR_#a`u^q1hH=r4x zjiQe^U0?5%bo@Z6P#@%q#jyqZgM_DpFY)0|snR$-PEm6Kt$xq(P)x=HL6(z=<@n772&T9`*%mu2WE&V1GW_# zb3o@C>j`@oSFB9$!)&r|?Kv4Yy}mV!--3z`mu->2HcnvmT7G>Rs*0cGtAYC+#2-FS z<;O~3(`lUHq7;VKEpL{puA3D(f{y&hSWkEv=L#q=q{$;xy6#wJv5C>_FocIXyU85r zY9;&i>k|C*cKMW)xmx(&En40iSy&MYZZi^|og?jO*zpJ3NfXwSVnrvPE&X(CSiVFG zLr(gkdoDl9Chqfjz|Ybc#H=1kL0}iv?goI11LT#?nX(m&9EL$|Os8MllN^y7MtoF6 zXn`vptAj^F1lD_vV4V7VRRU%5!zdwoBu(hAn+q~)*ceez!zHe|Xty`RjHs4o#@UnD zvK@~;Gs9{Zy7)2E@7GIPc=j8(*v9sB zbW`iaouY7_q{LA>{0j?DmN`7covjukh({_umU;O2ccXV=DZEFNUx;HD3+|Lwe$O3+ zl1-r--E#^d)#AOUaPnRW?>+-w#zQ^o2BP*PrJd9yw-C%!Opm!EQ$HnCi0;~JiNGpVV)7%L6mqng(rEaxO^s#BdSs}L7BqHzsi_v|nz=j9g*ywLSI}YZpx*vjH@{hI= zTX1O{Jst)v500d+Arga@u?|gNJ{N@DW>xRvN??PU64;E3-`cu(z=O!Vfv_Y0qyXv; zPg~oY#Tfcjw$UGKj#ZYe*8#z?%I{C{@%Ux2i)c^+Q$t?Ae!AKFKx9>6^l-(?LSY zniV()sHf1s)SZn^(sb=(D(X`qNh6O)5_?`#g$9WM>&2cuA~*cklMfrbJC0^QRD-n& zYm(xQ!gA%lkIT-Qo5Czh?j)VeO&pE-`6uw)_NCDm+D6W&z*VICuT2hu%E8xTqiOB~ z9(?}{*sG5L<&T`KU&lk`jeCamr_xkC7KT^T#AG z?Ew5D1lb68BiGg4Yv-VqtP7q&ObPcDfyLmW4xG}>@=5Nn%VFE_iJjxS+J;RZ&MW-s z9t#PZpcHq0_WL!`H8MecP!S??*_@TgY}>o9jXBj2$sxx*t7bGGhdS}2B5@I!2Hrwx zklPMevKLUqLW9nV&|Zi0B5wO^;uY}*nE44+-V!}T&xCur%|IC9{z#Uf8y>37b_ z=`oSrT0sN^J2rAGDc?>n8pgL;nsxmCQJW!Zlb$jwD}fv0@8kO^J4DwqiYwp0bES;@ z4XiQdqKEM7vAs4L38kaSeEg5q>dk%&;{JJ{qPosc8$28zQ9STzq@bZOR1C3+$fw@8 zW1N8pZc<;WYEt@4ubYNSV81H~%j5IRGCjGuNU!`NQP0Ks6j{l@T6QP$HgVR*Y{1qT zv-n9xXQsl0@cuMXm<#8SnDyuc&6DWNVsq2bH;hXJ^~IWArr2lT#s(av_$XSyv_S1o zdbr=3Fk^V|Y^d^0n0*#T_jva&haQ50`hc!Tj_f-md|F@pCetbM<^w&@cyQi%mHD?T z<9cc>Gm~joOc_PeYO#7etB9}^dkM^O;BK}DC~m@0_&?`FnXMDrYgta{-%zenR$lVR zQm4*1erkeBaC28AQK*O21NX4Mp|%0H^?GEUATZ+lArsWKJrV7w+GTtDN4rL5cn`Q$ zox81c|3uh-ATRm zrjt07^9o103Ud?=M2KhI{i%xs7s2#j8#Bc-A0g@)x=Oa|;G*)PAn{N9sx7*nR5z&i z7S5;iFr6dbopA5}m|eF1im>11w4lHPu9q&dQ!5r3tW)y3Jbo=ZOMC~movL%?*uZyT zzte-^clWn>2q_TmMXYjVMY}J4)8WeUZg9O``esg*L*p6R(FH#zdmVf7HOkOr&FH#|M<)1d4Gc%v?S|AgnUudYa=WPXo*FKvo%s7Zi6mq{d&OfL9KzF5orgKBA*~Q)}s8)!OT>AnJ zzr_Q!eDE?mm12X~gL5w99?Wo}T2x+h5EY33!EJ82*ARl1?c|UeXeC)gZ*E6QnVMqM zUy~*Z`~**}nP=+L;cTsGb}UpA{ju3S7sl#6{`H$tf7wYyq%0?;tNLac)eU}-z#IYw z7dR`2yICsX`$JCDHE<0-C(Y(D#MbME3J6WXezOu7k+53ymk@J?C58aKZhl2@*{K6- z4tvBo5bYF6VUxjnd?J{4ML77)kqq_v!L^L`%qz>wf%b*PL{XUON|7D-DpKBFr*mV()oLt zdR7A4q1DqiCD+{his-GL{^TCLgk&+LMR{j+-C0p_csG9y z&!c44nSZlwy~n#1R{-TXM9+R8_5Lwz*@xTV`Ly$1sn7~}TZh6JKheMEEKw(AZXY4K zQ&@2f>TEhjUKGY+UWyu_bf0h543#7tsL&3Crm8DhuIPCqhu6nX{nvCcY(gyxuD4d0 zCNqC-Po@N>oZlaW9OM^dKOwFbpOe|%-S^ypG{eYC$$tc@^GAHF^6Iyb-L@B2)N>eZFHn9v za`U>E*Zm%Dvq3R1u?|WV>d89bV#f+5x`c{V78rzC#Gtrdlr}h&C;M*W%#+sI6zD=T zcGzA^7ujfD2tt+TH_31PjyoTa5m54vlhuQQ?#Ltit`z+wjFa2nDmi3Yezk}<5`+fW zI}3YgQmtPNvHcbUA6iHup$>wJ?G13@ehay1Vomrx*ZewwbVJdeXxM!4oepkr@5dUw z$85vc%-b(Z$hH8vfY9>!>=p#!tgvF)J24IQ&%Dvt59F#Mn-P1{Z2N{l`adjH`HUGPZ8KUhiR_`dCFVPtd3zrGEYJ5isL6h* zkc~%+eL+^V%)blu{o<-loNQC1GpV*0ZzdU9%d~`Q#1-xm7dr6I@XZSSfbZb{>E@B> z1PG(EVc8Irg`OKSxO!u1{mx1UCvFL_MQB+awy|EWAfYSZh_KtmQkk8VmCR}pDN>)EE2Yt_oXsdnxrz=$6O^*A_F3x1v{G!15=NqbEzu)M{`c?89ijUTha>~}( z@Nzw(xCC$&Xn_UsU8)nKIWTpP1lpz3rcQo|DQ zcSTy_Qb;o-J|XSwX(4R}GFC(E)9!y>QjnLxhON+4V^yK?36Yx%YuWgc&tO`!{POnp z)@ujPWHlv(5m#Demj%|_UZC{m(eVThWS0Omc==rFw^TDmRrKd_tvrMS@1?2cNVht_ zZd9DsudBT(9a3G9awHb?)Eu!VGcY@Ghku@OQPSS)zXQ#Ve8~>F#+FSY3XS6f)q?)x zC(hh15#q|fyzT792ZYlv8|ihQOCVphUEhAT!3`4G0A2DWm8 z?JGHyRv`v3{XG3|Y{*;QB4Gkl6rjKzGLTuwT%;;a5h3&O{pd0liD#c28OU=HZj!*P zUr@$9K^EcYmWj)~`$wA>DSSV%Y+K~kuX{f`tQtOLl9u7Gthpx)cyIav)T#w%sx}A6 zxf134E5Lg0XUN2hoB$aYwqjH(K_1RALjoG!vG^UhOJ9IZTxDvN2TdOtN}ct)J)(m;Vjty}^rWQ^2-LYgXkq?51x!{Y-fUJmm4*{y`Bu zJs+h+=ux5M`kGA?+-#q6`Z51yn3nD;@XZ-(!5v3tV4jk;ll6*4sIcwV8bdkTJpgAk>?Rrg&jG_P3tMz>ObPt1+q_D4`bfwKfw zNzM*Uc#U2)(rKa}mcVow|FvH_HSvH#Tt3M?P>wi?T(4_T{oX6c$o^Q;6~4m+cvk#& zHFB?4(y7yH4xI=UjtQ8ivHVgA?+f-ddY?Mo%S%qH!RuW9P|%rbg$U!qV|B~Rg~nT2 z>cj53DOC;X;l~SA#9Bjj<{zC$NM)i1@7!R-zJ9cGz5Aa}As{wVOXS*l4+#J2*qLFr zfZHEcz`cAV^%1Q#6YfpyNc4s80|JIDb?Q<_c@Wwz>Qx4nOfpO!3Th!skSj9DaO8hpxEHea?HwJQKXarYEN4RJ z@3kLgQ{*iiej_CoF3STlZOgC=Y{YyiS3I}sQdAL%e87G+JjSKSbV@DKRTtl!62Z%u z-u<8qkoXbXX?tXO(OG7&XfpG3-FdpwTRdZGn*^rnkc?IAF4vR#5%i}se9ScR#H9bh z`}I4H4tQu)7t!mCXmf#W7IOQ9B}fWBssS$cGYqR#L9mcd7B0RXIJ&zbINaI_UAbf- zAg(&hm7^rXYgv$66xyWww%pY{E|%N0>C^YV6+xh<$Pj#To4R-(5@qF~;X~xKX?Me| z)x3@o^11KMM+>CH2JdE6v(vf|<*yFVOn2Y#U--@xt}eq_*AoLd;Lnaj%iV=enqvH~ zlojq$|ARTfJmY3QFRNm*e%-U%_1sMvnh|QX6rQt)(Ynxd3ct5Y(*lgNkig6lV@(V2 za{6{{LLL6sOmBI(XL(R0Ge!$I)KBers(C~^c6BsD( zKc@F``K|=^h~*5B={*k#G->XoC=_bNr{VrMpDs{Ro_V@h zw&7eX{}%D5tIBXIHuGE9^{^C&ob+2cN0*?Uc;t`CYxiS7p3vrvus7QmQxvfswE`X~Lmr-2t)L?9jSb0_1NBf(%pi;W?cG65*ke>f?VTj#M4xp6 zuh`_*A=K)ihO#?TK~uvc!6PjHDy4QAvQE}q*L3ZYZ9@MZ{Oxk?|l)!D%LLAPBb4G;VP+AU}8nCrGE&C(qHr}zG#_%BOjm&2gMW}O1^=^8j2u9Dr?A;Z&|!KnKSY)JWf&;U(- zkAv{v!Qj91wLXNnTo$sAID-NXGwa_dO9Qd*E}TD^rByR7rq$ccv-Ngi(dGjlck)bsnrJO~ z^I%+e0L6O)G;(;}BL{}6S+9(4 z7=(4>9qq@g_LSEDk^` zCuZJ9RS7FZv2@v;w}QKFe+eVhcXF@H{D5?)1|}2nhqGz^=B&44dfkYcfHLB|b{5j@ zq(9+sK(919M@h+S`*`~V#0Qj87P{#@$~a@fuE_K*tNaO2IYpQzl))*K0cJEGj2F@K zPxo?wv!G|aNOx_@M;oPAE5C5;cbJ7!);KqxhvvXz5IeeQj(2+l{;3+xydYk1SSn*s zq~_dqa*KN&ha4)&A^A#Rwdj#gHE%+XvJNreh&d2yGy#y%7=TQmaFS=wBI|?*7M{lF z*>sEXN_gGPrZ@ND+VmnF*F&3^Wm#JHn?AuWc3);uLk(A0b$Dm(NRy&Y#6HL@;$0Sb zeKH_S>A@7)dVKjrG2!UFp$&6@n~k`5&E%dz5CZ=GI(m0DBF@XDFQFGxL)E79C(IDV58c|`#djqm@DX#5sM??UT{ef9K264*;?E4TF5 zQK!XBJuu32_rdl591XTG-F<*&A*29%4xiVKJrGets6Stfz?2?$A(rJB|IxwK?yZ90 z6Q32xnQv6|5X5^&=qwaAJa2_+C8PTq1cI~SvW-U|jwHQd-v9GOaBD>#6?aZt6v9@T zkeR264c&K)8_%Z-DBMA3&|u96n~c($G;Sa1q!abPjf4y017EK@{yfr5`gJbplvFCh z*OC}s)GXa9RxAn%d z=dXx!4ASa26E8nrEJOR=j}ZW zLpqr!H^L(@oZ+cDDoliCei*WlzeEkq@>@}7NG*(W(8Er(|m9j!>*dd z6!)D_VS~#KD^L~P2$AHEBOpGl6dtu`?7=XwAno(>Z&m$767l#VQA%BKQ*qJNYh_?@8es!xA!7Uu>PrYwSs=|HGk?-Kju8&#{;C1 zxhLcjUNJRJu#rb9eMSviR^Wf?Et!?@{yvGXZw1! zn+ra@ALcAlkvpNUh5bs^pvQaZ{w8ODviKp&I?5f{oj0*AG_S9QTEfFrgR2Q2wyj;R zzs68&_e^OZzwYG)ft)n8hIO>S+KxOM%A?dwH&5hR_=arE3Gpam-YYj6BP#nyA#w|w zUEKaf?uHurXEet$o-!ui#G60>xLJ6d0X8lhDXNMWricn=2%8Q85r=yof=7H%o}Zlc z&8`3X-xcC2!1(p2`1qv;S71b_DB1vkiAKb7>99q@^sH3Me;)A>ytG(HKTO$0{3w0- z>J$8aGr9!ELv4$ey*0yVs9q2dCwrWMTa#}!c|-JxUWW*O|3MaY1L837lIB+C{Rz8c z?k3W)-%|oJi?A0A@W#;nt9+4MFwbXTKc!!<@8H;DtrhY+#8yJ15yeaPQB`d5OwD?? zIsKE&uQkenHWJtd@*ghMB1?HKpR3tnMnTD$$;R+rJ0GZPpGsRW5$+RR2e@2!_-GXG zor28vAaP-z(s;K?3$A9NaCK_9s1(x#fY#{oFWLoW{OP34SzE4jG01+H00d}ZsL zl<)oCX9?{a^x-5oj~{y0ZhhnwnMRVsp}M|S9pj}SS-+nm&~Zm%k}oViA38r=zC}%F zkoHS0v$C{2zJ{_3GL?@_x5MRDg*}k056ks8GEdCXO0-LxdMSQQ0SW;(9aYD==YM?H zTE(r+C0@zXxOB+4n9a%WB_3;~F=E>6dARmjV;$N_|JS#eG5N|i{EH6U?Z~Z^03G?3 zlR*nnZ8g_Y`%AO7548u0s1u`uYfe7gZ3I33i;{1`u_EB_peT@gf<}$6JIvT`I6K|H z66r3r^cjwCeXx}21KDbd);{%r5Z+9wZ>{yxNOnSCXzhEz)yQ>0r}`&<|NUB6*Y{on zYUmtPANmpZjnSJ3V_UrH1gfQHfrYU6kLUDt5zmRj#o0J>E|K?+n*$)5IGuanD)|dS z-6`hx=Z`d0Ed|IEYX%{!%T|#Tt$Qx51w&#l^`N0zgHfhh1fog}$e}thVm2ipjO< zsB4*dPs7|Q#PYOf4rV$;y`v@6aRi==ikFHOA;Su<2|b?ajJ+OSZsh8<4wH5v)LffB z9bWbx16la5_zC^Jg>hsDnH=O@jY6REoMkhq7eSLf?*1EAj z4MK6F_#|bx#hIRh(`Mtbi_Rf$9_;n=LM&YPyh#vz(4yp{mr~#?y30(cAC<2dn0QL0 zuVkwCI`Yo4Y_SxkJQi}Jrv8w?0+sOrnt%4)o_gO;7-$A3A!DX5)X2}568X+>S}f>f z2bG}bR;GJqckYG=>)lq@!uA?^y=1~C-mUw)B=Bk)hL~^#ysi%@-``zdl=DL!m6_`d z6mcyqIh7f`jmJ)eJ4_K{jm^X8mgg7QE@v}?meE^V>Z}xzwRw@csFzps+1na4xSOV` zKUzlOoW>ro>(RwX&J~nQvjU`}%8M@F9ub!mT}eJ$H4!)RfG~4)5Qt)sb~^*1=j!Uy zD^uc7nH+L;0~|k?b(B-Jz@-r%A=mxgd--Q0+IsL8p)-sUq1g&aB9Raf)x^JzKltYM z?$QKBP_3RJ-n_Q=-bt-vJ%_cm!*b=r@&7;5y^YOgvOJ?nfrRXMb4aq3!xM1x%RnU9>NmiZf#5Gu7C&R zC4$_F^P4+u`YpnCp%fBU_Pw7My{d>RMK15N#OA#6^42d!m7ipwX-EXEC z)w?&X$M@xnE8xxOFNl3y$a0scD-+RNr4izDFSE}v^UzbgR9nLVFDKdB#OPX4`(LNe zsF-hblceLud1eXVLBNQ9By|m$SY8`>`8U+yX2@c#seP2mENUr=mp;hkc)m2JLO9`< zAM44o(&B)5Z&6zZ&~Mmi_IpzQcmkmXJ4aeRpzs)>ATj~M+%qtb??;%NG?=O6YC1$v zre=P>$D^`7$W#T)akzpcRRyF^OtHq5qY+PzOJJW1An!tQG^YOgGt~I9+m&ZlwNpzo z1(5#}=KVU-_Y=p-&85@(qsos1ofRn!^MrbbQy>dVZtEdZw)?bv;!o5d$G2C=Ul~7T z>A3AVXv7mr>p!-Uq>;1R;)!gVQ1irE2za{i8=OTQ`oaHNR58bHG%h0zK28Ir<;nQj zGG~}T!NiCA<3`!~->Z4*Toai2azL(SFZcS=XqG-{eCQE7xluiNIfUHE9t-A?h8whT zm+Ao7Nu|7~bG>6;1;#hMNg#F+oWoK1gZR(j07QN$Oj5oT6WZp%1|{n+!9*(ZI|W!J zoJMTxUo01I)-XKcT~~L6PAhw{bSL{V|?@PBjp z75;N-PwIp%ZiP=?+&(Yo?6#0icClUE&%^ha;X!aFRB{wbJ5UOeNmRRAhDyHim(MwZb){f&vOG6buRlg<^qC@O| z(v~v7f7|JY9pt)ISLzhBJ>;hdv6Z8h1(TVA^i#K&8Zf*u&&V>)SkoHeX`Rxo_l|ij z&$bM&kk+taHx&^K?IN7QA~@Mx%y{O{=5=CMHIa9Ha~{h+=1K* zw&6S2g#$&eJ3+UId~;R)?g6GTrAFhU>Y8=FtauJIED&83=R_OeRZ=EM-h=>Nc$`+N z`h>lpXomEAp7&@F=>^?WJcixS;@}@RDfS;y^Nyr?yoFF_3U=?%ct#UfIb$?0I@k*v zwzE)-=glpb{UJ%G(>$YEBXgD)O(qv~F^`Hamq)To3ARI_JIBwZJtw_Dr#lzlj$9aS zC47Omo+ZYi%TixP6k1OED!Q2G-`p#lxUEwrfyI)`Ub6i$sgy2+#&>3_m*E#{p}K&- zit*O-7G+zPlWK((x~(7E7r}6#d7XQ6$cID%^XGWV*rMlb!lYPrq&tYX*kA!a64ZQO}h*7+; zjf#21N$bAOAa>TZ`~Oc%Zypcj`u~q>dDkgvQX-V;97$59td(U>izFe0ESXcX3~6$T zEMx9-l5AxTLY7R~*Cu<}rmQhZ_Kal=AI6|f}3 z)Ah%8yxrCEbnGEib3Ma5KKBQo>QgwDXGa!np@FuE0Cu^>ctcd>j~V|?+AYwVCy|0$ z_8*98yMIeNyuwWJj74l7QIO&IaY8_O(9!%}nhf2wjR*6UQvC51{ZXAmUvCGwHJzCW zZdGKxAPZcZ4*Z|BA%V=8Fm|pJ8@}Ft`NbITICMU6>(1Ht1v{^sw3zfIu6=9XQfyB; z=GCLV4ogX}nQ$vVR){SG{-K8|YBv}52x8o!JNU%L9RNPUhfoA|+H+25$Hyns@sqfm~{U*ucYw4Rc(Eccz{nsoz z$kp&IS<33h`iqum>Yoo(OV^{I2V;xJf7l`?sr zf_rcLxpSu^MQx_3lna!pLc!*c_z%O2A=tZ!1x&W*th>d)%E-FWlp=DJT@ISp7`So$ zj2CD9Wf;l-MTA1YH(&A)p181YzfaqNKd}VaL2`I}C_05uOXz{vHptO>`V=PmFvs@E ze~WdB^0tBZ5aa*{3{%$LDqRV@Zlrv$+y5YY>6;ir^ z3gyoythET!g|b4S4ZVY+%)sRL#wg>&&7LT6_#`^TFT^Vm)X6mYSne5k5UQ?gO_Ak9 zG6oh6mjrLBm7DvB;@e%SBjq95{O{72CZ2zcdiasPrS(J9=AvhJ7U>hB5wEams8`F; zwQ;Efj1mWgixa^84mb^q4Nine&fI;@)wfu2&Ronl#}QKZ}da!GyyGAfmRdD;{Qo(sY8w-H{q=y zMtF+ov6`o?AH+-^X$4|NdMjc~_UgMDQhQhsCAMt!rwk>q5Ko4A=9o#mlKA{7RLlvp zj=ZKQh=tc|_fnIc+lTK?s}+V4w+Jm?cfA${pdZ#+riI@X_jtUKYJWD-
  • r>Nd5e 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%0Ah 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 diff --git a/backend/views/error.html b/backend/views/error.html deleted file mode 100644 index 87cc731..0000000 --- a/backend/views/error.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'layout.html' %} - -{% block content %} -

    {{message}}

    -

    {{error.status}}

    -
    {{error.stack}}
    -{% endblock %} diff --git a/backend/views/join.html b/backend/views/join.html deleted file mode 100644 index 621a9e3..0000000 --- a/backend/views/join.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends 'layout.html' %} - -{% block content %} -
    -
    -
    - -
    -
    - -
    -
    - - -
    - -
    -
    -{% endblock %} - -{% block script %} - -{% endblock %} diff --git a/backend/views/layout.html b/backend/views/layout.html deleted file mode 100644 index c46c369..0000000 --- a/backend/views/layout.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - {{title}} - - - - - -
    -
    -
    - {% if user and user.id %} -
    {{'안녕하세요! ' + user.nick + '님'}}
    - - 내 프로필 - 로그아웃 - {% else %} -
    -
    - - -
    -
    - - -
    - 회원가입 - -
    - {% endif %} -
    - -
    - {% block content %} - {% endblock %} -
    - - - {% block script %} - {% endblock %} - - diff --git a/backend/views/main.html b/backend/views/main.html deleted file mode 100644 index 6cda02e..0000000 --- a/backend/views/main.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends 'layout.html' %} - -{% block content %} -
    - {% if user %} -
    -
    -
    - -
    -
    - - -
    -
    - - - -
    -
    -
    - {% endif %} -
    -
    - - -
    - {% for twit in twits %} -
    - - -
    {{twit.User.nick}}
    - {% if not followerIdList.includes(twit.User.id) and twit.User.id !== user.id %} - - {% endif %} -
    {{twit.content}}
    - {% if twit.img %} -
    섬네일
    - {% endif %} -
    - {% endfor %} -
    -
    -{% endblock %} - -{% block script %} - -{% endblock %}