From f673339d90c8fdc6caa59c6166e2c9fa34733725 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Wed, 1 Dec 2021 20:32:20 +0000 Subject: [PATCH] rewrite in typescript --- .gitignore | 2 +- .npmignore | 2 +- app.ts | 9 +++ index.js | 121 --------------------------------- package.json | 5 +- src/contracts/IFetchResult.ts | 6 ++ src/contracts/IRedditResult.ts | 11 +++ src/index.ts | 61 +++++++++++++++++ tsconfig.json | 2 +- yarn.lock | 121 +++++++++++++++++++++++++++++++-- 10 files changed, 211 insertions(+), 129 deletions(-) create mode 100644 app.ts delete mode 100644 index.js create mode 100644 src/contracts/IFetchResult.ts create mode 100644 src/contracts/IRedditResult.ts create mode 100644 src/index.ts diff --git a/.gitignore b/.gitignore index 1a05721..76add87 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ node_modules -app.js \ No newline at end of file +dist \ No newline at end of file diff --git a/.npmignore b/.npmignore index f9602e9..15f3de2 100644 --- a/.npmignore +++ b/.npmignore @@ -1 +1 @@ -app.js \ No newline at end of file +app.ts \ No newline at end of file diff --git a/app.ts b/app.ts new file mode 100644 index 0000000..3d66d96 --- /dev/null +++ b/app.ts @@ -0,0 +1,9 @@ +import randomBunny from "./src"; + +async function app() { + const result = await randomBunny('rabbits', 'hot', 100); + + console.log(result); +} + +app(); \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 7b59cfe..0000000 --- a/index.js +++ /dev/null @@ -1,121 +0,0 @@ -// Required Modules -const fetch = require('node-fetch'); - -// Valid sortBy names -const sortable = [ - 'new', - 'hot', - 'top' -] - -// Main function -function randomBunny(subreddit, sortBy, cb) { - // If the sortable list doesn't include sortBy, default to 'hot' - if (!sortable.includes(sortBy)) sortBy = 'hot'; - - // Fetch the json from reddit - // For example, if you're getting a random image from r/rabbits, sorted by new: - // https://www.reddit.com/r/rabbits/new.json - fetch(`https://www.reddit.com/r/${subreddit}/${sortBy}.json`).then(res => { - res.json().then(res => { - // Get the part of the json string which the data comes from - const data = res.data.children; - const size = data.length; - - // Found is used for the while loop in order to break out of the loop. - // We need to loop as the json string will contain invalid data for what we need - // Specifically videos. - let found = false; - - // Loop until a valid image post is found - while (!found) { - // Generate random number - const random = getRandom(0, size - 1); - - // Get variables from json to pass back - const randomSelect = data[random].data; - - // The json string to send back - const json = { - archived: randomSelect['archived'], - downs: randomSelect['downs'], - hidden: randomSelect['hidden'], - permalink: randomSelect['permalink'], - subreddit: randomSelect['subreddit'], - subredditSubscribers: randomSelect['subreddit_subscribers'], - title: randomSelect['title'], - ups: randomSelect['ups'], - url: randomSelect['url'] - }; - - // If the post is a .jpg, send back the data and stop looping - if (json.url.includes('.jpg')) { - found = true; - cb(json); - } - } - }); - }); -} - -function promise(subreddit, sortBy) { - return new Promise(resolve => { - // If the sortable list doesn't include sortBy, default to 'hot' - if (!sortable.includes(sortBy)) sortBy = 'hot'; - - // Fetch the json from reddit - // For example, if you're getting a random image from r/rabbits, sorted by new: - // https://www.reddit.com/r/rabbits/new.json - fetch(`https://www.reddit.com/r/${subreddit}/${sortBy}.json`).then(res => { - res.json().then(res => { - // Get the part of the json string which the data comes from - const data = res.data.children; - const size = data.length; - - // Found is used for the while loop in order to break out of the loop. - // We need to loop as the json string will contain invalid data for what we need - // Specifically videos. - let found = false; - - // Loop until a valid image post is found - while (!found) { - // Generate random number - const random = getRandom(0, size - 1); - - // Get variables from json to pass back - const randomSelect = data[random].data; - - // The json string to send back - const json = { - archived: randomSelect['archived'], - downs: randomSelect['downs'], - hidden: randomSelect['hidden'], - permalink: randomSelect['permalink'], - subreddit: randomSelect['subreddit'], - subredditSubscribers: randomSelect['subreddit_subscribers'], - title: randomSelect['title'], - ups: randomSelect['ups'], - url: randomSelect['url'] - }; - - // If the post is a .jpg, send back the data and stop looping - if (json.url.includes('.jpg')) { - found = true; - resolve(json); - } - } - }); - }); - }) -} - -// Generate a random number -function getRandom(min, max) { - return Math.floor((Math.random() * max) + min); -} - -// Export Functions -module.exports = { - randomBunny, - promise, -}; \ No newline at end of file diff --git a/package.json b/package.json index 8f851a4..8544848 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,11 @@ ], "dependencies": { "glob-parent": "^6.0.0", - "node-fetch": "^2.6.1" + "node-fetch": "^3.1.0" }, "scripts": { + "build": "tsc", + "start": "ts-node app.ts", "test": "echo none", "lint": "eslint ." }, @@ -29,6 +31,7 @@ "devDependencies": { "@types/node": "^16.11.11", "eslint": "^7.17.0", + "ts-node": "^10.4.0", "typescript": "^4.5.2" } } diff --git a/src/contracts/IFetchResult.ts b/src/contracts/IFetchResult.ts new file mode 100644 index 0000000..e913b05 --- /dev/null +++ b/src/contracts/IFetchResult.ts @@ -0,0 +1,6 @@ +import IRedditResult from "./IRedditResult"; + +export default interface IFetchResult { + IsSuccess: boolean; + Result?: IRedditResult; +} \ No newline at end of file diff --git a/src/contracts/IRedditResult.ts b/src/contracts/IRedditResult.ts new file mode 100644 index 0000000..84e726c --- /dev/null +++ b/src/contracts/IRedditResult.ts @@ -0,0 +1,11 @@ +export default interface IRedditResult { + Archived: boolean, + Downs: number, + Hidden: boolean, + Permalink: string, + Subreddit: string, + SubredditSubscribers: number, + Title: string, + Ups: number, + Url: string +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..b0e4b66 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,61 @@ +import IFetchResult from "./contracts/IFetchResult"; +import IRedditResult from "./contracts/IRedditResult"; +import fetch from "node-fetch"; + +const sortable = [ + 'new', + 'hot', + 'top' +]; + +export default async function randomBunny(subreddit: string, sortBy: string, maxTries = 100): Promise { + if (!sortable.includes(sortBy)) sortBy = 'hot'; + + const result = await fetch(`https://reddit.com/r/${subreddit}/${sortBy}.json`); + + if (!result) { + return { + IsSuccess: false + } + } + + const json = await result.json() as any; + + if (!json) { + return { + IsSuccess: false + } + } + + const data = json.data.children; + const size = data.length; + + for (let i = 0; i < maxTries; i++) { + const random = Math.floor((Math.random() * size - 1) + 0); // Between 0 and (size - 1) + + const randomSelect = data[random].data; + + const redditResult: IRedditResult = { + Archived: randomSelect['archived'], + Downs: randomSelect['downs'], + Hidden: randomSelect['hidden'], + Permalink: randomSelect['permalink'], + Subreddit: randomSelect['subreddit'], + SubredditSubscribers: randomSelect['subreddit_subscribers'], + Title: randomSelect['title'], + Ups: randomSelect['ups'], + Url: randomSelect['url'] + }; + + if (redditResult.Url.includes('.jpg')) { + return { + IsSuccess: true, + Result: redditResult + }; + } + } + + return { + IsSuccess: false + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f0e488f..0f0c5fd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -70,7 +70,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, "include": [ - "./src", + "./src", "app.ts", ], "exclude": [ "./tests" diff --git a/yarn.lock b/yarn.lock index 5229a5e..ce66324 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,18 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + "@eslint/eslintrc@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" @@ -38,6 +50,26 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + "@types/node@^16.11.11": version "16.11.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" @@ -48,11 +80,21 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.4.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -97,6 +139,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -173,6 +220,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -182,6 +234,11 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +data-uri-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== + debug@^4.0.1, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" @@ -194,6 +251,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -351,6 +413,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fetch-blob@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.3.tgz#a7dca4855e39d3e3c5a1da62d4ee335c37d26012" + integrity sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ== + dependencies: + web-streams-polyfill "^3.0.3" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -371,6 +440,13 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -535,6 +611,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -552,10 +633,14 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.1.0.tgz#714f4922dc270239487654eaeeab86b8206cb52e" + integrity sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.2" + formdata-polyfill "^4.0.10" once@^1.3.0: version "1.4.0" @@ -715,6 +800,24 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +ts-node@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" + integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -744,6 +847,11 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +web-streams-polyfill@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" + integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -765,3 +873,8 @@ yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==