Compare commits
	
		
			21 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a62ee63c83 | |||
| c89f2a2939 | |||
| d51c58867d | |||
| 2fa520fdde | |||
| 5bb7212420 | |||
| 2226705e3f | |||
| 72932955d1 | |||
| 339e2f39d8 | |||
| 12c6d7e3da | |||
| 1624e666e8 | |||
| 86f4cd00ea | |||
| 518aa3eb08 | |||
| 86985ef735 | |||
| fef7daaf96 | |||
| b14fa05adc | |||
| 7c71e94304 | |||
| 8fa489f2bc | |||
| 512acc0b8c | |||
| 567ac07612 | |||
| fa01864d0d | |||
| 91b25c22ca | 
							
								
								
									
										3
									
								
								.env
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								.env
									
									
									
									
									
								
							| @@ -1,3 +1,4 @@ | |||||||
| SSL=false | SSL=true | ||||||
|  | DOMAIN=kauft.es | ||||||
| DISABLE_PROVIDERS=false | DISABLE_PROVIDERS=false | ||||||
| ENABLE_REGISTER=true | ENABLE_REGISTER=true | ||||||
							
								
								
									
										45
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,8 +2,53 @@ | |||||||
|  |  | ||||||
| All notable changes to this project will be documented in this file. Dates are displayed in UTC. | All notable changes to this project will be documented in this file. Dates are displayed in UTC. | ||||||
|  |  | ||||||
|  | #### [0.3.0](https://git.odit.services/kauft.es/linkylinky/compare/0.2.0...0.3.0) | ||||||
|  |  | ||||||
|  | - Added license [`5bb7212`](https://git.odit.services/kauft.es/linkylinky/commit/5bb7212420ba102e743d62a47074191cdb264d2a) | ||||||
|  | - Added stats api route [`c89f2a2`](https://git.odit.services/kauft.es/linkylinky/commit/c89f2a2939b658ffc688646ccce32fc0e1530583) | ||||||
|  | - Added author info [`2fa520f`](https://git.odit.services/kauft.es/linkylinky/commit/2fa520fdde1d55b2766b4b03e394e21a4f6cbae5) | ||||||
|  | - Updated readme [`2226705`](https://git.odit.services/kauft.es/linkylinky/commit/2226705e3f57d7d2f3ef5a79947c3ab44ec62c38) | ||||||
|  | - Added comments [`d51c588`](https://git.odit.services/kauft.es/linkylinky/commit/d51c58867d7508c84f26c236e38567bc6a4adbed) | ||||||
|  |  | ||||||
|  | #### [0.2.0](https://git.odit.services/kauft.es/linkylinky/compare/0.1.4...0.2.0) | ||||||
|  |  | ||||||
|  | > 14 August 2021 | ||||||
|  |  | ||||||
|  | - 🚀RELEASE 0.2.0 [`7293295`](https://git.odit.services/kauft.es/linkylinky/commit/72932955d15976947dd553c5deba51cbf541b215) | ||||||
|  | - Added ebay provider recognition [`12c6d7e`](https://git.odit.services/kauft.es/linkylinky/commit/12c6d7e3da5cb4de6a597b4639f313b8e4319646) | ||||||
|  | - Ebay provider resolution [`339e2f3`](https://git.odit.services/kauft.es/linkylinky/commit/339e2f39d88d42a961e1e495f319dc0663cdc0a6) | ||||||
|  | - Now recognizing with and without protocol [`1624e66`](https://git.odit.services/kauft.es/linkylinky/commit/1624e666e83e0afe346bcacb105ea1a1535f0690) | ||||||
|  |  | ||||||
|  | #### [0.1.4](https://git.odit.services/kauft.es/linkylinky/compare/0.1.3...0.1.4) | ||||||
|  |  | ||||||
|  | > 14 August 2021 | ||||||
|  |  | ||||||
|  | - Added cors [`518aa3e`](https://git.odit.services/kauft.es/linkylinky/commit/518aa3eb08cb72854812130d45b3b89afb074693) | ||||||
|  | - 🚀RELEASE 0.1.4 [`86f4cd0`](https://git.odit.services/kauft.es/linkylinky/commit/86f4cd00ea517f7e2cacbf69f2163eae597610ee) | ||||||
|  |  | ||||||
|  | #### [0.1.3](https://git.odit.services/kauft.es/linkylinky/compare/0.1.2...0.1.3) | ||||||
|  |  | ||||||
|  | > 14 August 2021 | ||||||
|  |  | ||||||
|  | - Weired knex env fix [`fef7daa`](https://git.odit.services/kauft.es/linkylinky/commit/fef7daaf961e9112aa00f2ad22c3b0518ad258a7) | ||||||
|  | - 🚀RELEASE 0.1.3 [`86985ef`](https://git.odit.services/kauft.es/linkylinky/commit/86985ef7355c2db09dcd6c8e52ee7ebde3ed4128) | ||||||
|  |  | ||||||
|  | #### [0.1.2](https://git.odit.services/kauft.es/linkylinky/compare/0.1.1...0.1.2) | ||||||
|  |  | ||||||
|  | > 14 August 2021 | ||||||
|  |  | ||||||
|  | - API Endpoint to get all short urls [`fa01864`](https://git.odit.services/kauft.es/linkylinky/commit/fa01864d0de7921e741d63c3f5795161279ea478) | ||||||
|  | - 🚀RELEASE 0.1.2 [`b14fa05`](https://git.odit.services/kauft.es/linkylinky/commit/b14fa05adc1ef8e34fd73bf5f495505df7d44b33) | ||||||
|  | - Changed the way that the migration get's triggered [`8fa489f`](https://git.odit.services/kauft.es/linkylinky/commit/8fa489f2bcd9d1ad63ab4581b7f3b27eee3d9038) | ||||||
|  | - Get all api endpoints [`91b25c2`](https://git.odit.services/kauft.es/linkylinky/commit/91b25c22ca035aec5cc2fdc80ca4fbb56a2f8b65) | ||||||
|  | - Added optional db volume to docker-compose [`7c71e94`](https://git.odit.services/kauft.es/linkylinky/commit/7c71e943041d8e3ac9dcf95cad27f2f0bc0b024c) | ||||||
|  | - Prod db now resides in db folder [`512acc0`](https://git.odit.services/kauft.es/linkylinky/commit/512acc0b8c15d4cfbafef21ec20707bac4629ea4) | ||||||
|  |  | ||||||
| #### [0.1.1](https://git.odit.services/kauft.es/linkylinky/compare/0.1.0...0.1.1) | #### [0.1.1](https://git.odit.services/kauft.es/linkylinky/compare/0.1.0...0.1.1) | ||||||
|  |  | ||||||
|  | > 14 August 2021 | ||||||
|  |  | ||||||
|  | - 🚀RELEASE 0.1.1 [`55d6b91`](https://git.odit.services/kauft.es/linkylinky/commit/55d6b91cc252ee6676d13df9abd8b61283a07f0f) | ||||||
| - fix: Dockerfile [`807eb9c`](https://git.odit.services/kauft.es/linkylinky/commit/807eb9c267377df0b5f30f81eb380ef8a1c2add2) | - fix: Dockerfile [`807eb9c`](https://git.odit.services/kauft.es/linkylinky/commit/807eb9c267377df0b5f30f81eb380ef8a1c2add2) | ||||||
|  |  | ||||||
| #### [0.1.0](https://git.odit.services/kauft.es/linkylinky/compare/0.0.2...0.1.0) | #### [0.1.0](https://git.odit.services/kauft.es/linkylinky/compare/0.0.2...0.1.0) | ||||||
|   | |||||||
| @@ -4,8 +4,9 @@ COPY package.json . | |||||||
| COPY yarn.lock . | COPY yarn.lock . | ||||||
| RUN yarn --production --frozen-lockfile | RUN yarn --production --frozen-lockfile | ||||||
| COPY migrations ./migrations | COPY migrations ./migrations | ||||||
| COPY src/server.js ./ | COPY src ./src | ||||||
| COPY knexfile.js ./ | COPY knexfile.js ./ | ||||||
|  | RUN mkdir db | ||||||
| #  | #  | ||||||
| # FROM astefanutti/scratch-node:16.0.0 | # FROM astefanutti/scratch-node:16.0.0 | ||||||
| FROM node:16.6.2-alpine3.14 | FROM node:16.6.2-alpine3.14 | ||||||
| @@ -13,4 +14,4 @@ WORKDIR /app | |||||||
| COPY --from=0 /app /app | COPY --from=0 /app /app | ||||||
| ENV NODE_ENV production | ENV NODE_ENV production | ||||||
| EXPOSE 3000 | EXPOSE 3000 | ||||||
| ENTRYPOINT ["node", "./server.js"] | ENTRYPOINT ["/bin/sh", "-c", "yarn migrate && node ./src/server.js"] | ||||||
							
								
								
									
										24
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | MIT License | ||||||
|  | ----------- | ||||||
|  |  | ||||||
|  | Copyright (c) 2021 ODIT.Services (https://odit.services) | ||||||
|  | Permission is hereby granted, free of charge, to any person | ||||||
|  | obtaining a copy of this software and associated documentation | ||||||
|  | files (the "Software"), to deal in the Software without | ||||||
|  | restriction, including without limitation the rights to use, | ||||||
|  | copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the | ||||||
|  | Software is furnished to do so, subject to the following | ||||||
|  | conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be | ||||||
|  | included in all copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||||||
|  | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||||||
|  | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||||
|  | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||||
|  | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||||
|  | OTHER DEALINGS IN THE SOFTWARE. | ||||||
| @@ -1,5 +1,8 @@ | |||||||
| # LinkyLinky 🔗 | <p align="center"> | ||||||
| > A small url shortener, originaly developed for kauft.es |   <img height="150" src="https://git.odit.services/user/avatar/kauft.es/140"> | ||||||
|  |   <h1 align="center">LinkyLinky 🔗</h1> | ||||||
|  |   <h3 align="center">A small url shortener, originaly developed for kauft.es</h3> | ||||||
|  | </p> | ||||||
|  |  | ||||||
| ## Dev Setup 🛠 | ## Dev Setup 🛠 | ||||||
| > Runs on port 3000 | > Runs on port 3000 | ||||||
|   | |||||||
| @@ -5,3 +5,5 @@ services: | |||||||
|     #image: registry.odit.services/kauft.es/linkylinky:latest |     #image: registry.odit.services/kauft.es/linkylinky:latest | ||||||
|     ports: |     ports: | ||||||
|       - 3000:3000 |       - 3000:3000 | ||||||
|  |     #volumes: | ||||||
|  |     #  - ./db:/app/db | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ module.exports = { | |||||||
|   production: { |   production: { | ||||||
|     client: 'sqlite3', |     client: 'sqlite3', | ||||||
|     connection: { |     connection: { | ||||||
|       filename: './db.sqlite3' |       filename: './db/db.sqlite3' | ||||||
|     }, |     }, | ||||||
|     migrations: { |     migrations: { | ||||||
|       tableName: 'knex_migrations' |       tableName: 'knex_migrations' | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,9 +1,21 @@ | |||||||
| { | { | ||||||
|   "name": "@odit/shortener-backend", |   "name": "@odit/shortener-backend", | ||||||
|   "version": "0.1.1", |   "version": "0.3.0", | ||||||
|   "main": "index.js", |   "main": "index.js", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "private": false, |   "private": false, | ||||||
|  |   "author": { | ||||||
|  |     "name": "ODIT.Services", | ||||||
|  |     "email": "info@odit.services", | ||||||
|  |     "url": "https://odit.services" | ||||||
|  |   }, | ||||||
|  |   "contributors": [ | ||||||
|  |     { | ||||||
|  |       "name": "Nicolai Ort", | ||||||
|  |       "email": "info@nicolai-ort.com", | ||||||
|  |       "url": "https://nicolai-ort.com" | ||||||
|  |     } | ||||||
|  |   ], | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "dev": "nodemon src/server.js", |     "dev": "nodemon src/server.js", | ||||||
|     "start": "node src/server.js", |     "start": "node src/server.js", | ||||||
| @@ -15,6 +27,7 @@ | |||||||
|     "dotenv": "^10.0.0", |     "dotenv": "^10.0.0", | ||||||
|     "fastify": "^3.20.1", |     "fastify": "^3.20.1", | ||||||
|     "fastify-basic-auth": "^2.1.0", |     "fastify-basic-auth": "^2.1.0", | ||||||
|  |     "fastify-cors": "^6.0.2", | ||||||
|     "knex": "^0.21.21", |     "knex": "^0.21.21", | ||||||
|     "sqlite3": "^5.0.2", |     "sqlite3": "^5.0.2", | ||||||
|     "uniqid": "^5.3.0" |     "uniqid": "^5.3.0" | ||||||
|   | |||||||
| @@ -15,16 +15,17 @@ let config = { | |||||||
|         return `http://${config.domain}`; |         return `http://${config.domain}`; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | const environment = process.env.NODE_ENV || 'development'; | ||||||
| const knex = require('knex')({ | const knexConfiguration = require('../knexfile')[environment]; | ||||||
|     client: 'sqlite3', | const knex = require('knex')(knexConfiguration); | ||||||
|     connection: { |  | ||||||
|         filename: "./dev.sqlite3" |  | ||||||
|     } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| const authenticate = { realm: 'Short' } | const authenticate = { realm: 'Short' } | ||||||
| fastify.register(require('fastify-basic-auth'), { validate, authenticate }); | fastify.register(require('fastify-basic-auth'), { validate, authenticate }); | ||||||
|  | fastify.register(require('fastify-cors'), {  | ||||||
|  |     origin: true, | ||||||
|  |     preflight: true, | ||||||
|  |     preflightContinue: true | ||||||
|  |   }) | ||||||
|  |  | ||||||
| //Automagic Amazn redirects on /a/ | //Automagic Amazn redirects on /a/ | ||||||
| fastify.get('/a/:id', async (req, res) => { | fastify.get('/a/:id', async (req, res) => { | ||||||
| @@ -40,6 +41,11 @@ fastify.get('/ytpl/:id', async (req, res) => { | |||||||
|     res.redirect(302, `https://youtube.com/playlist?list=${req.params.id}`) |     res.redirect(302, `https://youtube.com/playlist?list=${req.params.id}`) | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | //Automagic ebay item redirects on /e/ | ||||||
|  | fastify.get('/e/:id', async (req, res) => { | ||||||
|  |     res.redirect(302, `https://ebay.de/itm/${req.params.id}`) | ||||||
|  | }) | ||||||
|  |  | ||||||
| //Normal shorturls | //Normal shorturls | ||||||
| fastify.get('/:shortcode', async (req, res) => { | fastify.get('/:shortcode', async (req, res) => { | ||||||
|     const shortcode = req.params.shortcode; |     const shortcode = req.params.shortcode; | ||||||
| @@ -133,6 +139,20 @@ fastify.post('/api', { newUrlSchema }, async (req, res) => { | |||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | //Get stats api route | ||||||
|  | fastify.get('/api/stats', async (req, res) => { | ||||||
|  |     const urls = await knex.select('shortcode') | ||||||
|  |         .from('urls'); | ||||||
|  |  | ||||||
|  |     const visits = await knex.select('timestamp') | ||||||
|  |         .from('visits'); | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |         urls: urls.length, | ||||||
|  |         visits: visits.length, | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  |  | ||||||
| //Get url api route | //Get url api route | ||||||
| fastify.get('/api/:shortcode', async (req, res) => { | fastify.get('/api/:shortcode', async (req, res) => { | ||||||
|     const shortcode = req.params.shortcode; |     const shortcode = req.params.shortcode; | ||||||
| @@ -162,6 +182,7 @@ fastify.get('/api/:shortcode', async (req, res) => { | |||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| //User registration | //User registration | ||||||
| fastify.post('/api/register', async (req, res) => { | fastify.post('/api/register', async (req, res) => { | ||||||
|     if (!config.registrationEnabled) { |     if (!config.registrationEnabled) { | ||||||
| @@ -195,6 +216,7 @@ fastify.post('/api/register', async (req, res) => { | |||||||
|     return "Done!" |     return "Done!" | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | //Anything in here has some kind of auth | ||||||
| fastify.after(() => { | fastify.after(() => { | ||||||
|     //Get url api route |     //Get url api route | ||||||
|     fastify.get('/api/:shortcode/visits', { onRequest: fastify.basicAuth }, async (req, res) => { |     fastify.get('/api/:shortcode/visits', { onRequest: fastify.basicAuth }, async (req, res) => { | ||||||
| @@ -221,7 +243,7 @@ fastify.after(() => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     //Get url api route |     //Get url api route | ||||||
|     fastify.delete('/api/:shortcode', async (req, res) => { |     fastify.delete('/api/:shortcode', { onRequest: fastify.basicAuth }, async (req, res) => { | ||||||
|         const shortcode = req.params.shortcode; |         const shortcode = req.params.shortcode; | ||||||
|  |  | ||||||
|         //This should never happen but better safe than 500 |         //This should never happen but better safe than 500 | ||||||
| @@ -237,6 +259,23 @@ fastify.after(() => { | |||||||
|         return true; |         return true; | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     //Get all urls api route | ||||||
|  |     fastify.get('/api', { onRequest: fastify.basicAuth }, async (req, res) => { | ||||||
|  |         urls = await knex.select('target', 'shortcode') | ||||||
|  |             .from('urls'); | ||||||
|  |  | ||||||
|  |         for (let url of urls) { | ||||||
|  |             url.url = `${config.getBaseUrl()}/${url.shortcode}` | ||||||
|  |             if(req.query.showVisits){ | ||||||
|  |                 url.visits = (await knex.select('timestamp') | ||||||
|  |                     .from('visits') | ||||||
|  |                     .where('shortcode', '=', url.shortcode)).length; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return urls; | ||||||
|  |     }); | ||||||
|  |  | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -266,7 +305,7 @@ function checkKnownProviders(target) { | |||||||
|             target |             target | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     const amazonID = target.match(/https?:\/\/(www|smile|)\.?(amazon|smile)\.(de)(?:(?:\/.*\/|\/)(?:dp|gp))(\/product\/|\/)([A-Z0-9]+)/); |     const amazonID = target.match(/(?:https?:\/\/|)(www|smile|)\.?(amazon|smile)\.(de)(?:(?:\/.*\/|\/)(?:dp|gp))(\/product\/|\/)([A-Z0-9]+)/); | ||||||
|     if (amazonID) { |     if (amazonID) { | ||||||
|         const shortcode = `a/${amazonID[5]}` |         const shortcode = `a/${amazonID[5]}` | ||||||
|         return { |         return { | ||||||
| @@ -275,6 +314,15 @@ function checkKnownProviders(target) { | |||||||
|             target |             target | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     const ebayID = target.match(/(?:[ebay]*(?:[\/]|[itm=])|^)([0-9]{9,12})/); | ||||||
|  |     if (ebayID) { | ||||||
|  |         const shortcode = `e/${ebayID[1]}` | ||||||
|  |         return { | ||||||
|  |             url: `${config.getBaseUrl()}/${shortcode}`, | ||||||
|  |             shortcode, | ||||||
|  |             target | ||||||
|  |         } | ||||||
|  |     } | ||||||
|     return null; |     return null; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -298,13 +346,6 @@ async function validate(username, password, req, reply) { | |||||||
|  |  | ||||||
| // Run the server! | // Run the server! | ||||||
| const start = async () => { | const start = async () => { | ||||||
|     try { |  | ||||||
|         await knex.migrate.latest() |  | ||||||
|     } catch (err) { |  | ||||||
|         fastify.log.error(err) |  | ||||||
|         process.exit(1) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     try { |     try { | ||||||
|         await fastify.listen(3000, '0.0.0.0') |         await fastify.listen(3000, '0.0.0.0') | ||||||
|     } catch (err) { |     } catch (err) { | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								yarn.lock
									
									
									
									
									
								
							| @@ -1249,6 +1249,14 @@ fastify-basic-auth@^2.1.0: | |||||||
|     fastify-plugin "^3.0.0" |     fastify-plugin "^3.0.0" | ||||||
|     http-errors "^1.7.3" |     http-errors "^1.7.3" | ||||||
|  |  | ||||||
|  | fastify-cors@^6.0.2: | ||||||
|  |   version "6.0.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/fastify-cors/-/fastify-cors-6.0.2.tgz#4fd5102549659e9b34d252fd7ee607b63d021390" | ||||||
|  |   integrity sha512-sE0AOyzmj5hLLRRVgenjA6G2iOGX35/1S3QGYB9rr9TXelMZB3lFrXy4CzwYVOMiujJeMiLgO4J7eRm8sQSv8Q== | ||||||
|  |   dependencies: | ||||||
|  |     fastify-plugin "^3.0.0" | ||||||
|  |     vary "^1.1.2" | ||||||
|  |  | ||||||
| fastify-error@^0.3.0: | fastify-error@^0.3.0: | ||||||
|   version "0.3.1" |   version "0.3.1" | ||||||
|   resolved "https://registry.yarnpkg.com/fastify-error/-/fastify-error-0.3.1.tgz#8eb993e15e3cf57f0357fc452af9290f1c1278d2" |   resolved "https://registry.yarnpkg.com/fastify-error/-/fastify-error-0.3.1.tgz#8eb993e15e3cf57f0357fc452af9290f1c1278d2" | ||||||
| @@ -4014,6 +4022,11 @@ v8flags@^3.2.0: | |||||||
|   dependencies: |   dependencies: | ||||||
|     homedir-polyfill "^1.0.1" |     homedir-polyfill "^1.0.1" | ||||||
|  |  | ||||||
|  | vary@^1.1.2: | ||||||
|  |   version "1.1.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" | ||||||
|  |   integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= | ||||||
|  |  | ||||||
| verror@1.10.0: | verror@1.10.0: | ||||||
|   version "1.10.0" |   version "1.10.0" | ||||||
|   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" |   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user