├── .gitignore ├── LICENSE ├── README.md ├── api ├── github-contributors.ts ├── github-files.ts ├── github-members.ts ├── gmail.ts ├── goodreads.ts ├── instagram-highlights.ts ├── owntracks.ts ├── pocket-casts.ts ├── spotify.ts ├── wakatime.ts ├── wikipedia-summary.ts └── yoga.ts ├── config.yml ├── helpers ├── document.json ├── files.ts ├── github-user-pics.ts ├── github.ts ├── goodreads.ts ├── instagram.ts ├── open-street-maps.ts ├── spotify.ts └── tweet-generator.ts ├── now.json ├── package.json ├── public.asc ├── secrets.gpg ├── types └── pocketcasts.d.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Anand Chowdhary 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🔧 Services 2 | 3 | These are microservices for automating everyday tasks, written in TypeScript/Node.js and deployed to [ZEIT](https://zeit.co). 4 | 5 | **Endpoint:** [services.anandchowdhary.now.sh/api](https://services.anandchowdhary.now.sh/api/) 6 | 7 | ## ⭐ Endpoints 8 | 9 | ### `/wikipedia-summary` 10 | 11 | Returns the introductory text for a search term. [Try it →](https://services.anandchowdhary.now.sh/api/wikipedia-summary?q=GitHub) 12 | 13 | | Query param | Description | Example | 14 | | ----------- | ------------------------- | ----------- | 15 | | `q` | Search query | Oswald Labs | 16 | | `limit` | Max length of summary | 300 | 17 | | `min` | Minimum length of summary | 8 | 18 | | `cacheAge` | Seconds to cache for | 86400 | 19 | 20 | ### `/github-contributors` 21 | 22 | Returns an SVG image with profile pictures of contributors of a repository on GitHub. [Try it →](https://services.anandchowdhary.now.sh/api/github-contributors?repo=elninotech/uppload) 23 | 24 | | Query param | Description | Example | 25 | | -------------- | ---------------------------------- | ------------------ | 26 | | `repo` | GitHub repository path | elninotech/uppload | 27 | | `width` | Profile picture width in pixels | 85 | 28 | | `itemsPerLine` | Number of pictures per line | 8 | 29 | | `padding` | Padding between pictures in pixels | 5 | 30 | | `cacheAge` | Seconds to cache for | 86400 | 31 | 32 | ![Contributors](https://services.anandchowdhary.now.sh/api/github-contributors?repo=elninotech/uppload) 33 | 34 | ### `/github-members` 35 | 36 | Returns an SVG image with profile pictures of members of a repository on GitHub. [Try it →](https://services.anandchowdhary.now.sh/api/github-members?org=elninotech) 37 | 38 | | Query param | Description | Example | 39 | | -------------- | ---------------------------------- | ---------- | 40 | | `org` | GitHub organization name | elninotech | 41 | | `width` | Profile picture width in pixels | 85 | 42 | | `itemsPerLine` | Number of pictures per line | 8 | 43 | | `padding` | Padding between pictures in pixels | 5 | 44 | | `cacheAge` | Seconds to cache for | 86400 | 45 | 46 | ![Contributors](https://services.anandchowdhary.now.sh/api/github-members?org=elninotech) 47 | 48 | ### `/github-files` 49 | 50 | Returns a [Shields.io schema](https://shields.io/endpoint) for a badge with the number of files in a GitHub repository's directory. [Try it →](https://services.anandchowdhary.now.sh/api/github-files?repo=elninotech/uppload&path=src/i18n&subtract=1&label=i18n&message=%241%24%20language%24S%24&color=blueviolet) 51 | 52 | ![Badge example](https://img.shields.io/endpoint?url=https%3A%2F%2Fservices.anandchowdhary.now.sh%2Fapi%2Fgithub-files%3Frepo%3Delninotech%2Fuppload%26path%3Dsrc%2Fi18n%26subtract%3D1%26label%3Di18n%26message%3D%25241%2524%2520language%2524S%2524%26color%3Dblueviolet) 53 | 54 | | Query param | Description | Example | 55 | | ---------------------- | ----------------------------- | ------------------ | 56 | | `repo` | GitHub repository path | elninotech/uppload | 57 | | `path` | Directory path | src/i18n | 58 | | `add`1 | Add to number of files | 0 | 59 | | `subtract`1 | Subtract from number of files | 1 | 60 | | `label` | Shield label | i18n | 61 | | `message`2 | Shield message | $1$ language$S$ | 62 | | `color` | Shield color | blueviolet | 63 | | `cacheAge` | Seconds to cache for | 3600 | 64 | 65 | - 1 Add and subtract numbers can be used, for example, to subtract the index.html file and return the number of content files 66 | - 2 Special variables $1$ and $S$ are replaced with the number of files and pluralized "s" respectively 67 | 68 | ### Life data endpoints 69 | 70 | These endpoints are used as webhooks for a cron job, and fetch data from various web services' APIs and update my [Life Data GitHub repo](https://github.com/AnandChowdhary/life-data). 71 | 72 | | Endpoint | Description | File | 73 | | ----------------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------- | 74 | | `/spotify` | My top artists data from Spotify | [top-artists.yml](https://github.com/AnandChowdhary/life-data/blob/master/top-artists.yml) | 75 | | `/wakatime` | My programming data from Wakatime | [development.yml](https://github.com/AnandChowdhary/life-data/blob/master/development.yml) | 76 | | `/owntracks` | My real-time location from OwnTracks | [location.json](https://github.com/AnandChowdhary/life-data/blob/master/location.json) | 77 | | `/yoga` | My heart rate from HealthKit | [heart-rate.yml](https://github.com/AnandChowdhary/life-data/blob/master/heart-rate.yml) | 78 | | `/yoga` | My step count from HealthKit | [step-count.yml](https://github.com/AnandChowdhary/life-data/blob/master/step-count.yml) | 79 | | `/yoga` | My flights climbed from HealthKit | [flights-climbed.yml](https://github.com/AnandChowdhary/life-data/blob/master/flights-climbed.yml) | 80 | | `/yoga` | My distance from HealthKit | [distance.yml](https://github.com/AnandChowdhary/life-data/blob/master/distance.yml) | 81 | | `/yoga` | My active energy from HealthKit | [active-energy.yml](https://github.com/AnandChowdhary/life-data/blob/master/active-energy.yml) | 82 | | `/yoga` | My basal energy from HealthKit | [basal-energy.yml](https://github.com/AnandChowdhary/life-data/blob/master/basal-energy.yml) | 83 | | `/instagram-highlights` | My story highlights from Instagram | [instagram-highlights.json](https://github.com/AnandChowdhary/life-data/blob/master/instagram-highlights.json) | 84 | | `/pocket-casts` | My podcasts list from Pocket Casts | [podcasts.yml](https://github.com/AnandChowdhary/life-data/blob/master/podcasts.yml) | 85 | | `/pocket-casts` | My listening history from Pocket Casts | [podcast-history.yml](https://github.com/AnandChowdhary/life-data/blob/master/podcast-history.yml) | 86 | | `/gmail` | My email summary from Gmail | [emails.yml](https://github.com/AnandChowdhary/life-data/blob/master/emails.yml) | 87 | 88 | ## 💻 Development 89 | 90 | Several secret keys are required to run these services, particularly my private access tokens for third-party services. 91 | 92 | - Locally, they are available in the `.env` file. 93 | - On Now, they come from `now.json` using Now Secrets 94 | - As backup, the are available in this repo in [`secrets.gpg`](./secrets.gpg), using the public key [`public.asc`](./public.asc) (also [on OpenPGP](https://keys.openpgp.org/search?q=mail%40anandchowdhary.com)) 95 | 96 | ## 📄 License 97 | 98 | [MIT](https://github.com/AnandChowdhary/services/blob/master/LICENSE) © [Anand Chowdhary](https://anandchowdhary.com) 99 | -------------------------------------------------------------------------------- /api/github-contributors.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { githubUserPics } from "../helpers/github-user-pics"; 3 | 4 | export default async (req: NowRequest, res: NowResponse) => { 5 | return await githubUserPics( 6 | req, 7 | res, 8 | `https://api.github.com/repos/${req.query.repo}/contributors` 9 | ); 10 | }; 11 | -------------------------------------------------------------------------------- /api/github-files.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import axios, { AxiosResponse } from "axios"; 3 | import { File } from "../helpers/github"; 4 | 5 | type Contents = File | File[]; 6 | 7 | export default async (req: NowRequest, res: NowResponse) => { 8 | try { 9 | const response = (await axios.get( 10 | `https://api.github.com/repos/${req.query.repo}/contents/${req.query.path}`, 11 | { 12 | headers: { 13 | Authorization: `token ${process.env.ACCESS_TOKEN}`, 14 | "User-Agent": "AnandChowdhary/services" 15 | } 16 | } 17 | )) as AxiosResponse; 18 | const files = response.data; 19 | if (!Array.isArray(files)) throw new Error("Not a directory"); 20 | const add = parseInt(req.query.add as string) || 0; 21 | const subtract = parseInt(req.query.subtract as string) || 0; 22 | const number = files.length + add - subtract; 23 | const label = req.query.label || req.query.path; 24 | const message = ((req.query.message as string) || "$1$ file$S$") 25 | .replace(/\$1\$/g, number.toString()) 26 | .replace(/\$S\$/g, number === 1 ? "" : "s"); 27 | const color = req.query.color || "orange"; 28 | res.setHeader( 29 | "Cache-Control", 30 | `max-age=${req.query.cacheAge || 3600}, public` 31 | ); 32 | return res.json({ schemaVersion: 1, label, message, color }); 33 | } catch (error) { 34 | return res.status(500).json({ error: "Unable to generate schema" }); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /api/github-members.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { githubUserPics } from "../helpers/github-user-pics"; 3 | 4 | export default async (req: NowRequest, res: NowResponse) => { 5 | return await githubUserPics( 6 | req, 7 | res, 8 | `https://api.github.com/orgs/${req.query.org}/members` 9 | ); 10 | }; 11 | -------------------------------------------------------------------------------- /api/gmail.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { google } from "googleapis"; 3 | import { safeDump } from "js-yaml"; 4 | import { writeGitHubFile } from "../helpers/github"; 5 | 6 | const oauth2Client = new google.auth.OAuth2( 7 | process.env.GMAIL_CLIENT_ID, 8 | process.env.GMAIL_CLIENT_SECRET, 9 | "https://developers.google.com/oauthplayground" 10 | ); 11 | oauth2Client.setCredentials({ 12 | access_token: process.env.GMAIL_ACCESS, 13 | refresh_token: process.env.GMAIL_REFRESH 14 | }); 15 | 16 | const gmail = google.gmail("v1"); 17 | 18 | export default async (req: NowRequest, res: NowResponse) => { 19 | try { 20 | const today = new Date(); 21 | const yesterday = new Date( 22 | today.getFullYear(), 23 | today.getMonth(), 24 | today.getDate() - 1 25 | ); 26 | const lastWeek = new Date( 27 | today.getFullYear(), 28 | today.getMonth(), 29 | today.getDate() - 7 30 | ); 31 | const sentLastWeek = ( 32 | await gmail.users.messages.list({ 33 | userId: "me", 34 | q: `in:sent after:${lastWeek.getUTCFullYear()}/${lastWeek.getUTCMonth() + 35 | 1}/${lastWeek.getUTCDate()}`, 36 | auth: oauth2Client 37 | }) 38 | ).data.resultSizeEstimate; 39 | const sentToday = ( 40 | await gmail.users.messages.list({ 41 | userId: "me", 42 | q: `in:sent after:${yesterday.getUTCFullYear()}/${yesterday.getUTCMonth() + 43 | 1}/${yesterday.getUTCDate()}`, 44 | auth: oauth2Client 45 | }) 46 | ).data.resultSizeEstimate; 47 | const receivedLastWeek = ( 48 | await gmail.users.messages.list({ 49 | userId: "me", 50 | q: `after:${lastWeek.getUTCFullYear()}/${lastWeek.getUTCMonth() + 51 | 1}/${lastWeek.getUTCDate()}`, 52 | auth: oauth2Client 53 | }) 54 | ).data.resultSizeEstimate; 55 | const receivedToday = ( 56 | await gmail.users.messages.list({ 57 | userId: "me", 58 | q: `after:${yesterday.getUTCFullYear()}/${yesterday.getUTCMonth() + 59 | 1}/${yesterday.getUTCDate()}`, 60 | auth: oauth2Client 61 | }) 62 | ).data.resultSizeEstimate; 63 | const result = safeDump({ 64 | sentLastWeek, 65 | receivedLastWeek, 66 | sentToday, 67 | receivedToday, 68 | lastUpdated: new Date() 69 | }); 70 | await writeGitHubFile( 71 | "AnandChowdhary/life-data", 72 | "emails.yml", 73 | `📧 ${sentToday} sent, ${receivedToday} received`, 74 | result 75 | ); 76 | return res.json({ done: true }); 77 | } catch (error) { 78 | res.status(500); 79 | res.json({ error }); 80 | } 81 | }; 82 | -------------------------------------------------------------------------------- /api/goodreads.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { getGoodreadBooks } from "../helpers/goodreads"; 3 | import { safeDump } from "js-yaml"; 4 | import { writeGitHubFile } from "../helpers/github"; 5 | 6 | export default async (req: NowRequest, res: NowResponse) => { 7 | try { 8 | const result = [ 9 | ...(await getGoodreadBooks("currently-reading")), 10 | ...(await getGoodreadBooks("read")) 11 | ] 12 | .sort( 13 | (a, b) => 14 | new Date(a.readAt || a.dateAdded).getTime() - 15 | new Date(b.readAt || b.dateAdded).getTime() 16 | ) 17 | .reverse(); 18 | const booksMap = new Map(result.map(o => [o.title, o])); 19 | const uniqueBooks = [...booksMap.values()]; 20 | await writeGitHubFile( 21 | "AnandChowdhary/life-data", 22 | "books.yml", 23 | `📘 ${[...uniqueBooks] 24 | .slice(0, 5) 25 | .map(i => i.title) 26 | .join(", ")}`, 27 | safeDump(uniqueBooks) 28 | ); 29 | res.json({ done: true }); 30 | } catch (error) { 31 | res.status(500); 32 | console.log(error); 33 | res.json({ error }); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /api/instagram-highlights.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { 3 | IgApiClient, 4 | HighlightsRepositoryHighlightsTrayResponseTrayItem 5 | } from "instagram-private-api"; 6 | import { writeGitHubFile } from "../helpers/github"; 7 | import { safeResult, safeHighlight } from "../helpers/instagram"; 8 | const ig = new IgApiClient(); 9 | ig.state.generateDevice(process.env.IG_USERNAME); 10 | 11 | const safeFirst = (i: HighlightsRepositoryHighlightsTrayResponseTrayItem[]) => 12 | i.length ? i[0] : undefined; 13 | 14 | const updateInstagramStoryData = async () => { 15 | await ig.simulate.preLoginFlow(); 16 | await ig.account.login(process.env.IG_USERNAME, process.env.IG_PASSWORD); 17 | process.nextTick(async () => await ig.simulate.postLoginFlow()); 18 | const igAccount = await ig.user.searchExact(process.env.IG_USERNAME); 19 | const tray = await ig.highlights.highlightsTray(igAccount.pk); 20 | const media = await ig.feed 21 | .reelsMedia({ userIds: tray.tray.map(x => x.id) }) 22 | .items(); 23 | const items = [...media].map(i => safeResult(i)); 24 | const highlights = new Set(); 25 | items.forEach(item => { 26 | item.highlightId.forEach((i: string) => highlights.add(i)); 27 | }); 28 | const highlightData: any = {}; 29 | highlights.forEach(highlight => { 30 | highlightData[highlight] = { 31 | meta: safeHighlight(safeFirst(tray.tray.filter(i => i.id === highlight))), 32 | data: items.filter(i => i.highlightId.includes(highlight)) 33 | }; 34 | }); 35 | await writeGitHubFile( 36 | "AnandChowdhary/life-data", 37 | "instagram-highlights.json", 38 | "🌇 Update Instagram highlights", 39 | JSON.stringify(highlightData, null, 2) 40 | ); 41 | }; 42 | 43 | export default async (req: NowRequest, res: NowResponse) => { 44 | try { 45 | await updateInstagramStoryData(); 46 | return res.json({ done: true }); 47 | } catch (error) { 48 | res.status(500); 49 | res.json({ error }); 50 | } 51 | }; 52 | -------------------------------------------------------------------------------- /api/owntracks.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { reverseGeocoding } from "../helpers/open-street-maps"; 3 | import { writeGitHubFile, readGitHubFile } from "../helpers/github"; 4 | import axios from "axios"; 5 | 6 | interface OwnTracks { 7 | cog: number; 8 | batt: number; 9 | lon: number; 10 | acc: number; 11 | vel: number; 12 | vac: number; 13 | bs: number; 14 | lat: number; 15 | topic: string; 16 | t: string; 17 | conn: string; 18 | tst: number; 19 | alt: number; 20 | } 21 | 22 | const statusify = (status: number) => { 23 | if (status === 1) return "unplugged"; 24 | if (status === 2) return "charging"; 25 | if (status === 3) return "full"; 26 | return "unknown"; 27 | }; 28 | 29 | const connectify = (status: string) => { 30 | if (status === "w") return "wireless"; 31 | if (status === "o") return "offline"; 32 | if (status === "m") return "mobile"; 33 | return "unknown"; 34 | }; 35 | 36 | export default async (req: NowRequest, res: NowResponse) => { 37 | try { 38 | const ownTracks: OwnTracks = { ...req.body }; 39 | if (!ownTracks || !Object.keys(ownTracks).length) 40 | throw new Error("No OwnTracks data found"); 41 | const details = await reverseGeocoding(ownTracks.lat, ownTracks.lon); 42 | const privateData = { 43 | accuracy: ownTracks.acc, 44 | altitude: ownTracks.alt, 45 | altitudeAccuracy: ownTracks.vac, 46 | battery: ownTracks.batt, 47 | batteryStatus: statusify(ownTracks.bs || 0), 48 | latitude: ownTracks.lat, 49 | longitude: ownTracks.lon, 50 | velocity: ownTracks.vel, 51 | device: ownTracks.topic, 52 | connection: connectify(ownTracks.conn || "u"), 53 | time: new Date(ownTracks.tst * 1000), 54 | ...details 55 | }; 56 | await writeGitHubFile( 57 | "AnandChowdhary/life-data-private", 58 | "location.json", 59 | `📍 ${details.display_name}`, 60 | JSON.stringify(privateData, null, 2) 61 | ); 62 | const publicData = { 63 | locality: details.address.locality, 64 | city: 65 | details.address.city || details.address.town || details.address.hamlet, 66 | village: details.address.village, 67 | county: details.address.county, 68 | suburb: details.address.suburb, 69 | state_district: details.address.state_district, 70 | state: details.address.state, 71 | country: details.address.country 72 | }; 73 | if (publicData.country === "United States of America") 74 | publicData.country = "United States"; 75 | const currentGitHubData = await readGitHubFile( 76 | "AnandChowdhary/life-data", 77 | "location.json" 78 | ); 79 | if ( 80 | currentGitHubData.content.replace(/\n/g, "") !== 81 | Buffer.from(JSON.stringify(publicData, null, 2)).toString("base64") && 82 | publicData.city 83 | ) { 84 | await axios.post( 85 | `https://maker.ifttt.com/trigger/location_changed/with/key/${process.env.IFTTT_WEBHOOK_LOCATION_KEY}`, 86 | { 87 | value1: `📍 ${publicData.city}, ${publicData.country}` 88 | }, 89 | { 90 | headers: { 91 | Accept: "application/json", 92 | "Content-Type": "application/json" 93 | } 94 | } 95 | ); 96 | await writeGitHubFile( 97 | "AnandChowdhary/life-data", 98 | "location.json", 99 | `📍 ${publicData.city}, ${publicData.country}`, 100 | JSON.stringify(publicData, null, 2) 101 | ); 102 | } 103 | return res.json({ success: true }); 104 | } catch (error) { 105 | console.log("Caught error", error); 106 | // Here, we keep 200 because OwnTracks would otherwise 107 | // keep sending requests until it sees a 200 108 | res.status(200); 109 | res.json({ error: "Unable to add OwnTracks data" }); 110 | } 111 | }; 112 | -------------------------------------------------------------------------------- /api/pocket-casts.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { safeDump } from "js-yaml"; 3 | import PocketCasts from "pocketcasts"; 4 | import { writeGitHubFile } from "../helpers/github"; 5 | 6 | const pocketCasts = new PocketCasts( 7 | process.env.POCKET_CASTS_USERNAME, 8 | process.env.POCKET_CASTS_PASSWORD 9 | ); 10 | 11 | export default async (req: NowRequest, res: NowResponse) => { 12 | try { 13 | await pocketCasts.login(); 14 | if (new Date().getDay() === 3) { 15 | const podcasts = (await pocketCasts.getList()).podcasts; 16 | const list = safeDump(podcasts); 17 | await writeGitHubFile( 18 | "AnandChowdhary/life-data", 19 | "podcasts.yml", 20 | `🎙️ ${[...podcasts] 21 | .slice(0, 5) 22 | .map(i => i.title) 23 | .join(", ")}`, 24 | list 25 | ); 26 | } 27 | const history = safeDump((await pocketCasts.getHistory()).episodes); 28 | await writeGitHubFile( 29 | "AnandChowdhary/life-data", 30 | "podcast-history.yml", 31 | "🎤 Update Pocket Cast history", 32 | history 33 | ); 34 | res.json({ done: true }); 35 | } catch (error) { 36 | res.status(500); 37 | res.json({ error }); 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /api/spotify.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { writeGitHubFile } from "../helpers/github"; 3 | import SpotifyAPI from "spotify-web-api-node"; 4 | import { safeDump } from "js-yaml"; 5 | import { 6 | cleanSpotifyArtistsResponse, 7 | cleanSpotifyTracksResponse 8 | } from "../helpers/spotify"; 9 | 10 | const spotify = new SpotifyAPI({ 11 | clientId: process.env.SPOTIFY_CLIENT_ID, 12 | clientSecret: process.env.SPOTIFY_CLIENT_SECRET, 13 | redirectUri: "https://anandchowdhary.com/test-callback", 14 | accessToken: process.env.SPOTIFY_ACCESS_TOKEN, 15 | refreshToken: process.env.SPOTIFY_REFRESH_TOKEN 16 | }); 17 | 18 | export default async (req: NowRequest, res: NowResponse) => { 19 | try { 20 | const data = await spotify.refreshAccessToken(); 21 | spotify.setAccessToken(data.body.access_token); 22 | if (!req.query.tracks) { 23 | const longTermArtists = cleanSpotifyArtistsResponse( 24 | ( 25 | await spotify.getMyTopArtists({ 26 | time_range: "long_term" 27 | }) 28 | ).body.items 29 | ); 30 | const mediumTermArtists = cleanSpotifyArtistsResponse( 31 | ( 32 | await spotify.getMyTopArtists({ 33 | time_range: "medium_term" 34 | }) 35 | ).body.items 36 | ); 37 | const shortTermArtists = cleanSpotifyArtistsResponse( 38 | ( 39 | await spotify.getMyTopArtists({ 40 | time_range: "short_term" 41 | }) 42 | ).body.items 43 | ); 44 | await writeGitHubFile( 45 | "AnandChowdhary/life-data", 46 | "top-artists.yml", 47 | `🎵 ${[...shortTermArtists] 48 | .slice(0, 5) 49 | .map(i => i.name) 50 | .join(", ")}`, 51 | safeDump({ 52 | longTermArtists, 53 | mediumTermArtists, 54 | shortTermArtists 55 | }) 56 | ); 57 | } 58 | const longTermTracks = cleanSpotifyTracksResponse( 59 | ( 60 | await spotify.getMyTopTracks({ 61 | time_range: "long_term" 62 | }) 63 | ).body.items 64 | ); 65 | const mediumTermTracks = cleanSpotifyTracksResponse( 66 | ( 67 | await spotify.getMyTopTracks({ 68 | time_range: "medium_term" 69 | }) 70 | ).body.items 71 | ); 72 | const shortTermTracks = cleanSpotifyTracksResponse( 73 | ( 74 | await spotify.getMyTopTracks({ 75 | time_range: "short_term" 76 | }) 77 | ).body.items 78 | ); 79 | await writeGitHubFile( 80 | "AnandChowdhary/life-data", 81 | "top-tracks.yml", 82 | `🎵 ${[...shortTermTracks] 83 | .slice(0, 5) 84 | .map(i => i.name) 85 | .join(", ")}`, 86 | safeDump({ 87 | longTermTracks, 88 | mediumTermTracks, 89 | shortTermTracks 90 | }) 91 | ); 92 | res.json({ done: true }); 93 | } catch (error) { 94 | res.status(500); 95 | res.json({ error: "Unable to add Spotify data" }); 96 | } 97 | }; 98 | -------------------------------------------------------------------------------- /api/wakatime.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import axios, { AxiosResponse } from "axios"; 3 | import { writeGitHubFile } from "../helpers/github"; 4 | import { safeDump } from "js-yaml"; 5 | 6 | interface WakatimeSummary { 7 | data: { 8 | languages: { 9 | name: number; 10 | digital: number; 11 | text: number; 12 | percent: number; 13 | }[]; 14 | daily_average_including_other_language: number; 15 | total_seconds_including_other_language: number; 16 | days_including_holidays: number; 17 | human_readable_daily_average_including_other_language: string; 18 | human_readable_total_including_other_language: string; 19 | start: string; 20 | end: string; 21 | }; 22 | } 23 | 24 | export default async (req: NowRequest, res: NowResponse) => { 25 | try { 26 | const summary = ((await axios.get( 27 | "https://wakatime.com/api/v1/users/current/stats/last_7_days", 28 | { 29 | headers: { 30 | Authorization: `Basic ${Buffer.from( 31 | process.env.WAKATIME_API_KEY 32 | ).toString("base64")}` 33 | } 34 | } 35 | )) as AxiosResponse).data; 36 | await writeGitHubFile( 37 | "AnandChowdhary/life-data", 38 | "development.yml", 39 | `👨‍💻 ${[...summary.data.languages] 40 | .slice(0, 5) 41 | .map(i => i.name) 42 | .join(", ")}`, 43 | safeDump({ 44 | start: summary.data.start, 45 | end: summary.data.end, 46 | total: summary.data.total_seconds_including_other_language, 47 | totalText: summary.data.human_readable_total_including_other_language, 48 | dailyAverage: summary.data.daily_average_including_other_language, 49 | dailyAverageText: 50 | summary.data.human_readable_daily_average_including_other_language, 51 | days: summary.data.days_including_holidays, 52 | languages: summary.data.languages 53 | }) 54 | ); 55 | res.json({ done: true }); 56 | } catch (error) { 57 | res.status(500); 58 | res.json({ error: "Unable to add Wakatime data" }); 59 | } 60 | }; 61 | -------------------------------------------------------------------------------- /api/wikipedia-summary.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import axios from "axios"; 3 | import truncate from "truncate-sentences"; 4 | 5 | const safeParam = (param: string | string[], value: number) => 6 | param && typeof param === "string" && !isNaN(parseInt(param)) 7 | ? parseInt(param) 8 | : value; 9 | 10 | export default async (req: NowRequest, res: NowResponse) => { 11 | try { 12 | const searchResults = ( 13 | await axios.get<{ 14 | query: { search: { title: string; pageid: string }[] }; 15 | }>( 16 | `https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=${encodeURIComponent( 17 | req.query.q as string 18 | )}` 19 | ) 20 | ).data; 21 | const pageId = searchResults.query.search[0].pageid; 22 | const pageResult = ( 23 | await axios.get<{ 24 | query: { 25 | pages: { [index: string]: { title: string; extract: string } }; 26 | }; 27 | }>( 28 | `https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&pageids=${pageId}` 29 | ) 30 | ).data; 31 | const limit = safeParam(req.query.length, 300); 32 | const result = truncate(pageResult.query.pages[pageId].extract, limit); 33 | const min = safeParam(req.query.length, 50); 34 | if (result.length < min) throw new Error("too short"); 35 | res.setHeader( 36 | "Cache-Control", 37 | `max-age=${req.query.cacheAge || 86400}, public` 38 | ); 39 | res.send(result); 40 | } catch (error) { 41 | res.status(404); 42 | res.json({ error: "not found" }); 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /api/yoga.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import { writeGitHubFile } from "../helpers/github"; 3 | import { safeDump } from "js-yaml"; 4 | 5 | export default async (req: NowRequest, res: NowResponse) => { 6 | try { 7 | const yogaData = { ...req.body }; 8 | if (!yogaData || !Object.keys(yogaData).length) 9 | throw new Error("No Yoga data found"); 10 | await writeGitHubFile( 11 | "AnandChowdhary/life-data-private", 12 | "health.json", 13 | `🌡 Update health data from iPhone`, 14 | JSON.stringify(yogaData, null, 2) 15 | ); 16 | const getSleepSamples = yogaData.getSleepSamples; 17 | if (getSleepSamples) 18 | await writeGitHubFile( 19 | "AnandChowdhary/life-data", 20 | "sleep.yml", 21 | "🛌 Update sleep data", 22 | safeDump(getSleepSamples) 23 | ); 24 | const getHeartRateSamples = yogaData.getHeartRateSamples; 25 | if (getHeartRateSamples) 26 | await writeGitHubFile( 27 | "AnandChowdhary/life-data", 28 | "heart-rate.yml", 29 | "💓 Update heart rate data", 30 | safeDump(getHeartRateSamples) 31 | ); 32 | const getDailyStepCountSamples = yogaData.getDailyStepCountSamples; 33 | if (getDailyStepCountSamples) 34 | await writeGitHubFile( 35 | "AnandChowdhary/life-data", 36 | "step-count.yml", 37 | "🚶 Update daily steps data", 38 | safeDump(getDailyStepCountSamples) 39 | ); 40 | const getDailyFlightsClimbedSamples = 41 | yogaData.getDailyFlightsClimbedSamples; 42 | if (getDailyFlightsClimbedSamples) 43 | await writeGitHubFile( 44 | "AnandChowdhary/life-data", 45 | "flights-climbed.yml", 46 | "🧗 Update flights climbed data", 47 | safeDump(getDailyFlightsClimbedSamples) 48 | ); 49 | const getDailyDistanceWalkingRunningSamples = 50 | yogaData.getDailyDistanceWalkingRunningSamples; 51 | if (getDailyDistanceWalkingRunningSamples) 52 | await writeGitHubFile( 53 | "AnandChowdhary/life-data", 54 | "distance.yml", 55 | "🚶 Update walking distance data", 56 | safeDump(getDailyDistanceWalkingRunningSamples) 57 | ); 58 | const getActiveEnergyBurned = yogaData.getActiveEnergyBurned; 59 | if (getActiveEnergyBurned) 60 | await writeGitHubFile( 61 | "AnandChowdhary/life-data", 62 | "active-energy.yml", 63 | "🏋️ Update active energy data", 64 | safeDump(getActiveEnergyBurned) 65 | ); 66 | const getBasalEnergyBurned = yogaData.getBasalEnergyBurned; 67 | if (getBasalEnergyBurned) 68 | await writeGitHubFile( 69 | "AnandChowdhary/life-data", 70 | "basal-energy.yml", 71 | "💪 Update basal energy data", 72 | safeDump(getBasalEnergyBurned) 73 | ); 74 | return res.json({ success: true }); 75 | } catch (error) { 76 | res.status(200); 77 | res.json({ error: "Unable to add Yoga data" }); 78 | } 79 | }; 80 | -------------------------------------------------------------------------------- /config.yml: -------------------------------------------------------------------------------- 1 | # These are document IDs to fetch for the `writing` repo 2 | # For example, "1Nwbt6I1YF6a20t3e3dlz5ID-zVSB2amYHth3YVdtTJQ" -> https://docs.google.com/document/d/1Nwbt6I1YF6a20t3e3dlz5ID-zVSB2amYHth3YVdtTJQ/edit# 3 | googleDocs: 4 | - 1Nwbt6I1YF6a20t3e3dlz5ID-zVSB2amYHth3YVdtTJQ 5 | -------------------------------------------------------------------------------- /helpers/files.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | export const imageToDataUri = async (url: string) => { 4 | const buffer = await axios.get( 5 | `https://images.weserv.nl/?url=${encodeURIComponent( 6 | url.replace("https://", "") 7 | )}&w=100&h=100&fit=cover&mask=circle&mbg=white&quality=50&output=jpg&encoding=base64` 8 | ); 9 | return buffer.data; 10 | }; 11 | -------------------------------------------------------------------------------- /helpers/github-user-pics.ts: -------------------------------------------------------------------------------- 1 | import { NowRequest, NowResponse } from "@now/node"; 2 | import axios, { AxiosResponse } from "axios"; 3 | import { User } from "../helpers/github"; 4 | import { imageToDataUri } from "../helpers/files"; 5 | 6 | const safeParam = (param: string | string[], value: number) => 7 | param && typeof param === "string" && !isNaN(parseInt(param)) 8 | ? parseInt(param) 9 | : value; 10 | 11 | export const githubUserPics = async ( 12 | req: NowRequest, 13 | res: NowResponse, 14 | url: string 15 | ) => { 16 | try { 17 | const width = safeParam(req.query.width, 85); 18 | const itemsPerLine = safeParam(req.query.itemsPerLine, 8); 19 | const padding = safeParam(req.query.padding, 5); 20 | const response = (await axios.get(url, { 21 | headers: { 22 | Authorization: `token ${process.env.ACCESS_TOKEN}`, 23 | "User-Agent": "AnandChowdhary/services" 24 | } 25 | })) as AxiosResponse; 26 | const contributors = response.data.filter( 27 | user => user.type !== "Bot" && !["ImgBotApp"].includes(user.login) 28 | ); 29 | res.setHeader( 30 | "Cache-Control", 31 | `max-age=${req.query.cacheAge || 86400}, public` 32 | ); 33 | res.setHeader("Content-Type", "image/svg+xml"); 34 | let images = ""; 35 | let i = 0; 36 | for await (const contributor of contributors) { 37 | images += `${contributor.login}`; 42 | i++; 43 | } 44 | return res.send(` 45 | 55 | ${images} 56 | 57 | `); 58 | } catch (error) { 59 | return res.status(500).json({ error: "Unable to generate image" }); 60 | } 61 | }; 62 | -------------------------------------------------------------------------------- /helpers/github.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosResponse } from "axios"; 2 | export interface File { 3 | name: string; 4 | path: string; 5 | sha: string; 6 | size: number; 7 | url: string; 8 | html_url: string; 9 | git_url: string; 10 | download_url: string; 11 | content: string; 12 | type: "file"; 13 | _links: { 14 | git: string; 15 | self: string; 16 | url: string; 17 | }; 18 | } 19 | 20 | export interface User { 21 | login: string; 22 | id: number; 23 | avatar_url: string; 24 | html_url: string; 25 | contributions: number; 26 | type: "User" | "Bot"; 27 | } 28 | 29 | export const readGitHubFile = async (repo: string, path: string) => { 30 | const currentContents = (await axios.get( 31 | `https://api.github.com/repos/${repo}/contents/${path}`, 32 | { 33 | headers: { 34 | "User-Agent": "AnandChowdhary/services", 35 | Authorization: `token ${process.env.FINDING_ANAND_ACCESS_TOKEN}` 36 | } 37 | } 38 | )) as AxiosResponse; 39 | return currentContents.data; 40 | }; 41 | 42 | export const writeGitHubFile = async ( 43 | repo: string, 44 | path: string, 45 | message: string, 46 | content: string, 47 | force = false 48 | ) => { 49 | const currentContents = (await axios.get( 50 | `https://api.github.com/repos/${repo}/contents/${path}`, 51 | { 52 | headers: { 53 | "User-Agent": "AnandChowdhary/services", 54 | Authorization: `token ${process.env.FINDING_ANAND_ACCESS_TOKEN}` 55 | } 56 | } 57 | )) as AxiosResponse; 58 | if ( 59 | currentContents.data.content.replace(/\n/g, "") === 60 | Buffer.from(content).toString("base64") && 61 | !force 62 | ) 63 | return; 64 | await axios.put( 65 | `https://api.github.com/repos/${repo}/contents/${path}`, 66 | { 67 | message, 68 | content: Buffer.from(content).toString("base64"), 69 | sha: currentContents.data.sha 70 | }, 71 | { 72 | headers: { 73 | "User-Agent": "AnandChowdhary/services", 74 | Authorization: `token ${process.env.FINDING_ANAND_ACCESS_TOKEN}`, 75 | Accept: "application/json", 76 | "Content-Type": "application/json" 77 | } 78 | } 79 | ); 80 | }; 81 | -------------------------------------------------------------------------------- /helpers/goodreads.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { xml2json } from "xml-js"; 3 | 4 | export const getGoodreadBooks = async (shelf: string) => { 5 | const result = []; 6 | const response = await axios.get( 7 | `https://www.goodreads.com/review/list/6784560.xml?shelf=${shelf}&key=${process.env.GOODREADS_KEY}&v=2`, 8 | { 9 | responseType: "text" 10 | } 11 | ); 12 | const json = JSON.parse(xml2json(response.data)); 13 | const books = json.elements 14 | .filter(i => i.name === "GoodreadsResponse")[0] 15 | .elements.filter(i => i.name === "reviews")[0].elements; 16 | for (const book of books) { 17 | let thisBook: any = {}; 18 | const bookDetails = book.elements.filter(i => i.name === "book")[0] 19 | .elements; 20 | try { 21 | const isbn = bookDetails.filter(i => i.name === "isbn")[0].elements[0] 22 | .text; 23 | thisBook.isbn = isbn; 24 | } catch (error) {} 25 | try { 26 | const isbn13 = bookDetails.filter(i => i.name === "isbn13")[0].elements[0] 27 | .text; 28 | thisBook.isbn13 = isbn13; 29 | } catch (error) {} 30 | try { 31 | const title = 32 | bookDetails.filter(i => i.name === "title")[0].elements[0].text || ""; 33 | thisBook.fullTitle = title; 34 | thisBook.title = title.split(":")[0]; 35 | } catch (error) {} 36 | try { 37 | const image_url = bookDetails.filter(i => i.name === "image_url")[0] 38 | .elements[0].text; 39 | thisBook.image_url = image_url; 40 | } catch (error) {} 41 | try { 42 | const large_image_url = bookDetails.filter( 43 | i => i.name === "large_image_url" 44 | )[0].elements[0].text; 45 | if (!thisBook.image_url && large_image_url) 46 | thisBook.image_url = large_image_url; 47 | } catch (error) {} 48 | try { 49 | const small_image_url = bookDetails.filter( 50 | i => i.name === "small_image_url" 51 | )[0].elements[0].text; 52 | if (!thisBook.image_url && small_image_url) 53 | thisBook.image_url = small_image_url; 54 | } catch (error) {} 55 | try { 56 | const link = bookDetails.filter(i => i.name === "link")[0].elements[0] 57 | .text; 58 | thisBook.link = link; 59 | } catch (error) {} 60 | try { 61 | const publisher = bookDetails.filter(i => i.name === "publisher")[0] 62 | .elements[0].text; 63 | thisBook.publisher = publisher; 64 | } catch (error) {} 65 | try { 66 | const authors = bookDetails.filter(i => i.name === "authors")[0] 67 | .elements[0].elements[1].elements[0].text; 68 | thisBook.author = authors; 69 | } catch (error) {} 70 | try { 71 | const rating = book.elements.filter(i => i.name === "rating")[0] 72 | .elements[0].text; 73 | thisBook.rating = rating; 74 | } catch (error) {} 75 | try { 76 | const dateAdded = book.elements.filter(i => i.name === "date_added")[0] 77 | .elements[0].text; 78 | thisBook.dateAdded = dateAdded; 79 | } catch (error) {} 80 | try { 81 | const startedAt = book.elements.filter(i => i.name === "started_at")[0] 82 | .elements[0].text; 83 | thisBook.startedAt = startedAt; 84 | } catch (error) {} 85 | try { 86 | const readAt = book.elements.filter(i => i.name === "read_at")[0] 87 | .elements[0].text; 88 | thisBook.readAt = readAt; 89 | } catch (error) {} 90 | try { 91 | const url = book.elements.filter(i => i.name === "url")[0].elements[0] 92 | .cdata; 93 | thisBook.url = url; 94 | } catch (error) {} 95 | result.push(thisBook); 96 | } 97 | return result; 98 | }; 99 | -------------------------------------------------------------------------------- /helpers/instagram.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ReelsMediaFeedResponseItem, 3 | HighlightsRepositoryHighlightsTrayResponseTrayItem, 4 | ReelsMediaFeedResponseImageVersions2 5 | } from "instagram-private-api"; 6 | 7 | const safeLocations = (locations: any) => 8 | (locations || []).map((data: any) => ({ 9 | name: data.location.name, 10 | address: data.location.address, 11 | city: data.location.city, 12 | shortName: data.location.short_name, 13 | latitude: data.location.lat, 14 | longitude: data.location.lng, 15 | facbookPlace: data.location.facebook_places_id 16 | })); 17 | 18 | const safeImages = (images: ReelsMediaFeedResponseImageVersions2) => 19 | images.candidates || []; 20 | 21 | export const safeHighlight = ( 22 | highlight: HighlightsRepositoryHighlightsTrayResponseTrayItem 23 | ) => ({ 24 | id: highlight.id, 25 | title: highlight.title, 26 | cover: highlight.cover_media.cropped_image_version.url 27 | }); 28 | 29 | export const safeResult = (result: ReelsMediaFeedResponseItem) => ({ 30 | date: new Date(result.taken_at * 1000), 31 | id: result.id, 32 | media_type: result.media_type, 33 | originalWidth: result.original_width, 34 | originalHeight: result.original_height, 35 | viewerCount: (result as any).viewer_count, 36 | story_locations: safeLocations((result as any).story_locations), 37 | highlightId: (result as any).highlight_reel_ids || [], 38 | images: safeImages(result.image_versions2) 39 | }); 40 | -------------------------------------------------------------------------------- /helpers/open-street-maps.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosResponse } from "axios"; 2 | 3 | interface NominatimResult { 4 | place_id: number; 5 | licence: string; 6 | lat: number; 7 | lon: number; 8 | display_name: string; 9 | address: { 10 | road?: string; 11 | town?: string; 12 | locality?: string; 13 | city: string; 14 | hamlet?: string; 15 | village?: string; 16 | county?: string; 17 | suburb?: string; 18 | state_district?: string; 19 | state?: string; 20 | postcode?: string; 21 | country: string; 22 | country_code: string; 23 | }; 24 | } 25 | 26 | export const reverseGeocoding = async (latitude: number, longitude: number) => { 27 | const result: AxiosResponse = await axios.get( 28 | `https://nominatim.openstreetmap.org/reverse?lat=${latitude}&lon=${longitude}&format=json` 29 | ); 30 | const data = { ...result.data }; 31 | data.display_name = 32 | data.display_name || data.address.city || data.address.country; 33 | delete data.lat; 34 | delete data.lon; 35 | delete data.licence; 36 | return data; 37 | }; 38 | -------------------------------------------------------------------------------- /helpers/spotify.ts: -------------------------------------------------------------------------------- 1 | const cleanSpotifyArtistResponse = (artist: SpotifyApi.ArtistObjectFull) => { 2 | delete artist.followers; 3 | delete artist.external_urls; 4 | delete artist.popularity; 5 | return artist; 6 | }; 7 | 8 | const cleanSpotifyTrackResponse = (track: SpotifyApi.TrackObjectFull) => { 9 | delete track.type; 10 | delete track.external_ids; 11 | delete track.popularity; 12 | delete track.available_markets; 13 | delete track.disc_number; 14 | delete track.duration_ms; 15 | delete track.external_urls; 16 | delete track.id; 17 | delete track.is_playable; 18 | delete track.linked_from; 19 | delete track.track_number; 20 | delete track.uri; 21 | delete track.external_ids; 22 | delete track.album.album_type; 23 | delete track.album.available_markets; 24 | delete track.album.external_urls; 25 | delete track.album.id; 26 | delete track.type; 27 | delete track.uri; 28 | return track; 29 | }; 30 | 31 | export const cleanSpotifyArtistsResponse = ( 32 | artists: SpotifyApi.ArtistObjectFull[] 33 | ) => { 34 | return artists.map(artist => cleanSpotifyArtistResponse(artist)); 35 | }; 36 | 37 | export const cleanSpotifyTracksResponse = ( 38 | tracks: SpotifyApi.TrackObjectFull[] 39 | ) => { 40 | return tracks.map(track => cleanSpotifyTrackResponse(track)); 41 | }; 42 | -------------------------------------------------------------------------------- /helpers/tweet-generator.ts: -------------------------------------------------------------------------------- 1 | const tweets = [ 2 | "Yo, I just saw $A$ in $1$", 3 | "It turns out $A$ is in $1$ now", 4 | "Just when I thought he's not around, $A$ is in $1$", 5 | "Am I the only one who just saw $A$ in $1$?", 6 | "Quit moving around! $A$ is in $1$ now.", 7 | "THIS JUST IN: $A$ is in $1$", 8 | "OKAY SO THIS JUST HAPPENED! $A$ is in $1$", 9 | "Haha so $A$ is in $1$ now, let's see what's next", 10 | "If you're looking for $A$, he's in $1$", 11 | "I'll tell you how it is: $A$ is in $1$", 12 | "I'm just sitting here... and $A$ is in $1$", 13 | "Maybe I should stalk someone else... but $A$ is in $1$", 14 | "I just saw $A$ in $1$ and I'm thinking... maybe I should do something better with my time?", 15 | "When I'm bored, I try to find $A$. He's in $1$.", 16 | "To all those who are looking for $A$: he's in $1$", 17 | "You didn't hear it from me, but $A$ is in $1$", 18 | "Don't tell him I told you, but $A$ is in $1$", 19 | "Locating... locating... loca---FOUND! $A$ is in $1$", 20 | "Have you been to $1$? That's where $A$ is", 21 | "me:\n$A$: is in $1$", 22 | "I'm going to tell my kids $A$ is in $1$", 23 | "world: exists\n$A$: goes to $1$", 24 | "I'm soooo bored... Oh, and $A$ is in $1$", 25 | "He's just been on the move, guys! $A$ is now in $1$!", 26 | "Whaaatttttt!!!! $A$ is in $1$!!!!", 27 | "That's my kind of city... $1$. That's where $A$ is.", 28 | "I always say: Where do you find $A$? In $1$, that's where.", 29 | "To all the boys i've loved before... $A$ is in $1$", 30 | "Just keep stalking, $A$ is in $1$ https://imgflip.com/i/3hr2f6", 31 | "But $A$ is in $1$!!! https://imgflip.com/i/3hr2ie", 32 | "That's what I do... $A$ is in $1$ https://imgflip.com/i/3hr2rg", 33 | "Oh my my my $A$ is in $1$ https://imgflip.com/i/3hr2ul", 34 | "That's right $A$ is in $1$ https://imgflip.com/i/3hr336", 35 | "You really think so? BTW it's $1$ https://imgflip.com/i/3hr35u", 36 | "Oh by the way, $A$ is currently hanging out in $1$", 37 | "Is $1$ the best stop to hang out in? That's where $A$ is so idk", 38 | "You might try but $1$ is where $A$ is https://imgflip.com/i/3hr3c6", 39 | "That's just what I do... $A$ is in $1$ https://imgflip.com/i/3hr3ee", 40 | "Okay boomer, $A$ is @ $1$ https://imgflip.com/i/3hr3iq", 41 | "Seriously, $A$ is in $1$ https://imgflip.com/i/3hr3oq", 42 | "You really think I'm creepy? :( $A$ is in $1$ https://imgflip.com/i/3hr3s3", 43 | "I swear $A$ is in $1$ https://imgflip.com/i/3hr3v6", 44 | "You don't want to get on my bad side, $1$ is where $A$ is https://imgflip.com/i/3hr3yp", 45 | "But I did find $A$ in $1$ https://imgflip.com/i/3hr40t", 46 | "Safety first, $A$ is in $1$ https://imgflip.com/i/3hr4d6", 47 | "Okay boomer, $A$ is @ $1$ https://imgflip.com/i/3hr4gl", 48 | "So he agrees! $A$ is in $1$ https://imgflip.com/i/3hr4jw", 49 | "Don't @ me but $A$ is in $1$", 50 | "So for everyone, $A$ is now in $1$ https://imgflip.com/i/3hr4od", 51 | "I promise 100% approval. Or not. Or $A$ is in $1$. One of them. https://imgflip.com/i/3hr4sw", 52 | "So $A$ was last seen in $1$ https://imgflip.com/i/3hr4y2", 53 | "If you want to find $A$, you must go to $1$", 54 | "Let's see where $A$ is... OH $1$ https://imgflip.com/i/3hr527", 55 | "Brace brace! $A$ is in $1$ https://imgflip.com/i/3hr57h", 56 | "Everyone knows it's me! $A$ is in $1$ https://imgflip.com/i/3hr599", 57 | "Because you made me, $A$ is in $1$ https://imgflip.com/i/3hr5do", 58 | "Not easy to find but $A$ is in $1$ https://imgflip.com/i/3hr5fr", 59 | "Bad luck $A$, at $1$ https://imgflip.com/i/3hr5i6", 60 | "Yeah, because I didn't... $A$ is in $1$ btw https://imgflip.com/i/3hr5l4", 61 | "That's what $A$ said but he's in $1$ now https://imgflip.com/i/3hr5p0", 62 | "Everywhere... $A$ is in $1$ right now though https://imgflip.com/i/3huqp2", 63 | "Nah thanks, I'm good... $A$ is in $1$ https://imgflip.com/i/3huqti", 64 | "Okay I will, but $A$ is in $1$ https://imgflip.com/i/3huqzg", 65 | "Well yes but $A$ is in $1$ https://imgflip.com/i/3hur4k", 66 | "roses are red\nviolets are blue\n$A$ is currently in\n$1$", 67 | "I WANT YOU but $A$ is in $1$ https://imgflip.com/i/3hurai", 68 | "That is pretty good... and $A$ is in $1$ https://imgflip.com/i/3hurdh", 69 | "Okay Mr. President, $A$ is in $1$ https://imgflip.com/i/3hurgl", 70 | "Do you think $A$ is in $1$? I do! https://imgflip.com/i/3hurl2", 71 | "But if you think $A$ is in $1$, you're right https://imgflip.com/i/3huro9", 72 | "Okay internet, $A$ is in $1$ https://imgflip.com/i/3hurq0", 73 | "At least you guys agree... $A$ is in $1$ https://imgflip.com/i/3hurs0", 74 | "I remember! $A$ is in $1$ https://imgflip.com/i/3hurv1", 75 | "Do we really want that? $A$ is in $1$ https://imgflip.com/i/3hurxp", 76 | "He's really angry lol... $A$ is in $1$ https://imgflip.com/i/3hus1b" 77 | ]; 78 | 79 | export const generateLocationTweet = (location: string) => { 80 | const randomTweet = tweets[Math.floor(Math.random() * tweets.length)]; 81 | return randomTweet.replace("$A$", "@AnandChowdhary").replace("$1$", location); 82 | }; 83 | -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "ACCESS_TOKEN": "@access_token", 4 | "SPOTIFY_CLIENT_ID": "@spotify_client_id", 5 | "SPOTIFY_CLIENT_SECRET": "@spotify_client_secret", 6 | "SPOTIFY_ACCESS_TOKEN": "@spotify_access_token", 7 | "SPOTIFY_REFRESH_TOKEN": "@spotify_refresh_token", 8 | "FINDING_ANAND_ACCESS_TOKEN": "@finding_anand_access_token", 9 | "WAKATIME_API_KEY": "@wakatime_api_key", 10 | "IFTTT_WEBHOOK_LOCATION_KEY": "@ifttt_webhook_location_key", 11 | "GOODREADS_API_KEY": "@goodreads_api_key", 12 | "IG_USERNAME": "@ig_username", 13 | "IG_PASSWORD": "@ig_password", 14 | "POCKET_CASTS_USERNAME": "@pocket_casts_username", 15 | "POCKET_CASTS_PASSWORD": "@pocket_casts_password", 16 | "GMAIL_REFRESH": "@gmail_refresh", 17 | "GMAIL_ACCESS": "@gmail_access", 18 | "GMAIL_CLIENT_ID": "@gmail_client_id", 19 | "GMAIL_CLIENT_SECRET": "@gmail_client_secret", 20 | "GOOGLE_DOCS_REFRESH": "@google_docs_refresh", 21 | "GOOGLE_DOCS_ACCESS": "@google_docs_access", 22 | "GOOGLE_DOCS_CLIENT_ID": "@google_docs_client_id", 23 | "GOOGLE_DOCS_CLIENT_SECRET": "@google_docs_client_secret", 24 | "GOODREADS_KEY": "@goodreads_key", 25 | "GOODREADS_SECRET": "@goodreads_secret" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "services", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "git@github.com:AnandChowdhary/services.git", 6 | "author": "Anand Chowdhary ", 7 | "license": "MIT", 8 | "scripts": { 9 | "lint": "prettier '**/*.ts' --write", 10 | "local": "now dev" 11 | }, 12 | "devDependencies": { 13 | "@now/node": "^1.2.0", 14 | "@types/js-yaml": "^3.12.1", 15 | "@types/spotify-web-api-node": "^4.0.1", 16 | "husky": "^3.1.0", 17 | "prettier": "^1.19.1" 18 | }, 19 | "husky": { 20 | "hooks": { 21 | "pre-commit": "npm run lint && git add ." 22 | } 23 | }, 24 | "dependencies": { 25 | "axios": "^0.21.1", 26 | "googleapis": "^47.0.0", 27 | "instagram-private-api": "^1.37.1", 28 | "js-yaml": "^3.13.1", 29 | "pocketcasts": "^1.0.1", 30 | "spotify-web-api-node": "^4.0.0", 31 | "truncate-sentences": "^1.0.0", 32 | "xml-js": "^1.6.11" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | mQENBF13Pb4BCAC/VzFnDwpGVEoamcVmBA7DTCZRqWLyDZwcx5XaiQ1xFfD6tbWg 4 | +nblH05nOoka/koQcxC578bBFDq3RNxBpx8c0EQEos0cwUEpv3VOZrxQwOgxjeEC 5 | odWgNLBvisdPXnf5wI2/DSbWtEUZB2/LS5N1pXlvHjWs8jcJoVlSlMX5Q9JMJGjO 6 | F2z0fAT578y1t0LfaowrpYYAuOdRXZOlsxJ41mZe9xkC1zkLxqJo5yvimdNCHhN5 7 | euWWNQBnM817LLWkV9Tgun7Z9S/nAl/AsdI9djwdlNM3XirisKb9xtbtDU+HAK76 8 | 3KVDnkGMvwucBI+ZImz5Q/44+fAwk0Y00MVBABEBAAG0KUFuYW5kIENob3dkaGFy 9 | eSA8bWFpbEBhbmFuZGNob3dkaGFyeS5jb20+iQFOBBMBCAA4FiEEaMCSWq1mml6E 10 | HX6pkERxboLzmY0FAl13Pb4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ 11 | kERxboLzmY2GFwf/Q6+V8gD84Cs/uxe6i8d734R+7mzk5rwkdErmBzBUKDDjCTPu 12 | wM7yTRtDpENzYegUu9LP9GfRVsWO54Nmx82r0QT6ZUDbL+PnmHZb83RKRozEEGUR 13 | eNXuwYF18GMiqnT57P9ft4ozAqzLz3ovF7owt5qrp3YRN2nL861f4/x+7/4pVYrw 14 | sos405JWb5TcIZAbwsvuFbl4zIvSdKraOub3uvlBkUzZHNUCoHwbZbyh51sCcqd4 15 | fNNpBxGgqW/PDCVs40Qxa13oamLNkK76AkO1e3un4FXAKHjhD0h1mSxuFdPap6cG 16 | SrBFn2s+WNDoagR1FEmFfIOsSKSsjrVZdsTK0LkBDQRddz2+AQgAxbuRWWO7jfjq 17 | 3/n87hgo5WXDJoPBHhVW3D2MJPQOY+FG0UGJE6zCNDDOUMFyFGnlrgAA+d3XbDIQ 18 | RlbYde0ZVH3z+M8ttqUEcxfjq7jlUyPq4iUjiXTjSOCq/VYVrR96YIoDzB0TZnFt 19 | mXyHItrwThZ4AhP4r3CuBTq47I/BMGBeQo/4NtNZBUTsVbQAI6w/FKuDyqsKm/Xq 20 | +yl/kzxEf78h/Zl8kUkfeMHJM0UQ0t7W7f6Z1uMmi+7xGAr0BDHTg68lGDNqqVQ9 21 | 3JR8j6S3G36ll1Yn5tosmw/1AabHqtmGCnmEdwh1jPHvIDbRNysg7m9HXAK+zaPq 22 | q0jM3xKPoQARAQABiQE2BBgBCAAgFiEEaMCSWq1mml6EHX6pkERxboLzmY0FAl13 23 | Pb4CGwwACgkQkERxboLzmY3c9gf/TmwB+8ToQYqFAukelKaIWCL88AfMwwcdmpRR 24 | NyWSrWQpsdueS4yl7ggS50VEHahMePPJsVIW33L9egPQ6rC26roFvATIUwJIsmcs 25 | D2qRGIEVSEP2q4mGX/toJtoHyveYQwLtHE+/KW/6gsK2Amg3KGX8U/RSmoDqbBzF 26 | 3SmKNUOlaTAnvNJSKVHjf5JKMUut1Tr1v5Vzhf7vScYi/eO4nTtc/ZczjAsIIVOD 27 | wpIGKBUh7OWhOLZ26SUS5RlJMIz0MJUpTIRkNmqdapqt2y005V8R5ik2AjzDPYS9 28 | Fbuf/LmuOhDAtPlgOoJ6lPM1ecKqvwLBYhsqsX4sruTZmhLsWw== 29 | =N8GX 30 | -----END PGP PUBLIC KEY BLOCK----- 31 | -------------------------------------------------------------------------------- /secrets.gpg: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP MESSAGE----- 2 | Version: BCPG v1.58 3 | 4 | hQEMA5BEcW6C85mNAQgAoWXeh9MpmfR0HkjWEeng2XU8P+OdWE2cxfqH+1IuEF0U 5 | dtNXCx9elx3a9VAY58phtvDWvWMnmOmVxvUBh9yq6/MG9cRP0BtfTX8ubgLEfCjJ 6 | nzE3NicBby0TjCWfWeX+6SQqNMy4s+NSqmoEAqHARwD1EdglBkywXyQsmn375W/Q 7 | GVDOj/eTLuLsKlR3ZIOWDLz/9DOwpX0+7hjQ2hAqVJNg4jJGX8adTm0HYovnaooT 8 | 7WxE4QjS88FL6hr16ck/5F6QLb4B7863DO8kFhsq4+aBRyskU1dpZaXXlYCkcmv2 9 | h+Pr+8tV9NvoILzfX8NeKt4y/o+FhzQ/dqnLCP8vodLEigHcjIyHtGw5N0n04Cdb 10 | K8ugFaGbq4ph/G/Npvi0ArXE5nzZ5fdYDTwqv7BR7MFHGUkFM8k02sEEBkJJdkv7 11 | 4BU9XZ1XWy0rx+rUsbue3tBpCXwuq+t6+r8PXnuLR73SswhVApRK57G/zEytuxJc 12 | r9UT1NLZ7Jwhl/sS2WvRhMemkOiF+iVL7wMNwqiT72rdf5AueUe47ax74B8IgwnY 13 | YMFT2qI6VQexw1dL2mI0oDOrevxCzgbRpsCQJBmsZmX672ykCZPxrJaZG9sv8SE7 14 | klq4tMdS6Fub21C8WPepFNVcTW/aqPqieuOnc9NDoRXCAgW57ceDUjrEz7D0WP18 15 | anMy1KgU4haNyJU2GQgMVKKKJftZF8BHihcvFxttgRwP2jUXQuGg8tA4vfv/Koz7 16 | jQNXo8NOc8DLw94DZP/2ZT+lm9CJBw0hajBzRs6vpMIQQ57vdCPloZOVV7dyFg/f 17 | NtJkkBKGuw4PNQqb+1+ZWPJavfgfKyhusojLZczYhzRaykhRk7nydO0SueroBVcO 18 | YlzTZotdhEMPivQjWkcx0b/Pgq/IM2TF+vrCKM2e9oD2HZay9yb2vswg6ZqmRA3T 19 | 1dTQkZ5kaZdeM1g5MMpncfSYEixHPq0BmlQapuXpMBidA4V0U/5feP+ltsmKWABA 20 | MDn51vbUVFaRABkHyWTl1UmwRV0jWgmkB/mH6BM5KOYGS5yWoB0u+j8BxZPNJaJ+ 21 | idH191Uu+2GjiDViSw3HYH+xXwYBnS+BowAW8QKPWbPXTBtV6DFdfO2sUjax+XjB 22 | aAkRUAeHVCagiEB7xn5MVpKkZaIxwKngacTeaiFsZGNTAmeEAQv/2hSV4NUpLR8J 23 | rXKwZTxeZJTmmA6hZuiYudYIpHba5QXH9G10kbN8W4+D7opeORhiN/EzUv7yZLU5 24 | OTCmYq11lGXTenpWHgdXP1QQ3tPrlfI26MySeIxhrOl6YmO7RdOs+0+a9WJqMXFY 25 | d9EwNanhhwypqVCxmGNhSaWFecILBeX3sEG1yXbI3s6ylRWzbntbtRifibbgYJJJ 26 | 7TCt/iVnk3xJA2NsylGM/ID10jAyToaDQAXNqIrA8bleTX6L+YV5vmoxvcPcC732 27 | j3aj1AxaSat3DoQqJsuwT8vadQUBlVf0rV8HonaWVQqzO/GpWAi3ZlQrT0HeAomB 28 | /wbaSjfUe9Q1Sf6gg4KxhK+XyDq1EIPCidfJ5v8yvB4MQmK1z451CuGYCVgAelci 29 | fwwZvO55WhH6QwNsfEzrLmQqyzSWE2d4ivH9ZRjE2zVL6oJJENExt94eInOnQAOv 30 | mkNHLngDoTPYBFQIi99CoMv3sCmtpbcz8OJtpNzgnyc7yVdsWH1CkMKtFkuuGvac 31 | d/2sfiZWPlXKHgvEc5ejpZeck/GvIXYZrG7llyeFRQoHU0i/K1AhDXbYdegHokmK 32 | RBmHzKMC/laiJEB7rR0UBNhl75NfvEY9wnanlP9m+UrlnLVuAf17sPtqWHRoM5e1 33 | D4UVwtBX1RdveKmoHfxa75cxYAaIUKXwI8xDs7lzii89DmZAvRRK0ORb5Pq3A0ur 34 | wmA/g90SLJBUIQWjBUaL3j+9/s6/anfMn3CF0iD3Z44ws1JbShsLxgeTuM/62oPQ 35 | 9UbUNjMQNmm/BD7D5Ezrc9VgdyPP5R1fSL8fOpVkAsG+9+3gayMoHAsmJzWNa59p 36 | VMwwNmPVQE8FK6bmW84DERI1dNKnV0p/L4zH6rLvEB9km/cHd0ktBWvUnZ1Bp1Ta 37 | UVV+4rkYWtCr+5/mgEbWQimv7NyX8QvGsbD82akQuVegCnSJ0MJrPklT+5c\u003d 38 | \u003dWi2H 39 | -----END PGP MESSAGE----- 40 | -------------------------------------------------------------------------------- /types/pocketcasts.d.ts: -------------------------------------------------------------------------------- 1 | interface Podcast { 2 | uuid: string; 3 | title: string; 4 | author: string; 5 | description: string; 6 | url: string; 7 | } 8 | 9 | interface MyPodcast extends Podcast { 10 | episodesSortOrder: number; 11 | autoStartFrom: number; 12 | lastEpisodePublished: string; 13 | unplayed: boolean; 14 | lastEpisodeUuid: string; 15 | lastEpisodePlayingStatus: number; 16 | lastEpisodeArchived: boolean; 17 | } 18 | 19 | interface Episode { 20 | uuid: string; 21 | url: string; 22 | published: string; 23 | duration: number; 24 | fileType: string; 25 | title: string; 26 | size: string; 27 | playingStatus: number; 28 | playedUpTo: number; 29 | starred: boolean; 30 | podcastUuid: string; 31 | podcastTitle: string; 32 | episodeType: string; 33 | episodeSeason: string; 34 | episodeNumber: string; 35 | isDeleted: boolean; 36 | } 37 | 38 | interface EpisodeList { 39 | total: number; 40 | episodes: Episode[]; 41 | } 42 | 43 | declare module "pocketcasts" { 44 | export default class PocketCasts { 45 | constructor(email: string, password: string); 46 | private post(path: string, json: any): Promise; 47 | private get(path: string): Promise; 48 | 49 | login(): Promise; 50 | 51 | getList(): Promise<{ podcasts: MyPodcast[] }>; 52 | getNewReleases(): Promise; 53 | getInProgress(): Promise; 54 | getStarred(): Promise; 55 | getHistory(): Promise; 56 | getStats(): Promise; 57 | getSearchResults({ 58 | term 59 | }: { 60 | term: string; 61 | }): Promise<{ podcasts: Podcast[] }>; 62 | getRecommendedEpisodes(): Promise; 63 | getCategories(): Promise; // 404 64 | getContent(): Promise; // 404 65 | getFeatured(): Promise; // 404 66 | getNetworkList(): Promise; // 404 67 | getPopular(): Promise; // 404 68 | getTrending(): Promise; // 404 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.5.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" 8 | integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.5.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 15 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@lifeomic/attempt@^3.0.0": 22 | version "3.0.0" 23 | resolved "https://registry.yarnpkg.com/@lifeomic/attempt/-/attempt-3.0.0.tgz#75fecc204f8b0ac18b5363b4404bb32450f01859" 24 | integrity sha512-Ibk4Vfl46dSrhtH5fHsrTA4waAuyP7/qcr3uo0mO70azRc6LWgJILlMy3B1oOvyiN9jQcdqwsThaQkPKLiYKTg== 25 | 26 | "@now/node@^1.2.0": 27 | version "1.2.0" 28 | resolved "https://registry.yarnpkg.com/@now/node/-/node-1.2.0.tgz#9d8ee325b3fbf9cd453d00419f3cbe7819cb3ac3" 29 | integrity sha512-Opa2zADScP524xinCnfIug/8DzrXvNZhI6eUVPHBcnSxsRgVQphhUop9l3gRvepT77tfe1yuL3IsKUdTN51oOA== 30 | dependencies: 31 | "@types/node" "*" 32 | 33 | "@types/bluebird@*": 34 | version "3.5.29" 35 | resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.29.tgz#7cd933c902c4fc83046517a1bef973886d00bdb6" 36 | integrity sha512-kmVtnxTuUuhCET669irqQmPAez4KFnFVKvpleVRyfC3g+SHD1hIkFZcWLim9BVcwUBLO59o8VZE4yGCmTif8Yw== 37 | 38 | "@types/caseless@*": 39 | version "0.12.2" 40 | resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" 41 | integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== 42 | 43 | "@types/chance@^1.0.2": 44 | version "1.0.8" 45 | resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.0.8.tgz#48e0a5648f54487a9128915fe090154fb1a2f348" 46 | integrity sha512-S1VWROFGexiUYyBFsP0NRjp6PkJ4rKECQ3HQJ0cJKW/2BcNyas9lXATRdnTNnN4CsICjEXTltAalAo8dJQQLKg== 47 | 48 | "@types/js-yaml@^3.12.1": 49 | version "3.12.1" 50 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" 51 | integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== 52 | 53 | "@types/node@*": 54 | version "12.12.12" 55 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.12.tgz#529bc3e73dbb35dd9e90b0a1c83606a9d3264bdb" 56 | integrity sha512-MGuvYJrPU0HUwqF7LqvIj50RZUX23Z+m583KBygKYUZLlZ88n6w28XRNJRJgsHukLEnLz6w6SvxZoLgbr5wLqQ== 57 | 58 | "@types/normalize-package-data@^2.4.0": 59 | version "2.4.0" 60 | resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" 61 | integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== 62 | 63 | "@types/request-promise@^4.1.43": 64 | version "4.1.45" 65 | resolved "https://registry.yarnpkg.com/@types/request-promise/-/request-promise-4.1.45.tgz#7fcdd39fd920674ab7bfb44197270f225fb4e585" 66 | integrity sha512-KFagTY/a7CzAj86DkhaAtqP0ViYTNam+CfEokSwtPFUIuq9Qrq+Rq2X4nuaB6OJmM2s0xWeiS085Ro7vR0tt9Q== 67 | dependencies: 68 | "@types/bluebird" "*" 69 | "@types/request" "*" 70 | 71 | "@types/request@*": 72 | version "2.48.4" 73 | resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.4.tgz#df3d43d7b9ed3550feaa1286c6eabf0738e6cf7e" 74 | integrity sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw== 75 | dependencies: 76 | "@types/caseless" "*" 77 | "@types/node" "*" 78 | "@types/tough-cookie" "*" 79 | form-data "^2.5.0" 80 | 81 | "@types/spotify-api@*": 82 | version "0.0.1" 83 | resolved "https://registry.yarnpkg.com/@types/spotify-api/-/spotify-api-0.0.1.tgz#64657f24616ade5d41bf37876cd1a9a4ae7bf349" 84 | integrity sha512-U04VetSyHF/hceog6JbpzukMjEiYzqLu4+nXIeAGTrJuW8f+3cDN/Igw7HBtdvLtGE1FUR6E22ILotnsB9cpgA== 85 | 86 | "@types/spotify-web-api-node@^4.0.1": 87 | version "4.0.1" 88 | resolved "https://registry.yarnpkg.com/@types/spotify-web-api-node/-/spotify-web-api-node-4.0.1.tgz#0a2b85a1d40ae312de37deeb3c7e85bf7f4e6812" 89 | integrity sha512-uxoz7DcSj/v2URDo54FjzctIfdQdEFvmUreHrR26G/Vf0Qm5S0lbt7LdKJeW2EoWUzzfjetYV3TcfMxRm1bWIw== 90 | dependencies: 91 | "@types/spotify-api" "*" 92 | 93 | "@types/tough-cookie@*": 94 | version "2.3.6" 95 | resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.6.tgz#c880579e087d7a0db13777ff8af689f4ffc7b0d5" 96 | integrity sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ== 97 | 98 | abort-controller@^3.0.0: 99 | version "3.0.0" 100 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" 101 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 102 | dependencies: 103 | event-target-shim "^5.0.0" 104 | 105 | afinn-165@^1.0.2: 106 | version "1.0.3" 107 | resolved "https://registry.yarnpkg.com/afinn-165/-/afinn-165-1.0.3.tgz#3968346229659bad79f9655017087c1771cc9eb6" 108 | integrity sha512-LTwJcUGRzjQCR6uQCXMEUkoecezmWNjyWRjPm9pv0WlIYtLLaOnVsR1RvAdSMgOJPTFNlxS1IkfXxrkmV+gcyQ== 109 | 110 | agent-base@5: 111 | version "5.1.1" 112 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" 113 | integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== 114 | 115 | ajv@^6.5.5: 116 | version "6.10.2" 117 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 118 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 119 | dependencies: 120 | fast-deep-equal "^2.0.1" 121 | fast-json-stable-stringify "^2.0.0" 122 | json-schema-traverse "^0.4.1" 123 | uri-js "^4.2.2" 124 | 125 | ansi-styles@^3.2.1: 126 | version "3.2.1" 127 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 128 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 129 | dependencies: 130 | color-convert "^1.9.0" 131 | 132 | apparatus@^0.0.10: 133 | version "0.0.10" 134 | resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e" 135 | integrity sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg== 136 | dependencies: 137 | sylvester ">= 0.0.8" 138 | 139 | argparse@^1.0.7: 140 | version "1.0.10" 141 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 142 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 143 | dependencies: 144 | sprintf-js "~1.0.2" 145 | 146 | arrify@^2.0.0: 147 | version "2.0.1" 148 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 149 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 150 | 151 | asn1@~0.2.3: 152 | version "0.2.4" 153 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 154 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 155 | dependencies: 156 | safer-buffer "~2.1.0" 157 | 158 | assert-plus@1.0.0, assert-plus@^1.0.0: 159 | version "1.0.0" 160 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 161 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 162 | 163 | asynckit@^0.4.0: 164 | version "0.4.0" 165 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 166 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 167 | 168 | aws-sign2@~0.7.0: 169 | version "0.7.0" 170 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 171 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 172 | 173 | aws4@^1.8.0: 174 | version "1.9.1" 175 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" 176 | integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== 177 | 178 | axios@^0.21.1: 179 | version "0.21.1" 180 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" 181 | integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== 182 | dependencies: 183 | follow-redirects "^1.10.0" 184 | 185 | base64-js@^1.3.0: 186 | version "1.3.1" 187 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 188 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 189 | 190 | bcrypt-pbkdf@^1.0.0: 191 | version "1.0.2" 192 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 193 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 194 | dependencies: 195 | tweetnacl "^0.14.3" 196 | 197 | bignumber.js@^7.0.0: 198 | version "7.2.1" 199 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" 200 | integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== 201 | 202 | bluebird@^3.5.0, bluebird@^3.7.1: 203 | version "3.7.2" 204 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 205 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 206 | 207 | buffer-equal-constant-time@1.0.1: 208 | version "1.0.1" 209 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 210 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 211 | 212 | caller-callsite@^2.0.0: 213 | version "2.0.0" 214 | resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" 215 | integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= 216 | dependencies: 217 | callsites "^2.0.0" 218 | 219 | caller-path@^2.0.0: 220 | version "2.0.0" 221 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" 222 | integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= 223 | dependencies: 224 | caller-callsite "^2.0.0" 225 | 226 | callsites@^2.0.0: 227 | version "2.0.0" 228 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 229 | integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= 230 | 231 | caseless@~0.12.0: 232 | version "0.12.0" 233 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 234 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 235 | 236 | chalk@^2.0.0, chalk@^2.4.2: 237 | version "2.4.2" 238 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 239 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 240 | dependencies: 241 | ansi-styles "^3.2.1" 242 | escape-string-regexp "^1.0.5" 243 | supports-color "^5.3.0" 244 | 245 | chance@^1.0.18: 246 | version "1.1.4" 247 | resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.4.tgz#d8743bf8e40bb05e024c305ca1ff441195eb23db" 248 | integrity sha512-pXPDSu3knKlb6H7ahQfpq//J9mSOxYK8SMtp8MV/nRJh8aLRDIl0ipLH8At8+nVogVwtvPZzyIzY/EbcY/cLuQ== 249 | 250 | ci-info@^2.0.0: 251 | version "2.0.0" 252 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 253 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 254 | 255 | class-transformer@^0.2.0: 256 | version "0.2.3" 257 | resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.2.3.tgz#598c92ca71dcca73f91ccb875d74a3847ccfa32d" 258 | integrity sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ== 259 | 260 | color-convert@^1.9.0: 261 | version "1.9.3" 262 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 263 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 264 | dependencies: 265 | color-name "1.1.3" 266 | 267 | color-name@1.1.3: 268 | version "1.1.3" 269 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 270 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 271 | 272 | combined-stream@^1.0.6, combined-stream@~1.0.6: 273 | version "1.0.8" 274 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 275 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 276 | dependencies: 277 | delayed-stream "~1.0.0" 278 | 279 | component-emitter@^1.2.0: 280 | version "1.3.0" 281 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 282 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 283 | 284 | cookiejar@^2.1.0: 285 | version "2.1.2" 286 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" 287 | integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== 288 | 289 | core-util-is@1.0.2, core-util-is@~1.0.0: 290 | version "1.0.2" 291 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 292 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 293 | 294 | cosmiconfig@^5.2.1: 295 | version "5.2.1" 296 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" 297 | integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== 298 | dependencies: 299 | import-fresh "^2.0.0" 300 | is-directory "^0.3.1" 301 | js-yaml "^3.13.1" 302 | parse-json "^4.0.0" 303 | 304 | cross-spawn@^6.0.0: 305 | version "6.0.5" 306 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 307 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 308 | dependencies: 309 | nice-try "^1.0.4" 310 | path-key "^2.0.1" 311 | semver "^5.5.0" 312 | shebang-command "^1.2.0" 313 | which "^1.2.9" 314 | 315 | dashdash@^1.12.0: 316 | version "1.14.1" 317 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 318 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 319 | dependencies: 320 | assert-plus "^1.0.0" 321 | 322 | debug@4: 323 | version "4.1.1" 324 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 325 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 326 | dependencies: 327 | ms "^2.1.1" 328 | 329 | debug@^3.1.0: 330 | version "3.2.6" 331 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 332 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 333 | dependencies: 334 | ms "^2.1.1" 335 | 336 | delayed-stream@~1.0.0: 337 | version "1.0.0" 338 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 339 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 340 | 341 | ecc-jsbn@~0.1.1: 342 | version "0.1.2" 343 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 344 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 345 | dependencies: 346 | jsbn "~0.1.0" 347 | safer-buffer "^2.1.0" 348 | 349 | ecdsa-sig-formatter@1.0.11: 350 | version "1.0.11" 351 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 352 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 353 | dependencies: 354 | safe-buffer "^5.0.1" 355 | 356 | end-of-stream@^1.1.0: 357 | version "1.4.4" 358 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 359 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 360 | dependencies: 361 | once "^1.4.0" 362 | 363 | error-ex@^1.3.1: 364 | version "1.3.2" 365 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 366 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 367 | dependencies: 368 | is-arrayish "^0.2.1" 369 | 370 | escape-string-regexp@^1.0.5: 371 | version "1.0.5" 372 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 373 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 374 | 375 | esprima@^4.0.0: 376 | version "4.0.1" 377 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 378 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 379 | 380 | esutils@^2.0.2: 381 | version "2.0.3" 382 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 383 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 384 | 385 | event-target-shim@^5.0.0: 386 | version "5.0.1" 387 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" 388 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 389 | 390 | execa@^1.0.0: 391 | version "1.0.0" 392 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 393 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 394 | dependencies: 395 | cross-spawn "^6.0.0" 396 | get-stream "^4.0.0" 397 | is-stream "^1.1.0" 398 | npm-run-path "^2.0.0" 399 | p-finally "^1.0.0" 400 | signal-exit "^3.0.0" 401 | strip-eof "^1.0.0" 402 | 403 | extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: 404 | version "3.0.2" 405 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 406 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 407 | 408 | extsprintf@1.3.0: 409 | version "1.3.0" 410 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 411 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 412 | 413 | extsprintf@^1.2.0: 414 | version "1.4.0" 415 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 416 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 417 | 418 | fast-deep-equal@^2.0.1: 419 | version "2.0.1" 420 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 421 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 422 | 423 | fast-json-stable-stringify@^2.0.0: 424 | version "2.1.0" 425 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 426 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 427 | 428 | fast-text-encoding@^1.0.0: 429 | version "1.0.0" 430 | resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef" 431 | integrity sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ== 432 | 433 | find-up@^4.0.0: 434 | version "4.1.0" 435 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 436 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 437 | dependencies: 438 | locate-path "^5.0.0" 439 | path-exists "^4.0.0" 440 | 441 | follow-redirects@^1.10.0: 442 | version "1.13.1" 443 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" 444 | integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== 445 | 446 | forever-agent@~0.6.1: 447 | version "0.6.1" 448 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 449 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 450 | 451 | form-data@^2.3.1, form-data@^2.5.0: 452 | version "2.5.1" 453 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" 454 | integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== 455 | dependencies: 456 | asynckit "^0.4.0" 457 | combined-stream "^1.0.6" 458 | mime-types "^2.1.12" 459 | 460 | form-data@~2.3.2: 461 | version "2.3.3" 462 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 463 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 464 | dependencies: 465 | asynckit "^0.4.0" 466 | combined-stream "^1.0.6" 467 | mime-types "^2.1.12" 468 | 469 | formidable@^1.2.0: 470 | version "1.2.1" 471 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" 472 | integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== 473 | 474 | gaxios@^2.0.1, gaxios@^2.1.0: 475 | version "2.2.2" 476 | resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-2.2.2.tgz#f58516ead6868d997fcf267d4fe2dcef652bd1a3" 477 | integrity sha512-fzttYsjvZxCaN+bQK7FtAMgoIlPtHkMwlz7vHD+aNRcU7I7gHgnp6hvGJksoo+dO1TDxaog+dSBycbYhHIStaA== 478 | dependencies: 479 | abort-controller "^3.0.0" 480 | extend "^3.0.2" 481 | https-proxy-agent "^4.0.0" 482 | is-stream "^2.0.0" 483 | node-fetch "^2.3.0" 484 | 485 | gcp-metadata@^3.3.0: 486 | version "3.3.0" 487 | resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-3.3.0.tgz#df061f0c0da3fb274b20f4af0d955030bbc21eac" 488 | integrity sha512-uO3P/aByOQmoDu5bOYBODHmD1oDCZw7/R8SYY0MdmMQSZVEmeTSxmiM1vwde+YHYSpkaQnAAMAIZuOqLvgfp/Q== 489 | dependencies: 490 | gaxios "^2.1.0" 491 | json-bigint "^0.3.0" 492 | 493 | get-stdin@^7.0.0: 494 | version "7.0.0" 495 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" 496 | integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== 497 | 498 | get-stream@^4.0.0: 499 | version "4.1.0" 500 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 501 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 502 | dependencies: 503 | pump "^3.0.0" 504 | 505 | getpass@^0.1.1: 506 | version "0.1.7" 507 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 508 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 509 | dependencies: 510 | assert-plus "^1.0.0" 511 | 512 | google-auth-library@^5.6.1: 513 | version "5.9.1" 514 | resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-5.9.1.tgz#aab2893b4aac10fce6c9215f918a83ae8e7b67bb" 515 | integrity sha512-927NlfjqRLrkok2JRBap4iYqe5+bsdtaotwO1JSAAxoQmji+Xmf+pFLzB+52C8ovtfycwFXbvC9f/SB4gmQCXw== 516 | dependencies: 517 | arrify "^2.0.0" 518 | base64-js "^1.3.0" 519 | fast-text-encoding "^1.0.0" 520 | gaxios "^2.1.0" 521 | gcp-metadata "^3.3.0" 522 | gtoken "^4.1.0" 523 | jws "^4.0.0" 524 | lru-cache "^5.0.0" 525 | 526 | google-p12-pem@^2.0.0: 527 | version "2.0.4" 528 | resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-2.0.4.tgz#036462394e266472632a78b685f0cc3df4ef337b" 529 | integrity sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg== 530 | dependencies: 531 | node-forge "^0.9.0" 532 | 533 | googleapis-common@^3.2.0: 534 | version "3.2.1" 535 | resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-3.2.1.tgz#1c81dfce74876948fb1e68a2a99f842da6123877" 536 | integrity sha512-lPAJXYpZLvY4AZp57RWj1eUXS2D5LxS3y6W0n9Jbl6eKOWmyLgz99f84XVCxVnyq8DcgV/ZAxt1lpFEzGZkVvQ== 537 | dependencies: 538 | extend "^3.0.2" 539 | gaxios "^2.0.1" 540 | google-auth-library "^5.6.1" 541 | qs "^6.7.0" 542 | url-template "^2.0.8" 543 | uuid "^3.3.2" 544 | 545 | googleapis@^47.0.0: 546 | version "47.0.0" 547 | resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-47.0.0.tgz#33f2ce796b420d56360279df3c217b9a9d25bdf2" 548 | integrity sha512-+Fnjgcc3Na/rk57dwxqW1V0HJXJFjnt3aqFlckULqAqsPkmex/AyJJe6MSlXHC37ZmlXEb9ZtPGUp5ZzRDXpHg== 549 | dependencies: 550 | google-auth-library "^5.6.1" 551 | googleapis-common "^3.2.0" 552 | 553 | gtoken@^4.1.0: 554 | version "4.1.4" 555 | resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-4.1.4.tgz#925ff1e7df3aaada06611d30ea2d2abf60fcd6a7" 556 | integrity sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA== 557 | dependencies: 558 | gaxios "^2.1.0" 559 | google-p12-pem "^2.0.0" 560 | jws "^4.0.0" 561 | mime "^2.2.0" 562 | 563 | har-schema@^2.0.0: 564 | version "2.0.0" 565 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 566 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 567 | 568 | har-validator@~5.1.0: 569 | version "5.1.3" 570 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 571 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 572 | dependencies: 573 | ajv "^6.5.5" 574 | har-schema "^2.0.0" 575 | 576 | has-flag@^3.0.0: 577 | version "3.0.0" 578 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 579 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 580 | 581 | hosted-git-info@^2.1.4: 582 | version "2.8.5" 583 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" 584 | integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== 585 | 586 | http-signature@~1.2.0: 587 | version "1.2.0" 588 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 589 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 590 | dependencies: 591 | assert-plus "^1.0.0" 592 | jsprim "^1.2.2" 593 | sshpk "^1.7.0" 594 | 595 | https-proxy-agent@^4.0.0: 596 | version "4.0.0" 597 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" 598 | integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== 599 | dependencies: 600 | agent-base "5" 601 | debug "4" 602 | 603 | husky@^3.1.0: 604 | version "3.1.0" 605 | resolved "https://registry.yarnpkg.com/husky/-/husky-3.1.0.tgz#5faad520ab860582ed94f0c1a77f0f04c90b57c0" 606 | integrity sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ== 607 | dependencies: 608 | chalk "^2.4.2" 609 | ci-info "^2.0.0" 610 | cosmiconfig "^5.2.1" 611 | execa "^1.0.0" 612 | get-stdin "^7.0.0" 613 | opencollective-postinstall "^2.0.2" 614 | pkg-dir "^4.2.0" 615 | please-upgrade-node "^3.2.0" 616 | read-pkg "^5.2.0" 617 | run-node "^1.0.0" 618 | slash "^3.0.0" 619 | 620 | image-size@^0.7.3: 621 | version "0.7.5" 622 | resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04" 623 | integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g== 624 | 625 | import-fresh@^2.0.0: 626 | version "2.0.0" 627 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" 628 | integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= 629 | dependencies: 630 | caller-path "^2.0.0" 631 | resolve-from "^3.0.0" 632 | 633 | inherits@~2.0.3: 634 | version "2.0.4" 635 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 636 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 637 | 638 | instagram-private-api@^1.37.1: 639 | version "1.37.1" 640 | resolved "https://registry.yarnpkg.com/instagram-private-api/-/instagram-private-api-1.37.1.tgz#673cb9c001c224c5adc600b64fd1eea872ab60f8" 641 | integrity sha512-k1h6aQ0h2LsVAalTbGTf5PKmITuW4h9d78ZSxhMatlZp2a+Tb5sj9Yf1aA0A1A4lDo6KeW0RYijwT5RLfARnZQ== 642 | dependencies: 643 | "@lifeomic/attempt" "^3.0.0" 644 | "@types/chance" "^1.0.2" 645 | "@types/request-promise" "^4.1.43" 646 | bluebird "^3.7.1" 647 | chance "^1.0.18" 648 | class-transformer "^0.2.0" 649 | image-size "^0.7.3" 650 | json-bigint "^0.3.0" 651 | lodash "^4.17.5" 652 | luxon "^1.12.1" 653 | reflect-metadata "^0.1.13" 654 | request "^2.88.0" 655 | request-promise "^4.2.4" 656 | rxjs "^6.5.2" 657 | snakecase-keys "^3.1.0" 658 | tough-cookie "^2.5.0" 659 | ts-custom-error "^2.2.2" 660 | ts-xor "^1.0.6" 661 | url-regex "^5.0.0" 662 | 663 | ip-regex@^4.1.0: 664 | version "4.1.0" 665 | resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" 666 | integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== 667 | 668 | is-arrayish@^0.2.1: 669 | version "0.2.1" 670 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 671 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 672 | 673 | is-directory@^0.3.1: 674 | version "0.3.1" 675 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 676 | integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= 677 | 678 | is-stream@^1.1.0: 679 | version "1.1.0" 680 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 681 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 682 | 683 | is-stream@^2.0.0: 684 | version "2.0.0" 685 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 686 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 687 | 688 | is-typedarray@~1.0.0: 689 | version "1.0.0" 690 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 691 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 692 | 693 | isarray@~1.0.0: 694 | version "1.0.0" 695 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 696 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 697 | 698 | isexe@^2.0.0: 699 | version "2.0.0" 700 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 701 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 702 | 703 | isstream@~0.1.2: 704 | version "0.1.2" 705 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 706 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 707 | 708 | js-tokens@^4.0.0: 709 | version "4.0.0" 710 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 711 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 712 | 713 | js-yaml@^3.13.1: 714 | version "3.13.1" 715 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 716 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 717 | dependencies: 718 | argparse "^1.0.7" 719 | esprima "^4.0.0" 720 | 721 | jsbn@~0.1.0: 722 | version "0.1.1" 723 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 724 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 725 | 726 | json-bigint@^0.3.0: 727 | version "0.3.0" 728 | resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-0.3.0.tgz#0ccd912c4b8270d05f056fbd13814b53d3825b1e" 729 | integrity sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4= 730 | dependencies: 731 | bignumber.js "^7.0.0" 732 | 733 | json-parse-better-errors@^1.0.1: 734 | version "1.0.2" 735 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 736 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 737 | 738 | json-schema-traverse@^0.4.1: 739 | version "0.4.1" 740 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 741 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 742 | 743 | json-schema@0.2.3: 744 | version "0.2.3" 745 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 746 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 747 | 748 | json-stable-stringify@^1.0.1: 749 | version "1.0.1" 750 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 751 | integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= 752 | dependencies: 753 | jsonify "~0.0.0" 754 | 755 | json-stringify-safe@~5.0.1: 756 | version "5.0.1" 757 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 758 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 759 | 760 | jsonify@~0.0.0: 761 | version "0.0.0" 762 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 763 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= 764 | 765 | jsprim@^1.2.2: 766 | version "1.4.1" 767 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 768 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 769 | dependencies: 770 | assert-plus "1.0.0" 771 | extsprintf "1.3.0" 772 | json-schema "0.2.3" 773 | verror "1.10.0" 774 | 775 | jwa@^2.0.0: 776 | version "2.0.0" 777 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" 778 | integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== 779 | dependencies: 780 | buffer-equal-constant-time "1.0.1" 781 | ecdsa-sig-formatter "1.0.11" 782 | safe-buffer "^5.0.1" 783 | 784 | jws@^4.0.0: 785 | version "4.0.0" 786 | resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" 787 | integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== 788 | dependencies: 789 | jwa "^2.0.0" 790 | safe-buffer "^5.0.1" 791 | 792 | lines-and-columns@^1.1.6: 793 | version "1.1.6" 794 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 795 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 796 | 797 | locate-path@^5.0.0: 798 | version "5.0.0" 799 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 800 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 801 | dependencies: 802 | p-locate "^4.1.0" 803 | 804 | lodash@^4.17.15, lodash@^4.17.5: 805 | version "4.17.15" 806 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 807 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 808 | 809 | lru-cache@^5.0.0: 810 | version "5.1.1" 811 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 812 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 813 | dependencies: 814 | yallist "^3.0.2" 815 | 816 | luxon@^1.12.1: 817 | version "1.21.3" 818 | resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.21.3.tgz#f1d5c2a7e855d039836cf4954f883ecac8fc4727" 819 | integrity sha512-lLRwNcNnkZLuv13A1FUuZRZmTWF7ro2ricYvb0L9cvBYHPvZhQdKwrYnZzi103D2XKmlVmxWpdn2wfIiOt2YEw== 820 | 821 | map-obj@^4.0.0: 822 | version "4.1.0" 823 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" 824 | integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== 825 | 826 | methods@^1.1.1: 827 | version "1.1.2" 828 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 829 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 830 | 831 | mime-db@1.42.0: 832 | version "1.42.0" 833 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" 834 | integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== 835 | 836 | mime-db@1.43.0: 837 | version "1.43.0" 838 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 839 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 840 | 841 | mime-types@^2.1.12: 842 | version "2.1.25" 843 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" 844 | integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== 845 | dependencies: 846 | mime-db "1.42.0" 847 | 848 | mime-types@~2.1.19: 849 | version "2.1.26" 850 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 851 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 852 | dependencies: 853 | mime-db "1.43.0" 854 | 855 | mime@^1.4.1: 856 | version "1.6.0" 857 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 858 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 859 | 860 | mime@^2.2.0: 861 | version "2.4.4" 862 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" 863 | integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== 864 | 865 | ms@^2.1.1: 866 | version "2.1.2" 867 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 868 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 869 | 870 | natural@^0.6.3: 871 | version "0.6.3" 872 | resolved "https://registry.yarnpkg.com/natural/-/natural-0.6.3.tgz#62f56db82fbfddcf9e1f5810c5e39135fdbc1355" 873 | integrity sha512-78fcEdNN6Y4pv8SOLPDhJTlUG+8IiQzNx0nYpl0k7q00K4ZZuds+wDWfSa6eeiPcSQDncvV44WWGsi70/ZP3+w== 874 | dependencies: 875 | afinn-165 "^1.0.2" 876 | apparatus "^0.0.10" 877 | json-stable-stringify "^1.0.1" 878 | sylvester "^0.0.12" 879 | underscore "^1.3.1" 880 | 881 | nice-try@^1.0.4: 882 | version "1.0.5" 883 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 884 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 885 | 886 | node-fetch@^2.3.0: 887 | version "2.6.0" 888 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 889 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 890 | 891 | node-forge@^0.9.0: 892 | version "0.9.1" 893 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.1.tgz#775368e6846558ab6676858a4d8c6e8d16c677b5" 894 | integrity sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ== 895 | 896 | normalize-package-data@^2.5.0: 897 | version "2.5.0" 898 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 899 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 900 | dependencies: 901 | hosted-git-info "^2.1.4" 902 | resolve "^1.10.0" 903 | semver "2 || 3 || 4 || 5" 904 | validate-npm-package-license "^3.0.1" 905 | 906 | npm-run-path@^2.0.0: 907 | version "2.0.2" 908 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 909 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 910 | dependencies: 911 | path-key "^2.0.0" 912 | 913 | oauth-sign@~0.9.0: 914 | version "0.9.0" 915 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 916 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 917 | 918 | once@^1.3.1, once@^1.4.0: 919 | version "1.4.0" 920 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 921 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 922 | dependencies: 923 | wrappy "1" 924 | 925 | opencollective-postinstall@^2.0.2: 926 | version "2.0.2" 927 | resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" 928 | integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== 929 | 930 | p-finally@^1.0.0: 931 | version "1.0.0" 932 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 933 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 934 | 935 | p-limit@^2.2.0: 936 | version "2.2.1" 937 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" 938 | integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== 939 | dependencies: 940 | p-try "^2.0.0" 941 | 942 | p-locate@^4.1.0: 943 | version "4.1.0" 944 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 945 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 946 | dependencies: 947 | p-limit "^2.2.0" 948 | 949 | p-try@^2.0.0: 950 | version "2.2.0" 951 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 952 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 953 | 954 | parse-json@^4.0.0: 955 | version "4.0.0" 956 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 957 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 958 | dependencies: 959 | error-ex "^1.3.1" 960 | json-parse-better-errors "^1.0.1" 961 | 962 | parse-json@^5.0.0: 963 | version "5.0.0" 964 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" 965 | integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== 966 | dependencies: 967 | "@babel/code-frame" "^7.0.0" 968 | error-ex "^1.3.1" 969 | json-parse-better-errors "^1.0.1" 970 | lines-and-columns "^1.1.6" 971 | 972 | path-exists@^4.0.0: 973 | version "4.0.0" 974 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 975 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 976 | 977 | path-key@^2.0.0, path-key@^2.0.1: 978 | version "2.0.1" 979 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 980 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 981 | 982 | path-parse@^1.0.6: 983 | version "1.0.6" 984 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 985 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 986 | 987 | performance-now@^2.1.0: 988 | version "2.1.0" 989 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 990 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 991 | 992 | pkg-dir@^4.2.0: 993 | version "4.2.0" 994 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 995 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 996 | dependencies: 997 | find-up "^4.0.0" 998 | 999 | please-upgrade-node@^3.2.0: 1000 | version "3.2.0" 1001 | resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" 1002 | integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== 1003 | dependencies: 1004 | semver-compare "^1.0.0" 1005 | 1006 | pocketcasts@^1.0.1: 1007 | version "1.0.1" 1008 | resolved "https://registry.yarnpkg.com/pocketcasts/-/pocketcasts-1.0.1.tgz#363eee29f36eaac6168b67781432bb61d4762c14" 1009 | integrity sha512-QNlup6ulWeu7k7TjB3zTkl0Kd0PqZJRjgWr78wvYhzEN0yd5n1DsfMHOpeitzDVrp7z5ddMDwq+xxllfUdWWvg== 1010 | dependencies: 1011 | request "^2.88.0" 1012 | request-promise-native "^1.0.7" 1013 | 1014 | prettier@^1.19.1: 1015 | version "1.19.1" 1016 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" 1017 | integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== 1018 | 1019 | process-nextick-args@~2.0.0: 1020 | version "2.0.1" 1021 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1022 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1023 | 1024 | psl@^1.1.24, psl@^1.1.28: 1025 | version "1.7.0" 1026 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" 1027 | integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== 1028 | 1029 | pump@^3.0.0: 1030 | version "3.0.0" 1031 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1032 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1033 | dependencies: 1034 | end-of-stream "^1.1.0" 1035 | once "^1.3.1" 1036 | 1037 | punycode@^1.4.1: 1038 | version "1.4.1" 1039 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1040 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1041 | 1042 | punycode@^2.1.0, punycode@^2.1.1: 1043 | version "2.1.1" 1044 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1045 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1046 | 1047 | qs@^6.5.1, qs@^6.7.0: 1048 | version "6.9.1" 1049 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" 1050 | integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== 1051 | 1052 | qs@~6.5.2: 1053 | version "6.5.2" 1054 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1055 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1056 | 1057 | read-pkg@^5.2.0: 1058 | version "5.2.0" 1059 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" 1060 | integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== 1061 | dependencies: 1062 | "@types/normalize-package-data" "^2.4.0" 1063 | normalize-package-data "^2.5.0" 1064 | parse-json "^5.0.0" 1065 | type-fest "^0.6.0" 1066 | 1067 | readable-stream@^2.3.5: 1068 | version "2.3.6" 1069 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1070 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1071 | dependencies: 1072 | core-util-is "~1.0.0" 1073 | inherits "~2.0.3" 1074 | isarray "~1.0.0" 1075 | process-nextick-args "~2.0.0" 1076 | safe-buffer "~5.1.1" 1077 | string_decoder "~1.1.1" 1078 | util-deprecate "~1.0.1" 1079 | 1080 | reflect-metadata@^0.1.13: 1081 | version "0.1.13" 1082 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 1083 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1084 | 1085 | request-promise-core@1.1.3: 1086 | version "1.1.3" 1087 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" 1088 | integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== 1089 | dependencies: 1090 | lodash "^4.17.15" 1091 | 1092 | request-promise-native@^1.0.7: 1093 | version "1.0.8" 1094 | resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" 1095 | integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== 1096 | dependencies: 1097 | request-promise-core "1.1.3" 1098 | stealthy-require "^1.1.1" 1099 | tough-cookie "^2.3.3" 1100 | 1101 | request-promise@^4.2.4: 1102 | version "4.2.5" 1103 | resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c" 1104 | integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg== 1105 | dependencies: 1106 | bluebird "^3.5.0" 1107 | request-promise-core "1.1.3" 1108 | stealthy-require "^1.1.1" 1109 | tough-cookie "^2.3.3" 1110 | 1111 | request@^2.88.0: 1112 | version "2.88.0" 1113 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1114 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 1115 | dependencies: 1116 | aws-sign2 "~0.7.0" 1117 | aws4 "^1.8.0" 1118 | caseless "~0.12.0" 1119 | combined-stream "~1.0.6" 1120 | extend "~3.0.2" 1121 | forever-agent "~0.6.1" 1122 | form-data "~2.3.2" 1123 | har-validator "~5.1.0" 1124 | http-signature "~1.2.0" 1125 | is-typedarray "~1.0.0" 1126 | isstream "~0.1.2" 1127 | json-stringify-safe "~5.0.1" 1128 | mime-types "~2.1.19" 1129 | oauth-sign "~0.9.0" 1130 | performance-now "^2.1.0" 1131 | qs "~6.5.2" 1132 | safe-buffer "^5.1.2" 1133 | tough-cookie "~2.4.3" 1134 | tunnel-agent "^0.6.0" 1135 | uuid "^3.3.2" 1136 | 1137 | resolve-from@^3.0.0: 1138 | version "3.0.0" 1139 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 1140 | integrity sha1-six699nWiBvItuZTM17rywoYh0g= 1141 | 1142 | resolve@^1.10.0: 1143 | version "1.12.2" 1144 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.2.tgz#08b12496d9aa8659c75f534a8f05f0d892fff594" 1145 | integrity sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw== 1146 | dependencies: 1147 | path-parse "^1.0.6" 1148 | 1149 | run-node@^1.0.0: 1150 | version "1.0.0" 1151 | resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" 1152 | integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== 1153 | 1154 | rxjs@^6.5.2: 1155 | version "6.5.4" 1156 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" 1157 | integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== 1158 | dependencies: 1159 | tslib "^1.9.0" 1160 | 1161 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 1162 | version "5.2.0" 1163 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1164 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1165 | 1166 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1167 | version "5.1.2" 1168 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1169 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1170 | 1171 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1172 | version "2.1.2" 1173 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1174 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1175 | 1176 | sax@^1.2.4: 1177 | version "1.2.4" 1178 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1179 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1180 | 1181 | semver-compare@^1.0.0: 1182 | version "1.0.0" 1183 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 1184 | integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= 1185 | 1186 | "semver@2 || 3 || 4 || 5", semver@^5.5.0: 1187 | version "5.7.1" 1188 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1189 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1190 | 1191 | shebang-command@^1.2.0: 1192 | version "1.2.0" 1193 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1194 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1195 | dependencies: 1196 | shebang-regex "^1.0.0" 1197 | 1198 | shebang-regex@^1.0.0: 1199 | version "1.0.0" 1200 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1201 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1202 | 1203 | signal-exit@^3.0.0: 1204 | version "3.0.2" 1205 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1206 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1207 | 1208 | slash@^3.0.0: 1209 | version "3.0.0" 1210 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1211 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1212 | 1213 | snakecase-keys@^3.1.0: 1214 | version "3.1.1" 1215 | resolved "https://registry.yarnpkg.com/snakecase-keys/-/snakecase-keys-3.1.1.tgz#7e5a616d5ae7d2872bb73a6b2318eeb44265ea61" 1216 | integrity sha512-X9jgb3xAsYiD4NGcP9yA/TjOzuLw7a96rWH6S7Od/Tvu6lTahBv1CZDDkDABtHPu630kBgZsEF7d8gsBGlczSQ== 1217 | dependencies: 1218 | map-obj "^4.0.0" 1219 | to-snake-case "^1.0.0" 1220 | 1221 | spdx-correct@^3.0.0: 1222 | version "3.1.0" 1223 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 1224 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 1225 | dependencies: 1226 | spdx-expression-parse "^3.0.0" 1227 | spdx-license-ids "^3.0.0" 1228 | 1229 | spdx-exceptions@^2.1.0: 1230 | version "2.2.0" 1231 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 1232 | integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 1233 | 1234 | spdx-expression-parse@^3.0.0: 1235 | version "3.0.0" 1236 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1237 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 1238 | dependencies: 1239 | spdx-exceptions "^2.1.0" 1240 | spdx-license-ids "^3.0.0" 1241 | 1242 | spdx-license-ids@^3.0.0: 1243 | version "3.0.5" 1244 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1245 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1246 | 1247 | spotify-web-api-node@^4.0.0: 1248 | version "4.0.0" 1249 | resolved "https://registry.yarnpkg.com/spotify-web-api-node/-/spotify-web-api-node-4.0.0.tgz#55f060975220cdac18efc0e781f84130b12004c0" 1250 | integrity sha512-FQAX4qiP9xfjmJpkSfF5PEVr7RVorUZiLvcdVTlhVFLYAmQ8VSsZlyb0yTK0GExKhAcgJy9GfWxqjSB2r9SrjA== 1251 | dependencies: 1252 | superagent "^3.7.0" 1253 | 1254 | sprintf-js@~1.0.2: 1255 | version "1.0.3" 1256 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1257 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1258 | 1259 | sshpk@^1.7.0: 1260 | version "1.16.1" 1261 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 1262 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 1263 | dependencies: 1264 | asn1 "~0.2.3" 1265 | assert-plus "^1.0.0" 1266 | bcrypt-pbkdf "^1.0.0" 1267 | dashdash "^1.12.0" 1268 | ecc-jsbn "~0.1.1" 1269 | getpass "^0.1.1" 1270 | jsbn "~0.1.0" 1271 | safer-buffer "^2.0.2" 1272 | tweetnacl "~0.14.0" 1273 | 1274 | stealthy-require@^1.1.1: 1275 | version "1.1.1" 1276 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 1277 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 1278 | 1279 | string_decoder@~1.1.1: 1280 | version "1.1.1" 1281 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1282 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1283 | dependencies: 1284 | safe-buffer "~5.1.0" 1285 | 1286 | strip-eof@^1.0.0: 1287 | version "1.0.0" 1288 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1289 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1290 | 1291 | superagent@^3.7.0: 1292 | version "3.8.3" 1293 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" 1294 | integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== 1295 | dependencies: 1296 | component-emitter "^1.2.0" 1297 | cookiejar "^2.1.0" 1298 | debug "^3.1.0" 1299 | extend "^3.0.0" 1300 | form-data "^2.3.1" 1301 | formidable "^1.2.0" 1302 | methods "^1.1.1" 1303 | mime "^1.4.1" 1304 | qs "^6.5.1" 1305 | readable-stream "^2.3.5" 1306 | 1307 | supports-color@^5.3.0: 1308 | version "5.5.0" 1309 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1310 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1311 | dependencies: 1312 | has-flag "^3.0.0" 1313 | 1314 | "sylvester@>= 0.0.8": 1315 | version "0.0.21" 1316 | resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7" 1317 | integrity sha1-KYexzivS84sNzio0OIiEv6RADqc= 1318 | 1319 | sylvester@^0.0.12: 1320 | version "0.0.12" 1321 | resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.12.tgz#5a884415cd2d002c57e7a3aac99462a75ce9fdb4" 1322 | integrity sha1-WohEFc0tACxX56OqyZRip1zp/bQ= 1323 | 1324 | tlds@^1.203.0: 1325 | version "1.207.0" 1326 | resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.207.0.tgz#459264e644cf63ddc0965fece3898913286b1afd" 1327 | integrity sha512-k7d7Q1LqjtAvhtEOs3yN14EabsNO8ZCoY6RESSJDB9lst3bTx3as/m1UuAeCKzYxiyhR1qq72ZPhpSf+qlqiwg== 1328 | 1329 | to-no-case@^1.0.0: 1330 | version "1.0.2" 1331 | resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" 1332 | integrity sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo= 1333 | 1334 | to-snake-case@^1.0.0: 1335 | version "1.0.0" 1336 | resolved "https://registry.yarnpkg.com/to-snake-case/-/to-snake-case-1.0.0.tgz#ce746913897946019a87e62edfaeaea4c608ab8c" 1337 | integrity sha1-znRpE4l5RgGah+Yu366upMYIq4w= 1338 | dependencies: 1339 | to-space-case "^1.0.0" 1340 | 1341 | to-space-case@^1.0.0: 1342 | version "1.0.0" 1343 | resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" 1344 | integrity sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc= 1345 | dependencies: 1346 | to-no-case "^1.0.0" 1347 | 1348 | tough-cookie@^2.3.3, tough-cookie@^2.5.0: 1349 | version "2.5.0" 1350 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 1351 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 1352 | dependencies: 1353 | psl "^1.1.28" 1354 | punycode "^2.1.1" 1355 | 1356 | tough-cookie@~2.4.3: 1357 | version "2.4.3" 1358 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1359 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 1360 | dependencies: 1361 | psl "^1.1.24" 1362 | punycode "^1.4.1" 1363 | 1364 | truncate-sentences@^1.0.0: 1365 | version "1.0.0" 1366 | resolved "https://registry.yarnpkg.com/truncate-sentences/-/truncate-sentences-1.0.0.tgz#c48bdba63b84a190d845fb7afb4169b7e06a05e2" 1367 | integrity sha512-Q+BUmkm/xq1Es2dVK9B0L36XnrC/Zp3BVPHLydR70iOEMd3Sr+CMaLgtPwDvPuV0qY3Jye2vvMLRfOU5ZA1Y0g== 1368 | dependencies: 1369 | natural "^0.6.3" 1370 | 1371 | ts-custom-error@^2.2.2: 1372 | version "2.2.2" 1373 | resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-2.2.2.tgz#ee769cd6a9cf35dc2e9fedefbb3842f3a2fbceae" 1374 | integrity sha512-I0FEdfdatDjeigRqh1JFj67bcIKyRNm12UVGheBjs2pXgyELg2xeiQLVaWu1pVmNGXZVnz/fvycSU41moBIpOg== 1375 | 1376 | ts-xor@^1.0.6: 1377 | version "1.0.8" 1378 | resolved "https://registry.yarnpkg.com/ts-xor/-/ts-xor-1.0.8.tgz#e56ba7a21d49e1517ca1e076e5e37cf1d67631a4" 1379 | integrity sha512-0u70/SDLSCaX23UddnwAb2GvZZ2N0Rbjnmemn5pHoR40D32Xcva5KRGWV9SdJOKHCjJUlmctmCTvT0z+2yT8aw== 1380 | 1381 | tslib@^1.9.0: 1382 | version "1.10.0" 1383 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1384 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1385 | 1386 | tunnel-agent@^0.6.0: 1387 | version "0.6.0" 1388 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1389 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1390 | dependencies: 1391 | safe-buffer "^5.0.1" 1392 | 1393 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1394 | version "0.14.5" 1395 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1396 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1397 | 1398 | type-fest@^0.6.0: 1399 | version "0.6.0" 1400 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" 1401 | integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== 1402 | 1403 | underscore@^1.3.1: 1404 | version "1.9.1" 1405 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" 1406 | integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== 1407 | 1408 | uri-js@^4.2.2: 1409 | version "4.2.2" 1410 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1411 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1412 | dependencies: 1413 | punycode "^2.1.0" 1414 | 1415 | url-regex@^5.0.0: 1416 | version "5.0.0" 1417 | resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" 1418 | integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== 1419 | dependencies: 1420 | ip-regex "^4.1.0" 1421 | tlds "^1.203.0" 1422 | 1423 | url-template@^2.0.8: 1424 | version "2.0.8" 1425 | resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" 1426 | integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= 1427 | 1428 | util-deprecate@~1.0.1: 1429 | version "1.0.2" 1430 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1431 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1432 | 1433 | uuid@^3.3.2: 1434 | version "3.3.3" 1435 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 1436 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 1437 | 1438 | validate-npm-package-license@^3.0.1: 1439 | version "3.0.4" 1440 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1441 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1442 | dependencies: 1443 | spdx-correct "^3.0.0" 1444 | spdx-expression-parse "^3.0.0" 1445 | 1446 | verror@1.10.0: 1447 | version "1.10.0" 1448 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1449 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1450 | dependencies: 1451 | assert-plus "^1.0.0" 1452 | core-util-is "1.0.2" 1453 | extsprintf "^1.2.0" 1454 | 1455 | which@^1.2.9: 1456 | version "1.3.1" 1457 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1458 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1459 | dependencies: 1460 | isexe "^2.0.0" 1461 | 1462 | wrappy@1: 1463 | version "1.0.2" 1464 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1465 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1466 | 1467 | xml-js@^1.6.11: 1468 | version "1.6.11" 1469 | resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" 1470 | integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== 1471 | dependencies: 1472 | sax "^1.2.4" 1473 | 1474 | yallist@^3.0.2: 1475 | version "3.1.1" 1476 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1477 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1478 | --------------------------------------------------------------------------------