From 94720ca478ce72a74ab0ef1d2ffd12034705e2ba Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 09:56:23 -0700 Subject: [PATCH 01/45] Split readme and proposal. Linked to proposal from readme Hashed faker passwords migration and seed for userJobSaves table --- PROPOSAL.md | 62 +++++++++++++++ README.md | 71 +----------------- data/db/dev.sqlite3 | Bin 61440 -> 65536 bytes data/migrations/20190311202119_profileImg.js | 9 +++ data/migrations/20190311210317_userSave.js | 8 -- .../20190312090851_user-job-save.js | 14 ++++ data/seeds/userJobSave.js | 10 +++ data/utils/index.js | 17 ++++- 8 files changed, 112 insertions(+), 79 deletions(-) create mode 100644 PROPOSAL.md create mode 100644 data/migrations/20190311202119_profileImg.js delete mode 100644 data/migrations/20190311210317_userSave.js create mode 100644 data/migrations/20190312090851_user-job-save.js create mode 100644 data/seeds/userJobSave.js diff --git a/PROPOSAL.md b/PROPOSAL.md new file mode 100644 index 0000000..722828b --- /dev/null +++ b/PROPOSAL.md @@ -0,0 +1,62 @@ +# Proposal + +- What problem does your app solve? + + - Helps a user find their dream job + +- Be as specific as possible; how does your app solve the problem? + + - Allows a user to quickly swipe through possible jobs to find the one they like the best + +- What is the mission statement? + + - Match candidates with great companies + +# Features + +- What features are required for your minimum viable product? + +- What features may you wish to put in a future release? + +- What do the top 3 similar apps do for their users? + +# Frameworks + +- ## What 3rd party frameworks are you considering using? + + - Cloudinary + +- Do APIs require you to contact its maintainer to gain access? + + - No + +- Are you required to pay to use the API? + - No +- Have you considered using Apple Frameworks? (MapKit, Healthkit, ARKit?) + - No + +# For Data Scientists + +- Describe the Established data source with at least rough data able to be provided on day 1. + +- You can gather information about the data set you'll be working with from the project description. Be sure to collaborate with your PM, and your Backend Architect to chat about the resources you have. + +- Write a description for what the DS problem is (what uncertainty/prediction are we trying to do here? Sentiment analysis? Why is this a useful solution to a problem?) + +- A target (e.g. JSON format or such) for output that DS students can deliver to web/other students for them to ingest and use in the app + +# Target Audience + +- Who is your target audience? Be specific. + +- What feedback have you gotten from potential users? + +- Have you validated the problem and your solution with your target audience? How? + +Research + +- Research thouroughly before writing a single line of code. Solidify the features of your app conceptually before implementation. Spend the weekend researching so you can hit the ground running on Monday. + +# Prototype Key Feature(s) + +- This is the "bread and butter" of the app, this is what makes your app yours. Calculate how long it takes to implement these features and triple the time estimated. That way you'll have plenty of time to finish. It is preferred to drop features and spend more time working on your MVP features if needed. diff --git a/README.md b/README.md index f31d550..12e13c7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Droom API -[Proposal](#proposal) +[Proposal](PROPOSAL.md) ## HEROKU DEPLOYMENT @@ -626,72 +626,3 @@ ``` --- - - - -# Proposal - -- What problem does your app solve? - - - Helps a user find their dream job - -- Be as specific as possible; how does your app solve the problem? - - - Allows a user to quickly swipe through possible jobs to find the one they like the best - -- What is the mission statement? - - - Match candidates with great companies - -# Features - -- What features are required for your minimum viable product? - -- What features may you wish to put in a future release? - -- What do the top 3 similar apps do for their users? - -# Frameworks - -- ## What 3rd party frameworks are you considering using? - - - Cloudinary - -- Do APIs require you to contact its maintainer to gain access? - - - No - -- Are you required to pay to use the API? - - No -- Have you considered using Apple Frameworks? (MapKit, Healthkit, ARKit?) - - No - -# For Data Scientists - -- Describe the Established data source with at least rough data able to be provided on day 1. - -- You can gather information about the data set you'll be working with from the project description. Be sure to collaborate with your PM, and your Backend Architect to chat about the resources you have. - -- Write a description for what the DS problem is (what uncertainty/prediction are we trying to do here? Sentiment analysis? Why is this a useful solution to a problem?) - -- A target (e.g. JSON format or such) for output that DS students can deliver to web/other students for them to ingest and use in the app - -# Target Audience - -- Who is your target audience? Be specific. - -- What feedback have you gotten from potential users? - -- Have you validated the problem and your solution with your target audience? How? - -Research - -- Research thouroughly before writing a single line of code. Solidify the features of your app conceptually before implementation. Spend the weekend researching so you can hit the ground running on Monday. - -# Prototype Key Feature(s) - -- This is the "bread and butter" of the app, this is what makes your app yours. Calculate how long it takes to implement these features and triple the time estimated. That way you'll have plenty of time to finish. It is preferred to drop features and spend more time working on your MVP features if needed. - -``` - -``` diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index d8c79b84faf06aa7c6f73964cfd050185d7a7bc0..e95248028f750ec150ecd7e10017d68a0c326293 100644 GIT binary patch literal 65536 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 B{(Jxc literal 61440 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 diff --git a/data/migrations/20190311202119_profileImg.js b/data/migrations/20190311202119_profileImg.js new file mode 100644 index 0000000..623f929 --- /dev/null +++ b/data/migrations/20190311202119_profileImg.js @@ -0,0 +1,9 @@ +exports.up = function(knex, Promise) { + return knex.schema.table('users', tbl => { + tbl.string('profileImg'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.table('users').dropColumn('profileImg'); +}; diff --git a/data/migrations/20190311210317_userSave.js b/data/migrations/20190311210317_userSave.js deleted file mode 100644 index bbd1ee2..0000000 --- a/data/migrations/20190311210317_userSave.js +++ /dev/null @@ -1,8 +0,0 @@ - -exports.up = function(knex, Promise) { - -}; - -exports.down = function(knex, Promise) { - -}; diff --git a/data/migrations/20190312090851_user-job-save.js b/data/migrations/20190312090851_user-job-save.js new file mode 100644 index 0000000..8414d03 --- /dev/null +++ b/data/migrations/20190312090851_user-job-save.js @@ -0,0 +1,14 @@ +exports.up = function(knex, Promise) { + return knex.schema.createTable('userJobSaves', tbl => { + tbl.increments(); + tbl.integer('user_id').unsigned(); + tbl.foreign('user_id').references('users.id'); + + tbl.integer('job_id').unsigned(); + tbl.foreign('job_id').references('jobPosting.id'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.dropTableIfExists('userJobSaves'); +}; diff --git a/data/seeds/userJobSave.js b/data/seeds/userJobSave.js new file mode 100644 index 0000000..c68b5e9 --- /dev/null +++ b/data/seeds/userJobSave.js @@ -0,0 +1,10 @@ +const { jobSaves } = require('../utils/'); +exports.seed = function(knex, Promise) { + return knex('userJobSaves') + .truncate() + .then(function() { + // Inserts seed entries + // list generates 25 fake jobs + return knex('userJobSaves').insert(jobSaves); + }); +}; diff --git a/data/utils/index.js b/data/utils/index.js index 0566a11..cb249d6 100644 --- a/data/utils/index.js +++ b/data/utils/index.js @@ -1,11 +1,12 @@ const faker = require('faker'); +const bcrypt = require('bcryptjs'); function generateProfile() { return { firstName: faker.name.firstName(), lastName: faker.name.lastName(), email: faker.internet.email(), - password: faker.internet.password(), + password: bcrypt.hashSync(faker.internet.password(), 8), occupation: faker.name.jobTitle(), experience: 'experience', interests: 'interests', @@ -37,6 +38,18 @@ function generateCompanies() { address: faker.address.streetAddress(), }; } +function generateSaves() { + return { + user_id: faker.random.number({ + min: 1, + max: 25, + }), + job_id: faker.random.number({ + min: 1, + max: 100, + }), + }; +} function accumulate(cb, iteration) { if (iteration > 0) { @@ -50,9 +63,11 @@ function accumulate(cb, iteration) { const list = accumulate(generateProfile, 25); const jobs = accumulate(generateJobs, 100); const companyList = accumulate(generateCompanies, 25); +const jobSaves = accumulate(generateSaves, 100); module.exports = { list, jobs, companyList, + jobSaves, }; From 9a0a1e37c60a72610e37cf0ee88a260673daabed Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 11:44:13 -0700 Subject: [PATCH 02/45] /user/info now returns the 'saved' jobs for their account --- data/db/dev.sqlite3 | Bin 65536 -> 69632 bytes data/helpers/companyHelper.js | 11 ++--------- data/helpers/jobsHelper.js | 2 +- data/helpers/userHelper.js | 26 ++++++++++++++++++++++---- data/middleware/middleware.js | 2 +- data/routes/jobsRoutes.js | 13 +++++++------ data/routes/usersRoutes.js | 10 ++++++++-- data/utils/index.js | 4 ++-- 8 files changed, 43 insertions(+), 25 deletions(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index e95248028f750ec150ecd7e10017d68a0c326293..d80ee6dda3b32643c20ec2d79361e0abcec7b1d6 100644 GIT binary patch literal 69632 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 B{(Jxc diff --git a/data/helpers/companyHelper.js b/data/helpers/companyHelper.js index c57e8b1..b290ddf 100644 --- a/data/helpers/companyHelper.js +++ b/data/helpers/companyHelper.js @@ -30,15 +30,8 @@ async function getCompanyById(id) { .where('id', id) .select('id', 'companyName', 'email', 'bio', 'address') .first(); - companyWithJobs = { - id: company.id, - companyName: company.companyName, - email: company.email, - bio: company.bio, - address: company.address, - companyJobs: jobs, - }; - return companyWithJobs; + Object.assign(company, { comapnyJobs: jobs }); + return company; } function updateCompany(user, updateInfo) { diff --git a/data/helpers/jobsHelper.js b/data/helpers/jobsHelper.js index f760e9c..2e98e99 100644 --- a/data/helpers/jobsHelper.js +++ b/data/helpers/jobsHelper.js @@ -11,7 +11,7 @@ module.exports = { }; function createJob(jobPost) { - console.log('createJob'); + console.log(jobPost); db('jobPosting').insert(jobPost); return 1; } diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 3036043..f849bf8 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -3,8 +3,9 @@ const knexConfig = require('../../knexfile'); const db = knex(knexConfig.development); module.exports = { - getUserInfo, getAllUsers, + getSaves, + getUserInfo, getUserById, updateUser, // deleteUser, @@ -21,12 +22,29 @@ function getAllUsers() { ); } -function getUserInfo(user) { - return db('users') - .where('email', user.email) +function getSaves(id) { + return db('userJobSaves').where('user_id', id); +} + +async function getUserInfo(user) { + const likes = await db('userJobSaves') + .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') + .where('user_id', user.subject); + console.log(likes); + const userInfo = await db('users') + .where('id', user.subject) .select('id', 'firstName', 'lastName', 'occupation', 'experience', 'interests') .first(); + Object.assign(userInfo, { saved: likes }); + return userInfo; } + +// function getUserInfo(user) { +// return db('users') +// .where('email', user.email) +// .select('id', 'firstName', 'lastName', 'occupation', 'experience', 'interests') +// .first(); +// } function getUserById(id) { return db('users') .where('id', id) diff --git a/data/middleware/middleware.js b/data/middleware/middleware.js index e624009..3d14389 100644 --- a/data/middleware/middleware.js +++ b/data/middleware/middleware.js @@ -16,7 +16,7 @@ function restricted(req, res, next) { } }); } else { - res.status(401).json({ message: 'No token provided' }); + res.status(404).json({ message: 'No token provided' }); } } diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 6654032..515bdd0 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -11,16 +11,17 @@ const router = express.Router(); // Create Job router.post('/', restricted, async (req, res) => { - const company = await companyHelper.getCompanyById(req.body.company_id); try { - if (company) { - console.log(company.id); + console.log(req.body.company_id); + const company = await companyHelper.getCompanyInfo(req.decodedToken); + + if (company && req.body.company_id) { const result = jobsHelper.createJob(req.body); res.status(201).json(result); - } else { - res.status(400).json({ message: 'Invalid company id' }); } - } catch {} + } catch (error) { + res.status(500).json(error); + } }); //Get All Jobs router.get('/', restricted, async (req, res) => { diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 5373fe9..c2163ef 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -20,8 +20,14 @@ router.get('/', restricted, async (req, res) => { //Get logged in user router.get('/info', restricted, async (req, res) => { - const result = await userHelper.getUserInfo(req.decodedToken); - res.status(200).json(result); + try { + const result = await userHelper.getUserInfo(req.decodedToken); + // const saves = await userHelper.getSaves(result.id); + + res.status(200).json(result); + } catch (err) { + res.status(500).json('server error'); + } }); // Get User by ID diff --git a/data/utils/index.js b/data/utils/index.js index cb249d6..8677c8d 100644 --- a/data/utils/index.js +++ b/data/utils/index.js @@ -6,7 +6,7 @@ function generateProfile() { firstName: faker.name.firstName(), lastName: faker.name.lastName(), email: faker.internet.email(), - password: bcrypt.hashSync(faker.internet.password(), 8), + password: bcrypt.hashSync('password', 8), occupation: faker.name.jobTitle(), experience: 'experience', interests: 'interests', @@ -33,7 +33,7 @@ function generateCompanies() { return { companyName: faker.company.companyName(), email: faker.internet.email(), - password: faker.internet.password(), + password: bcrypt.hashSync('password', 8), bio: faker.lorem.paragraph(), address: faker.address.streetAddress(), }; From 49ada587053abab8efb785414ad24eff8f4801c8 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 13:59:25 -0700 Subject: [PATCH 03/45] post job, delete job --- data/db/dev.sqlite3 | Bin 69632 -> 69632 bytes data/helpers/jobsHelper.js | 46 +++++++++++++++++++++++++++---------- data/helpers/userHelper.js | 4 +++- data/routes/jobsRoutes.js | 22 ++++++++++++------ data/routes/usersRoutes.js | 1 + 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index d80ee6dda3b32643c20ec2d79361e0abcec7b1d6..0aefeb9149abd53ec3c41a72e4b14551b5e70bcd 100644 GIT binary patch delta 445 zcmZozz|ydQWr8&0oQX2djB_?7xa$jM@ToE@GG^r`1>_f(Wag!(Z{DHrGXW^XH<|r_ zBO4 zr26IOrFww~LsL^DBMT#QGc$8@V?6^yQ*%orQv*{ALo*PU470Lu8Wxz!&7d!i?y#WL z;?%^VwH+k!*iGCI?n~3lOVWR zQQ#xDBx?o>11F;zYdVM$VMzm03@oWYa`U4<{Y)(U7a2Gvm;R3d*~hW@>VItk0KB$> A+yDRo delta 411 zcmXAjJxIeq9K|nfsDqM!)kzeIf}j*MjlDJnL5iRVDx#YxdTkC(Npkg)2%XeX2WiNp ziyyc+N*3K(oZNJ9a1wFQ(McSHn(Fd+!~6K{or!yAVy##3{k|!|zuuS`>(r&8_<&Gm z#YN`0hP|nWH)C_PxGa#MtzL+sEx*toY}KV*N_4s4I36cx~Nu5JH1!1;HVJbRrD~ z$=XCX_i!f#aQYs8y|gD&Q9|!{L+}ls@By#z43BUR4Y-ACxPo&y1|JS!AF8k&41ZpR d1Ig}=@a^X)CMLQ>6nM>5F_92a_|!}#e*rcriS+;g diff --git a/data/helpers/jobsHelper.js b/data/helpers/jobsHelper.js index 2e98e99..f64ea88 100644 --- a/data/helpers/jobsHelper.js +++ b/data/helpers/jobsHelper.js @@ -7,13 +7,18 @@ module.exports = { getAllJobs, getJobById, updateJob, - // deleteUser, + saveJob, + deleteJob, }; -function createJob(jobPost) { - console.log(jobPost); - db('jobPosting').insert(jobPost); - return 1; +async function createJob(jobPost) { + try { + const result = await db('jobPosting').insert(jobPost); + + return 1; + } catch (error) { + return error; + } } function getAllJobs() { return db('jobPosting'); @@ -31,10 +36,27 @@ function updateJob(id, updateInfo) { .update(updateInfo); } -// function deleteUser(user) { -// console.log('delete', user.email); -// const userDelete = db('users') -// .where('email', user.email) -// .del(); -// return user.email; -// } +async function deleteJob(id) { + try { + const saves = await db('userJobSaves').where('job_id', id); + const job = await db('jobPosting').where('id', id); + if (saves.length > 0 || job.length > 0) { + const saves = await db('userJobSaves') + .where('job_id', id) + .del(); + const deleteJob = await db('jobPosting') + .where('id', id) + .del(); + + return 1; + } else { + return 1; + } + } catch (error) { + return error; + } +} + +function saveJob(userId, jobId) { + return db('userJobSaves').insert({ user_id: userId, job_id: jobId }); +} diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index f849bf8..e78a992 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -22,6 +22,8 @@ function getAllUsers() { ); } + + function getSaves(id) { return db('userJobSaves').where('user_id', id); } @@ -29,7 +31,7 @@ function getSaves(id) { async function getUserInfo(user) { const likes = await db('userJobSaves') .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') - .where('user_id', user.subject); + .where('user_id', user.subject).select('job_id','jobTitle','jobPosition', 'jobDescription', 'jobRequirements', 'jobSalary','jobTags','jobOpenDate','jobCloseDate'); console.log(likes); const userInfo = await db('users') .where('id', user.subject) diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 515bdd0..7234af9 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -12,9 +12,9 @@ const router = express.Router(); // Create Job router.post('/', restricted, async (req, res) => { try { - console.log(req.body.company_id); + // console.log(req.body.company_id); const company = await companyHelper.getCompanyInfo(req.decodedToken); - + console.log('company', company); if (company && req.body.company_id) { const result = jobsHelper.createJob(req.body); res.status(201).json(result); @@ -33,6 +33,12 @@ router.get('/', restricted, async (req, res) => { } }); +router.post('/:id/save', restricted, async (req, res) => { + const { id } = req.params; + const result = await jobsHelper.saveJob(req.decodedToken.subject, id); + res.status(201).json(result); +}); + //Get logged in user router.get('/info', restricted, async (req, res) => { const result = await userHelper.getUserInfo(req.decodedToken); @@ -54,10 +60,12 @@ router.put('/update/:id', restricted, async (req, res) => { res.status(200).json(result); // returns a 1 if updated }); -//Delete User -// router.delete('/delete', restricted, async (req, res) => { -// const result = await userHelper.deleteUser(req.decodedToken); -// res.status(204).json(result); -// }); +// Delete Job +router.delete('/:id/delete', restricted, async (req, res) => { + const { id } = req.params; + const result = await jobsHelper.deleteJob(id); + console.log(result); + res.status(204).json(result); +}); module.exports = router; diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index c2163ef..eb11e2b 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -30,6 +30,7 @@ router.get('/info', restricted, async (req, res) => { } }); + // Get User by ID router.get('/:id', restricted, async (req, res) => { const { id } = req.params; From d21ebdebc054cdc229696337fc8c2cf9d0647be6 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 14:04:26 -0700 Subject: [PATCH 04/45] added delete job --- README.md | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 12e13c7..05863ce 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ #### Jobs -[Get All Jobs](#getAllJobs) | [Create Job](#createJob) | [Get Job by Id](#getJobById) | [Update Job](#updateJob) +[Get All Jobs](#getAllJobs) | [Create Job](#createJob) | [Get Job by Id](#getJobById) | [Update Job](#updateJob) [Delete Job](#deleteJob) ## ENDPOINTS @@ -581,11 +581,17 @@ ### Body - ``` - Can send any part of the body that needs updating: + | name | type | required | description | + | --------------- | -------- | -------- | ----------- | + | jobTitle | String | No | | + | jobPosition | String | No | | + | jobDescription | String | No | | + | jobRequirements | String | No | | + | jobSalary | Integer | No | | + | jobTags | String | No | | + | jobOpenDate | Integer | No | | + | jobCloseDate | Intteger | No | | - jobTitle, jobPosition, jobDescription, jobRequirements, jobSalary, jobTags, jobOpenDate, jobCloseDate - ``` ``` { @@ -597,9 +603,25 @@ > On success return `1` -# <<<<<<< HEAD +--- + +5. `Delete Job` + + _Method URL: /jobs/:id/delete_ + + _HTTP method: [DELETE]_ + + ### Headers + + | name | type | required | description | + | ------------- | ------ | -------- | ------------------------------------ | + | Content-type | String | Yes | Must be application/json | + | Authorization | String | Yes | Token must be from a company account | + + + ### Response -> > > > > > > 90f0f5af1164e4a260f0fe08cf83ab4e766a71f7 + > On success return status(204) --- From 11edf9557b0ee0b3697b47e71d800b604907cfa0 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 14:06:46 -0700 Subject: [PATCH 05/45] updated returned object for /users/info --- README.md | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 05863ce..4e29dd5 100644 --- a/README.md +++ b/README.md @@ -213,15 +213,36 @@ > On success return object ``` - { - "id": 1, - "firstName": "Orlando", - "lastName": "Nitzsche", - "occupation": "Regional Functionality Strategist", - "experience": "experience", - "interests": "interests" - } - + "id": 1, + "firstName": "Laurence", + "lastName": "Bechtelar", + "occupation": "Central Mobility Director", + "experience": "experience", + "interests": "interests", + "saved": [ + { + "job_id": 47, + "jobTitle": "Internal Quality Agent", + "jobPosition": "Architect", + "jobDescription": "Regional", + "jobRequirements": "Brand", + "jobSalary": 903, + "jobTags": "dolore eos quia", + "jobOpenDate": "1552373894247.0", + "jobCloseDate": "1559589532036.0" + }, + { + "job_id": 49, + "jobTitle": "Future Interactions Technician", + "jobPosition": "Analyst", + "jobDescription": "District", + "jobRequirements": "Data", + "jobSalary": 18, + "jobTags": "animi quia omnis", + "jobOpenDate": "1552355593356.0", + "jobCloseDate": "1570538807737.0" + } + ] ``` --- From 82510d8024b3f5df1104083eceecb9866220edf2 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 14:33:22 -0700 Subject: [PATCH 06/45] DELETE /jobs/:id/remove endpoint --- data/db/dev.sqlite3 | Bin 69632 -> 69632 bytes data/helpers/jobsHelper.js | 8 +++++++- data/routes/jobsRoutes.js | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index 0aefeb9149abd53ec3c41a72e4b14551b5e70bcd..d90b2ec4a38ac48b6ffb6c1a9ba2bfc632113978 100644 GIT binary patch delta 65 zcmV-H0KWf#pag)R1dtm6o{=0w0iLm7M=t?sv#2jxzy@*vW(>&zlL+w41P^iy$+IC4 X@e8xb{HX#5577Vz2?0d2dH;tH4`mn~ delta 65 zcmV-H0KWf#pag)R1dtm6oRJ(u0i3a5M=t?rv#2jxzy@&uW(>&ylL+w41PsXx$+IC4 X@e8xb{HX#5(Etbm0S5xJdH;tH6*U+c diff --git a/data/helpers/jobsHelper.js b/data/helpers/jobsHelper.js index f64ea88..5c3726a 100644 --- a/data/helpers/jobsHelper.js +++ b/data/helpers/jobsHelper.js @@ -7,8 +7,9 @@ module.exports = { getAllJobs, getJobById, updateJob, - saveJob, deleteJob, + saveJob, + removeJob, }; async function createJob(jobPost) { @@ -60,3 +61,8 @@ async function deleteJob(id) { function saveJob(userId, jobId) { return db('userJobSaves').insert({ user_id: userId, job_id: jobId }); } +function removeJob(userId, jobId) { + return db('userJobSaves') + .where({ user_id: userId, job_id: jobId }) + .del(); +} diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 7234af9..5c7712e 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -38,6 +38,11 @@ router.post('/:id/save', restricted, async (req, res) => { const result = await jobsHelper.saveJob(req.decodedToken.subject, id); res.status(201).json(result); }); +router.post('/:id/remove', restricted, async (req, res) => { + const { id } = req.params; + const result = await jobsHelper.removeJob(req.decodedToken.subject, id); + res.status(201).json(result); +}); //Get logged in user router.get('/info', restricted, async (req, res) => { From 0f2ae522f7b47983c1de4164890c4ec083deb3c6 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 14:59:36 -0700 Subject: [PATCH 07/45] company can like a user and remove them from being liked --- data/db/dev.sqlite3 | Bin 69632 -> 73728 bytes data/helpers/companyHelper.js | 21 +++++++++++-- data/helpers/userHelper.js | 28 +++++++++++++++--- .../20190312143602_companyUserSaves.js | 14 +++++++++ data/routes/companyRoutes.js | 2 +- data/routes/usersRoutes.js | 12 +++++++- data/seeds/companyUserSaves.js | 10 +++++++ data/utils/index.js | 14 +++++++++ 8 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 data/migrations/20190312143602_companyUserSaves.js create mode 100644 data/seeds/companyUserSaves.js diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index d90b2ec4a38ac48b6ffb6c1a9ba2bfc632113978..bced8e6165e0b968615fe61c13da1c63d2c1cedf 100644 GIT binary patch literal 73728 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%0DC|0o}=rX zsN2t;PrKix>(mYRJ9Hg>KJt{r7Ic3TJ-z*o`w3ldz32V}UGL4hAJg@9pZjgPPCs-% zV$a9iZ_(BF%>9sE-*CT4SNBu*1G?T#xCOd;%I;aZPQ~3Hr|ZPHdxoyJOYS%5>hikp z({*gg{V{eOaZl6L`_z4puK4^ET}Kn{*XcU$bKj-wjiCDuU0=KDzD?JuJ3imfI!4Ew z3+~tG`JIIOCS4~!>Gsie@-uEPUGHYx9`?HEo}}yTn0tb*-X-@qU2pEV$LRW+=)OVM zsWJB`U8mP!%s23S$UQ>O?+GKrB(^!Xi#`3Edx);1!)_;CeJRTS4^4ib!+Rfp?0>cd zYzf#Buq9wiz?Oh50b2sL1Z)Y|68Hm_z{~dZnB&279E9=tI31AD)PZIw=h&%SisaAX zJe>X`xeQv@RsVKpxgI;+S=wGa>t;4OD|1r7uOtp@XHh*EP)?VYPpYAFy{AhF_`I6DGD8+`c& zZ+r$f!%vDZ)B32byp+F>2!ZF-VNR$m+g9iO { + tbl.increments(); + tbl.integer('company_id').unsigned(); + tbl.foreign('company_id').references('companies.id'); + + tbl.integer('user_id').unsigned(); + tbl.foreign('user_id').references('users.id'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.dropTableIfExists('companyUserSaves'); +}; diff --git a/data/routes/companyRoutes.js b/data/routes/companyRoutes.js index 875e181..92a1ca1 100644 --- a/data/routes/companyRoutes.js +++ b/data/routes/companyRoutes.js @@ -39,7 +39,7 @@ router.put('/update', restricted, async (req, res) => { res.status(200).json(result); // returns a 1 if updated }); -//Delete User +//Delete Company // router.delete('/delete', restricted, async (req, res) => { // const result = await companyHelper.deleteCompany(req.decodedToken); // res.status(204).json(result); diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index eb11e2b..fced722 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -30,7 +30,6 @@ router.get('/info', restricted, async (req, res) => { } }); - // Get User by ID router.get('/:id', restricted, async (req, res) => { const { id } = req.params; @@ -46,6 +45,17 @@ router.put('/update', restricted, imageProcess, async (req, res) => { res.status(200).json(result); // returns a 1 if updated }); +router.post('/:id/save', restricted, async (req, res) => { + const { id } = req.params; + const result = await userHelper.saveUser(req.decodedToken.subject, id); + res.status(201).json(result); +}); +router.post('/:id/remove', restricted, async (req, res) => { + const { id } = req.params; + const result = await userHelper.removeUser(req.decodedToken.subject, id); + res.status(201).json(result); +}); + //Delete User // router.delete('/delete', restricted, async (req, res) => { // const result = await userHelper.deleteUser(req.decodedToken); diff --git a/data/seeds/companyUserSaves.js b/data/seeds/companyUserSaves.js new file mode 100644 index 0000000..94a08a9 --- /dev/null +++ b/data/seeds/companyUserSaves.js @@ -0,0 +1,10 @@ +const { userSaves } = require('../utils/'); +exports.seed = function(knex, Promise) { + return knex('companyUserSaves') + .truncate() + .then(function() { + // Inserts seed entries + // list generates 25 fake jobs + return knex('companyUserSaves').insert(userSaves); + }); +}; diff --git a/data/utils/index.js b/data/utils/index.js index 8677c8d..495d701 100644 --- a/data/utils/index.js +++ b/data/utils/index.js @@ -50,6 +50,18 @@ function generateSaves() { }), }; } +function generateUserSaves() { + return { + company_id: faker.random.number({ + min: 1, + max: 25, + }), + user_id: faker.random.number({ + min: 1, + max: 25, + }), + }; +} function accumulate(cb, iteration) { if (iteration > 0) { @@ -64,10 +76,12 @@ const list = accumulate(generateProfile, 25); const jobs = accumulate(generateJobs, 100); const companyList = accumulate(generateCompanies, 25); const jobSaves = accumulate(generateSaves, 100); +const userSaves = accumulate(generateUserSaves, 50); module.exports = { list, jobs, companyList, jobSaves, + userSaves, }; From 54c9be6a64e2c0e19458fbc1b2dce33f1b1676df Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 15:34:32 -0700 Subject: [PATCH 08/45] setting up match --- data/helpers/userHelper.js | 15 ++++++++++++--- data/routes/usersRoutes.js | 6 ++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 28c5913..bb6950c 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -8,6 +8,9 @@ module.exports = { getUserInfo, getUserById, updateUser, + saveUser, + removeUser, + match, // deleteUser, }; @@ -18,9 +21,7 @@ function getAllUsers() { 'lastName', 'occupation', 'experience', - 'interests', - 'saveUser', - 'removeUser' + 'interests' ); } @@ -87,3 +88,11 @@ function removeUser(companyId, userId) { .where({ company_id: companyId, user_id: userId }) .del(); } + +async function match(userId) { + console.log(userId); + const result = await db('companyUserSaves').where('user_id', userId); + + console.log(result); + return result; +} diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index fced722..f3dc472 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -62,4 +62,10 @@ router.post('/:id/remove', restricted, async (req, res) => { // res.status(204).json(result); // }); +router.get('/match', restricted, async (req, res) => { + // const result = await userHelper.match(req.decodedToken.subject); + let test = req.decodedToken; + res.status(200).json({ test }); +}); + module.exports = router; From 92b39b6baeb91b0ff677c112cedb1ec4641b5bb1 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 16:40:12 -0700 Subject: [PATCH 09/45] still working on match --- data/db/dev.sqlite3 | Bin 73728 -> 73728 bytes data/helpers/jobsHelper.js | 15 ++++++++--- data/helpers/userHelper.js | 17 ++++++++----- ...0312163646_addCompanyId_to_userJobSaves.js | 9 +++++++ data/routes/authRoutes.js | 3 --- data/routes/usersRoutes.js | 24 +++++++++++------- 6 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 data/migrations/20190312163646_addCompanyId_to_userJobSaves.js diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index bced8e6165e0b968615fe61c13da1c63d2c1cedf..badeb29981395d1a17c2cd83a1d529e9747c520f 100644 GIT binary patch delta 183 zcmZoTz|wGlWrDQeb_NCpAs~hUfr&cCjN2zB$TOO3Y*@)7$|o)^&e)<@l9-g!B+SJw zuByt|oH;p!cjDxFF6GIW*_Aen@O@wuV&^->z<-B-3x6+vGQSx=8{etTiUM2sY^*q0 z88R7JjSLJe4U7$q49$$qOw8gFQ&ODsa|;slDm_!;OY-AOi&Kld@{@uS%TkN=vWnRl dGfP}gs%&PHe;~ldDbC1j$~k!gpU5JE4*-;;G1LG6 delta 142 zcmZoTz|wGlWrDQeHU { + tbl.integer('company_id'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.table('userJobSaves').dropColumn('company_id'); +}; diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index ae0cc4f..5be0888 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -65,8 +65,6 @@ router.post('/login', async (req, res) => { .where('email', email) .first(); if (user && bcrypt.compareSync(password, user.password)) { - console.log('user'); - try { const token = generateToken(user); const userInfo = { @@ -84,7 +82,6 @@ router.post('/login', async (req, res) => { res.status(404).json({ message: 'unable to find that user' }); } } else if (company && bcrypt.compareSync(password, company.password)) { - console.log('company'); try { const token = generateToken(company); const companyInfo = { diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index f3dc472..61954f6 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -29,6 +29,14 @@ router.get('/info', restricted, async (req, res) => { res.status(500).json('server error'); } }); +router.get('/matched', restricted, async (req, res) => { + try { + const result = await userHelper.match(req.decodedToken.subject); + res.status(200).json(result); + } catch { + res.status(500).json({ message: 'Internal server error' }); + } +}); // Get User by ID router.get('/:id', restricted, async (req, res) => { @@ -46,9 +54,13 @@ router.put('/update', restricted, imageProcess, async (req, res) => { }); router.post('/:id/save', restricted, async (req, res) => { - const { id } = req.params; - const result = await userHelper.saveUser(req.decodedToken.subject, id); - res.status(201).json(result); + try { + const { id } = req.params; + const result = await userHelper.saveUser(req.decodedToken.subject, id); + res.status(201).json(result); + } catch (error) { + res.status(500).json(error); + } }); router.post('/:id/remove', restricted, async (req, res) => { const { id } = req.params; @@ -62,10 +74,4 @@ router.post('/:id/remove', restricted, async (req, res) => { // res.status(204).json(result); // }); -router.get('/match', restricted, async (req, res) => { - // const result = await userHelper.match(req.decodedToken.subject); - let test = req.decodedToken; - res.status(200).json({ test }); -}); - module.exports = router; From b5061e170a6dd6f84c01d4c849303b5598743c9f Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 20:19:22 -0700 Subject: [PATCH 10/45] attempt at match --- data/db/dev.sqlite3 | Bin 73728 -> 77824 bytes data/helpers/jobsHelper.js | 5 ++++- data/helpers/userHelper.js | 30 +++++++++++++++++++++++------- data/routes/usersRoutes.js | 1 + 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index badeb29981395d1a17c2cd83a1d529e9747c520f..6788225007f20edbff56e166f959a5d57dc8a518 100644 GIT binary patch delta 734 zcmbV~KWGzi6vuzR%kTQTGw=6%)lgcf`A2OjMUB-2>g7f!$(ug!`)7J@b&IXG*xIPNLkNjH zPvm?!eSG6X;cDurEvG_BTB+X6S8I;7QnI|w)a)G@!aYArBKQmUanC!p_8nD!mql;? zl{^y~Bl9kA&eR)Zz8CW+T?~`q=um`4;!)~Y&a!#GTC*Ihx>7J}_a2%L^2>H5V`Qe! z8JY9OStDckU?^#`pBg+agh_5Z>g_bM@i=@YHY`y*zz(*tg}d0qZQR05+`zYByNS-N z5m=Hl@{%;*sT`M4IV6QtMHimAjn3p0IO4jsnSNlu}k0;LsyIbb{XwK*{h$mFSdSVEkeLF{WJ!(#kc)i-BY++zOzq za65pK!Yct-3V~gs=~OTCa-bX;=A{5k5R*NJnA(8ZQ*_g9|Gvz`O~T!i-7zM95Y3(I zt}}Vcho4=8$ywi;J{)EEnrL4BFi)9(Db0KHXFI0hJEBplD4(1dZBQwECxiU1ysZIRf3;hM_;Iq{L delta 341 zcmZp8z|wGlWr8&8b_NCpp@|CiK!%=9z{V73eZdqyEoMc=to)>a{Nj?#y!4dKJM?`L zc$oOV0o5|_@&D%kHd)|+&1RnoOZiz%O^qzfH-DSYXTYq;aCkEN1sBdJkTMXM95NwN z%+$!(*xcOI(9ptA&%n^s%-q7v(9B}<;R|;1@<25yJTDmdfAD|cf5HEN{|5gB{uBHM z_;>Jc;9tSNV6wu85D7jXJ{LY4J`+A&K2<(hK2bhiK33kpyk95xe9%zg_2+fxwdXbG z)#ugVRp6E272xIIW#IY2^MU6D&jp^7{6#z`H!BK!6Bbr$Aj9yVGz*(K3&ZAs ae*ugvY&<~LlK&^ { res.status(500).json('server error'); } }); + router.get('/matched', restricted, async (req, res) => { try { const result = await userHelper.match(req.decodedToken.subject); From 9066c854a0d665f56cda3c78521722bf7d41e2c6 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 20:35:18 -0700 Subject: [PATCH 11/45] added images for users, companies, jobs --- data/db/dev.sqlite3 | Bin 77824 -> 81920 bytes data/helpers/userHelper.js | 10 ++++++---- data/migrations/20190312202053_companyImg.js | 9 +++++++++ data/migrations/20190312202156_jobImg.js | 9 +++++++++ data/migrations/20190312202258_rename.js | 9 +++++++++ data/utils/index.js | 9 ++++++--- 6 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 data/migrations/20190312202053_companyImg.js create mode 100644 data/migrations/20190312202156_jobImg.js create mode 100644 data/migrations/20190312202258_rename.js diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index 6788225007f20edbff56e166f959a5d57dc8a518..f821233e90208866c5a7abbcadc800994d76f41b 100644 GIT binary patch literal 81920 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 JT~ep}{{V}@{m%dZ literal 77824 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 { + tbl.string('companyImg'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.table('companies').dropColumn('companyImg'); +}; diff --git a/data/migrations/20190312202156_jobImg.js b/data/migrations/20190312202156_jobImg.js new file mode 100644 index 0000000..14665d8 --- /dev/null +++ b/data/migrations/20190312202156_jobImg.js @@ -0,0 +1,9 @@ +exports.up = function(knex, Promise) { + return knex.schema.table('jobPosting', tbl => { + tbl.string('jobImg'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.table('jobPosting').dropColumn('jobImg'); +}; diff --git a/data/migrations/20190312202258_rename.js b/data/migrations/20190312202258_rename.js new file mode 100644 index 0000000..218a3aa --- /dev/null +++ b/data/migrations/20190312202258_rename.js @@ -0,0 +1,9 @@ +exports.up = function(knex, Promise) { + return knex.schema.table('users', tbl => { + tbl.renameColumn('profileImg', 'userImg'); + }); +}; + +exports.down = function(knex, Promise) { + return knex.schema.table('users').renameColumn('userImg', 'profileImg'); +}; diff --git a/data/utils/index.js b/data/utils/index.js index 495d701..68ce758 100644 --- a/data/utils/index.js +++ b/data/utils/index.js @@ -10,6 +10,7 @@ function generateProfile() { occupation: faker.name.jobTitle(), experience: 'experience', interests: 'interests', + userImg: faker.image.avatar(), }; } @@ -23,6 +24,7 @@ function generateJobs() { jobTags: faker.lorem.words(), jobOpenDate: faker.date.recent(), jobCloseDate: faker.date.future(), + jobImg: faker.image.technics(), company_id: faker.random.number({ min: 1, max: 25, @@ -36,6 +38,7 @@ function generateCompanies() { password: bcrypt.hashSync('password', 8), bio: faker.lorem.paragraph(), address: faker.address.streetAddress(), + companyImg: faker.image.business(), }; } function generateSaves() { @@ -73,10 +76,10 @@ function accumulate(cb, iteration) { // creates 25 users const list = accumulate(generateProfile, 25); -const jobs = accumulate(generateJobs, 100); +const jobs = accumulate(generateJobs, 50); const companyList = accumulate(generateCompanies, 25); -const jobSaves = accumulate(generateSaves, 100); -const userSaves = accumulate(generateUserSaves, 50); +const jobSaves = accumulate(generateSaves, 50); +const userSaves = accumulate(generateUserSaves, 25); module.exports = { list, From b91e8c0bb4faa3fed4b3a8e4484dbf4f2750dc85 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Tue, 12 Mar 2019 20:38:50 -0700 Subject: [PATCH 12/45] added image on login --- data/routes/authRoutes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 5be0888..ea801ec 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -75,6 +75,7 @@ router.post('/login', async (req, res) => { occupation: user.occupation, experience: user.experience, interests: user.interests, + userImg: user.userImg, }; res.status(200).json({ token, userInfo }); From ea942e92f3c2dd44c1ce7ff10f31195d78af8b70 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 09:15:06 -0700 Subject: [PATCH 13/45] Cleaning up code --- data/db/dev.sqlite3 | Bin 81920 -> 81920 bytes data/helpers/companyHelper.js | 29 ++++++++--------- data/helpers/jobsHelper.js | 14 +++++--- data/helpers/userHelper.js | 33 +++++++++---------- data/routes/companyRoutes.js | 20 ++++++++---- data/routes/jobsRoutes.js | 7 ++-- data/routes/usersRoutes.js | 58 ++++++++++++++++++++++------------ 7 files changed, 95 insertions(+), 66 deletions(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index f821233e90208866c5a7abbcadc800994d76f41b..7accd3a119f67c0be1b34a169c288a43c228014d 100644 GIT binary patch literal 81920 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 literal 81920 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 JT~ep}{{V}@{m%dZ diff --git a/data/helpers/companyHelper.js b/data/helpers/companyHelper.js index dca493d..e1e30ef 100644 --- a/data/helpers/companyHelper.js +++ b/data/helpers/companyHelper.js @@ -7,7 +7,7 @@ module.exports = { getCompanyInfo, getCompanyById, updateCompany, - // deleteCompany, + deleteCompany, }; function getAllCompanies() { @@ -30,13 +30,6 @@ async function getCompanyInfo(user) { return company; } -// function getCompanyInfo(user) { -// return db('companies') -// .where('email', user.email) -// .select('id', 'companyName', 'email', 'bio', 'address') -// .first(); -// } - async function getCompanyById(id) { const jobs = await db('jobPosting').where('company_id', id); @@ -57,10 +50,16 @@ function updateCompany(user, updateInfo) { .update(updateInfo); } -// function deleteCompany(user) { -// console.log('delete', user.email); -// const userDelete = db('companies') -// .where('email', user.email) -// .del(); -// return user.email; -// } +async function deleteCompany(id) { + try { + await db('companyUserSaves') + .where('company_id', id) + .del(); + await db('companies') + .where('id', id) + .del(); + return; + } catch (error) { + return error; + } +} diff --git a/data/helpers/jobsHelper.js b/data/helpers/jobsHelper.js index 0399b39..1e0df45 100644 --- a/data/helpers/jobsHelper.js +++ b/data/helpers/jobsHelper.js @@ -70,9 +70,15 @@ async function saveJob(userId, jobId) { }); } async function removeJob(userId, jobId) { - const job = await db('jobPosting').where('id', id); + try { + await db('userJobSaves') + .where({ user_id: userId, job_id: jobId, company_id: job.company_id }) + .del(); - return db('userJobSaves') - .where({ user_id: userId, job_id: jobId, company_id: job.company_id }) - .del(); + await db('jobPosting') + .where('id', id) + .del(); + } catch (error) { + res.status(500).json(error); + } } diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index e06837f..db5139d 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -10,8 +10,8 @@ module.exports = { updateUser, saveUser, removeUser, + deleteUser, match, - // deleteUser, }; function getAllUsers() { @@ -54,12 +54,6 @@ async function getUserInfo(user) { return userInfo; } -// function getUserInfo(user) { -// return db('users') -// .where('email', user.email) -// .select('id', 'firstName', 'lastName', 'occupation', 'experience', 'interests') -// .first(); -// } function getUserById(id) { return db('users') .where('id', id) @@ -73,17 +67,24 @@ function updateUser(user, updateInfo) { .update(updateInfo); } -// function deleteUser(user) { -// console.log('delete', user.email); -// const userDelete = db('users') -// .where('email', user.email) -// .del(); -// return user.email; -// } +async function deleteUser(user) { + try { + const result = await db('userJobSaves') + .where('user_id', user.subject) + .del(); + const userDelete = await db('users') + .where('email', user.email) + .del(); + return 1; + } catch (error) { + return error; + } +} function saveUser(companyId, userId) { return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }); } + function removeUser(companyId, userId) { return db('companyUserSaves') .where({ company_id: companyId, user_id: userId }) @@ -99,7 +100,7 @@ function removeUser(companyId, userId) { // where u.user_id = c.user_id async function match(userId) { - console.log(userId); + // console.log(userId); try { const userMatches = db('userJobSaves') .select( @@ -112,7 +113,7 @@ async function match(userId) { .leftJoin('companies', 'companyUserSaves.company_id', 'companies.id') .where('userJobSaves.user_id', 'companyUserSaves.user_id'); - console.log(userMatches); + // console.log(userMatches); return userMatches; } catch (error) { diff --git a/data/routes/companyRoutes.js b/data/routes/companyRoutes.js index 92a1ca1..88489ac 100644 --- a/data/routes/companyRoutes.js +++ b/data/routes/companyRoutes.js @@ -1,7 +1,4 @@ const express = require('express'); -// const knex = require('knex'); -// const knexConfig = require('../../knexfile'); -// const db = knex(knexConfig.development); const companyHelper = require('../helpers/companyHelper'); @@ -40,9 +37,18 @@ router.put('/update', restricted, async (req, res) => { }); //Delete Company -// router.delete('/delete', restricted, async (req, res) => { -// const result = await companyHelper.deleteCompany(req.decodedToken); -// res.status(204).json(result); -// }); +router.delete('/delete', restricted, async (req, res) => { + try { + const company = await companyHelper.getCompanyById(req.decodedToken.subject); + if (company) { + const result = await companyHelper.deleteCompany(req.decodedToken.subject); + res.status(204).json({ message: 'Success' }); + } else { + res.status(404).json({ message: 'Unable to find that company' }); + } + } catch (error) { + res.status(500); + } +}); module.exports = router; diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 5c7712e..4a280da 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -1,7 +1,4 @@ const express = require('express'); -// const knex = require('knex'); -// const knexConfig = require('../../knexfile'); -// const db = knex(knexConfig.development); const jobsHelper = require('../helpers/jobsHelper'); const companyHelper = require('../helpers/companyHelper'); @@ -23,6 +20,7 @@ router.post('/', restricted, async (req, res) => { res.status(500).json(error); } }); + //Get All Jobs router.get('/', restricted, async (req, res) => { try { @@ -33,11 +31,14 @@ router.get('/', restricted, async (req, res) => { } }); +// Save job to a user profile router.post('/:id/save', restricted, async (req, res) => { const { id } = req.params; const result = await jobsHelper.saveJob(req.decodedToken.subject, id); res.status(201).json(result); }); + +// Remove job from a profile router.post('/:id/remove', restricted, async (req, res) => { const { id } = req.params; const result = await jobsHelper.removeJob(req.decodedToken.subject, id); diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 6028e3d..658afd2 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -30,30 +30,21 @@ router.get('/info', restricted, async (req, res) => { } }); -router.get('/matched', restricted, async (req, res) => { - try { - const result = await userHelper.match(req.decodedToken.subject); - res.status(200).json(result); - } catch { - res.status(500).json({ message: 'Internal server error' }); - } -}); - -// Get User by ID +// Get User by ID - response 200 router.get('/:id', restricted, async (req, res) => { const { id } = req.params; const result = await userHelper.getUserById(id); res.status(200).json(result); }); -//Update User +//Update User - response 202 - returns a 1 if updated router.put('/update', restricted, imageProcess, async (req, res) => { - console.log(req.decodedToken); const updateInfo = req.body; const result = await userHelper.updateUser(req.decodedToken, updateInfo); - res.status(200).json(result); // returns a 1 if updated + res.status(202).json(result); }); +// Save job to user profile - response 201 router.post('/:id/save', restricted, async (req, res) => { try { const { id } = req.params; @@ -63,16 +54,41 @@ router.post('/:id/save', restricted, async (req, res) => { res.status(500).json(error); } }); + +// Remove saved job from profile - response 204 router.post('/:id/remove', restricted, async (req, res) => { - const { id } = req.params; - const result = await userHelper.removeUser(req.decodedToken.subject, id); - res.status(201).json(result); + try { + const { id } = req.params; + const result = await userHelper.removeUser(req.decodedToken.subject, id); + res.status(204).json(result); + } catch (error) { + res.status(500).json(error); + } +}); + +// Delete User - response 204 +router.delete('/delete', restricted, async (req, res) => { + try { + const user = await userHelper.getUserById(req.decodedToken.subject); + if (user) { + const result = await userHelper.deleteUser(req.decodedToken); + res.status(204); + } else { + res.status(404).json({ message: 'Unable to find that user' }); + } + } catch (error) { + res.status(500).json(error); + } }); -//Delete User -// router.delete('/delete', restricted, async (req, res) => { -// const result = await userHelper.deleteUser(req.decodedToken); -// res.status(204).json(result); -// }); +// Get matched user/companies - response 200 +router.get('/matched', restricted, async (req, res) => { + try { + const result = await userHelper.match(req.decodedToken.subject); + res.status(200).json(result); + } catch { + res.status(500).json({ message: 'Internal server error' }); + } +}); module.exports = router; From a02b3b81e1f68e6d725eda28d3db57f5ab19acb6 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 09:21:05 -0700 Subject: [PATCH 14/45] postgres updates --- knexfile.js | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/knexfile.js b/knexfile.js index e0c653e..cf9bc02 100644 --- a/knexfile.js +++ b/knexfile.js @@ -1,10 +1,10 @@ -// const localPgConnection = { -// host: 'localhost', -// database: 'hobbits', -// user: 'student', -// password: 'pass', -// }; -// const prodDbConnection = process.env.DATABASE_URL || localPgConnection; +const localPgConnection = { + host: 'localhost', + database: 'hobbits', + user: 'student', + password: 'pass', +}; +const prodDbConnection = process.env.DATABASE_URL || localPgConnection; module.exports = { development: { @@ -33,22 +33,11 @@ module.exports = { directory: './data/seeds', }, }, - production: { - client: 'sqlite3', - connection: { - filename: './data/db/prod.db3', - }, - migrations: { - directory: './data/migrations', - }, - seeds: { - directory: './data/seeds', - }, - }, - // production: { - // client: 'postgresql', - // connection: prodDbConnection, + // client: 'sqlite3', + // connection: { + // filename: './data/db/prod.db3', + // }, // migrations: { // directory: './data/migrations', // }, @@ -56,4 +45,15 @@ module.exports = { // directory: './data/seeds', // }, // }, + + production: { + client: 'postgresql', + connection: prodDbConnection, + migrations: { + directory: './data/migrations', + }, + seeds: { + directory: './data/seeds', + }, + }, }; From 2f03f474f1fee536821c9ddc90d5f55ec28fdf80 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 09:45:21 -0700 Subject: [PATCH 15/45] adjusted update endpoint for jobs listed out all routes --- README.md | 35 +++++++++++++++++++++ api/dbConfig.js | 32 +++++++++++++++++++ data/routes/companyRoutes.js | 14 ++++----- data/routes/jobsRoutes.js | 44 +++++++++++++------------- data/routes/usersRoutes.js | 60 +++++++++++++++++++----------------- 5 files changed, 127 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 4e29dd5..814efc1 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,41 @@ --- +### TLDR + +``` +Authentication + [POST] https://droom-backend.herokuapp.com/auth/register + [POST] https://droom-backend.herokuapp.com/auth/login + +Users + [GET] https://droom-backend.herokuapp.com/users/ + [GET] https://droom-backend.herokuapp.com/users/info + [PUT] https://droom-backend.herokuapp.com/users/update + [DELETE] https://droom-backend.herokuapp.com/users/delete + [GET] https://droom-backend.herokuapp.com/users/matched + [GET] https://droom-backend.herokuapp.com/users/:id + [POST] https://droom-backend.herokuapp.com/users/:id/save + [POST] https://droom-backend.herokuapp.com/users/:id/remove + +Companies + [GET] https://droom-backend.herokuapp.com/companies/ + [GET] https://droom-backend.herokuapp.com/companies/info + [GET] https://droom-backend.herokuapp.com/companies/:id + [PUT] https://droom-backend.herokuapp.com/companies/update + [DELETE] https://droom-backend.herokuapp.com/companies/delete + +Jobs + [GET] https://droom-backend.herokuapp.com/jobs/ + [POST] https://droom-backend.herokuapp.com/jobs/ + [GET] https://droom-backend.herokuapp.com/jobs/info + [GET] https://droom-backend.herokuapp.com/jobs/:id + [PUT] https://droom-backend.herokuapp.com/jobs/:id/update + [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete + [POST] https://droom-backend.herokuapp.com/jobs/:id/save + [POST] https://droom-backend.herokuapp.com/jobs/:id/remove +``` + [Axios Example](#axios_example) ## NAVIGATION diff --git a/api/dbConfig.js b/api/dbConfig.js index af8339f..72adc0f 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -4,3 +4,35 @@ const config = require('../knexfile'); const dbEnv = process.env.DB_ENV || 'development'; module.exports = knex(config[dbEnv]); + +// https://droom-backend.herokuapp.com/ +// Authentication +[POST] https://droom-backend.herokuapp.com/auth/register +[POST] https://droom-backend.herokuapp.com/auth/login + +// Users +[GET] https://droom-backend.herokuapp.com/users/ +[GET] https://droom-backend.herokuapp.com/users/info +[PUT] https://droom-backend.herokuapp.com/users/update +[DELETE] https://droom-backend.herokuapp.com/users/delete +[GET] https://droom-backend.herokuapp.com/users/matched +[GET] https://droom-backend.herokuapp.com/users/:id +[POST] https://droom-backend.herokuapp.com/users/:id/save +[POST] https://droom-backend.herokuapp.com/users/:id/remove + +// Companies +[GET] https://droom-backend.herokuapp.com/companies/ +[GET] https://droom-backend.herokuapp.com/companies/info +[GET] https://droom-backend.herokuapp.com/companies/:id +[PUT] https://droom-backend.herokuapp.com/companies/update +[DELETE] https://droom-backend.herokuapp.com/companies/delete + +//Jobs +[GET] https://droom-backend.herokuapp.com/jobs/ +[POST] https://droom-backend.herokuapp.com/jobs/ +[GET] https://droom-backend.herokuapp.com/jobs/info +[GET] https://droom-backend.herokuapp.com/jobs/:id +[PUT] https://droom-backend.herokuapp.com/jobs/:id/update +[DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete +[POST] https://droom-backend.herokuapp.com/jobs/:id/save +[POST] https://droom-backend.herokuapp.com/jobs/:id/remove \ No newline at end of file diff --git a/data/routes/companyRoutes.js b/data/routes/companyRoutes.js index 88489ac..dd46a7a 100644 --- a/data/routes/companyRoutes.js +++ b/data/routes/companyRoutes.js @@ -21,13 +21,6 @@ router.get('/info', restricted, async (req, res) => { res.status(200).json(result); }); -// Get Company by ID -router.get('/:id', restricted, async (req, res) => { - const { id } = req.params; - const result = await companyHelper.getCompanyById(id); - res.status(200).json(result); -}); - //Update Company router.put('/update', restricted, async (req, res) => { console.log(req.decodedToken); @@ -51,4 +44,11 @@ router.delete('/delete', restricted, async (req, res) => { } }); +// Get Company by ID +router.get('/:id', restricted, async (req, res) => { + const { id } = req.params; + const result = await companyHelper.getCompanyById(id); + res.status(200).json(result); +}); + module.exports = router; diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 4a280da..88a196e 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -31,35 +31,14 @@ router.get('/', restricted, async (req, res) => { } }); -// Save job to a user profile -router.post('/:id/save', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.saveJob(req.decodedToken.subject, id); - res.status(201).json(result); -}); - -// Remove job from a profile -router.post('/:id/remove', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.removeJob(req.decodedToken.subject, id); - res.status(201).json(result); -}); - //Get logged in user router.get('/info', restricted, async (req, res) => { const result = await userHelper.getUserInfo(req.decodedToken); res.status(200).json(result); }); -// Get Job by ID -router.get('/:id', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.getJobById(id); - res.status(200).json(result); -}); - // Update Job -router.put('/update/:id', restricted, async (req, res) => { +router.put('/:id/update', restricted, async (req, res) => { const updateInfo = req.body; const { id } = req.params; const result = await jobsHelper.updateJob(id, updateInfo); @@ -74,4 +53,25 @@ router.delete('/:id/delete', restricted, async (req, res) => { res.status(204).json(result); }); +// Get Job by ID +router.get('/:id', restricted, async (req, res) => { + const { id } = req.params; + const result = await jobsHelper.getJobById(id); + res.status(200).json(result); +}); + +// Save job to a user profile +router.post('/:id/save', restricted, async (req, res) => { + const { id } = req.params; + const result = await jobsHelper.saveJob(req.decodedToken.subject, id); + res.status(201).json(result); +}); + +// Remove job from a profile +router.post('/:id/remove', restricted, async (req, res) => { + const { id } = req.params; + const result = await jobsHelper.removeJob(req.decodedToken.subject, id); + res.status(201).json(result); +}); + module.exports = router; diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 658afd2..5c99673 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -30,13 +30,6 @@ router.get('/info', restricted, async (req, res) => { } }); -// Get User by ID - response 200 -router.get('/:id', restricted, async (req, res) => { - const { id } = req.params; - const result = await userHelper.getUserById(id); - res.status(200).json(result); -}); - //Update User - response 202 - returns a 1 if updated router.put('/update', restricted, imageProcess, async (req, res) => { const updateInfo = req.body; @@ -44,28 +37,6 @@ router.put('/update', restricted, imageProcess, async (req, res) => { res.status(202).json(result); }); -// Save job to user profile - response 201 -router.post('/:id/save', restricted, async (req, res) => { - try { - const { id } = req.params; - const result = await userHelper.saveUser(req.decodedToken.subject, id); - res.status(201).json(result); - } catch (error) { - res.status(500).json(error); - } -}); - -// Remove saved job from profile - response 204 -router.post('/:id/remove', restricted, async (req, res) => { - try { - const { id } = req.params; - const result = await userHelper.removeUser(req.decodedToken.subject, id); - res.status(204).json(result); - } catch (error) { - res.status(500).json(error); - } -}); - // Delete User - response 204 router.delete('/delete', restricted, async (req, res) => { try { @@ -91,4 +62,35 @@ router.get('/matched', restricted, async (req, res) => { } }); +// Get User by ID - response 200 +router.get('/:id', restricted, async (req, res) => { + const { id } = req.params; + const result = await userHelper.getUserById(id); + res.status(200).json(result); +}); + +// Save job to user profile - response 201 +router.post('/:id/save', restricted, async (req, res) => { + try { + const { id } = req.params; + const result = await userHelper.saveUser(req.decodedToken.subject, id); + res.status(201).json(result); + } catch (error) { + res.status(500).json(error); + } +}); + +// Remove saved job from profile - response 204 +router.post('/:id/remove', restricted, async (req, res) => { + try { + const { id } = req.params; + const result = await userHelper.removeUser(req.decodedToken.subject, id); + res.status(204).json(result); + } catch (error) { + res.status(500).json(error); + } +}); + + + module.exports = router; From 03ef6b0168c74566a7707de0b72ff18d3ae93d28 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 10:02:46 -0700 Subject: [PATCH 16/45] removed db from pushing to github --- data/db/dev.sqlite3 | Bin 81920 -> 0 bytes data/db/prod.db3 | Bin 36864 -> 0 bytes data/db/test.db3 | Bin 36864 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/db/dev.sqlite3 delete mode 100644 data/db/prod.db3 delete mode 100644 data/db/test.db3 diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 deleted file mode 100644 index 7accd3a119f67c0be1b34a169c288a43c228014d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81920 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 diff --git a/data/db/prod.db3 b/data/db/prod.db3 deleted file mode 100644 index 583de6affd98b91d273832a518535a9525fafd67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeI4O;8)j6@WF2K?scGwQ&@R-PLGQ-ZCXGmIUIb9LE+y!Uzco1lI0JG&7B+(P(Dq znK2Bh9N6TRs#N8aQ}&kgUiOqqDu*PMOD@@}oHmzSl0yzT=8#HN-UtvvKeo5Lhb`Be zLLj<(`t|$X>o?3pZz@{_W>e|F;7wvnbG}M7G}CaPh_KM5}i@2Mw^6bHAiPh4sEvvGTYhoPFC98T;JNwO6!}e*^i~YcK5ZD z_9R2^=-ZR-@3rRKn>iEx{%{s#KJ1ctK9Q@FChe9y`U=Utr}mM5F=!L!hgJM=#2=1C zgdb;Zvaem~*w)5>A#x|ZQpk2`!jwIU={BuXF6o9X>5isJCTC5;U8zA`i8!{wbeYp8 z)$IqDXS*%Y(hI_6mGJw?RBEPuIt)7JGqBqvmUV1!5ItyueP&$mgh`2_aB5lC+h@qI zKb!~)Xa1H69E5}O(Nb)ug6PE5)f)n(e#<@pL&!R|K0*$1LOoJt92^%kRs zPETr0R_84NR!uYHM!&Wj*9rC;;u)f4+pp=U>|83na`2h*&`3BI6FzAz(K^!L-nV8^ zhzp=;*RSHWg>`k__crzeICJLg`-0z_^3#X?)b3Je=-QlnUA-+muNK?hPA}b!-a>k8 zv`=hVZPNmKwhd9UnKxb`Huc`kc=zT*p)Y))zri;=kN^@u0!RP}AOR$R1dsp{Kmter z2_S)Q4S^4bhJBg9a5A1)j?cxHlF39WwOnf_`(_UAzZ`9j ziZBolB!C2v01`j~NZ^|%U`_^nk?^BfF&fEnsz4Q{+{kcd*=dDp8l8Pc;YmIEQ19fX);)+4OO!+L9eas5O~Mb zlUOMlDUbu=Qro6G4hP(8P)%*mWiiR*}1A~ zt6RnPo_;McV*y|I?qVzpE(u1Z1)|rBlxwwZ7rdflgDKfVew5th+^!eo?9!#%uQyGt zRq21enbURP*~d~!04z0?h-IRY9hXzuSRvdt^fjhXLtl(v>0%o5FU&2ov{Ei-PLgz$ zaVp!=u0{4ehjXPJDy!g9VC_Cq_$WvTmpmzX!=k2IG+vbs&W^=86nlV2BoOM&-C%^1MC!`@PM@!=)zaB&jmr93X6Yh&l%PugBEVNn3J^7j9ep?+44?ZR=#+t{ zHE2|)C5!0*uFABg=jZL~Nnv;6xO8$vstc=YpPa7r`rgZ8uW`c*6dPWkSb;#xXqm_c zJRc$t%WN__yKN|()g5}8Om^CMYrmd0}%qrQcvAlexQ!cHmM(u=U*Q=VFEVqo5b99JC-tP6hFav(2FnvJ$GlxJ* zn;%&t%fyVoz5aYxS`#O>V9aV5LGztz4nZ#m}* z4%)|K@E6SF#8upd2eTpP zoBx9cXG8)>00|%gB!C2v01`j~NB{{Sfj1;DEj|(kB#kG(BPN92^zI$6xi=MiJ0fOa zrhy66cit192m|w;x4hng*~yT%$^m)A;QL})7@YW<_^y}|`lae_-W4B$c3nxe@hNdp z=$i=}^VIImTm|llCE=C1rqOrB$HJiOkl$NLPcCP~YwbzA41Z7DfQeq3D7i5yek62f zH$-m*gAx%#?~9qhOY#QZ|Nr5k|9Bt)B!C2v01`j~NB{{S0VIF~kN^@u0&g(^@BjaJ z|Nj;n7*#_8NB{{S0VIF~kN^@u0!RP}AOR!*1n~YJ-2e$70VIF~kN^@u0!RP}AOR$R K1dzbnPvHOg3*I{b diff --git a/data/db/test.db3 b/data/db/test.db3 deleted file mode 100644 index f939e16b1697c748886a4935e34fc0201eec5b88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeI(Pfyce9Ki8*V-!T0iH9C39t;aa#>fmr6Gh!YLkRdM(bHD8M|@;!N82gH)6n=b zd=tUVPfILc5_MT*&f$!bW-i_V@X4jxmnLI9l@A+WqxPDiYbKS<(r_j_@qU4J@bA zY+7wkwruaf+7$PO#7)eGn~ey|umiYulSEmCJ>Axa!pNIkmZM`~ExE zQ%j#V!M1dhjcQW6(eQ-tC+iD#&M=ouy=z1%==j1*raY<{ABsNMxknw|r)+{A9Z-f7!`be*JVn7;kC@T73+VxTF! zR#X;(bQ-$XvxZqN>)oBmXx9<@)t21xq6PeF)2;6gs~bxS4(k#oBFgO9Ts1WYWGx;xC{-=7PAbV^;?inyxwuj)EtSiw)%eZ6n{RwwwmyGay{_l9 z+b8=KOU0FH^d42e&#m76|A&_UmH%;J0^~#xKmY**5I_I{1Q0*~0R#|0;6DP_GTC`O z_058esb|ZRsmkap8R7n4&;QZX4+Q}P5I_I{1Q0*~0R#|0009I>PavyjwTW>5um0(u zf&c;tAb Date: Wed, 13 Mar 2019 10:03:43 -0700 Subject: [PATCH 17/45] minor changes --- README.md | 18 ++++++++++++++ api/dbConfig.js | 51 +++++++++++++++++++++----------------- data/routes/usersRoutes.js | 4 +-- knexfile.js | 4 +-- 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 814efc1..163460d 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,24 @@ Jobs [POST] https://droom-backend.herokuapp.com/jobs/:id/remove ``` +User Login + +``` +{ + "email":"user@user.com", + "password":"password" +} +``` + +User Login + +``` +{ + "email":"company@company.com", + "password":"password" +} +``` + [Axios Example](#axios_example) ## NAVIGATION diff --git a/api/dbConfig.js b/api/dbConfig.js index 72adc0f..f9501cd 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -6,33 +6,38 @@ const dbEnv = process.env.DB_ENV || 'development'; module.exports = knex(config[dbEnv]); // https://droom-backend.herokuapp.com/ + // Authentication -[POST] https://droom-backend.herokuapp.com/auth/register -[POST] https://droom-backend.herokuapp.com/auth/login + +// [POST] https://droom-backend.herokuapp.com/auth/register +// [POST] https://droom-backend.herokuapp.com/auth/login // Users -[GET] https://droom-backend.herokuapp.com/users/ -[GET] https://droom-backend.herokuapp.com/users/info -[PUT] https://droom-backend.herokuapp.com/users/update -[DELETE] https://droom-backend.herokuapp.com/users/delete -[GET] https://droom-backend.herokuapp.com/users/matched -[GET] https://droom-backend.herokuapp.com/users/:id -[POST] https://droom-backend.herokuapp.com/users/:id/save -[POST] https://droom-backend.herokuapp.com/users/:id/remove + +// [GET] https://droom-backend.herokuapp.com/users/ +// [GET] https://droom-backend.herokuapp.com/users/info +// [PUT] https://droom-backend.herokuapp.com/users/update +// [DELETE] https://droom-backend.herokuapp.com/users/delete +// [GET] https://droom-backend.herokuapp.com/users/matched +// [GET] https://droom-backend.herokuapp.com/users/:id +// [POST] https://droom-backend.herokuapp.com/users/:id/save +// [POST] https://droom-backend.herokuapp.com/users/:id/remove // Companies -[GET] https://droom-backend.herokuapp.com/companies/ -[GET] https://droom-backend.herokuapp.com/companies/info -[GET] https://droom-backend.herokuapp.com/companies/:id -[PUT] https://droom-backend.herokuapp.com/companies/update -[DELETE] https://droom-backend.herokuapp.com/companies/delete + +// [GET] https://droom-backend.herokuapp.com/companies/ +// [GET] https://droom-backend.herokuapp.com/companies/info +// [GET] https://droom-backend.herokuapp.com/companies/:id +// [PUT] https://droom-backend.herokuapp.com/companies/update +// [DELETE] https://droom-backend.herokuapp.com/companies/delete //Jobs -[GET] https://droom-backend.herokuapp.com/jobs/ -[POST] https://droom-backend.herokuapp.com/jobs/ -[GET] https://droom-backend.herokuapp.com/jobs/info -[GET] https://droom-backend.herokuapp.com/jobs/:id -[PUT] https://droom-backend.herokuapp.com/jobs/:id/update -[DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete -[POST] https://droom-backend.herokuapp.com/jobs/:id/save -[POST] https://droom-backend.herokuapp.com/jobs/:id/remove \ No newline at end of file + +// [GET] https://droom-backend.herokuapp.com/jobs/ +// [POST] https://droom-backend.herokuapp.com/jobs/ +// [GET] https://droom-backend.herokuapp.com/jobs/info +// [GET] https://droom-backend.herokuapp.com/jobs/:id +// [PUT] https://droom-backend.herokuapp.com/jobs/:id/update +// [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete +// [POST] https://droom-backend.herokuapp.com/jobs/:id/save +// [POST] https://droom-backend.herokuapp.com/jobs/:id/remove diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 5c99673..ea1ec33 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -1,7 +1,5 @@ const express = require('express'); -// const knex = require('knex'); -// const knexConfig = require('../../knexfile'); -// const db = knex(knexConfig.development); + const userHelper = require('../helpers/userHelper'); diff --git a/knexfile.js b/knexfile.js index cf9bc02..d36786b 100644 --- a/knexfile.js +++ b/knexfile.js @@ -1,7 +1,7 @@ const localPgConnection = { host: 'localhost', - database: 'hobbits', - user: 'student', + database: 'dev', + user: 'user', password: 'pass', }; const prodDbConnection = process.env.DATABASE_URL || localPgConnection; From 049119b52bfdb56f7a5e042c530f07ca867bab3a Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 10:24:57 -0700 Subject: [PATCH 18/45] Minor adjustments to auth route --- README.md | 4 +++- data/routes/authRoutes.js | 11 ++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 163460d..df9c00d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ ### START SERVER +- run 'yarn install` - run `yarn server` --- @@ -54,7 +55,8 @@ User Login ``` { "email":"user@user.com", - "password":"password" + "password":"password", + "type":"user" } ``` diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index ea801ec..c3d985f 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -10,8 +10,8 @@ const router = express.Router(); router.post('/register', emailCheck, async (req, res) => { // eamil, password, type = required - // firstName, lastname, occupation, expereience, interests = optional for user - // name, bio, address + // firstName, lastname, occupation, expereience, interests, userImg = optional for user + // name, bio, address, companyImg let user = req.body; const hash = bcrypt.hashSync(user.password, 8); user.password = hash; @@ -25,7 +25,7 @@ router.post('/register', emailCheck, async (req, res) => { const result = await db('users').insert(newUser); res.status(201).json({ message: 'Successfully created user account', result }); } catch (error) { - // res.status(400).json({ message: 'Email address is already in use', error }); + res.status(500).json({ message: 'Error processing the request' }); } } else { res.status(404).json({ @@ -43,7 +43,7 @@ router.post('/register', emailCheck, async (req, res) => { const result = await db('companies').insert(newCompany); res.status(201).json({ message: 'Successfully created company', result }); } catch { - // res.status(400).json({ message: 'Email address is already in use' }); + res.status(500).json({ message: 'Error processing the request' }); } } else { res.status(404).json({ @@ -90,11 +90,12 @@ router.post('/login', async (req, res) => { companyName: company.companyName, bio: company.bio, address: company.address, + companyImg: company.companyImg, }; res.status(200).json({ token, companyInfo }); } catch { - res.status(404).json({ message: 'unable to find that user' }); + res.status(404).json({ message: 'unable to find that company' }); } } else { res.status(500).json({ message: 'login server issue' }); From 7c6cd6ef642e69dc87184bd3b62d824a76f71377 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 10:31:33 -0700 Subject: [PATCH 19/45] added companyName to readme docs example --- README.md | 1 + data/routes/authRoutes.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df9c00d..8f7316e 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ User Login ``` { + companyName: "Company", email: "johnDoe@test.com", password: "password123" type:'company' diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index c3d985f..4c47287 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -56,7 +56,7 @@ router.post('/register', emailCheck, async (req, res) => { }); router.post('/login', async (req, res) => { - let { email, password, type } = req.body; + let { email, password } = req.body; const user = await db('users') .where('email', email) From 304cbf0ef4c092fa57312bf30f01158f73db4a29 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 10:39:45 -0700 Subject: [PATCH 20/45] testing auth --- data/routes/authRoutes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 4c47287..98a2390 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -22,7 +22,7 @@ router.post('/register', emailCheck, async (req, res) => { email: user.email, password: user.password, }; - const result = await db('users').insert(newUser); + const result = await db('users').insert(newUser, 'id'); res.status(201).json({ message: 'Successfully created user account', result }); } catch (error) { res.status(500).json({ message: 'Error processing the request' }); @@ -40,7 +40,7 @@ router.post('/register', emailCheck, async (req, res) => { email: user.email, password: user.password, }; - const result = await db('companies').insert(newCompany); + const result = await db('companies').insert(newCompany, 'id'); res.status(201).json({ message: 'Successfully created company', result }); } catch { res.status(500).json({ message: 'Error processing the request' }); From 4a0f5578bc28c6209f4ebc1f29c274b892c12d5d Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 12:06:54 -0700 Subject: [PATCH 21/45] matching works --- data/helpers/userHelper.js | 35 ++++++++++++++++++++++------------- data/routes/companyRoutes.js | 4 ++++ data/routes/usersRoutes.js | 3 --- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index db5139d..67e2379 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -99,21 +99,30 @@ function removeUser(companyId, userId) { // on c.company_id = com.id // where u.user_id = c.user_id -async function match(userId) { - // console.log(userId); +// select userJobSaves.user_id, userJobSaves.company_id, userJobSaves.job_id +// from userJobSaves +// left join companyUserSaves +// on userJobSaves.company_id = companyUserSaves.company_id +// where userJobSaves.user_id = companyUserSaves.user_id + +async function match(id) { try { - const userMatches = db('userJobSaves') - .select( - 'userJobSaves.user_id', - 'userJobSaves.company_id', - 'companies.companyName', - 'userJobSaves.job_id' - ) - .leftJoin('companyUserSaves', 'userJobSaves.company_id', companyUserSaves.company_id) - .leftJoin('companies', 'companyUserSaves.company_id', 'companies.id') - .where('userJobSaves.user_id', 'companyUserSaves.user_id'); + // const userMatches = await db('userJobSaves') + // .leftJoin('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') + // .where('userJobSaves.user_id', 'companyUserSaves.user_id') + // .select('userJobSaves.user_id', 'userJobSaves.company_id', 'userJobSaves.job_id'); - // console.log(userMatches); + const userMatches = await db('userJobSaves') + .join('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') + .where('userJobSaves.user_id', id) + .where('companyUserSaves.user_id', id) + .select( + 'userJobSaves.user_id as UserId', + // 'companyUserSaves.user_id as 2UserId', + 'userJobSaves.company_id as companyId', + 'userJobSaves.job_id as jobId' + ); + console.log('match', userMatches); return userMatches; } catch (error) { diff --git a/data/routes/companyRoutes.js b/data/routes/companyRoutes.js index dd46a7a..aa47571 100644 --- a/data/routes/companyRoutes.js +++ b/data/routes/companyRoutes.js @@ -44,6 +44,10 @@ router.delete('/delete', restricted, async (req, res) => { } }); +// Match + +// get companyUserSaves + // Get Company by ID router.get('/:id', restricted, async (req, res) => { const { id } = req.params; diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index ea1ec33..e91319a 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -1,6 +1,5 @@ const express = require('express'); - const userHelper = require('../helpers/userHelper'); const { restricted, imageProcess } = require('../middleware/middleware'); @@ -89,6 +88,4 @@ router.post('/:id/remove', restricted, async (req, res) => { } }); - - module.exports = router; From 0ac39d77c1f4b89d97b03a95fd5d4c1b47c724c7 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 12:25:18 -0700 Subject: [PATCH 22/45] added invalid endponit catch --- api/server.js | 6 ++++++ data/helpers/userHelper.js | 22 ---------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/api/server.js b/api/server.js index 90a384b..8c0b85e 100644 --- a/api/server.js +++ b/api/server.js @@ -26,4 +26,10 @@ server.get('/', (req, res) => { res.send('Sanity Check'); }); +server.use(function(req, res) { + res.status(404).json({ + message: 'Invalid endpoint!', + }); +}); + module.exports = server; diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 67e2379..79fab77 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -91,39 +91,17 @@ function removeUser(companyId, userId) { .del(); } -// select u.user_id,c.user_id,u.company_id,c.company_id, com.companyName, com.id, u.job_id -// from userJobSaves u -// left join companyUserSaves c -// on u.company_id = c.company_id -// left join companies com -// on c.company_id = com.id -// where u.user_id = c.user_id - -// select userJobSaves.user_id, userJobSaves.company_id, userJobSaves.job_id -// from userJobSaves -// left join companyUserSaves -// on userJobSaves.company_id = companyUserSaves.company_id -// where userJobSaves.user_id = companyUserSaves.user_id - async function match(id) { try { - // const userMatches = await db('userJobSaves') - // .leftJoin('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') - // .where('userJobSaves.user_id', 'companyUserSaves.user_id') - // .select('userJobSaves.user_id', 'userJobSaves.company_id', 'userJobSaves.job_id'); - const userMatches = await db('userJobSaves') .join('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') .where('userJobSaves.user_id', id) .where('companyUserSaves.user_id', id) .select( 'userJobSaves.user_id as UserId', - // 'companyUserSaves.user_id as 2UserId', 'userJobSaves.company_id as companyId', 'userJobSaves.job_id as jobId' ); - console.log('match', userMatches); - return userMatches; } catch (error) { return error; From c17fcd9a138fe063e4370d73b225a19b741555e4 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 12:37:50 -0700 Subject: [PATCH 23/45] added email to get user info --- data/helpers/userHelper.js | 55 +++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 79fab77..65d82ce 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -31,27 +31,40 @@ function getSaves(id) { } async function getUserInfo(user) { - const likes = await db('userJobSaves') - .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') - .where('user_id', user.subject) - .select( - 'job_id', - 'jobTitle', - 'jobPosition', - 'jobDescription', - 'jobRequirements', - 'jobSalary', - 'jobTags', - 'jobOpenDate', - 'jobCloseDate', - 'jobImg' - ); - const userInfo = await db('users') - .where('id', user.subject) - .select('id', 'firstName', 'lastName', 'occupation', 'experience', 'interests', 'userImg') - .first(); - Object.assign(userInfo, { saved: likes }); - return userInfo; + try { + const likes = await db('userJobSaves') + .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') + .where('user_id', user.subject) + .select( + 'job_id', + 'jobTitle', + 'jobPosition', + 'jobDescription', + 'jobRequirements', + 'jobSalary', + 'jobTags', + 'jobOpenDate', + 'jobCloseDate', + 'jobImg' + ); + const userInfo = await db('users') + .where('id', user.subject) + .select( + 'id', + 'firstName', + 'lastName', + 'email', + 'occupation', + 'experience', + 'interests', + 'userImg' + ) + .first(); + Object.assign(userInfo, { saved: likes }); + return userInfo; + } catch (error) { + return error; + } } function getUserById(id) { From bb594b3dfddf7578e0c999ff2d9c75a30393548a Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 13:04:31 -0700 Subject: [PATCH 24/45] modified sanity check --- api/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/server.js b/api/server.js index 8c0b85e..eef54fd 100644 --- a/api/server.js +++ b/api/server.js @@ -23,7 +23,7 @@ server.use('/companies', companyRoute); server.use('/jobs', jobRoute); server.get('/', (req, res) => { - res.send('Sanity Check'); + res.send('Sanity Check PG'); }); server.use(function(req, res) { From c54bcdfbb548392f3dda969207e1e918473bebe7 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 13:49:22 -0700 Subject: [PATCH 25/45] yarn upgrade --- yarn.lock | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index dbc437d..ad92e67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1128,9 +1128,9 @@ helmet-csp@2.7.1: platform "1.3.5" helmet@^3.15.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.15.1.tgz#2c80d1a59138b6f23929605afca4b1c88b3298ec" - integrity sha512-hgoNe/sjKlKNvJ3g9Gz149H14BjMMWOCmW/DTXl7IfyKGtIK37GePwZrHNfr4aPXdKVyXcTj26RgRFbPKDy9lw== + version "3.16.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.16.0.tgz#7df41a4bfe4c83d90147c1e30d70893f92a9d97c" + integrity sha512-rsTKRogc5OYGlvSHuq5QsmOsOzF6uDoMqpfh+Np8r23+QxDq+SUx90Rf8HyIKQVl7H6NswZEwfcykinbAeZ6UQ== dependencies: depd "2.0.0" dns-prefetch-control "0.1.0" @@ -1142,8 +1142,8 @@ helmet@^3.15.1: helmet-csp "2.7.1" hide-powered-by "1.0.0" hpkp "2.0.0" - hsts "2.1.0" - ienoopen "1.0.0" + hsts "2.2.0" + ienoopen "1.1.0" nocache "2.0.0" referrer-policy "1.1.0" x-xss-protection "1.1.0" @@ -1165,10 +1165,12 @@ hpkp@2.0.0: resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" integrity sha1-EOFCJk52IVpdMMROxD3mTe5tFnI= -hsts@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.1.0.tgz#cbd6c918a2385fee1dd5680bfb2b3a194c0121cc" - integrity sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA== +hsts@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.2.0.tgz#09119d42f7a8587035d027dda4522366fe75d964" + integrity sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ== + dependencies: + depd "2.0.0" http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" @@ -1203,10 +1205,10 @@ iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -ienoopen@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b" - integrity sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms= +ienoopen@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974" + integrity sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ== ignore-by-default@^1.0.1: version "1.0.1" @@ -2887,9 +2889,9 @@ unzip-response@^2.0.1: integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= upath@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.1.tgz#497f7c1090b0818f310bbfb06783586a68d28014" - integrity sha512-D0yetkpIOKiZQquxjM2Syvy48Y1DbZ0SWxgsZiwd9GCWRpc75vN8ytzem14WDSg+oiX6+Qt31FpiS/ExODCrLg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== update-notifier@^2.5.0: version "2.5.0" From 6ea7a1749ec3aee957f5aa7adf7513489f44d443 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 13:51:49 -0700 Subject: [PATCH 26/45] uploading db's again --- .gitignore | 2 -- data/db/dev.sqlite3 | Bin 0 -> 81920 bytes data/db/match.md | 6 ++++++ data/db/prod.db3 | Bin 0 -> 36864 bytes data/db/test.db3 | Bin 0 -> 36864 bytes 5 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 data/db/dev.sqlite3 create mode 100644 data/db/match.md create mode 100644 data/db/prod.db3 create mode 100644 data/db/test.db3 diff --git a/.gitignore b/.gitignore index 9179c95..74783ea 100644 --- a/.gitignore +++ b/.gitignore @@ -85,5 +85,3 @@ typings/ # DynamoDB Local files .dynamodb/ .gitignore - -db/ \ No newline at end of file diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..600b7d1c2fbaaf4721a07e19ee9a1b8cebf60191 GIT binary patch literal 81920 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 literal 0 HcmV?d00001 diff --git a/data/db/match.md b/data/db/match.md new file mode 100644 index 0000000..2ccb847 --- /dev/null +++ b/data/db/match.md @@ -0,0 +1,6 @@ +select u.user_id,c.user_id,u.company_id,c.company_id, u.job_id +from userJobSaves u + left join companyUserSaves c + on u.company_id = c.company_id + where u.user_id = c.user_id + diff --git a/data/db/prod.db3 b/data/db/prod.db3 new file mode 100644 index 0000000000000000000000000000000000000000..583de6affd98b91d273832a518535a9525fafd67 GIT binary patch literal 36864 zcmeI4O;8)j6@WF2K?scGwQ&@R-PLGQ-ZCXGmIUIb9LE+y!Uzco1lI0JG&7B+(P(Dq znK2Bh9N6TRs#N8aQ}&kgUiOqqDu*PMOD@@}oHmzSl0yzT=8#HN-UtvvKeo5Lhb`Be zLLj<(`t|$X>o?3pZz@{_W>e|F;7wvnbG}M7G}CaPh_KM5}i@2Mw^6bHAiPh4sEvvGTYhoPFC98T;JNwO6!}e*^i~YcK5ZD z_9R2^=-ZR-@3rRKn>iEx{%{s#KJ1ctK9Q@FChe9y`U=Utr}mM5F=!L!hgJM=#2=1C zgdb;Zvaem~*w)5>A#x|ZQpk2`!jwIU={BuXF6o9X>5isJCTC5;U8zA`i8!{wbeYp8 z)$IqDXS*%Y(hI_6mGJw?RBEPuIt)7JGqBqvmUV1!5ItyueP&$mgh`2_aB5lC+h@qI zKb!~)Xa1H69E5}O(Nb)ug6PE5)f)n(e#<@pL&!R|K0*$1LOoJt92^%kRs zPETr0R_84NR!uYHM!&Wj*9rC;;u)f4+pp=U>|83na`2h*&`3BI6FzAz(K^!L-nV8^ zhzp=;*RSHWg>`k__crzeICJLg`-0z_^3#X?)b3Je=-QlnUA-+muNK?hPA}b!-a>k8 zv`=hVZPNmKwhd9UnKxb`Huc`kc=zT*p)Y))zri;=kN^@u0!RP}AOR$R1dsp{Kmter z2_S)Q4S^4bhJBg9a5A1)j?cxHlF39WwOnf_`(_UAzZ`9j ziZBolB!C2v01`j~NZ^|%U`_^nk?^BfF&fEnsz4Q{+{kcd*=dDp8l8Pc;YmIEQ19fX);)+4OO!+L9eas5O~Mb zlUOMlDUbu=Qro6G4hP(8P)%*mWiiR*}1A~ zt6RnPo_;McV*y|I?qVzpE(u1Z1)|rBlxwwZ7rdflgDKfVew5th+^!eo?9!#%uQyGt zRq21enbURP*~d~!04z0?h-IRY9hXzuSRvdt^fjhXLtl(v>0%o5FU&2ov{Ei-PLgz$ zaVp!=u0{4ehjXPJDy!g9VC_Cq_$WvTmpmzX!=k2IG+vbs&W^=86nlV2BoOM&-C%^1MC!`@PM@!=)zaB&jmr93X6Yh&l%PugBEVNn3J^7j9ep?+44?ZR=#+t{ zHE2|)C5!0*uFABg=jZL~Nnv;6xO8$vstc=YpPa7r`rgZ8uW`c*6dPWkSb;#xXqm_c zJRc$t%WN__yKN|()g5}8Om^CMYrmd0}%qrQcvAlexQ!cHmM(u=U*Q=VFEVqo5b99JC-tP6hFav(2FnvJ$GlxJ* zn;%&t%fyVoz5aYxS`#O>V9aV5LGztz4nZ#m}* z4%)|K@E6SF#8upd2eTpP zoBx9cXG8)>00|%gB!C2v01`j~NB{{Sfj1;DEj|(kB#kG(BPN92^zI$6xi=MiJ0fOa zrhy66cit192m|w;x4hng*~yT%$^m)A;QL})7@YW<_^y}|`lae_-W4B$c3nxe@hNdp z=$i=}^VIImTm|llCE=C1rqOrB$HJiOkl$NLPcCP~YwbzA41Z7DfQeq3D7i5yek62f zH$-m*gAx%#?~9qhOY#QZ|Nr5k|9Bt)B!C2v01`j~NB{{S0VIF~kN^@u0&g(^@BjaJ z|Nj;n7*#_8NB{{S0VIF~kN^@u0!RP}AOR!*1n~YJ-2e$70VIF~kN^@u0!RP}AOR$R K1dzbnPvHOg3*I{b literal 0 HcmV?d00001 diff --git a/data/db/test.db3 b/data/db/test.db3 new file mode 100644 index 0000000000000000000000000000000000000000..f939e16b1697c748886a4935e34fc0201eec5b88 GIT binary patch literal 36864 zcmeI(Pfyce9Ki8*V-!T0iH9C39t;aa#>fmr6Gh!YLkRdM(bHD8M|@;!N82gH)6n=b zd=tUVPfILc5_MT*&f$!bW-i_V@X4jxmnLI9l@A+WqxPDiYbKS<(r_j_@qU4J@bA zY+7wkwruaf+7$PO#7)eGn~ey|umiYulSEmCJ>Axa!pNIkmZM`~ExE zQ%j#V!M1dhjcQW6(eQ-tC+iD#&M=ouy=z1%==j1*raY<{ABsNMxknw|r)+{A9Z-f7!`be*JVn7;kC@T73+VxTF! zR#X;(bQ-$XvxZqN>)oBmXx9<@)t21xq6PeF)2;6gs~bxS4(k#oBFgO9Ts1WYWGx;xC{-=7PAbV^;?inyxwuj)EtSiw)%eZ6n{RwwwmyGay{_l9 z+b8=KOU0FH^d42e&#m76|A&_UmH%;J0^~#xKmY**5I_I{1Q0*~0R#|0;6DP_GTC`O z_058esb|ZRsmkap8R7n4&;QZX4+Q}P5I_I{1Q0*~0R#|0009I>PavyjwTW>5um0(u zf&c;tAb Date: Wed, 13 Mar 2019 13:59:01 -0700 Subject: [PATCH 27/45] minor update to user update --- data/routes/usersRoutes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index e91319a..f559d59 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -28,7 +28,7 @@ router.get('/info', restricted, async (req, res) => { }); //Update User - response 202 - returns a 1 if updated -router.put('/update', restricted, imageProcess, async (req, res) => { +router.put('/update', restricted, async (req, res) => { const updateInfo = req.body; const result = await userHelper.updateUser(req.decodedToken, updateInfo); res.status(202).json(result); From 6f173f91a01c3c496558d1d31c7b4f0af5ba67d9 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:03:58 -0700 Subject: [PATCH 28/45] Update get user by id to include 404 --- data/helpers/userHelper.js | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 65d82ce..fdd15eb 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -67,11 +67,28 @@ async function getUserInfo(user) { } } -function getUserById(id) { - return db('users') - .where('id', id) - .select('id', 'firstName', 'lastName', 'occupation', 'experience', 'interests', 'userImg') - .first(); +async function getUserById(id) { + try { + const user = db('users') + .where('id', id) + .select( + 'id', + 'firstName', + 'lastName', + 'occupation', + 'experience', + 'interests', + 'userImg' + ) + .first(); + if (user) { + res.status(200).json(user); + } else { + res.status(404).json({ message: 'Unable to find a user by tat ID' }); + } + } catch (error) { + res.status(500); + } } function updateUser(user, updateInfo) { From 142f3ec4f998a991f92e6cabec2dc9c15ff94166 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:16:05 -0700 Subject: [PATCH 29/45] adds needed 'id' for insert --- api/dbConfig.js | 42 +++++++++++++++++++------------------- data/helpers/jobsHelper.js | 17 ++++++++------- data/helpers/userHelper.js | 4 ++-- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/api/dbConfig.js b/api/dbConfig.js index f9501cd..1b9f59f 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -14,30 +14,30 @@ module.exports = knex(config[dbEnv]); // Users -// [GET] https://droom-backend.herokuapp.com/users/ -// [GET] https://droom-backend.herokuapp.com/users/info -// [PUT] https://droom-backend.herokuapp.com/users/update -// [DELETE] https://droom-backend.herokuapp.com/users/delete -// [GET] https://droom-backend.herokuapp.com/users/matched -// [GET] https://droom-backend.herokuapp.com/users/:id -// [POST] https://droom-backend.herokuapp.com/users/:id/save -// [POST] https://droom-backend.herokuapp.com/users/:id/remove +// [x] [GET] https://droom-backend.herokuapp.com/users/ +// [x] [GET] https://droom-backend.herokuapp.com/users/info +// [x] [PUT] https://droom-backend.herokuapp.com/users/update +// [] [DELETE] https://droom-backend.herokuapp.com/users/delete +// [] [GET] https://droom-backend.herokuapp.com/users/matched +// [x] [GET] https://droom-backend.herokuapp.com/users/:id +// [] [POST] https://droom-backend.herokuapp.com/users/:id/save +// [] [POST] https://droom-backend.herokuapp.com/users/:id/remove // Companies -// [GET] https://droom-backend.herokuapp.com/companies/ -// [GET] https://droom-backend.herokuapp.com/companies/info -// [GET] https://droom-backend.herokuapp.com/companies/:id -// [PUT] https://droom-backend.herokuapp.com/companies/update -// [DELETE] https://droom-backend.herokuapp.com/companies/delete +// [x] [GET] https://droom-backend.herokuapp.com/companies/ +// [x] [GET] https://droom-backend.herokuapp.com/companies/info +// [x] [GET] https://droom-backend.herokuapp.com/companies/:id +// [x] [PUT] https://droom-backend.herokuapp.com/companies/update +// [] [DELETE] https://droom-backend.herokuapp.com/companies/delete //Jobs -// [GET] https://droom-backend.herokuapp.com/jobs/ -// [POST] https://droom-backend.herokuapp.com/jobs/ -// [GET] https://droom-backend.herokuapp.com/jobs/info -// [GET] https://droom-backend.herokuapp.com/jobs/:id -// [PUT] https://droom-backend.herokuapp.com/jobs/:id/update -// [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete -// [POST] https://droom-backend.herokuapp.com/jobs/:id/save -// [POST] https://droom-backend.herokuapp.com/jobs/:id/remove +// [x] [GET] https://droom-backend.herokuapp.com/jobs/ +// [] [POST] https://droom-backend.herokuapp.com/jobs/ +// [] [GET] https://droom-backend.herokuapp.com/jobs/info +// [] [GET] https://droom-backend.herokuapp.com/jobs/:id +// [] [PUT] https://droom-backend.herokuapp.com/jobs/:id/update +// [] [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete +// [] [POST] https://droom-backend.herokuapp.com/jobs/:id/save +// [] [POST] https://droom-backend.herokuapp.com/jobs/:id/remove diff --git a/data/helpers/jobsHelper.js b/data/helpers/jobsHelper.js index 1e0df45..074715b 100644 --- a/data/helpers/jobsHelper.js +++ b/data/helpers/jobsHelper.js @@ -14,9 +14,9 @@ module.exports = { async function createJob(jobPost) { try { - const result = await db('jobPosting').insert(jobPost); + const result = await db('jobPosting').insert(jobPost, 'id'); - return 1; + return result; } catch (error) { return error; } @@ -63,11 +63,14 @@ async function saveJob(userId, jobId) { .where('id', jobId) .first(); console.log('job', job); - return db('userJobSaves').insert({ - user_id: userId, - job_id: jobId, - company_id: job.company_id, - }); + return db('userJobSaves').insert( + { + user_id: userId, + job_id: jobId, + company_id: job.company_id, + }, + 'id' + ); } async function removeJob(userId, jobId) { try { diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index fdd15eb..85f40f4 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -87,7 +87,7 @@ async function getUserById(id) { res.status(404).json({ message: 'Unable to find a user by tat ID' }); } } catch (error) { - res.status(500); + res.status(500).send('Internal server error'); } } @@ -112,7 +112,7 @@ async function deleteUser(user) { } function saveUser(companyId, userId) { - return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }); + return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }, 'id'); } function removeUser(companyId, userId) { From 905a11f0fdcda429f4976c3e77e73bdba0e7a2ae Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:19:04 -0700 Subject: [PATCH 30/45] corrects /jobs/info --- api/dbConfig.js | 4 ++-- data/routes/jobsRoutes.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/dbConfig.js b/api/dbConfig.js index 1b9f59f..ce68d4e 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -34,8 +34,8 @@ module.exports = knex(config[dbEnv]); //Jobs // [x] [GET] https://droom-backend.herokuapp.com/jobs/ -// [] [POST] https://droom-backend.herokuapp.com/jobs/ -// [] [GET] https://droom-backend.herokuapp.com/jobs/info +// [x] [POST] https://droom-backend.herokuapp.com/jobs/ +// [x] [GET] https://droom-backend.herokuapp.com/jobs/info // [] [GET] https://droom-backend.herokuapp.com/jobs/:id // [] [PUT] https://droom-backend.herokuapp.com/jobs/:id/update // [] [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 88a196e..f1d9795 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -33,7 +33,7 @@ router.get('/', restricted, async (req, res) => { //Get logged in user router.get('/info', restricted, async (req, res) => { - const result = await userHelper.getUserInfo(req.decodedToken); + const result = await userHelper.getUserInfo(req.decodedToken.subject); res.status(200).json(result); }); From 8f9a71efefffa253c92b535b9d25dbbf22eaef18 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:21:37 -0700 Subject: [PATCH 31/45] updates company delete function --- api/dbConfig.js | 4 ++-- data/helpers/companyHelper.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/dbConfig.js b/api/dbConfig.js index ce68d4e..9299669 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -36,8 +36,8 @@ module.exports = knex(config[dbEnv]); // [x] [GET] https://droom-backend.herokuapp.com/jobs/ // [x] [POST] https://droom-backend.herokuapp.com/jobs/ // [x] [GET] https://droom-backend.herokuapp.com/jobs/info -// [] [GET] https://droom-backend.herokuapp.com/jobs/:id +// [x] [GET] https://droom-backend.herokuapp.com/jobs/:id // [] [PUT] https://droom-backend.herokuapp.com/jobs/:id/update -// [] [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete +// [x] [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete // [] [POST] https://droom-backend.herokuapp.com/jobs/:id/save // [] [POST] https://droom-backend.herokuapp.com/jobs/:id/remove diff --git a/data/helpers/companyHelper.js b/data/helpers/companyHelper.js index e1e30ef..53df971 100644 --- a/data/helpers/companyHelper.js +++ b/data/helpers/companyHelper.js @@ -52,13 +52,13 @@ function updateCompany(user, updateInfo) { async function deleteCompany(id) { try { - await db('companyUserSaves') + const saves = await db('companyUserSaves') .where('company_id', id) .del(); - await db('companies') + const result = await db('companies') .where('id', id) .del(); - return; + return res.send('success'); } catch (error) { return error; } From 8fb7739877c907755cfd3ddacde6d72c36eb4b00 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:28:13 -0700 Subject: [PATCH 32/45] update delete user function --- api/dbConfig.js | 2 +- data/helpers/userHelper.js | 6 +++--- data/routes/usersRoutes.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/api/dbConfig.js b/api/dbConfig.js index 9299669..dac9129 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -29,7 +29,7 @@ module.exports = knex(config[dbEnv]); // [x] [GET] https://droom-backend.herokuapp.com/companies/info // [x] [GET] https://droom-backend.herokuapp.com/companies/:id // [x] [PUT] https://droom-backend.herokuapp.com/companies/update -// [] [DELETE] https://droom-backend.herokuapp.com/companies/delete +// [x] [DELETE] https://droom-backend.herokuapp.com/companies/delete //Jobs diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 85f40f4..83939aa 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -100,12 +100,12 @@ function updateUser(user, updateInfo) { async function deleteUser(user) { try { const result = await db('userJobSaves') - .where('user_id', user.subject) + .where('user_id', user) .del(); const userDelete = await db('users') - .where('email', user.email) + .where('id', user) .del(); - return 1; + return { message: 'Success' }; } catch (error) { return error; } diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index f559d59..c9c2c52 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -39,13 +39,13 @@ router.delete('/delete', restricted, async (req, res) => { try { const user = await userHelper.getUserById(req.decodedToken.subject); if (user) { - const result = await userHelper.deleteUser(req.decodedToken); - res.status(204); + const result = await userHelper.deleteUser(req.decodedToken.subject); + res.status(204).json(result); } else { res.status(404).json({ message: 'Unable to find that user' }); } } catch (error) { - res.status(500).json(error); + res.status(500).json({ message: 'Internal server error' }); } }); From e65fce4ac47b74c0abb67cbeca3acdfddbcc82fb Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:36:38 -0700 Subject: [PATCH 33/45] fixed user delete --- data/db/dev.sqlite3 | Bin 81920 -> 81920 bytes data/routes/usersRoutes.js | 11 +++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index 600b7d1c2fbaaf4721a07e19ee9a1b8cebf60191..98b3ff95e93c4f8ed0394b1ca482a36337bb17c8 100644 GIT binary patch delta 123 zcmZo@U~On%ogmGqI#I@%QFUWNp+2MZ=1cl68<;q|H!BL1aR!GmFsL`OG5|qoacYqR zh|o*U&s8x>R57qn$@SJR%#KWQa!Jk8kEnDlD~U>W4N6V&_cADo%C_(hi}3W#G|mn; Xa!C#J&Q31X%L)j!Ox^tOrF<9w-a020 delta 36 scmZo@U~On%ogmGqI8nx#QE_8Jp+2MJ=1cl68#XHnoaWs8@TGhh0M^M32LJ#7 diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index c9c2c52..0dabff0 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -1,4 +1,7 @@ const express = require('express'); +const knex = require('knex'); +const knexConfig = require('../../knexfile'); +const db = knex(knexConfig.development); const userHelper = require('../helpers/userHelper'); @@ -36,11 +39,15 @@ router.put('/update', restricted, async (req, res) => { // Delete User - response 204 router.delete('/delete', restricted, async (req, res) => { + console.log(req.decodedToken.subject); + const user = await db('users') + .where('id', req.decodedToken.subject) + .first(); + console.log(user); try { - const user = await userHelper.getUserById(req.decodedToken.subject); if (user) { const result = await userHelper.deleteUser(req.decodedToken.subject); - res.status(204).json(result); + res.status(204).json({ message: 'Success' }); } else { res.status(404).json({ message: 'Unable to find that user' }); } From b4f290cf78e1e839b5d967c97af8a6cc4425b754 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 14:42:57 -0700 Subject: [PATCH 34/45] added 404 for find job by id --- api/dbConfig.js | 8 ++++---- data/helpers/jobsHelper.js | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/api/dbConfig.js b/api/dbConfig.js index dac9129..98f4ebb 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -9,15 +9,15 @@ module.exports = knex(config[dbEnv]); // Authentication -// [POST] https://droom-backend.herokuapp.com/auth/register -// [POST] https://droom-backend.herokuapp.com/auth/login +// [x] [POST] https://droom-backend.herokuapp.com/auth/register +// [x] [POST] https://droom-backend.herokuapp.com/auth/login // Users // [x] [GET] https://droom-backend.herokuapp.com/users/ // [x] [GET] https://droom-backend.herokuapp.com/users/info // [x] [PUT] https://droom-backend.herokuapp.com/users/update -// [] [DELETE] https://droom-backend.herokuapp.com/users/delete +// [x] [DELETE] https://droom-backend.herokuapp.com/users/delete // [] [GET] https://droom-backend.herokuapp.com/users/matched // [x] [GET] https://droom-backend.herokuapp.com/users/:id // [] [POST] https://droom-backend.herokuapp.com/users/:id/save @@ -37,7 +37,7 @@ module.exports = knex(config[dbEnv]); // [x] [POST] https://droom-backend.herokuapp.com/jobs/ // [x] [GET] https://droom-backend.herokuapp.com/jobs/info // [x] [GET] https://droom-backend.herokuapp.com/jobs/:id -// [] [PUT] https://droom-backend.herokuapp.com/jobs/:id/update +// [x] [PUT] https://droom-backend.herokuapp.com/jobs/:id/update // [x] [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete // [] [POST] https://droom-backend.herokuapp.com/jobs/:id/save // [] [POST] https://droom-backend.herokuapp.com/jobs/:id/remove diff --git a/data/helpers/jobsHelper.js b/data/helpers/jobsHelper.js index 074715b..34999c8 100644 --- a/data/helpers/jobsHelper.js +++ b/data/helpers/jobsHelper.js @@ -25,10 +25,21 @@ function getAllJobs() { return db('jobPosting'); } -function getJobById(id) { - return db('jobPosting') - .where('id', id) - .first(); +async function getJobById(id) { + try { + const job = await db('jobPosting') + .where('id', id) + .first(); + if (job) { + return job; + } else { + return res.status(404).json({ message: 'Unable to find job with that ID' }); + } + + return job; + } catch (error) { + return error; + } } function updateJob(id, updateInfo) { From 6f313114330eacc3e4b0bd7461066232bb76fa4c Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 15:54:24 -0700 Subject: [PATCH 35/45] Updated the two remove routes to delete --- README.md | 440 +++++++++++++++++++++---------------- api/dbConfig.js | 37 ---- data/routes/jobsRoutes.js | 2 +- data/routes/usersRoutes.js | 2 +- 4 files changed, 252 insertions(+), 229 deletions(-) diff --git a/README.md b/README.md index 8f7316e..ab93bb0 100644 --- a/README.md +++ b/README.md @@ -10,44 +10,52 @@ ### START SERVER -- run 'yarn install` +- run `yarn install` + - run `yarn server` --- ### TLDR +- x marks tested + ``` -Authentication - [POST] https://droom-backend.herokuapp.com/auth/register - [POST] https://droom-backend.herokuapp.com/auth/login - -Users - [GET] https://droom-backend.herokuapp.com/users/ - [GET] https://droom-backend.herokuapp.com/users/info - [PUT] https://droom-backend.herokuapp.com/users/update - [DELETE] https://droom-backend.herokuapp.com/users/delete - [GET] https://droom-backend.herokuapp.com/users/matched - [GET] https://droom-backend.herokuapp.com/users/:id - [POST] https://droom-backend.herokuapp.com/users/:id/save - [POST] https://droom-backend.herokuapp.com/users/:id/remove - -Companies - [GET] https://droom-backend.herokuapp.com/companies/ - [GET] https://droom-backend.herokuapp.com/companies/info - [GET] https://droom-backend.herokuapp.com/companies/:id - [PUT] https://droom-backend.herokuapp.com/companies/update - [DELETE] https://droom-backend.herokuapp.com/companies/delete - -Jobs - [GET] https://droom-backend.herokuapp.com/jobs/ - [POST] https://droom-backend.herokuapp.com/jobs/ - [GET] https://droom-backend.herokuapp.com/jobs/info - [GET] https://droom-backend.herokuapp.com/jobs/:id - [PUT] https://droom-backend.herokuapp.com/jobs/:id/update - [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete - [POST] https://droom-backend.herokuapp.com/jobs/:id/save - [POST] https://droom-backend.herokuapp.com/jobs/:id/remove + Authentication + + [X] [POST] /auth/register + [X] [POST] /auth/login + + Users + + [X] [GET] /users/ + [X] [GET] /users/info + [X] [PUT] /users/update + [X] [DELETE] /users/delete + [ ] [GET] /users/matched + [X] [GET] /users/:id + [ ] [POST] /users/:id/save + [ ] [DELETE] /users/:id/remove + + Companies + + [X] [GET] /companies/ + [X] [GET] /companies/info + [X] [GET] /companies/:id + [X] [PUT] /companies/update + [X] [DELETE] /companies/delete + + Jobs + + [X] [GET] /jobs/ + [X] [POST] /jobs/ + [X] [GET] /jobs/info + [X] [GET] /jobs/:id + [ ] [PUT] /jobs/:id/update + [X] [DELETE] /jobs/:id/delete + [ ] [POST] /jobs/:id/save + [ ] [DELETE] /jobs/:id/remove + ``` User Login @@ -79,15 +87,15 @@ User Login #### Users -[Get All Users](#allusers) | [Get User Info](#getUserInfo) | [Get User by Id](#getUserById) | [Update User](#updateUser) +[Get All Users](#allusers) | [Get User Info](#getUserInfo) | [Get User by Id](#getUserById) | [Update User](#updateUser) | [Delete User](#deleteUser) | [User Matches](#userMatched) | [Save user to Company](#userSave) | [Remove user to Company](#userRemove) #### Companies -[Get All Companies](#allCompanies) | [Get Company Info](#getCompanyInfo) | [Get Company by Id](#getCompanyById) | [Update Company](#updateCompany) +[Get All Companies](#allCompanies) | [Get Company Info](#getCompanyInfo) | [Get Company by Id](#getCompanyById) | [Update Company](#updateCompany) | [Delete Company](#deleteCompany) #### Jobs -[Get All Jobs](#getAllJobs) | [Create Job](#createJob) | [Get Job by Id](#getJobById) | [Update Job](#updateJob) [Delete Job](#deleteJob) +[Get All Jobs](#getAllJobs) | [Create Job](#createJob) | [Get Job by Id](#getJobById) | [Update Job](#updateJob) [Delete Job](#deleteJob) | [Get jobs for signed in Company](#jobsInfo) | [Save job to user profile](#saveToUser) | [Remove job from use profile](#removeFromUser) ## ENDPOINTS @@ -226,28 +234,28 @@ User Login > On success return array -``` + ``` - [ - { - "id": 1, - "firstName": "Orlando", - "lastName": "Nitzsche", - "occupation": "Regional Functionality Strategist", - "experience": "experience", - "interests": "interests" - }, - { - "id": 2, - "firstName": "Delphine", - "lastName": "Shanahan", - "occupation": "Product Factors Orchestrator", - "experience": "experience", - "interests": "interests" - } - ] + [ + { + "id": 1, + "firstName": "Orlando", + "lastName": "Nitzsche", + "occupation": "Regional Functionality Strategist", + "experience": "experience", + "interests": "interests" + }, + { + "id": 2, + "firstName": "Delphine", + "lastName": "Shanahan", + "occupation": "Product Factors Orchestrator", + "experience": "experience", + "interests": "interests" + } + ] -``` + ``` --- @@ -268,38 +276,38 @@ User Login > On success return object -``` - "id": 1, - "firstName": "Laurence", - "lastName": "Bechtelar", - "occupation": "Central Mobility Director", - "experience": "experience", - "interests": "interests", - "saved": [ - { - "job_id": 47, - "jobTitle": "Internal Quality Agent", - "jobPosition": "Architect", - "jobDescription": "Regional", - "jobRequirements": "Brand", - "jobSalary": 903, - "jobTags": "dolore eos quia", - "jobOpenDate": "1552373894247.0", - "jobCloseDate": "1559589532036.0" - }, - { - "job_id": 49, - "jobTitle": "Future Interactions Technician", - "jobPosition": "Analyst", - "jobDescription": "District", - "jobRequirements": "Data", - "jobSalary": 18, - "jobTags": "animi quia omnis", - "jobOpenDate": "1552355593356.0", - "jobCloseDate": "1570538807737.0" - } - ] -``` + ``` + "id": 1, + "firstName": "Laurence", + "lastName": "Bechtelar", + "occupation": "Central Mobility Director", + "experience": "experience", + "interests": "interests", + "saved": [ + { + "job_id": 47, + "jobTitle": "Internal Quality Agent", + "jobPosition": "Architect", + "jobDescription": "Regional", + "jobRequirements": "Brand", + "jobSalary": 903, + "jobTags": "dolore eos quia", + "jobOpenDate": "1552373894247.0", + "jobCloseDate": "1559589532036.0" + }, + { + "job_id": 49, + "jobTitle": "Future Interactions Technician", + "jobPosition": "Analyst", + "jobDescription": "District", + "jobRequirements": "Data", + "jobSalary": 18, + "jobTags": "animi quia omnis", + "jobOpenDate": "1552355593356.0", + "jobCloseDate": "1570538807737.0" + } + ] + ``` --- @@ -320,17 +328,17 @@ User Login > On success return object -``` - { - "id": 2, - "firstName": "Imani", - "lastName": "Heidenreich", - "occupation": "Future Tactics Agent", - "experience": "experience", - "interests": "interests" - } + ``` + { + "id": 2, + "firstName": "Imani", + "lastName": "Heidenreich", + "occupation": "Future Tactics Agent", + "experience": "experience", + "interests": "interests" + } -``` + ``` --- @@ -370,6 +378,11 @@ User Login --- +5. `Delete User` +6. `User Matches` +7. `Save user to Company` +8. `Remove user to Company` + ## Companies 1. `Get All Companies` @@ -389,25 +402,25 @@ User Login > On success return array -``` + ``` - [ - { - "id": 1, - "companyName": "Company", - "email": "user@company.com", - "bio": null, - "address": null - }, - { - "id": 2, - "companyName": "Apple", - "email": "hr@apple.com", - "bio": null, - "address": "1 Infinite Loop" - } - ] -``` + [ + { + "id": 1, + "companyName": "Company", + "email": "user@company.com", + "bio": null, + "address": null + }, + { + "id": 2, + "companyName": "Apple", + "email": "hr@apple.com", + "bio": null, + "address": "1 Infinite Loop" + } + ] + ``` --- @@ -428,15 +441,15 @@ User Login > On success return object -``` - { - "id": 2, - "companyName": "Apple", - "email": "hr@apple.com", - "bio": null, - "address": "1 Infinite Loop" - } -``` + ``` + { + "id": 2, + "companyName": "Apple", + "email": "hr@apple.com", + "bio": null, + "address": "1 Infinite Loop" + } + ``` --- @@ -457,29 +470,29 @@ User Login > On success return object -``` - { - "id": 2, - "companyName": "Apple", - "email": "hr@apple.com", - "bio": null, - "address": "1 Infinite Loop", - "companyJobs": [ - { - "id": 3, - "jobTitle": "title", - "jobPosition": "Position", - "jobDescription": "Description", - "jobRequirements": "Requirements", - "jobSalary": 100000, - "jobTags": ["tech", "janitor"], - "jobOpenDate": "March 11th, 2019", - "jobCloseDate": "June 1st, 2019", - "company_id": 2 - } - ] - } -``` + ``` + { + "id": 2, + "companyName": "Apple", + "email": "hr@apple.com", + "bio": null, + "address": "1 Infinite Loop", + "companyJobs": [ + { + "id": 3, + "jobTitle": "title", + "jobPosition": "Position", + "jobDescription": "Description", + "jobRequirements": "Requirements", + "jobSalary": 100000, + "jobTags": ["tech", "janitor"], + "jobOpenDate": "March 11th, 2019", + "jobCloseDate": "June 1st, 2019", + "company_id": 2 + } + ] + } + ``` --- @@ -525,7 +538,11 @@ User Login --- -#### Jobs +5. `Delete Company` + +--- + +## Jobs 1. `Get All Jobs` @@ -544,35 +561,35 @@ User Login > On success return array -``` + ``` - [ - { - "id": 1, - "jobTitle": "Dynamic Program Administrator", - "jobPosition": "Consultant", - "jobDescription": "Direct", - "jobRequirements": "Web", - "jobSalary": 553, - "jobTags": "tempora", - "jobOpenDate": "1552312445647.0", - "jobCloseDate": "1579476170156.0", - "company_id": 11 - }, - { - "id": 2, - "jobTitle": "International Configuration Developer", - "jobPosition": "Supervisor", - "jobDescription": "Future", - "jobRequirements": "Marketing", - "jobSalary": 206, - "jobTags": "nostrum", - "jobOpenDate": "1552303764015.0", - "jobCloseDate": "1579102031521.0", - "company_id": 4 - } - ] -``` + [ + { + "id": 1, + "jobTitle": "Dynamic Program Administrator", + "jobPosition": "Consultant", + "jobDescription": "Direct", + "jobRequirements": "Web", + "jobSalary": 553, + "jobTags": "tempora", + "jobOpenDate": "1552312445647.0", + "jobCloseDate": "1579476170156.0", + "company_id": 11 + }, + { + "id": 2, + "jobTitle": "International Configuration Developer", + "jobPosition": "Supervisor", + "jobDescription": "Future", + "jobRequirements": "Marketing", + "jobSalary": 206, + "jobTags": "nostrum", + "jobOpenDate": "1552303764015.0", + "jobCloseDate": "1579102031521.0", + "company_id": 4 + } + ] + ``` --- @@ -626,20 +643,20 @@ User Login > On success return object -``` - { - "id": 13, - "jobTitle": "Customer Research Apprentice", - "jobPosition": "Executive", - "jobDescription": "Lead", - "jobRequirements": "Accounts", - "jobSalary": 704, - "jobTags": "voluptas", - "jobOpenDate": "1552282766773.0", - "jobCloseDate": "1579250581673.0", - "company_id": 1 -} -``` + ``` + { + "id": 13, + "jobTitle": "Customer Research Apprentice", + "jobPosition": "Executive", + "jobDescription": "Lead", + "jobRequirements": "Accounts", + "jobSalary": 704, + "jobTags": "voluptas", + "jobOpenDate": "1552282766773.0", + "jobCloseDate": "1579250581673.0", + "company_id": 1 + } + ``` --- @@ -702,10 +719,52 @@ User Login --- - +6. `Get jobs for signed in Company` + +--- + +7. `Save job to user profile` + +--- + +8. `Remove job from use profile` + +_Method URL: /_ + +_HTTP method: [GET]_ + +### Headers + +| name | type | required | description | +| ------------- | ------ | -------- | ------------------------------------ | +| Content-type | String | Yes | Must be application/json | +| Authorization | String | Yes | Token must be from a company account | + +### Body + +| name | type | required | description | +| ---- | ------ | -------- | ----------- | +| item | String | No | | + +#### Example + +``` + { + jobSalary: 50000, + } +``` + +### Response + +> On success return `1` + + +-- ## Axios Examples + + 1. `Axios Post Request` ``` @@ -725,3 +784,4 @@ User Login ``` --- + diff --git a/api/dbConfig.js b/api/dbConfig.js index 98f4ebb..af8339f 100644 --- a/api/dbConfig.js +++ b/api/dbConfig.js @@ -4,40 +4,3 @@ const config = require('../knexfile'); const dbEnv = process.env.DB_ENV || 'development'; module.exports = knex(config[dbEnv]); - -// https://droom-backend.herokuapp.com/ - -// Authentication - -// [x] [POST] https://droom-backend.herokuapp.com/auth/register -// [x] [POST] https://droom-backend.herokuapp.com/auth/login - -// Users - -// [x] [GET] https://droom-backend.herokuapp.com/users/ -// [x] [GET] https://droom-backend.herokuapp.com/users/info -// [x] [PUT] https://droom-backend.herokuapp.com/users/update -// [x] [DELETE] https://droom-backend.herokuapp.com/users/delete -// [] [GET] https://droom-backend.herokuapp.com/users/matched -// [x] [GET] https://droom-backend.herokuapp.com/users/:id -// [] [POST] https://droom-backend.herokuapp.com/users/:id/save -// [] [POST] https://droom-backend.herokuapp.com/users/:id/remove - -// Companies - -// [x] [GET] https://droom-backend.herokuapp.com/companies/ -// [x] [GET] https://droom-backend.herokuapp.com/companies/info -// [x] [GET] https://droom-backend.herokuapp.com/companies/:id -// [x] [PUT] https://droom-backend.herokuapp.com/companies/update -// [x] [DELETE] https://droom-backend.herokuapp.com/companies/delete - -//Jobs - -// [x] [GET] https://droom-backend.herokuapp.com/jobs/ -// [x] [POST] https://droom-backend.herokuapp.com/jobs/ -// [x] [GET] https://droom-backend.herokuapp.com/jobs/info -// [x] [GET] https://droom-backend.herokuapp.com/jobs/:id -// [x] [PUT] https://droom-backend.herokuapp.com/jobs/:id/update -// [x] [DELETE] https://droom-backend.herokuapp.com/jobs/:id/delete -// [] [POST] https://droom-backend.herokuapp.com/jobs/:id/save -// [] [POST] https://droom-backend.herokuapp.com/jobs/:id/remove diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index f1d9795..90683f1 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -68,7 +68,7 @@ router.post('/:id/save', restricted, async (req, res) => { }); // Remove job from a profile -router.post('/:id/remove', restricted, async (req, res) => { +router.delete('/:id/remove', restricted, async (req, res) => { const { id } = req.params; const result = await jobsHelper.removeJob(req.decodedToken.subject, id); res.status(201).json(result); diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 0dabff0..7a13305 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -85,7 +85,7 @@ router.post('/:id/save', restricted, async (req, res) => { }); // Remove saved job from profile - response 204 -router.post('/:id/remove', restricted, async (req, res) => { +router.DELETE('/:id/remove', restricted, async (req, res) => { try { const { id } = req.params; const result = await userHelper.removeUser(req.decodedToken.subject, id); From dcf05a703b279332d2ee1e3b8003ad57b6368c51 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Wed, 13 Mar 2019 15:57:45 -0700 Subject: [PATCH 36/45] typo --- data/routes/usersRoutes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 7a13305..57cd37b 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -85,7 +85,7 @@ router.post('/:id/save', restricted, async (req, res) => { }); // Remove saved job from profile - response 204 -router.DELETE('/:id/remove', restricted, async (req, res) => { +router.delete('/:id/remove', restricted, async (req, res) => { try { const { id } = req.params; const result = await userHelper.removeUser(req.decodedToken.subject, id); From 88d8aca6520b94dc7f5e3a029d3b5b0388911a92 Mon Sep 17 00:00:00 2001 From: Carlos Lantigua Date: Thu, 14 Mar 2019 09:15:38 -0400 Subject: [PATCH 37/45] changed helper for get user by id route to not use res and instead return the user --- data/helpers/userHelper.js | 216 +++++++++++++++++++------------------ data/routes/authRoutes.js | 177 +++++++++++++++--------------- 2 files changed, 197 insertions(+), 196 deletions(-) diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 83939aa..97fdb28 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -3,137 +3,139 @@ const knexConfig = require('../../knexfile'); const db = knex(knexConfig.development); module.exports = { - getAllUsers, - getSaves, - getUserInfo, - getUserById, - updateUser, - saveUser, - removeUser, - deleteUser, - match, + getAllUsers, + getSaves, + getUserInfo, + getUserById, + updateUser, + saveUser, + removeUser, + deleteUser, + match, }; function getAllUsers() { - return db('users').select( - 'id', - 'firstName', - 'lastName', - 'occupation', - 'experience', - 'interests', - 'userImg' - ); + return db('users').select( + 'id', + 'firstName', + 'lastName', + 'occupation', + 'experience', + 'interests', + 'userImg' + ); } function getSaves(id) { - return db('userJobSaves').where('user_id', id); + return db('userJobSaves').where('user_id', id); } async function getUserInfo(user) { - try { - const likes = await db('userJobSaves') - .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') - .where('user_id', user.subject) - .select( - 'job_id', - 'jobTitle', - 'jobPosition', - 'jobDescription', - 'jobRequirements', - 'jobSalary', - 'jobTags', - 'jobOpenDate', - 'jobCloseDate', - 'jobImg' - ); - const userInfo = await db('users') - .where('id', user.subject) - .select( - 'id', - 'firstName', - 'lastName', - 'email', - 'occupation', - 'experience', - 'interests', - 'userImg' - ) - .first(); - Object.assign(userInfo, { saved: likes }); - return userInfo; - } catch (error) { - return error; - } + try { + const likes = await db('userJobSaves') + .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') + .where('user_id', user.subject) + .select( + 'job_id', + 'jobTitle', + 'jobPosition', + 'jobDescription', + 'jobRequirements', + 'jobSalary', + 'jobTags', + 'jobOpenDate', + 'jobCloseDate', + 'jobImg' + ); + const userInfo = await db('users') + .where('id', user.subject) + .select( + 'id', + 'firstName', + 'lastName', + 'email', + 'occupation', + 'experience', + 'interests', + 'userImg' + ) + .first(); + Object.assign(userInfo, { saved: likes }); + return userInfo; + } catch (error) { + return error; + } } async function getUserById(id) { - try { - const user = db('users') - .where('id', id) - .select( - 'id', - 'firstName', - 'lastName', - 'occupation', - 'experience', - 'interests', - 'userImg' - ) - .first(); - if (user) { - res.status(200).json(user); - } else { - res.status(404).json({ message: 'Unable to find a user by tat ID' }); - } - } catch (error) { - res.status(500).send('Internal server error'); - } + try { + const user = await db('users') + .where('id', id) + .select( + 'id', + 'firstName', + 'lastName', + 'occupation', + 'experience', + 'interests', + 'userImg' + ) + .first(); + // if (user) { + // res.status(200).json(user); + // } else { + // res.status(404).json({ message: 'Unable to find a user by that ID' }); + // } + return user; + } catch (error) { + // res.status(500).send('Internal server error'); + return error; + } } function updateUser(user, updateInfo) { - return db('users') - .where('email', user.email) - .update(updateInfo); + return db('users') + .where('email', user.email) + .update(updateInfo); } async function deleteUser(user) { - try { - const result = await db('userJobSaves') - .where('user_id', user) - .del(); - const userDelete = await db('users') - .where('id', user) - .del(); - return { message: 'Success' }; - } catch (error) { - return error; - } + try { + const result = await db('userJobSaves') + .where('user_id', user) + .del(); + const userDelete = await db('users') + .where('id', user) + .del(); + return { message: 'Success' }; + } catch (error) { + return error; + } } function saveUser(companyId, userId) { - return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }, 'id'); + return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }, 'id'); } function removeUser(companyId, userId) { - return db('companyUserSaves') - .where({ company_id: companyId, user_id: userId }) - .del(); + return db('companyUserSaves') + .where({ company_id: companyId, user_id: userId }) + .del(); } async function match(id) { - try { - const userMatches = await db('userJobSaves') - .join('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') - .where('userJobSaves.user_id', id) - .where('companyUserSaves.user_id', id) - .select( - 'userJobSaves.user_id as UserId', - 'userJobSaves.company_id as companyId', - 'userJobSaves.job_id as jobId' - ); - return userMatches; - } catch (error) { - return error; - } -} + try { + const userMatches = await db('userJobSaves') + .join('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') + .where('userJobSaves.user_id', id) + .where('companyUserSaves.user_id', id) + .select( + 'userJobSaves.user_id as UserId', + 'userJobSaves.company_id as companyId', + 'userJobSaves.job_id as jobId' + ); + return userMatches; + } catch (error) { + return error; + } +} \ No newline at end of file diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 98a2390..8bc00b5 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -8,98 +8,97 @@ const { generateToken } = require('../helpers/helpers'); const { emailCheck } = require('../middleware/middleware'); const router = express.Router(); -router.post('/register', emailCheck, async (req, res) => { - // eamil, password, type = required - // firstName, lastname, occupation, expereience, interests, userImg = optional for user - // name, bio, address, companyImg - let user = req.body; - const hash = bcrypt.hashSync(user.password, 8); - user.password = hash; - if (user.type === 'user') { - if (user.email && user.password) { - try { - const newUser = { - email: user.email, - password: user.password, - }; - const result = await db('users').insert(newUser, 'id'); - res.status(201).json({ message: 'Successfully created user account', result }); - } catch (error) { - res.status(500).json({ message: 'Error processing the request' }); - } - } else { - res.status(404).json({ - message: 'Make sure email & password are included', - }); - } - } else if (user.type === 'company') { - if (user.email && user.password) { - try { - const newCompany = { - companyName: user.companyName, - email: user.email, - password: user.password, - }; - const result = await db('companies').insert(newCompany, 'id'); - res.status(201).json({ message: 'Successfully created company', result }); - } catch { - res.status(500).json({ message: 'Error processing the request' }); - } - } else { - res.status(404).json({ - message: 'Make sure email & password are included', - }); - } - } else { - res.status(500); - } +router.post('/register', emailCheck, async(req, res) => { + // eamil, password, type = required + // firstName, lastname, occupation, expereience, interests, userImg = optional for user + // name, bio, address, companyImg + let user = req.body; + const hash = bcrypt.hashSync(user.password, 8); + user.password = hash; + if (user.type === 'user') { + if (user.email && user.password) { + try { + const newUser = { + email: user.email, + password: user.password, + }; + const result = await db('users').insert(newUser, 'id'); + res.status(201).json({ message: 'Successfully created user account', result }); + } catch (error) { + res.status(500).json({ message: 'Error processing the request' }); + } + } else { + res.status(404).json({ + message: 'Make sure email & password are included', + }); + } + } else if (user.type === 'company') { + if (user.email && user.password) { + try { + const newCompany = { + companyName: user.companyName, + email: user.email, + password: user.password, + }; + const result = await db('companies').insert(newCompany, 'id'); + res.status(201).json({ message: 'Successfully created company', result }); + } catch { + res.status(500).json({ message: 'Error processing the request' }); + } + } else { + res.status(404).json({ + message: 'Make sure email & password are included', + }); + } + } else { + res.status(500); + } }); -router.post('/login', async (req, res) => { - let { email, password } = req.body; +router.post('/login', async(req, res) => { + let { email, password } = req.body; + const user = await db('users') + .where('email', email) + .first(); + const company = await db('companies') + .where('email', email) + .first(); + if (user && bcrypt.compareSync(password, user.password)) { + try { + const token = await generateToken(user); + const userInfo = { + id: user.id, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + occupation: user.occupation, + experience: user.experience, + interests: user.interests, + userImg: user.userImg, + }; - const user = await db('users') - .where('email', email) - .first(); - const company = await db('companies') - .where('email', email) - .first(); - if (user && bcrypt.compareSync(password, user.password)) { - try { - const token = generateToken(user); - const userInfo = { - id: user.id, - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - occupation: user.occupation, - experience: user.experience, - interests: user.interests, - userImg: user.userImg, - }; + res.status(200).json({ token, userInfo }); + } catch { + res.status(404).json({ message: 'unable to find that user' }); + } + } else if (company && bcrypt.compareSync(password, company.password)) { + try { + const token = generateToken(company); + const companyInfo = { + id: company.id, + companyName: company.companyName, + bio: company.bio, + address: company.address, + companyImg: company.companyImg, + }; - res.status(200).json({ token, userInfo }); - } catch { - res.status(404).json({ message: 'unable to find that user' }); - } - } else if (company && bcrypt.compareSync(password, company.password)) { - try { - const token = generateToken(company); - const companyInfo = { - id: company.id, - companyName: company.companyName, - bio: company.bio, - address: company.address, - companyImg: company.companyImg, - }; - - res.status(200).json({ token, companyInfo }); - } catch { - res.status(404).json({ message: 'unable to find that company' }); - } - } else { - res.status(500).json({ message: 'login server issue' }); - } + res.status(200).json({ token, companyInfo }); + } catch { + res.status(404).json({ message: 'unable to find that company' }); + } + } else { + res.status(500).json({ message: 'login server issue' }); + } }); -module.exports = router; +module.exports = router; \ No newline at end of file From 8fa2043ed821c447092a4b0e8c787917aa22d369 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Thu, 14 Mar 2019 08:44:31 -0700 Subject: [PATCH 38/45] added 3 tests to server.js added try/catch where it was missing --- api/server.js | 2 +- api/server.test.js | 35 + data/db/dev.sqlite3 | Bin 81920 -> 81920 bytes data/db/test.db3 | Bin 36864 -> 73728 bytes data/helpers/userHelper.test.js | 19 + data/routes/authRoutes.js | 176 +-- data/routes/companyRoutes.js | 14 +- data/routes/jobsRoutes.js | 64 +- data/routes/usersRoutes.js | 18 +- package.json | 7 +- yarn.lock | 2121 ++++++++++++++++++++++++++++++- 11 files changed, 2292 insertions(+), 164 deletions(-) create mode 100644 api/server.test.js create mode 100644 data/helpers/userHelper.test.js diff --git a/api/server.js b/api/server.js index eef54fd..4da1be5 100644 --- a/api/server.js +++ b/api/server.js @@ -23,7 +23,7 @@ server.use('/companies', companyRoute); server.use('/jobs', jobRoute); server.get('/', (req, res) => { - res.send('Sanity Check PG'); + res.status(200).json('Sanity Check'); }); server.use(function(req, res) { diff --git a/api/server.test.js b/api/server.test.js new file mode 100644 index 0000000..8ce75ec --- /dev/null +++ b/api/server.test.js @@ -0,0 +1,35 @@ +const request = require('supertest'); +require('dotenv').config(); +const server = require('./server'); +// const express = require('express'); +// const knex = require('knex'); +// const knexConfig = require('../knexfile'); +// const db = knex(knexConfig.testing); + +// const server = express(); + +afterEach(async () => { + // await db('users').truncate(); +}); + +describe('server.js', () => { + test('should set testing enviornment', () => { + expect(process.env.DB_ENV).toBe('testing'); + }); +}); + +describe('GET', () => { + test('should return status 200', async () => { + const res = await request(server).get('/'); + expect(res.status).toBe(200); + }); + + test('should return JSON', async () => { + const res = await request(server).get('/'); + expect(res.type).toBe('application/json'); + }); + test('should return { "Sanity Check" }', async () => { + const res = await request(server).get('/'); + expect(res.body).toBe('Sanity Check'); + }); +}); diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index 98b3ff95e93c4f8ed0394b1ca482a36337bb17c8..edb1c759e105c2e6c91321356af662790f3c5312 100644 GIT binary patch delta 105 zcmZo@U~On%ogmF?#lXNI0>o@U%ra5KoY87y!a{j*{^Ja6{0$8J&-pL$@8ECXU%@{O y2#;?TGzj6JoTDGj0#weu`Lw>N06Q;`$soY6nB75uml?o@U%rsHMoKbaS!a{j*Adj8Dfr0-y|0Vt%{0;mo_>c2X y<3GMx&>)0=a*lp93#S{i_~z64rULA&K(&ngzZbJR2=Foj*&x%vc(X{roA&_1{})*R diff --git a/data/db/test.db3 b/data/db/test.db3 index f939e16b1697c748886a4935e34fc0201eec5b88..d412b5b5902635d7d3963956df4d7f8568a3449e 100644 GIT binary patch literal 73728 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 delta 246 zcmZoTz|ydQX@ayM3j+fKClJE``$QdMSr!I8od8~-5C_*827X7r_k3QwYCMOzk8;~{ zo!P7?5WqG04A)PV#%eb9%_q5I8M&GiS=hzJ#Ti=^CvoUbwr1C!+|O}vvnStfMh+(a zEe!m3__u5pG+4nud5e4iP~;K=|8xFJK#^noQo>Bk+KkzGsTJ|LndwD|C7Jno#Z2Oi j%%+@^C-8|ZG7w+`IfOv~sQMNE#03IuT&P_9vZ#syEkis; diff --git a/data/helpers/userHelper.test.js b/data/helpers/userHelper.test.js new file mode 100644 index 0000000..f20bd2f --- /dev/null +++ b/data/helpers/userHelper.test.js @@ -0,0 +1,19 @@ +const request = require('supertest'); +require('dotenv').config(); +const express = require('express'); +const knex = require('knex'); +const knexConfig = require('../../knexfile'); +const db = knex(knexConfig.testing); + +const userHelper = require('./userHelper'); + +describe.skip('Get All Users', () => { + test('should return an object', async () => { + const res = await userHelper.getAllUsers(); + expect(res.type).toEqual('application/json'); + }); + test('should return status 200', async () => { + const res = await userHelper.getAllUsers(); + expect(res.status).toBe(200); + }); +}); diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 8bc00b5..0d81dbc 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -8,97 +8,97 @@ const { generateToken } = require('../helpers/helpers'); const { emailCheck } = require('../middleware/middleware'); const router = express.Router(); -router.post('/register', emailCheck, async(req, res) => { - // eamil, password, type = required - // firstName, lastname, occupation, expereience, interests, userImg = optional for user - // name, bio, address, companyImg - let user = req.body; - const hash = bcrypt.hashSync(user.password, 8); - user.password = hash; - if (user.type === 'user') { - if (user.email && user.password) { - try { - const newUser = { - email: user.email, - password: user.password, - }; - const result = await db('users').insert(newUser, 'id'); - res.status(201).json({ message: 'Successfully created user account', result }); - } catch (error) { - res.status(500).json({ message: 'Error processing the request' }); - } - } else { - res.status(404).json({ - message: 'Make sure email & password are included', - }); - } - } else if (user.type === 'company') { - if (user.email && user.password) { - try { - const newCompany = { - companyName: user.companyName, - email: user.email, - password: user.password, - }; - const result = await db('companies').insert(newCompany, 'id'); - res.status(201).json({ message: 'Successfully created company', result }); - } catch { - res.status(500).json({ message: 'Error processing the request' }); - } - } else { - res.status(404).json({ - message: 'Make sure email & password are included', - }); - } - } else { - res.status(500); - } +router.post('/register', emailCheck, async (req, res) => { + // eamil, password, type = required + // firstName, lastname, occupation, expereience, interests, userImg = optional for user + // name, bio, address, companyImg + let user = req.body; + const hash = bcrypt.hashSync(user.password, 8); + user.password = hash; + if (user.type === 'user') { + if (user.email && user.password) { + try { + const newUser = { + email: user.email, + password: user.password, + }; + const result = await db('users').insert(newUser, 'id'); + res.status(201).json({ message: 'Successfully created user account', result }); + } catch (error) { + res.status(500).json({ message: 'Error processing the request' }); + } + } else { + res.status(404).json({ + message: 'Make sure email & password are included', + }); + } + } else if (user.type === 'company') { + if (user.email && user.password) { + try { + const newCompany = { + // companyName: user.companyName, + email: user.email, + password: user.password, + }; + const result = await db('companies').insert(newCompany, 'id'); + res.status(201).json({ message: 'Successfully created company', result }); + } catch (error) { + res.status(500).json({ message: 'Error processing the request' }); + } + } else { + res.status(404).json({ + message: 'Make sure email & password are included', + }); + } + } else { + res.status(500); + } }); -router.post('/login', async(req, res) => { - let { email, password } = req.body; - const user = await db('users') - .where('email', email) - .first(); - const company = await db('companies') - .where('email', email) - .first(); - if (user && bcrypt.compareSync(password, user.password)) { - try { - const token = await generateToken(user); - const userInfo = { - id: user.id, - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - occupation: user.occupation, - experience: user.experience, - interests: user.interests, - userImg: user.userImg, - }; +router.post('/login', async (req, res) => { + let { email, password } = req.body; + const user = await db('users') + .where('email', email) + .first(); + const company = await db('companies') + .where('email', email) + .first(); + if (user && bcrypt.compareSync(password, user.password)) { + try { + const token = await generateToken(user); + const userInfo = { + id: user.id, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + occupation: user.occupation, + experience: user.experience, + interests: user.interests, + userImg: user.userImg, + }; - res.status(200).json({ token, userInfo }); - } catch { - res.status(404).json({ message: 'unable to find that user' }); - } - } else if (company && bcrypt.compareSync(password, company.password)) { - try { - const token = generateToken(company); - const companyInfo = { - id: company.id, - companyName: company.companyName, - bio: company.bio, - address: company.address, - companyImg: company.companyImg, - }; + res.status(200).json({ token, userInfo }); + } catch (error) { + res.status(404).json({ message: 'unable to find that user' }); + } + } else if (company && bcrypt.compareSync(password, company.password)) { + try { + const token = generateToken(company); + const companyInfo = { + id: company.id, + companyName: company.companyName, + bio: company.bio, + address: company.address, + companyImg: company.companyImg, + }; - res.status(200).json({ token, companyInfo }); - } catch { - res.status(404).json({ message: 'unable to find that company' }); - } - } else { - res.status(500).json({ message: 'login server issue' }); - } + res.status(200).json({ token, companyInfo }); + } catch (error) { + res.status(404).json({ message: 'unable to find that company' }); + } + } else { + res.status(500).json({ message: 'login server issue' }); + } }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/data/routes/companyRoutes.js b/data/routes/companyRoutes.js index aa47571..5264c84 100644 --- a/data/routes/companyRoutes.js +++ b/data/routes/companyRoutes.js @@ -10,7 +10,7 @@ router.get('/', restricted, async (req, res) => { try { const result = await companyHelper.getAllCompanies(); res.status(200).json(result); - } catch { + } catch (error) { res.status(500).json({ message: 'Internal server error' }); } }); @@ -23,10 +23,14 @@ router.get('/info', restricted, async (req, res) => { //Update Company router.put('/update', restricted, async (req, res) => { - console.log(req.decodedToken); - const updateInfo = req.body; - const result = await companyHelper.updateCompany(req.decodedToken, updateInfo); - res.status(200).json(result); // returns a 1 if updated + try { + console.log(req.decodedToken); + const updateInfo = req.body; + const result = await companyHelper.updateCompany(req.decodedToken, updateInfo); + res.status(200).json(result); // returns a 1 if updated + } catch (error) { + res.status(500).json(error); + } }); //Delete Company diff --git a/data/routes/jobsRoutes.js b/data/routes/jobsRoutes.js index 90683f1..1a1b0fe 100644 --- a/data/routes/jobsRoutes.js +++ b/data/routes/jobsRoutes.js @@ -26,52 +26,76 @@ router.get('/', restricted, async (req, res) => { try { const result = await jobsHelper.getAllJobs(); res.status(200).json(result); - } catch { + } catch (error) { res.status(500).json({ message: 'Internal server error' }); } }); //Get logged in user router.get('/info', restricted, async (req, res) => { - const result = await userHelper.getUserInfo(req.decodedToken.subject); - res.status(200).json(result); + try { + const result = await userHelper.getUserInfo(req.decodedToken.subject); + res.status(200).json(result); + } catch (error) { + res.status(500).json(error); + } }); // Update Job router.put('/:id/update', restricted, async (req, res) => { - const updateInfo = req.body; - const { id } = req.params; - const result = await jobsHelper.updateJob(id, updateInfo); - res.status(200).json(result); // returns a 1 if updated + try { + const updateInfo = req.body; + const { id } = req.params; + const result = await jobsHelper.updateJob(id, updateInfo); + res.status(200).json(result); // returns a 1 if updated + } catch (error) { + res.status(500).json(error); + } }); // Delete Job router.delete('/:id/delete', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.deleteJob(id); - console.log(result); - res.status(204).json(result); + try { + const { id } = req.params; + const result = await jobsHelper.deleteJob(id); + console.log(result); + res.status(204).json(result); + } catch (error) { + res.status(500).json(error); + } }); // Get Job by ID router.get('/:id', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.getJobById(id); - res.status(200).json(result); + try { + const { id } = req.params; + const result = await jobsHelper.getJobById(id); + res.status(200).json(result); + } catch (error) { + res.status(500).json(error); + } }); // Save job to a user profile router.post('/:id/save', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.saveJob(req.decodedToken.subject, id); - res.status(201).json(result); + try { + const { id } = req.params; + const result = await jobsHelper.saveJob(req.decodedToken.subject, id); + res.status(201).json(result); + } catch (error) { + res.status(500).json(error); + } }); // Remove job from a profile router.delete('/:id/remove', restricted, async (req, res) => { - const { id } = req.params; - const result = await jobsHelper.removeJob(req.decodedToken.subject, id); - res.status(201).json(result); + try { + const { id } = req.params; + const result = await jobsHelper.removeJob(req.decodedToken.subject, id); + res.status(201).json(result); + } catch (error) { + res.status(500).json(error); + } }); module.exports = router; diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index 57cd37b..b27c5e3 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -13,7 +13,7 @@ router.get('/', restricted, async (req, res) => { try { const result = await userHelper.getAllUsers(); res.status(200).json(result); - } catch { + } catch (error) { res.status(500).json({ message: 'Internal server error' }); } }); @@ -25,16 +25,22 @@ router.get('/info', restricted, async (req, res) => { // const saves = await userHelper.getSaves(result.id); res.status(200).json(result); - } catch (err) { + } catch (error) { res.status(500).json('server error'); } }); //Update User - response 202 - returns a 1 if updated router.put('/update', restricted, async (req, res) => { - const updateInfo = req.body; - const result = await userHelper.updateUser(req.decodedToken, updateInfo); - res.status(202).json(result); + try { + { + } + const updateInfo = req.body; + const result = await userHelper.updateUser(req.decodedToken, updateInfo); + res.status(202).json(result); + } catch (error) { + res.status(500).json(error); + } }); // Delete User - response 204 @@ -61,7 +67,7 @@ router.get('/matched', restricted, async (req, res) => { try { const result = await userHelper.match(req.decodedToken.subject); res.status(200).json(result); - } catch { + } catch (error) { res.status(500).json({ message: 'Internal server error' }); } }); diff --git a/package.json b/package.json index 96d353b..d21a6e3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "server": "nodemon index.js", - "start": "node index.js" + "start": "node index.js", + "test": "jest --watch --verbose" }, "repository": { "type": "git", @@ -34,6 +35,8 @@ "sqlite3": "^4.0.6" }, "devDependencies": { - "nodemon": "^1.18.10" + "nodemon": "^1.18.10", + "jest": "^23.6.0", + "supertest": "^3.3.0" } } diff --git a/yarn.lock b/yarn.lock index ad92e67..6ac3217 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,22 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/polyfill@^7.0.0": version "7.2.5" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" @@ -15,6 +31,11 @@ resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.26.tgz#a38c438ae84fa02431d6892edf86e46edcbca291" integrity sha512-aj2mrBLn5ky0GmAg6IPXrQjnN0iB/ulozuJ+oZdrHRAzRbXjGmu4UXsNCjFvPbSaaPZmniocdOzsM392qLOlmQ== +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -28,6 +49,29 @@ accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + ajv@^6.5.5: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" @@ -45,6 +89,11 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -55,7 +104,12 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^3.2.1: +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -70,6 +124,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= + dependencies: + default-require-extensions "^1.0.0" + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -83,12 +144,26 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.1.0: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -103,6 +178,11 @@ array-each@^1.0.1: resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -113,11 +193,21 @@ array-slice@^1.0.0: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -135,11 +225,28 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@^2.1.4, async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -168,6 +275,167 @@ axios@^0.18.0: follow-redirects "^1.3.0" is-buffer "^1.1.5" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" + integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= + +babel-plugin-syntax-object-rest-spread@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" + integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -260,6 +528,15 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -276,11 +553,35 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + dependencies: + node-int64 "^0.4.0" + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + buffer-writer@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" @@ -306,7 +607,12 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -camelcase@^4.0.0: +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= @@ -316,6 +622,13 @@ camelize@1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" + capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" @@ -335,7 +648,18 @@ chalk@2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^2.0.1: +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -388,6 +712,15 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + cloudinary@^1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/cloudinary/-/cloudinary-1.13.2.tgz#af3c3f5091119d743d85c27be9405cf15e9012db" @@ -396,6 +729,11 @@ cloudinary@^1.13.2: lodash "^4.17.11" q "^1.5.1" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -433,7 +771,12 @@ commander@^2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -component-emitter@^1.2.1: +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +component-emitter@^1.2.0, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= @@ -475,6 +818,13 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +convert-source-map@^1.4.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -485,12 +835,17 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookiejar@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.5.7: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: version "2.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== @@ -529,6 +884,18 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" + integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A== + dependencies: + cssom "0.3.x" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -541,7 +908,16 @@ dasherize@2.0.0: resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" integrity sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg= -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -562,6 +938,11 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -572,6 +953,25 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -624,16 +1024,40 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + dns-prefetch-control@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" integrity sha1-YN20V3dOF48flBXwyrsOhbCzALI= +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + dont-sniff-mimetype@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" @@ -681,21 +1105,88 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== + dependencies: + merge "^1.2.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -709,6 +1200,18 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -722,6 +1225,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -734,6 +1244,18 @@ expect-ct@0.1.1: resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.1.tgz#de84476a2dbcb85000d5903737e9bc8a5ba7b897" integrity sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg== +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== + dependencies: + ansi-styles "^3.2.0" + jest-diff "^23.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" @@ -790,6 +1312,13 @@ extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -829,11 +1358,47 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + feature-policy@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/feature-policy/-/feature-policy-0.2.0.tgz#22096de49ab240176878ffe2bde2f6ff04d48c43" integrity sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw== +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -857,6 +1422,21 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -895,6 +1475,13 @@ for-in@^1.0.1, for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" @@ -907,7 +1494,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.3.2: +form-data@^2.3.1, form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== @@ -916,6 +1503,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +formidable@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" + integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -950,7 +1542,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: +fsevents@^1.2.3, fsevents@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== @@ -958,6 +1550,11 @@ fsevents@^1.2.7: nan "^2.9.2" node-pre-gyp "^0.10.0" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -972,6 +1569,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -989,6 +1591,21 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -997,7 +1614,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.1.3: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1036,6 +1653,11 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -1058,6 +1680,22 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -1071,11 +1709,28 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -1112,6 +1767,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + helmet-crossdomain@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz#707e2df930f13ad61f76ed08e1bb51ab2b2e85fa" @@ -1153,6 +1815,14 @@ hide-powered-by@1.0.0: resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" integrity sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys= +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -1160,6 +1830,11 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + hpkp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" @@ -1172,6 +1847,13 @@ hsts@2.2.0: dependencies: depd "2.0.0" +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -1198,7 +1880,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -1227,6 +1909,14 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -1255,6 +1945,18 @@ interpret@^1.1.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1282,6 +1984,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -1294,6 +2001,11 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + is-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" @@ -1315,6 +2027,11 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -1333,6 +2050,18 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -1345,11 +2074,23 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -1362,6 +2103,18 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -1389,6 +2142,13 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -1396,6 +2156,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -1415,11 +2180,28 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + is-relative@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" @@ -1437,6 +2219,13 @@ is-stream@^1.0.0, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1449,11 +2238,21 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1481,13 +2280,455 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +istanbul-api@^1.3.1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" + integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" -json-schema-traverse@^0.4.1: - version "0.4.1" +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== + dependencies: + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" + integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== + dependencies: + throat "^4.0.0" + +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" + jest-get-type "^22.1.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" + micromatch "^2.3.11" + node-notifier "^5.2.1" + prompts "^0.1.9" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^11.0.0" + +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== + dependencies: + babel-core "^6.0.0" + babel-jest "^23.6.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" + integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c= + dependencies: + detect-newline "^2.1.0" + +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== + dependencies: + chalk "^2.0.1" + pretty-format "^23.6.0" + +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + +jest-get-type@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== + +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + invariant "^2.2.4" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== + dependencies: + babel-traverse "^6.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^23.6.0" + is-generator-fn "^1.0.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= + +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= + +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== + dependencies: + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" + +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== + dependencies: + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-docblock "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" + jest-worker "^23.2.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^4.1.6" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^11.0.0" + +jest-serializer@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" + integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= + +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== + dependencies: + babel-types "^6.0.0" + chalk "^2.0.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.6.0" + semver "^5.5.0" + +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" + +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw= + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" + +jest-worker@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" + integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk= + dependencies: + merge-stream "^1.0.1" + +jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== + dependencies: + import-local "^1.0.0" + jest-cli "^23.6.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.7.0: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +json-schema-traverse@^0.4.1: + version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== @@ -1501,6 +2742,11 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + jsonwebtoken@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#ebd0ca2a69797816e1c5af65b6c759787252947e" @@ -1568,6 +2814,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +kleur@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" + integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== + knex@^0.16.3: version "0.16.3" resolved "https://registry.yarnpkg.com/knex/-/knex-0.16.3.tgz#ca9effd4973655f42b42132b9019b0bc6bd20644" @@ -1598,6 +2849,31 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + liftoff@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" @@ -1612,6 +2888,25 @@ liftoff@2.5.0: rechoir "^0.6.2" resolve "^1.1.7" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -1647,11 +2942,23 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash@^4.17.11: +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.17.11, lodash@^4.17.4: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -1679,6 +2986,13 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -1691,21 +3005,64 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -methods@~1.1.2: +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -1742,7 +3099,17 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -minimatch@^3.0.4: +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -1754,11 +3121,16 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -1837,6 +3209,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" @@ -1856,6 +3233,22 @@ nocache@2.0.0: resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" integrity sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA= +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + node-pre-gyp@0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" @@ -1935,7 +3328,17 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-path@^2.1.1: +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -1982,6 +3385,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.1.tgz#08d6d75e69fd791bdea31507ffafe8c843b67e9c" + integrity sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -2001,6 +3409,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-keys@^1.0.12: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" + integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -2018,6 +3431,14 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.map@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" @@ -2026,6 +3447,14 @@ object.map@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -2045,19 +3474,48 @@ on-headers@~1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0: +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -2075,6 +3533,25 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -2099,11 +3576,33 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -2119,7 +3618,19 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-is-absolute@^1.0.0: +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -2134,7 +3645,7 @@ path-key@^2.0.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -2156,6 +3667,15 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -2212,16 +3732,45 @@ pgpass@1.x: dependencies: split "^1.0.0" +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + platform@1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q== +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -2249,16 +3798,47 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +prompts@^0.1.9: + version "0.1.14" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" + integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w== + dependencies: + kleur "^2.0.1" + sisteransi "^0.1.1" + proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" @@ -2272,7 +3852,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: +psl@^1.1.24, psl@^1.1.28: version "1.1.31" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== @@ -2287,7 +3867,7 @@ punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -2302,6 +3882,20 @@ qs@6.5.2, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@^6.5.1: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -2327,7 +3921,24 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@^2.0.2, readable-stream@^2.0.6: +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -2349,6 +3960,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +realpath-native@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -2361,11 +3979,23 @@ referrer-policy@1.1.0: resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79" integrity sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk= +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + regenerator-runtime@^0.12.0: version "0.12.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -2399,11 +4029,34 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -2430,6 +4083,23 @@ request@^2.87.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -2438,12 +4108,22 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7: +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== @@ -2455,13 +4135,18 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.6.1: +rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -2479,6 +4164,22 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -2491,16 +4192,16 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + semver@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -2530,7 +4231,7 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -2572,11 +4273,26 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -2618,16 +4334,62 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.6: + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.6: +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -2642,6 +4404,11 @@ split@^1.0.0: dependencies: through "2" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + sqlite3@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.6.tgz#e587b583b5acc6cb38d4437dedb2572359c080ad" @@ -2666,6 +4433,11 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -2684,6 +4456,19 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -2722,6 +4507,18 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-bom@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -2732,6 +4529,42 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +superagent@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + +supertest@^3.3.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.4.2.tgz#bad7de2e43d60d27c8caeb8ab34a67c8a5f71aad" + integrity sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA== + dependencies: + methods "^1.1.2" + superagent "^3.8.3" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + supports-color@^5.2.0, supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -2739,6 +4572,11 @@ supports-color@^5.2.0, supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + tar@^4: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" @@ -2764,6 +4602,22 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +test-exclude@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -2781,6 +4635,16 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -2813,6 +4677,14 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -2821,6 +4693,18 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -2833,6 +4717,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -2841,6 +4732,14 @@ type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -2938,6 +4837,14 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -2955,6 +4862,14 @@ v8flags@^3.1.1: dependencies: homedir-polyfill "^1.0.1" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -2969,7 +4884,69 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -which@^1.2.14, which@^1.2.9: +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -2990,12 +4967,30 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: +write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: version "2.4.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== @@ -3004,6 +4999,13 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + x-xss-protection@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz#4f1898c332deb1e7f2be1280efb3e2c53d69c1a7" @@ -3014,11 +5016,21 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -3028,3 +5040,28 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" From 0877da305218dfbfbdd3e21b8902ee2f9dda30b2 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Thu, 14 Mar 2019 09:26:42 -0700 Subject: [PATCH 39/45] working on user and auth testing --- data/db/test.db3 | Bin 73728 -> 73728 bytes data/helpers/userHelper.test.js | 2 +- data/routes/authRoutes.js | 4 +- data/routes/authRoutes.test.js | 63 ++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 data/routes/authRoutes.test.js diff --git a/data/db/test.db3 b/data/db/test.db3 index d412b5b5902635d7d3963956df4d7f8568a3449e..5a19e6cdea0dd27e99d3146d590d6f946c0213b4 100644 GIT binary patch delta 81 zcmZoTz|wGlWr8&CLX5;VP%&t($&jJ+Y-rS;JBf!oJ bWHJaaY-V@(xt|Bb1_DMP7TU_g_(dK7%H9wi delta 80 zcmZoTz|wGlWr8#>KLZ1U5D { let user = req.body; const hash = bcrypt.hashSync(user.password, 8); user.password = hash; - if (user.type === 'user') { + if (user.type && user.type === 'user') { if (user.email && user.password) { try { const newUser = { @@ -32,7 +32,7 @@ router.post('/register', emailCheck, async (req, res) => { message: 'Make sure email & password are included', }); } - } else if (user.type === 'company') { + } else if (user.type && user.type === 'company') { if (user.email && user.password) { try { const newCompany = { diff --git a/data/routes/authRoutes.test.js b/data/routes/authRoutes.test.js new file mode 100644 index 0000000..f972ee7 --- /dev/null +++ b/data/routes/authRoutes.test.js @@ -0,0 +1,63 @@ +require('dotenv').config(); +const request = require('supertest'); +const express = require('express'); +const knex = require('knex'); +const knexConfig = require('../../knexfile'); +const db = knex(knexConfig.testing); + +const authRoute = require('./authRoutes'); + +afterEach(async () => { + await db('users').truncate(); +}); + +describe('/register', () => { + test('should return 201', async () => { + try { + const newUser = { email: 'test@test.com', password: 'password', type: 'user' }; + const res = await request(server) + .post('/register') + .send(newUser); + expect(res.status).toBe(201); + } catch (error) {} + }); + test('should return status 500', async () => { + try { + const newUser = { email: 'test@test.com', password: 'password' }; + const res = await request(server) + .post('/register') + .send(newUser); + expect(res.status).toBe(100); + } catch (error) {} + }); + + test('should return 500', async () => { + try { + const newUser = { email: 'test@test.com', type: 'user' }; + const res = await request(server) + .post('/register') + .send(newUser); + expect(res.status).toBe(500); + } catch (error) {} + }); + test('should return an object', async () => { + try { + const newUser = { email: 'test@test.com', password: 'password' }; + const res = await request(server) + .post('/register') + .send(newUser); + expect(res.type).toExpect('object'); + } catch (error) {} + }); +}); +describe('/login', () => { + test('should return 200', async () => { + try { + const newUser = { email: 'test@test.com', password: 'password' }; + const res = await request(server) + .post('/login') + .send(newUser); + expect(res.status).toBe(200); + } catch (error) {} + }); +}); From 114ec04953ff3cce84b092444b8d27df91b3d534 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Thu, 14 Mar 2019 09:50:52 -0700 Subject: [PATCH 40/45] minor update to update user --- data/helpers/userHelper.js | 213 ++++++++++++++++++------------------- data/routes/authRoutes.js | 2 +- data/routes/usersRoutes.js | 7 +- 3 files changed, 106 insertions(+), 116 deletions(-) diff --git a/data/helpers/userHelper.js b/data/helpers/userHelper.js index 97fdb28..c96430d 100644 --- a/data/helpers/userHelper.js +++ b/data/helpers/userHelper.js @@ -3,139 +3,134 @@ const knexConfig = require('../../knexfile'); const db = knex(knexConfig.development); module.exports = { - getAllUsers, - getSaves, - getUserInfo, - getUserById, - updateUser, - saveUser, - removeUser, - deleteUser, - match, + getAllUsers, + getSaves, + getUserInfo, + getUserById, + updateUser, + saveUser, + removeUser, + deleteUser, + match, }; function getAllUsers() { - return db('users').select( - 'id', - 'firstName', - 'lastName', - 'occupation', - 'experience', - 'interests', - 'userImg' - ); + return db('users').select( + 'id', + 'firstName', + 'lastName', + 'occupation', + 'experience', + 'interests', + 'userImg' + ); } function getSaves(id) { - return db('userJobSaves').where('user_id', id); + return db('userJobSaves').where('user_id', id); } async function getUserInfo(user) { - try { - const likes = await db('userJobSaves') - .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') - .where('user_id', user.subject) - .select( - 'job_id', - 'jobTitle', - 'jobPosition', - 'jobDescription', - 'jobRequirements', - 'jobSalary', - 'jobTags', - 'jobOpenDate', - 'jobCloseDate', - 'jobImg' - ); - const userInfo = await db('users') - .where('id', user.subject) - .select( - 'id', - 'firstName', - 'lastName', - 'email', - 'occupation', - 'experience', - 'interests', - 'userImg' - ) - .first(); - Object.assign(userInfo, { saved: likes }); - return userInfo; - } catch (error) { - return error; - } + try { + const likes = await db('userJobSaves') + .join('jobPosting', 'userJobSaves.job_id', 'jobPosting.id') + .where('user_id', user.subject) + .select( + 'job_id', + 'jobTitle', + 'jobPosition', + 'jobDescription', + 'jobRequirements', + 'jobSalary', + 'jobTags', + 'jobOpenDate', + 'jobCloseDate', + 'jobImg' + ); + const userInfo = await db('users') + .where('id', user.subject) + .select( + 'id', + 'firstName', + 'lastName', + 'email', + 'occupation', + 'experience', + 'interests', + 'userImg' + ) + .first(); + Object.assign(userInfo, { saved: likes }); + return userInfo; + } catch (error) { + return error; + } } async function getUserById(id) { - try { - const user = await db('users') - .where('id', id) - .select( - 'id', - 'firstName', - 'lastName', - 'occupation', - 'experience', - 'interests', - 'userImg' - ) - .first(); - // if (user) { - // res.status(200).json(user); - // } else { - // res.status(404).json({ message: 'Unable to find a user by that ID' }); - // } - return user; - } catch (error) { - // res.status(500).send('Internal server error'); - return error; - } + try { + const user = await db('users') + .where('id', id) + .select( + 'id', + 'firstName', + 'lastName', + 'occupation', + 'experience', + 'interests', + 'userImg' + ) + .first(); + return user; + } catch (error) { + // res.status(500).send('Internal server error'); + return error; + } } function updateUser(user, updateInfo) { - return db('users') - .where('email', user.email) - .update(updateInfo); + return db('users') + .where('email', user.email) + .update(updateInfo); } async function deleteUser(user) { - try { - const result = await db('userJobSaves') - .where('user_id', user) - .del(); - const userDelete = await db('users') - .where('id', user) - .del(); - return { message: 'Success' }; - } catch (error) { - return error; - } + try { + const result = await db('userJobSaves') + .where('user_id', user) + .del(); + const userDelete = await db('users') + .where('id', user) + .del(); + return { message: 'Success' }; + } catch (error) { + return error; + } } function saveUser(companyId, userId) { - return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }, 'id'); + return db('companyUserSaves').insert({ company_id: companyId, user_id: userId }, 'id'); } function removeUser(companyId, userId) { - return db('companyUserSaves') - .where({ company_id: companyId, user_id: userId }) - .del(); + return db('companyUserSaves') + .where({ company_id: companyId, user_id: userId }) + .del(); } async function match(id) { - try { - const userMatches = await db('userJobSaves') - .join('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') - .where('userJobSaves.user_id', id) - .where('companyUserSaves.user_id', id) - .select( - 'userJobSaves.user_id as UserId', - 'userJobSaves.company_id as companyId', - 'userJobSaves.job_id as jobId' - ); - return userMatches; - } catch (error) { - return error; - } -} \ No newline at end of file + try { + const userMatches = await db('userJobSaves') + .join('companyUserSaves', 'userJobSaves.company_id', 'companyUserSaves.company_id') + .where('userJobSaves.user_id', id) + .where('companyUserSaves.user_id', id) + .select( + 'userJobSaves.user_id as UserId', + 'userJobSaves.company_id as companyId', + 'userJobSaves.job_id as jobId' + ); + return userMatches; + } catch (error) { + return error; + } +} diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 0d81dbc..9670170 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -36,7 +36,7 @@ router.post('/register', emailCheck, async (req, res) => { if (user.email && user.password) { try { const newCompany = { - // companyName: user.companyName, + companyName: user.companyName, email: user.email, password: user.password, }; diff --git a/data/routes/usersRoutes.js b/data/routes/usersRoutes.js index b27c5e3..3b7de05 100644 --- a/data/routes/usersRoutes.js +++ b/data/routes/usersRoutes.js @@ -33,10 +33,7 @@ router.get('/info', restricted, async (req, res) => { //Update User - response 202 - returns a 1 if updated router.put('/update', restricted, async (req, res) => { try { - { - } - const updateInfo = req.body; - const result = await userHelper.updateUser(req.decodedToken, updateInfo); + const result = await userHelper.updateUser(req.decodedToken, req.body); res.status(202).json(result); } catch (error) { res.status(500).json(error); @@ -45,11 +42,9 @@ router.put('/update', restricted, async (req, res) => { // Delete User - response 204 router.delete('/delete', restricted, async (req, res) => { - console.log(req.decodedToken.subject); const user = await db('users') .where('id', req.decodedToken.subject) .first(); - console.log(user); try { if (user) { const result = await userHelper.deleteUser(req.decodedToken.subject); From 4bfdee95928a8dce892d7b5193b23f04717ec874 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Thu, 14 Mar 2019 13:07:22 -0700 Subject: [PATCH 41/45] more testing on authRoutes --- api/server.test.js | 4 ++ data/db/dev.sqlite3 | Bin 81920 -> 81920 bytes data/db/test.db3 | Bin 73728 -> 73728 bytes data/routes/authRoutes.js | 4 +- data/routes/authRoutes.test.js | 75 ++++++++++++++++++--------------- 5 files changed, 46 insertions(+), 37 deletions(-) diff --git a/api/server.test.js b/api/server.test.js index 8ce75ec..a3f4ef1 100644 --- a/api/server.test.js +++ b/api/server.test.js @@ -23,6 +23,10 @@ describe('GET', () => { const res = await request(server).get('/'); expect(res.status).toBe(200); }); + test('should return status 404', async () => { + const res = await request(server).get('/test'); + expect(res.status).toBe(404); + }); test('should return JSON', async () => { const res = await request(server).get('/'); diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index edb1c759e105c2e6c91321356af662790f3c5312..725154b5431e2bb6bac19b21dac100de4def6842 100644 GIT binary patch delta 8233 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 delta 6348 zcmeHLTWBNK8I~`y$7_4W_O9b~ycg|ev)RpNNB3LO(3M8AbzR-B?Z!D89Z5$sb4EHd zql+ncO+z8=OBO?*g+eJU=~E$H3W2^An!FTR0xk3{r4NN=LkSf6P$)eb?|L`5edt>X zM#%m=64Iyd|IYV+*8Tg|`}eKyZ7siUu~^R0`y9Q`KDgnZdi}$4 zmB|ka$Nh8Zdy5~O`FP>c!Wwg9zBs2_zd!r&%%hprY0p%{^6uxUmlA`8@>13j+fnqn5A^n&Z<1?XB zxmqN9(OlP`=m#*g$NPp1L8SmOQi-hs8@8+rFh1lTNA|m_*6Bb+li}FzbOrcsuYHhN zU9xO!I1j9$E0+%zDo9p9K|y*)Fk~5Gci>K20Z8UWRk`K@*BpUsFe(?i4UJ?aPrC06 z)a8&20(?I)#Ca6BD?r1r56gs%U|;|s)V!Tks>2J0rmO1;B(^lv2@*A1h=?7eLs36; zJPuQ41R?^CS=CpTEL$7y18b79;v%5e!El@gScgf2=zI*|<_Thjf;7wo>!@C|i_vzO zxN2p+2vaeT?)%G9Z>(1Py+ zoWhQp${9t!H@H*o_(FA0IU+=$uiK1^4Y^ZKC%s93G7sBFWCQ{!uK~10aT{Sc8DYR6 z#F)H;Dx+gAHI{O@=zqc`1qd0Z5N@^!#9=~T3WI>pq*IE7GhSmDh=Wp6lB+JqaJ%E< z!@iN65Yb&dpA37W1w#(wQMf;{x7=z-_VGdo!IsU`35XM!wC5ZJ0Ga64BCvT(C%e34 z+1#`rSfg}y)+mx8#DyNh5{Sx86$kux#-O9B&snORl4@EJ?d@zUs-AMl_1tz68Q$zp zB-0#Z?TKi(-88)ETEK4<3|G2QNyt@UVyP8%VyOwYHZezd_{Ham{hr!;&fwLhCCmC& z=!wDes-`6g=!!_%mQ{k9U^k`?>G)jk6NYjKL!nCA84|ar_6k}}@>P;bMyM40El;J~ zALmOT2ttLT$1As`;<$);r|J^mGS&&TQgNb|s2%?3Z|VIm(gC&mu|)S4slC^uM-nX- z2{jtPVYLZEG8|EF)4}t3Rc>i2J|R}hF$xKMEEBCX8Z~!+FK18iNgg?I4P}Z6&t3;O zB_&|5;DX}O9j(ZAFMG+A5meGssYcLNfTBT6hie*|yzkKo)P|r(1$j2c+!;E?^*0Wz zZ%l$AY!I3nNmcBGFw!(&9zk#L1iOJFT#v%8NA2e6>Lu7pqEyIjOd??;LG!Hz zi2#T`B&gldx1o$gD)Vk$RU0R08SQFj9LpA)-d@R(Z^Wg-KJ`kj68LJ=u5hFRhq7_r5XeyNRHW-m?g`_vos&RPT4LO zCNrf+cpK0V8)HD4yD$%A?mgrq8dHhHV`KX26Xk%{#e*=fkuNEqWH{wwfRZnQz0jb zfA%g=6%rGbi0u@}MbsTZL$f@AP80mddzN{k8=B z&|4iVz3!+4c_|dm4WR(fA037?AQIFyn?U2kkdI9#s|M0`sUHb~$I`tuM~!zed0-7r zq>Io)3UEQ}7&3M1T_ko?85kNLgG8YhRO~vrq6#}h2>l(ooE`3z+8J>>(G8@HC`9g< zs7HcfPE48XpuK92S4-835`DOm%v%?z_Mb*Hjko2q~{B+6+)dfIVRO!yv)MJ|8oTb^f zE*w~e$*5B_0O$a4642CC@oofSs3FPcKjFjCxS#V>?9G}o%Hgy!l4?FW)3{RzSL9x^ zwwLmSA}&qLlw*QDlF7HvcJ?HfaU_{7XMo8DJ*+*->{DCmdK=K~i1lMul^JTlExNCE zD654C9WTfkNZ(U&lxnOJK1q;vLOQ-s4!|H^@Zfqk>JA3Fde6=Ct#PsF^=>zUgLbQ% zBDtM`+8SuNXlzHU#haJ-6l?=={QQcr6?#xal;Y8H-zUZ%)p2mlt~O2CU4BwM7K9E! zN?uh!+kgb*fedNbc$_B`3wdRGD^aUCQue*jj@O%0+zAIC8M^Y@QO77e7%D z_6zma;s=&x%e$8UUWVy|Pi_w$+&g^t&V|z&d{oX)YcRFnX$?ND!KXF&>Hq7eHTbj! ze^qKQ{qC&xe^7&IAu+ysHP~XAe*d%v|Iam;*2>SmQZ;z(OEuW+ZNK>a?Ax8mH^JOL zxX-!2aDU={$Nh%;755?c0rx}hkozwEZh64TT!X7}cex1nI_Kc7a~HTZj$!}B{+)fq ze#ZWh{Vn@z_9OP^>`&Mqu(p7%2j6FFvQ8M}$>%xes9BAz)nf7?2>FlD)YbN)4YX~FW^0&~lJ?AAts zdDTR(u7;SKCc3$jn!jN_|3-*;#k};&%o20mMAuhu?=vr(@Z~d?m}@4ww&-PEGSN%x zaptOtuCBS5D<-G4n2RR5czngS)+s`jTzZ>XG_Nhryv3X` z(V4S1nFSLqtmYZUM2z)KX5K{e%N}OVM03mvV>OX=={7TKqS@Iq%#4X<7QD=~iKb`n N%}-eu=%A;We*=uu#@zq_ diff --git a/data/db/test.db3 b/data/db/test.db3 index 5a19e6cdea0dd27e99d3146d590d6f946c0213b4..836284a3e03d6157ca3b96736c73c57c013e123d 100644 GIT binary patch delta 24 ecmZoTz|wGlWr7qF delta 24 ecmZoTz|wGlWr7qF!^DX)PC&9TVQT{80(k&uwFmwH diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 998864e..0d81dbc 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -15,7 +15,7 @@ router.post('/register', emailCheck, async (req, res) => { let user = req.body; const hash = bcrypt.hashSync(user.password, 8); user.password = hash; - if (user.type && user.type === 'user') { + if (user.type === 'user') { if (user.email && user.password) { try { const newUser = { @@ -32,7 +32,7 @@ router.post('/register', emailCheck, async (req, res) => { message: 'Make sure email & password are included', }); } - } else if (user.type && user.type === 'company') { + } else if (user.type === 'company') { if (user.email && user.password) { try { const newCompany = { diff --git a/data/routes/authRoutes.test.js b/data/routes/authRoutes.test.js index f972ee7..b53fc0a 100644 --- a/data/routes/authRoutes.test.js +++ b/data/routes/authRoutes.test.js @@ -4,6 +4,8 @@ const express = require('express'); const knex = require('knex'); const knexConfig = require('../../knexfile'); const db = knex(knexConfig.testing); +const server = require('../../api/server'); +const faker = require('faker'); const authRoute = require('./authRoutes'); @@ -13,51 +15,54 @@ afterEach(async () => { describe('/register', () => { test('should return 201', async () => { - try { - const newUser = { email: 'test@test.com', password: 'password', type: 'user' }; - const res = await request(server) - .post('/register') - .send(newUser); - expect(res.status).toBe(201); - } catch (error) {} + const newUser = { email: faker.internet.email(), password: 'password', type: 'user' }; + const res = await request(server) + .post('/auth/register') + .send(newUser); + console.log(res.status); + expect(res.status).toBe(201); + }); + test('should return [1]', async () => { + const newUser = { email: faker.internet.email(), password: '132', type: 'user' }; + const res = await request(server) + .post('/auth/register') + .send(newUser); + console.log(res.body.result); + expect(res.body.result).toMatch(/[\[*\]]/); }); test('should return status 500', async () => { - try { - const newUser = { email: 'test@test.com', password: 'password' }; - const res = await request(server) - .post('/register') - .send(newUser); - expect(res.status).toBe(100); - } catch (error) {} + const newUser = { email: faker.internet.email(), password: 'password' }; + const res = await request(server) + .post('/auth/register') + .send(newUser); + expect(res.status).toBe(500); }); test('should return 500', async () => { - try { - const newUser = { email: 'test@test.com', type: 'user' }; - const res = await request(server) - .post('/register') - .send(newUser); - expect(res.status).toBe(500); - } catch (error) {} + const newUser = { email: faker.internet.email(), type: 'user' }; + const res = await request(server) + .post('/register') + .send(newUser); + expect(res.status).toBe(404); }); test('should return an object', async () => { - try { - const newUser = { email: 'test@test.com', password: 'password' }; - const res = await request(server) - .post('/register') - .send(newUser); - expect(res.type).toExpect('object'); - } catch (error) {} + const newUser = { email: faker.internet.email(), password: 'password' }; + const res = await request(server) + .post('/auth/register') + .send(newUser); + expect(res.type).toBe('application/json'); }); }); describe('/login', () => { test('should return 200', async () => { - try { - const newUser = { email: 'test@test.com', password: 'password' }; - const res = await request(server) - .post('/login') - .send(newUser); - expect(res.status).toBe(200); - } catch (error) {} + const userRegister = { email: 'test5@test.com', password: 'password', type: 'user' }; + const res1 = await request(server) + .post('/auth/register') + .send(userRegister); + const userLogin = { email: 'test5@test.com', password: 'password' }; + const res = await request(server) + .post('/auth/login') + .send(userLogin); + expect(res.status).toBe(200); }); }); From 3b2ff3a7e86670ea6949cbc777e6490a270933c0 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Thu, 14 Mar 2019 13:44:54 -0700 Subject: [PATCH 42/45] auth routes are good --- data/db/dev.sqlite3 | Bin 81920 -> 81920 bytes data/db/test.db3 | Bin 73728 -> 73728 bytes data/routes/authRoutes.js | 9 ++++++--- data/routes/authRoutes.test.js | 25 ++++++++++++++----------- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index 725154b5431e2bb6bac19b21dac100de4def6842..e825141fbb4ff30f4a1c21bed1db24c9b6e4a3d9 100644 GIT binary patch delta 1367 zcmZXTOK#g%7=`UY296!aMS&JY3ls%B=2N7oHcc#&;+r8Q>Ol!8luPQ8qWF^dlBkJQ zv>Rcjv|VXHWllDxH1&@ZHs4 zXSYASI6pZ#Y5n|U|DI?NBng=IVV2c5ehh*Lantyk0M{6EEiVTH)*bd)k_?#~G-F{+ zsHJb1uZ^a_M4%Us$9;pXV2D{#>Lg>lU5oAy2Yly<=h6&J#SFq^o<>EJyqTx(io2`s zNTTzm4S`cRLtQmWHg2~?q+uqTNfkt_GUPM4)Y&LRFuZ3jXKJAV#QFX}=8j|$W+0kP zt!0pefWqFb?moY5y4!`3m=5AGvL29jte9@IU$z7rv)5LxQk`xukee z4O$0k`#z4+4bn27N+8REoTeW|A}~XXK~Ss{Z*zaMMdKAVXuxa~gn2<|oz-T`F{Yd0 zPCQ_?gl6ClTd%;BIcWTN)X;+@3E-4Z>j-|bjns_W9b#mqb+tabHI@c$46bzn@B_V$)XX=1rwq9aA3~FSjX3z;;CuhBZO(yIJ z7i`zBmmZaG)rF=4{DFoZxN{gmL`t+-~t)FiT{3>Ua#``QAXZAV1SqDcAv<*U=b{{sLlpgaHo delta 48 zcmZo@U~On%ogmGaF;T{uF=Jzbygs8|bA$f$27SgB4kms(2L5^ccAFIyjQFS9*)tvj E09CXNU;qFB diff --git a/data/db/test.db3 b/data/db/test.db3 index 836284a3e03d6157ca3b96736c73c57c013e123d..9f95c42032e00c6d74a40371deceec9530bcc790 100644 GIT binary patch delta 22 ecmZoTz|wGlWr8&0*@-gFjAt7Ywk9wxkOu%{w+MCs delta 22 ecmZoTz|wGlWr8&0+=(*IjB^_kwk9wxkOu%@#|Rbx diff --git a/data/routes/authRoutes.js b/data/routes/authRoutes.js index 0d81dbc..687ddfb 100644 --- a/data/routes/authRoutes.js +++ b/data/routes/authRoutes.js @@ -12,6 +12,9 @@ router.post('/register', emailCheck, async (req, res) => { // eamil, password, type = required // firstName, lastname, occupation, expereience, interests, userImg = optional for user // name, bio, address, companyImg + if (!req.body.type) { + res.send(500); + } let user = req.body; const hash = bcrypt.hashSync(user.password, 8); user.password = hash; @@ -79,7 +82,7 @@ router.post('/login', async (req, res) => { res.status(200).json({ token, userInfo }); } catch (error) { - res.status(404).json({ message: 'unable to find that user' }); + res.status(500).json({ message: 'login server issue' }); } } else if (company && bcrypt.compareSync(password, company.password)) { try { @@ -94,10 +97,10 @@ router.post('/login', async (req, res) => { res.status(200).json({ token, companyInfo }); } catch (error) { - res.status(404).json({ message: 'unable to find that company' }); + res.status(500).json({ message: 'login server issue' }); } } else { - res.status(500).json({ message: 'login server issue' }); + res.status(404).json({ message: 'That email address does not exist' }); } }); diff --git a/data/routes/authRoutes.test.js b/data/routes/authRoutes.test.js index b53fc0a..3799c38 100644 --- a/data/routes/authRoutes.test.js +++ b/data/routes/authRoutes.test.js @@ -19,17 +19,9 @@ describe('/register', () => { const res = await request(server) .post('/auth/register') .send(newUser); - console.log(res.status); expect(res.status).toBe(201); }); - test('should return [1]', async () => { - const newUser = { email: faker.internet.email(), password: '132', type: 'user' }; - const res = await request(server) - .post('/auth/register') - .send(newUser); - console.log(res.body.result); - expect(res.body.result).toMatch(/[\[*\]]/); - }); + test('should return status 500', async () => { const newUser = { email: faker.internet.email(), password: 'password' }; const res = await request(server) @@ -45,8 +37,8 @@ describe('/register', () => { .send(newUser); expect(res.status).toBe(404); }); - test('should return an object', async () => { - const newUser = { email: faker.internet.email(), password: 'password' }; + test('should return json', async () => { + const newUser = { email: faker.internet.email(), password: 'password', type: 'user' }; const res = await request(server) .post('/auth/register') .send(newUser); @@ -65,4 +57,15 @@ describe('/login', () => { .send(userLogin); expect(res.status).toBe(200); }); + test('should return 404', async () => { + const userRegister = { email: 'test5@test.com', password: 'password', type: 'user' }; + const res1 = await request(server) + .post('/auth/register') + .send(userRegister); + const userLogin = { email: '6@test.com', password: 'password' }; + const res = await request(server) + .post('/auth/login') + .send(userLogin); + expect(res.status).toBe(404); + }); }); From 6e6762cc1c012a6679643561da2ed881479496f7 Mon Sep 17 00:00:00 2001 From: Michael Landers Date: Thu, 14 Mar 2019 15:24:49 -0700 Subject: [PATCH 43/45] user route testing --- .gitignore | 2 ++ data/db/dev.sqlite3 | Bin 81920 -> 81920 bytes data/db/test.db3 | Bin 73728 -> 73728 bytes data/middleware/middleware.js | 6 +++--- data/routes/usersRoutes.test.js | 37 ++++++++++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 data/routes/usersRoutes.test.js diff --git a/.gitignore b/.gitignore index 74783ea..d353e3e 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,5 @@ typings/ # DynamoDB Local files .dynamodb/ .gitignore + +.DS_Store \ No newline at end of file diff --git a/data/db/dev.sqlite3 b/data/db/dev.sqlite3 index e825141fbb4ff30f4a1c21bed1db24c9b6e4a3d9..e86a97df0607007289af590ce574ff9437a17a42 100644 GIT binary patch delta 4875 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 delta 1740 zcmb`IO>g5w9ETGiyOd40g|?Kcs+x)(kQUi_Y2FY>P3k0V-kiiunuG(Lj3@Ra_Bfdt zr*SW7Brb>ppgnNhZ-4|naN)v--~;SsrM+=q4othEycB771(wFL#~OK_dFJ<@i;KX; zMd0hr#fi`7TNUk&Xs>||3C*I20 z716c$;nfFm`7htB{r1)B-G#@#r3d#97v10&_a43V)57D0FE4kNCky`8!|&9snO%~{ z!%i=&AR@QD+=O>wu7P@LF-*I|RH@ZIs^Hl0B&wi#X$W0uP-~{qyuA_hZEZZ52MRme z^OZcd92*gE2na)@0Z=@>Z`c4^5_Ig{DA*0Bc9SYmN#5n1lWc65v(7t*Miffk4AWd% z_4-DuTRHP;G@Nf%pjw(9!n#$dmm0{x4gpr^7(k983#k;Eh;a(IL(z1EC`JS#OgN&V zo0*)C*hjL=ViK^yxfpuJt|lS7xDOy=^7A`C!(5Dzd+tovO~4$NLL^6`DQPe==BMuk zeH&Zpd7v)f?qw+;IxjjVVca2yz_T!tG!E!+-vg%O{DrX(aWRETxv-f&wrb6~+>zQN zb(+;Mr{QDe#3ZeZB&q4lsHoZLL_HN7&U)?e{FChXIbpbq1-G`pnDk$O$9VXQXWz2JskhCGIJvnqdF{0 zGz`v)JcU6HcQrK<&2o7VtMtZ|##FP*x{9?})>RwRL?H*fqbo1u8b>&+AWp9x_WKwL zU$3IC{;&QZ1=uhVA*gpX(HlDauGpUI$$8*YVQ@X8Qw#_J8gLOUIur5i#bVb~!)iBD ztq!J&-aG))&SdYrQ0k#rtKC#okYH9MKd?s81nM{uyPxj15-=`lf2TTdY}+LmUQ@Er zF@mOe6F+XgqoguEUC9 z(&ZBvLzQzl4!6P`4@rB6-LWU!h0n`ILph;Yxn4grc#=mI^|+)R%v=#Xv3xh><^O{N zmIYXEghT-TOkHCo=v!Nl2xmgv+a+h#Ls^GG=c=k8FPXSiQRH%k=mXtsb;foTl#`RA z`g9~U-F}|qlAJ2*xLz`Q5Ys}gn(x|1U#+$a3Z@A1Py;apM7a!UuBej}A?;S=a<5)8 oEfcs5QCo!Q4|PBM`o{k2%L`Axy&LxLh_mJAg&&`${p)vr2Vrwtng9R* diff --git a/data/db/test.db3 b/data/db/test.db3 index 9f95c42032e00c6d74a40371deceec9530bcc790..cb0f768c06ec727be6358da4df3751590606dc94 100644 GIT binary patch delta 24 ecmZoTz|wGlWr7qFQ_(~jCm`9Fur+~kfjj_ZI|sx7 delta 24 ecmZoTz|wGlWr7qF 0 || companyAccount.length > 0) { res.status(400).json({ message: 'Email account alredy in use' }); } else { - console.log('next'); + // console.log('next'); next(); } } @@ -35,7 +35,7 @@ async function emailCheck(req, res, next) { cloudinary.config({ cloud_name: process.env.CLOUDINARY_CLOUD_NAME, api_key: process.env.CLOUDINARY_API_KEY, - api_secret: process.env.CLOUDINARY_SECRET, + api_secret: process.env.CLOUDINARY_SECRET }); function imageProcess(res, req, next) { @@ -69,5 +69,5 @@ function imageProcess(res, req, next) { module.exports = { restricted, emailCheck, - imageProcess, + imageProcess }; diff --git a/data/routes/usersRoutes.test.js b/data/routes/usersRoutes.test.js new file mode 100644 index 0000000..e90378a --- /dev/null +++ b/data/routes/usersRoutes.test.js @@ -0,0 +1,37 @@ +require('dotenv').config(); +const request = require('supertest'); +// const express = require('express'); +const knex = require('knex'); +const knexConfig = require('../../knexfile'); +const db = knex(knexConfig.testing); +const server = require('../../api/server'); +// const faker = require('faker'); + +const usersRoutes = require('./usersRoutes'); +const authRoutes = require('./authRoutes'); + +afterEach(async () => { + await db('users').truncate(); +}); + +describe('User Routes', () => { + test('should return 200', async () => { + const userRegister = { + email: 'test44@test.com', + password: 'password', + type: 'user' + }; + const res1 = await request(server) + .post('/auth/register') + .send(userRegister); + const userLogin = { email: 'test44@test.com', password: 'password' }; + const res = await request(server) + .post('/auth/login') + .send(userLogin); + let token = res.body.token; + const users = await request(server) + .get('/users') + .send(token); + expect(res.status).toBe(200); + }); +}); From a7d94d7b65c7e6ceef7bdd6f2f6163ad33219f93 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Fri, 15 Mar 2019 10:43:09 -0700 Subject: [PATCH 44/45] Build week info --- BuildWeekInfo.md | 62 +++++++++++++++++++++++++++++++++++++++ data/auth/requiresAuth.js | 27 ----------------- 2 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 BuildWeekInfo.md delete mode 100644 data/auth/requiresAuth.js diff --git a/BuildWeekInfo.md b/BuildWeekInfo.md new file mode 100644 index 0000000..762dc30 --- /dev/null +++ b/BuildWeekInfo.md @@ -0,0 +1,62 @@ +## Links + +- UI Rodean - https://distracted-almeida-fcf080.netlify.com/ +- UI Divya - https://droom.netlify.com/ +- Front-end https://keen-hodgkin-2ca05d.netlify.com +- Back-end https://droom-backend.herokuapp.com/ + +## Lambda Build Week Presented Projects + +SpotiFinder + + - Front-End - https://bw-spotify.netlify.com + +Fifa Stats + + - Landing page - https://fifastrongerlinks.netlify.com/ + - Front-end - https://fifastats.netlify.com/ + +Shots Fired + + - Landing page - http://shots-fired-marketing.netlify.com/ + - Front-end - https://shots-fired-frontend.netlify.com/ + +Life GPA + + - Landing page - http://try-lifegpa.netlify.com + - Front-end - https://lifegpa.netlify.com/login + +Nifty Markets + + - Landing page - http://niftymarkets.herokuapp.com + - Front-end - http://niftymarkets.herokuapp.com + +How To + + - Landing page - https://how-to.now.sh/ + - Front-end - https://howto-frontend.netlify.com/signup + +Flex Together + + - Landing page - http://fervent-edison-947bf4.netlify.com + - Front-end - https://lbwft.netlify.com/ + +Pokemon Stats + + - Landing page - http://pkstats.netlify.com/ + - Front-end - https://pokestat.netlify.com/ + +Gun Violence 2 + + - Landing page - http://jolly-albattani-cb484c.netlify.com + - Front-end - https://gun-violence-heat-map.netlify.com/login + +Github User Breakdown + + - Landing page - https://distracted-hoover-00aed4.netlify.com/ + - Front-end - https://condescending-lalande-1ac5c1.netlify.com/login + +Luncher + + - Landing page - https://luncher-0311.netlify.com/ + - Front-end - https://school-luncher.netlify.com/#/login diff --git a/data/auth/requiresAuth.js b/data/auth/requiresAuth.js deleted file mode 100644 index e555ebb..0000000 --- a/data/auth/requiresAuth.js +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; -import axios from 'axios'; - -// axios defaults and interceptors -axios.defaults.baseURL = 'https://lambda-auth-ii.herokuapp.com/api'; -axios.interceptors.request.use( - function(options) { - options.headers.authorization = localStorage.getItem('jwt'); - - return options; - }, - function(error) { - // do something with the error - return Promise.reject(error); - } -); - -export default function(Component) { - return class Authenticated extends React.Component { - render() { - const token = localStorage.getItem('jwt'); - const notLoggedIn =
Please login to see the jokes
; - - return <> {token ? : notLoggedIn} ; - } - }; -} From a6b0aa9fa60975bd90cc44be4abbbcecd0691ad9 Mon Sep 17 00:00:00 2001 From: Mike Landers Date: Fri, 15 Mar 2019 10:48:12 -0700 Subject: [PATCH 45/45] update to readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ab93bb0..f9fa7aa 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ --- + User Login ```