From c0e207b9677523d4ec97fe672ddd72ccbb3c1cc4 Mon Sep 17 00:00:00 2001 From: garronej Date: Sat, 25 Feb 2023 14:29:46 +0100 Subject: [PATCH] Add linking script --- .eslintignore | 1 + .gitignore | 1 + .prettierignore | 1 + .prettierrc.json | 2 +- README.md | 3 + README.template.md | 47 +++++++++++ package.json | 7 +- src/scripts/link-in-app.ts | 162 +++++++++++++++++++++++++++++++++++++ tsconfig.json | 3 +- yarn.lock | 104 ++++++++++++++++++++++++ 10 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 src/scripts/link-in-app.ts diff --git a/.eslintignore b/.eslintignore index 1a62f0e..ce24e97 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ /dist/ /.eslintrc.js /CHANGELOG.md +/.yarn_home diff --git a/.gitignore b/.gitignore index 998f7b6..f50ad76 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,5 @@ jspm_packages .DS_Store +/.yarn_home /dist diff --git a/.prettierignore b/.prettierignore index 4844bc5..fc83b27 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,3 +3,4 @@ /.eslintrc.js /docs/ /CHANGELOG.md +/.yarn_home diff --git a/.prettierrc.json b/.prettierrc.json index 6fb2b46..25f0691 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -5,7 +5,7 @@ "semi": true, "singleQuote": false, "quoteProps": "preserve", - "trailingComma": "all", + "trailingComma": "none", "bracketSpacing": true, "arrowParens": "avoid" } diff --git a/README.md b/README.md index 1938a5a..85b29db 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ https://user-images.githubusercontent.com/6702424/197344513-065246b9-8823-4894-a - โœ๏ธ Filling up the `package.json` - โœ… Testing on multiple Node version running on Ubuntu and Windows before publishing. - ๐Ÿ“ฆ Publishing on NPM and creating corresponding GitHub releases. +- ๐Ÿงช Enable you to test your local copy of the module on an external app. - ๐ŸŒ— You can use a different repo image for dark and light mode. Example with: [i18nifty](https://github.com/etalab/i18nifty): [Light](https://user-images.githubusercontent.com/6702424/200299948-94bacf9d-381e-40f8-b9a3-8e726bcd37c5.png) - [Dark](https://user-images.githubusercontent.com/6702424/200299807-42388349-a5ae-44b2-abd1-0aa538b58da2.png) See [here](https://github.com/etalab/i18nifty/blob/f6ad7bb11514224a416158af7af8e4073c7932c1/README.md?plain=1#L1-L11) the special GitHub syntax (`#gh-dark-mode-only`) that enable this to work. @@ -79,6 +80,8 @@ If you want to release for both CJS and ESM, it's a bit less straign forward. Yo ## Can I use `npm` (or something else) instead of `yarn` Yes, just remove the `yarn.lock` file and edit `.github/workflows/ci.yaml`, replace all `yarn ***` by `npm run ****`. +Note however that the the script (`src/link-in-app.ts`) that enable you to test in an external app will no longer work. + ## What will be included in the npm bundle? All filles listed in [the files property of your package JSON](https://github.com/garronej/ts_ci/blob/974054f2b83f8170317f2b2fa60b5f78e9336c0b/package.json#L35-L41). diff --git a/README.template.md b/README.template.md index ec42e8c..240f4a8 100644 --- a/README.template.md +++ b/README.template.md @@ -40,3 +40,50 @@ Specific imports: import { myFunction } from "#{REPO_NAME}#/myFunction"; import { myObject } from "#{REPO_NAME}#/myObject"; ``` + +# Contributing + +## Testing your changes in an external app + +You have made some changes to the code and you want to test them +in your app before submitting a pull request? + +Assuming `you/my-app` have `#{REPO_NAME}#` as a dependency. + +```bash +cd ~/github +git clone https://github.com/you/my-app +cd my-app +yarn + +cd ~/github +git clone https://github.com/garronej/#{REPO_NAME}# +cd #{REPO_NAME}# +yarn +yarn build +yarn link-in-app my-app +npx tsc -w + +# Open another terminal + +cd ~/github/my-app +rm -rf node_modules/.cache +yarn start # Or whatever my-app is using for starting the project +``` + +You don't have to use `~/github` as reference path. Just make sure `my-app` and `#{REPO_NAME}#` +are in the same directory. + +> Note for the maintainer: You might run into issues if you do not list all your singleton dependencies in +> `src/link-in-app.js -> singletonDependencies`. A singleton dependency is a dependency that can +> only be present once in an App. Singleton dependencies are usually listed as peerDependencies example `react`, `@emotion/*`. + +## Releasing + +For releasing a new version on GitHub and NPM you don't need to create a tag. +Just update the `package.json` version number and push. + +For publishing a release candidate update your `package.json` with `1.3.4-rc.0` (`.1`, `.2`, ...). +It also work if you do it from a branch that have an open PR on main. + +> Make sure your have defined the `NPM_TOKEN` repository secret or NPM publishing will fail. diff --git a/package.json b/package.json index 03f8c76..217379b 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "lint": "npm run lint:check -- --fix", "_format": "prettier '**/*.{ts,tsx,json,md}'", "format": "npm run _format -- --write", - "format:check": "npm run _format -- --list-different" + "format:check": "npm run _format -- --list-different", + "link-in-app": "ts-node --skipProject src/scripts/link-in-app.ts" }, "lint-staged": { "*.{ts,tsx}": [ @@ -35,6 +36,7 @@ "files": [ "src/", "!src/test/", + "!src/scripts", "dist/", "!dist/test/", "!dist/tsconfig.tsbuildinfo" @@ -50,6 +52,7 @@ "eslint-config-prettier": "^8.3.0", "husky": "^4.3.8", "lint-staged": "^11.1.1", - "prettier": "^2.3.2" + "prettier": "^2.3.2", + "ts-node": "^10.9.1" } } diff --git a/src/scripts/link-in-app.ts b/src/scripts/link-in-app.ts new file mode 100644 index 0000000..ac8a50d --- /dev/null +++ b/src/scripts/link-in-app.ts @@ -0,0 +1,162 @@ +import { execSync } from "child_process"; +import { join as pathJoin, relative as pathRelative } from "path"; +import * as fs from "fs"; + +const singletonDependencies = [ + //"react", + //"@types/react", +]; + +const rootDirPath = pathJoin(__dirname, "..", ".."); + +fs.writeFileSync( + pathJoin(rootDirPath, "dist", "package.json"), + Buffer.from( + JSON.stringify( + (() => { + const packageJsonParsed = JSON.parse( + fs.readFileSync(pathJoin(rootDirPath, "package.json")).toString("utf8") + ); + + return { + ...packageJsonParsed, + "main": packageJsonParsed["main"]?.replace(/^dist\//, ""), + "types": packageJsonParsed["types"]?.replace(/^dist\//, ""), + "module": packageJsonParsed["module"]?.replace(/^dist\//, ""), + "bin": !("bin" in packageJsonParsed) + ? undefined + : Object.fromEntries( + Object.entries(packageJsonParsed["bin"]).map(([k, v]) => [ + k, + v.replace(/^dist\//, "") + ]) + ), + "exports": !("exports" in packageJsonParsed) + ? undefined + : Object.fromEntries( + Object.entries(packageJsonParsed["exports"]).map(([key, value]) => [ + key, + (value as string).replace(/^\.\/dist\//, "./") + ]) + ) + }; + })(), + null, + 2 + ), + "utf8" + ) +); + +const commonThirdPartyDeps = (() => { + // For example [ "@emotion" ] it's more convenient than + // having to list every sub emotion packages (@emotion/css @emotion/utils ...) + // in singletonDependencies + const namespaceSingletonDependencies = []; + + return [ + ...namespaceSingletonDependencies + .map(namespaceModuleName => + fs + .readdirSync(pathJoin(rootDirPath, "node_modules", namespaceModuleName)) + .map(submoduleName => `${namespaceModuleName}/${submoduleName}`) + ) + .reduce((prev, curr) => [...prev, ...curr], []), + ...singletonDependencies + ]; +})(); + +const yarnHomeDirPath = pathJoin(rootDirPath, ".yarn_home"); + +fs.rmSync(yarnHomeDirPath, { "recursive": true, "force": true }); +fs.mkdirSync(yarnHomeDirPath); + +const execYarnLink = (params: { targetModuleName?: string; cwd: string }) => { + const { targetModuleName, cwd } = params; + + const cmd = ["yarn", "link", ...(targetModuleName !== undefined ? [targetModuleName] : [])].join( + " " + ); + + console.log(`$ cd ${pathRelative(rootDirPath, cwd) || "."} && ${cmd}`); + + execSync(cmd, { + cwd, + "env": { + ...process.env, + "HOME": yarnHomeDirPath + } + }); +}; + +const testAppPaths = (() => { + const [, , ...testAppNames] = process.argv; + + return testAppNames + .map(testAppName => { + const testAppPath = pathJoin(rootDirPath, "..", testAppName); + + if (fs.existsSync(testAppPath)) { + return testAppPath; + } + + console.warn(`Skipping ${testAppName} since it cant be found here: ${testAppPath}`); + + return undefined; + }) + .filter((path): path is string => path !== undefined); +})(); + +if (testAppPaths.length === 0) { + console.error("No test app to link into!"); + process.exit(-1); +} + +testAppPaths.forEach(testAppPath => execSync("yarn install", { "cwd": testAppPath })); + +console.log("=== Linking common dependencies ==="); + +const total = commonThirdPartyDeps.length; +let current = 0; + +commonThirdPartyDeps.forEach(commonThirdPartyDep => { + current++; + + console.log(`${current}/${total} ${commonThirdPartyDep}`); + + const localInstallPath = pathJoin( + ...[ + rootDirPath, + "node_modules", + ...(commonThirdPartyDep.startsWith("@") + ? commonThirdPartyDep.split("/") + : [commonThirdPartyDep]) + ] + ); + + execYarnLink({ "cwd": localInstallPath }); +}); + +commonThirdPartyDeps.forEach(commonThirdPartyDep => + testAppPaths.forEach(testAppPath => + execYarnLink({ + "cwd": testAppPath, + "targetModuleName": commonThirdPartyDep + }) + ) +); + +console.log("=== Linking in house dependencies ==="); + +execYarnLink({ "cwd": pathJoin(rootDirPath, "dist") }); + +testAppPaths.forEach(testAppPath => + execYarnLink({ + "cwd": testAppPath, + "targetModuleName": JSON.parse( + fs.readFileSync(pathJoin(rootDirPath, "package.json")).toString("utf8") + )["name"] + }) +); + +export {}; diff --git a/tsconfig.json b/tsconfig.json index 708cd3a..87d2581 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,5 +17,6 @@ "jsx": "react-jsx", "noFallthroughCasesInSwitch": true }, - "include": ["src"] + "include": ["src"], + "exclude": ["src/scripts"] } diff --git a/yarn.lock b/yarn.lock index 6e3ee58..a6ac299 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,6 +30,13 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -59,6 +66,24 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -80,6 +105,26 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + "@types/json-schema@^7.0.7": version "7.0.8" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" @@ -169,11 +214,21 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +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.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -233,6 +288,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" @@ -372,6 +432,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +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, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -398,6 +463,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== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -966,6 +1036,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== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -1345,6 +1420,25 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.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" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -1386,6 +1480,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -1441,6 +1540,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"