diff --git a/.changeset/curly-falcons-deny.md b/.changeset/curly-falcons-deny.md new file mode 100644 index 000000000..0b71f76b8 --- /dev/null +++ b/.changeset/curly-falcons-deny.md @@ -0,0 +1,5 @@ +--- +"synckit": minor +--- + +feat: support js as ts, ts as esm, etc diff --git a/.env b/.env deleted file mode 100644 index a3347233c..000000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -SYNCKIT_TS_ESM=1 diff --git a/package.json b/package.json index 456194c46..84094c79a 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "build": "run-p build:*", "build:r": "r -f cjs", "build:ts": "tsc -p src", - "jest": "node --experimental-vm-modules node_modules/.bin/jest --setupFiles dotenv/config", + "jest": "node --experimental-vm-modules node_modules/.bin/jest", "lint": "run-p lint:*", "lint:es": "eslint . --cache -f friendly --max-warnings 10", "lint:tsc": "tsc --noEmit", @@ -53,10 +53,11 @@ "typecov": "type-coverage" }, "dependencies": { + "@pkgr/utils": "^2.0.3", "tslib": "^2.3.1" }, "devDependencies": { - "@1stg/lib-config": "^5.3.0", + "@1stg/lib-config": "^5.5.0", "@changesets/changelog-github": "^0.4.4", "@changesets/cli": "^2.22.0", "@types/jest": "^27.4.1", @@ -72,7 +73,7 @@ "typescript": "^4.6.3" }, "resolutions": { - "prettier": "^2.6.1", + "prettier": "^2.6.2", "tslib": "^2.3.1" }, "commitlint": { @@ -105,7 +106,7 @@ ] }, "typeCoverage": { - "atLeast": 99.67, + "atLeast": 99.73, "cache": true, "detail": true, "ignoreAsAssertion": true, diff --git a/src/index.ts b/src/index.ts index 279be6465..3ab8a10ee 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,6 @@ +import { createRequire } from 'module' import path from 'path' +import { pathToFileURL } from 'url' import { MessageChannel, Worker, @@ -7,6 +9,8 @@ import { parentPort, } from 'worker_threads' +import { findUp, tryExtensions } from '@pkgr/utils' + import { AnyAsyncFn, AnyFn, @@ -18,14 +22,7 @@ import { export * from './types.js' -const { - SYNCKIT_BUFFER_SIZE, - SYNCKIT_TIMEOUT, - SYNCKIT_TS_ESM, - SYNCKIT_EXEC_ARV, -} = process.env - -const TS_USE_ESM = !!SYNCKIT_TS_ESM && ['1', 'true'].includes(SYNCKIT_TS_ESM) +const { SYNCKIT_BUFFER_SIZE, SYNCKIT_TIMEOUT, SYNCKIT_EXEC_ARV } = process.env export const DEFAULT_BUFFER_SIZE = SYNCKIT_BUFFER_SIZE ? +SYNCKIT_BUFFER_SIZE @@ -35,6 +32,7 @@ export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined export const DEFAULT_WORKER_BUFFER_SIZE = DEFAULT_BUFFER_SIZE || 1024 +/* istanbul ignore next */ export const DEFAULT_EXEC_ARGV = SYNCKIT_EXEC_ARV?.split(',') ?? [] const syncFnCache = new Map() @@ -50,7 +48,7 @@ export interface SynckitOptions { // property copying manually. export const extractProperties = (object?: T): T | undefined => { if (object && typeof object === 'object') { - const properties = {} as T + const properties = {} as unknown as T for (const key in object) { properties[key as keyof T] = object[key] } @@ -84,7 +82,7 @@ export function createSyncFn>( const syncFn = startWorkerThread( workerPath, - typeof bufferSizeOrOptions === 'number' + /* istanbul ignore next */ typeof bufferSizeOrOptions === 'number' ? { bufferSize: bufferSizeOrOptions, timeout } : bufferSizeOrOptions, ) @@ -94,8 +92,55 @@ export function createSyncFn>( return syncFn } -const throwError = (msg: string) => { - throw new Error(msg) +const cjsRequire = + typeof require === 'undefined' + ? createRequire(import.meta.url) + : /* istanbul ignore next */ require + +const dataUrl = (code: string) => + new URL(`data:text/javascript,${encodeURIComponent(code)}`) + +// eslint-disable-next-line sonarjs/cognitive-complexity +const setupTsNode = (workerPath: string, execArgv: string[]) => { + if (!/[/\\]node_modules[/\\]/.test(workerPath)) { + const ext = path.extname(workerPath) + // TODO: support `.cts` and `.mts` automatically + if (!ext || ext === '.js') { + const found = tryExtensions( + ext ? workerPath.replace(/\.js$/, '') : workerPath, + ['.ts', '.js'], + ) + if (found) { + workerPath = found + } + } + } + + const isTs = /\.[cm]?ts$/.test(workerPath) + + // TODO: it does not work for `ts-node` for now + let tsUseEsm = workerPath.endsWith('.mts') + + if (isTs) { + if (!tsUseEsm) { + const pkg = findUp(workerPath) + if (pkg) { + tsUseEsm = + (cjsRequire(pkg) as { type?: 'commonjs' | 'module' }).type === + 'module' + } + } + if (tsUseEsm && !execArgv.includes('--loader')) { + execArgv = ['--loader', 'ts-node/esm', ...execArgv] + } + } + + return { + isTs, + tsUseEsm, + workerPath, + execArgv, + } } function startWorkerThread>( @@ -108,21 +153,24 @@ function startWorkerThread>( ) { const { port1: mainPort, port2: workerPort } = new MessageChannel() - const isTs = workerPath.endsWith('.ts') + const { + isTs, + tsUseEsm, + workerPath: finalWorkerPath, + execArgv: finalExecArgv, + } = setupTsNode(workerPath, execArgv) const worker = new Worker( isTs - ? TS_USE_ESM - ? throwError( - 'Native esm in `.ts` file is not supported yet, please use `.cjs` instead', - ) - : `require('ts-node/register');require('${workerPath}')` - : workerPath, + ? tsUseEsm + ? dataUrl(`import '${String(pathToFileURL(finalWorkerPath))}'`) + : `require('ts-node/register');require('${finalWorkerPath}')` + : finalWorkerPath, { - eval: isTs, + eval: isTs && !tsUseEsm, workerData: { workerPort }, transferList: [workerPort], - execArgv, + execArgv: finalExecArgv, }, ) @@ -158,7 +206,7 @@ function startWorkerThread>( } if (error) { - throw Object.assign(error, properties) + throw Object.assign(error as object, properties) } return result! diff --git a/test/cjs/package.json b/test/cjs/package.json new file mode 100644 index 000000000..ecd5f6dd2 --- /dev/null +++ b/test/cjs/package.json @@ -0,0 +1,3 @@ +{ + "name": "cjs-test" +} diff --git a/test/cjs/worker-cjs.ts b/test/cjs/worker-cjs.ts new file mode 100644 index 000000000..5ebee70d0 --- /dev/null +++ b/test/cjs/worker-cjs.ts @@ -0,0 +1,9 @@ +// we're not using `synckit` here because jest can not handle cjs+mjs dual package correctly +const { runAsWorker } = + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires + require('../../lib/index.cjs') as typeof import('synckit') + +runAsWorker( + (result: T, timeout?: number) => + new Promise(resolve => setTimeout(() => resolve(result), timeout)), +) diff --git a/test/esm/package.json b/test/esm/package.json new file mode 100644 index 000000000..637064f86 --- /dev/null +++ b/test/esm/package.json @@ -0,0 +1,4 @@ +{ + "name": "esm-test", + "type": "module" +} diff --git a/test/worker-esm.ts b/test/esm/worker-esm.ts similarity index 100% rename from test/worker-esm.ts rename to test/esm/worker-esm.ts diff --git a/test/fn.spec.ts b/test/fn.spec.ts index d7143c277..c36bc3f0d 100644 --- a/test/fn.spec.ts +++ b/test/fn.spec.ts @@ -1,4 +1,6 @@ import { createRequire } from 'module' +import path from 'path' +import { fileURLToPath } from 'url' import { jest } from '@jest/globals' @@ -11,17 +13,51 @@ beforeEach(() => { delete process.env.SYNCKIT_BUFFER_SIZE delete process.env.SYNCKIT_TIMEOUT - - process.env.SYNCKIT_TS_ESM = '1' }) const cjsRequire = createRequire(import.meta.url) -const workerEsmTsPath = cjsRequire.resolve('./worker-esm.ts') +const _dirname = + typeof __dirname === 'undefined' + ? path.dirname(fileURLToPath(import.meta.url)) + : __dirname + +const workerCjsTsPath = cjsRequire.resolve('./cjs/worker-cjs.ts') +const workerEsmTsPath = cjsRequire.resolve('./esm/worker-esm.ts') +const workerNoExtAsJsPath = path.resolve(_dirname, './worker-js') +const workerJsAsTsPath = path.resolve(_dirname, './worker.js') const workerCjsPath = cjsRequire.resolve('./worker.cjs') const workerMjsPath = cjsRequire.resolve('./worker.mjs') const workerErrorPath = cjsRequire.resolve('./worker-error.cjs') +test('ts as cjs', () => { + const syncFn = createSyncFn(workerCjsTsPath) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) +}) + +test('ts as esm', () => { + const syncFn = createSyncFn(workerEsmTsPath) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) +}) + +test('no ext as js (as esm)', () => { + const syncFn = createSyncFn(workerNoExtAsJsPath) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) +}) + +test('js as ts (as esm)', () => { + const syncFn = createSyncFn(workerJsAsTsPath) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) +}) + test('createSyncFn', () => { expect(() => createSyncFn('./fake')).toThrow('`workerPath` must be absolute') expect(() => createSyncFn(cjsRequire.resolve('eslint'))).not.toThrow() @@ -30,10 +66,6 @@ test('createSyncFn', () => { const syncFn2 = createSyncFn(workerCjsPath) const syncFn3 = createSyncFn(workerMjsPath) - expect(() => createSyncFn(workerEsmTsPath)).toThrow( - 'Native esm in `.ts` file is not supported yet, please use `.cjs` instead', - ) - const errSyncFn = createSyncFn<() => Promise>(workerErrorPath) expect(syncFn1).toBe(syncFn2) @@ -58,7 +90,6 @@ test('createSyncFn', () => { test('timeout', async () => { process.env.SYNCKIT_BUFFER_SIZE = '0' process.env.SYNCKIT_TIMEOUT = '1' - process.env.SYNCKIT_TS_ESM = '0' const { createSyncFn } = await import('synckit') const syncFn = createSyncFn(workerCjsPath) diff --git a/test/worker-error.cjs b/test/worker-error.cjs index 46baa8ec2..4c51aa749 100644 --- a/test/worker-error.cjs +++ b/test/worker-error.cjs @@ -1,3 +1,3 @@ -const { runAsWorker } = require('synckit') +const { runAsWorker } = require('../lib/index.cjs') runAsWorker(() => Promise.reject(new Error('Worker Error'))) diff --git a/test/worker-js.js b/test/worker-js.js new file mode 100644 index 000000000..115ab999e --- /dev/null +++ b/test/worker-js.js @@ -0,0 +1,6 @@ +import { runAsWorker } from 'synckit' + +runAsWorker( + (result, timeout) => + new Promise(resolve => setTimeout(() => resolve(result), timeout)), +) diff --git a/test/worker.cjs b/test/worker.cjs index e62c2b23b..7c5b25297 100644 --- a/test/worker.cjs +++ b/test/worker.cjs @@ -1,3 +1,4 @@ +// we're not using `synckit` here because jest can not handle cjs+mjs dual package correctly const { runAsWorker } = require('../lib/index.cjs') runAsWorker( diff --git a/test/worker.mjs b/test/worker.mjs index 78a8c1ace..115ab999e 100644 --- a/test/worker.mjs +++ b/test/worker.mjs @@ -1,4 +1,4 @@ -import { runAsWorker } from '../lib/index.js' +import { runAsWorker } from 'synckit' runAsWorker( (result, timeout) => diff --git a/test/worker.ts b/test/worker.ts new file mode 100644 index 000000000..eff74dc15 --- /dev/null +++ b/test/worker.ts @@ -0,0 +1,6 @@ +import { runAsWorker } from 'synckit' + +runAsWorker( + (result: number, timeout: number) => + new Promise(resolve => setTimeout(() => resolve(result), timeout)), +) diff --git a/yarn.lock b/yarn.lock index 564966ec8..3e179cb67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@1stg/babel-preset@^2.1.4": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@1stg/babel-preset/-/babel-preset-2.1.5.tgz#420cb21dc771c22b78d27c66a5648edb09d51222" - integrity sha512-2ldiD7YR2wgV71vGOu+vWcb869r6j1iPjDF2OZIgV0sBPbcy2VYDhajwyn1F+Ka6isdP9BI7lNqD5F29PoJcaw== +"@1stg/babel-preset@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@1stg/babel-preset/-/babel-preset-2.2.0.tgz#8e28ebb437e64d8517a5aadf046f190757ea9cb1" + integrity sha512-gj8B+hzY91eSpmMl4TUKS6g7e3fNJA1pVRyDdMuPyp4rYDtH/QhM5AX7XDoy2z4CH8Iw5wduUC/yi1yKG3xG7g== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-class-properties" "^7.16.7" @@ -35,17 +35,17 @@ "@commitlint/config-lerna-scopes" "^16.2.2" "@pkgr/utils" "^2.0.2" -"@1stg/common-config@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@1stg/common-config/-/common-config-3.3.0.tgz#bcb80bc7da63715d7f8f6d3a3f31edcf2b952dfa" - integrity sha512-Bx2a4j2rhwcWpcdxaLB2UMOzdRpAJjnodrUc58vuMAIBWAV4SEXJV8xTsrqCFESDcq+WnYK+IkBIU3zmMedTvw== +"@1stg/common-config@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@1stg/common-config/-/common-config-3.5.0.tgz#70ccf860cbab56cacfa97b4ed29fbe5be35a136b" + integrity sha512-LE7FwX3Jx0FpjI60jM0hg83Q/DRkc/2qQN1dltetXW4YcHfp+XwUHFOuCaZH/eMPBu6iZbqtRBAsI+KCK4aZJQ== dependencies: - "@1stg/babel-preset" "^2.1.4" + "@1stg/babel-preset" "^2.2.0" "@1stg/commitlint-config" "^2.0.1" - "@1stg/eslint-config" "^3.3.0" + "@1stg/eslint-config" "^3.4.0" "@1stg/lint-staged" "^1.7.5" "@1stg/markuplint-config" "^1.0.2" - "@1stg/prettier-config" "^2.0.0" + "@1stg/prettier-config" "^2.2.0" "@1stg/remark-config" "^2.0.0" "@1stg/simple-git-hooks" "^0.1.2" "@1stg/tsconfig" "^2.0.1" @@ -54,22 +54,22 @@ eslint "^8.12.0" lint-staged "^12.3.7" npm-run-all "^4.1.5" - prettier "^2.6.1" + prettier "^2.6.2" simple-git-hooks "^2.7.0" tslib "^2.3.1" yarn-deduplicate "^4.0.0" -"@1stg/eslint-config@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@1stg/eslint-config/-/eslint-config-3.3.0.tgz#d3c2a3e497e8da206f25d4212f90550fc1441b87" - integrity sha512-9L3NEOS1r9eaJ6QYRLG6Z8liEd9gfBPvCTrLC86uddAFECCe3+aqI0eFxtHwc0iYHm5w40CjdP6oj0BtIGZNZA== +"@1stg/eslint-config@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@1stg/eslint-config/-/eslint-config-3.4.0.tgz#6777ad32d82f58cc8c27c52cde647e3acf8a63f1" + integrity sha512-wyPK0sgaXvLbFONVu3+eI6Xpq706NvERYmSpBAUGmRBdQhXK3AnUQd5wrro2qBhdR95f3rQzuARPor3T1kt1nA== dependencies: "@angular-eslint/eslint-plugin" "^13.1.0" "@angular-eslint/eslint-plugin-template" "^13.1.0" "@angular-eslint/template-parser" "^13.1.0" "@babel/eslint-parser" "^7.17.0" "@babel/eslint-plugin" "^7.17.7" - "@pkgr/utils" "^2.0.2" + "@pkgr/utils" "^2.0.3" "@typescript-eslint/eslint-plugin" "^5.17.0" "@typescript-eslint/eslint-plugin-tslint" "^5.17.0" "@typescript-eslint/parser" "^5.17.0" @@ -83,28 +83,28 @@ eslint-plugin-eslint-comments "^3.2.0" eslint-plugin-import "^2.25.4" eslint-plugin-jest "^26.1.3" - eslint-plugin-jsdoc "^38.1.4" + eslint-plugin-jsdoc "^38.1.5" eslint-plugin-markup "^0.8.0" eslint-plugin-mdx "^2.0.0-next.1" eslint-plugin-node "^11.1.0" eslint-plugin-prettier "^4.0.0" eslint-plugin-promise "^6.0.0" eslint-plugin-react "^7.29.4" - eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-react-hooks "^4.4.0" eslint-plugin-simple-import-sort "^7.0.0" eslint-plugin-sonar "^0.8.0" eslint-plugin-sonarjs "^0.13.0" eslint-plugin-svelte "^1.1.2" - eslint-plugin-unicorn "^41.0.1" + eslint-plugin-unicorn "^42.0.0" eslint-plugin-vue "^8.5.0" -"@1stg/lib-config@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@1stg/lib-config/-/lib-config-5.3.0.tgz#063868669bd339824a6cd3440994e24c8b8d5206" - integrity sha512-fvo5miq10Bv8tTZKA4MbgIcMaNnDMpnYI7VkxajkGqzyJmC07Be7SCt2DkOT22jv5hipdA3mI7ggMEIo3dF3hw== +"@1stg/lib-config@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@1stg/lib-config/-/lib-config-5.5.0.tgz#bf2cb07bf8d4afd49712fc9c2564d6825be40d1e" + integrity sha512-x8hyxJWm+et+FJwfZEa7keuuG4ahoQ/HlXsLAVJS7fc+n/aUL4pdqILaGKSwvm6dP0rxEu9MpXyLYHzOR9iMHQ== dependencies: - "@1stg/common-config" "^3.3.0" - "@pkgr/rollup" "^3.0.0" + "@1stg/common-config" "^3.5.0" + "@pkgr/rollup" "^3.0.1" jest "^27.5.1" "@1stg/lint-staged@^1.7.5": @@ -127,16 +127,16 @@ "@markuplint/vue-spec" "^2.0.2" markuplint-angular-parser "^1.1.0" -"@1stg/prettier-config@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@1stg/prettier-config/-/prettier-config-2.0.0.tgz#35e982b560d6349f21fc3f8f303acde5616d585e" - integrity sha512-50X5adrROd2g6/SzSe141R67dtMAUKrHvf0l7kDJZHDMzKfN3Ci1efVuKmGJruLiyJqu+dxqM0zFVP6ccYBayQ== +"@1stg/prettier-config@^2.0.0", "@1stg/prettier-config@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@1stg/prettier-config/-/prettier-config-2.2.0.tgz#4b8523e335da99d19f632f77953624dee145d946" + integrity sha512-gfoexQu/cl31I05vnIq5GOK3R1d/2Tid7Qv0p61QaaWqEQaqVeGO/3rk40Pt9ZfwUubFQNK58uvhh/q/rOOK1g== dependencies: "@prettier/plugin-pug" "^1.20.0" "@prettier/plugin-ruby" "^2.0.0" "@prettier/plugin-xml" "^2.0.1" - prettier-plugin-pkg "^0.11.1" - prettier-plugin-sh "^0.8.1" + prettier-plugin-pkg "^0.13.0" + prettier-plugin-sh "^0.10.0" prettier-plugin-svelte "^2.6.0" prettier-plugin-toml "^0.3.1" @@ -2218,7 +2218,7 @@ resolved "https://registry.yarnpkg.com/@pkgr/es-modules/-/es-modules-0.5.1.tgz#091cb5891d93aacaaf5fff953d8104ed71a48a53" integrity sha512-c0S4KU6dvjD8JyuIR10dJvc7TTYj4zY6b8jmdAOGKivsagu4rY987OK2ceBDYxJoV2e3l+YEIyaVoH2GZQ7O5g== -"@pkgr/rollup@^3.0.0": +"@pkgr/rollup@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@pkgr/rollup/-/rollup-3.0.1.tgz#bae96f60e0abc1d59cad17e22acd089db31509ee" integrity sha512-KBVJWQmX8E7g/Bd3Z+DFQnA0ba1SWtg+BZULA3NCK9uRXCEF1Fdt038+6/Th06bxKeNHp6UZonz3yY7koAA9Ng== @@ -4689,10 +4689,10 @@ eslint-plugin-jest@^26.1.3: dependencies: "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-jsdoc@^38.1.4: - version "38.1.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-38.1.5.tgz#6f30a2d343c98f29f9b18b0a7ead84c8fed99d14" - integrity sha512-hPVSfeqo/YPoVkjy2Hj5fFZVnfFdWh3cbkwKZ1sziv6hiHAio31KLN+lHDLS6tOzeHPVb3IHGtc72wicaSyeBA== +eslint-plugin-jsdoc@^38.1.5: + version "38.1.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-38.1.6.tgz#7dfa2a6d38f550935c6a3668a1fc5a05b19e4069" + integrity sha512-n4s95oYlg0L43Bs8C0dkzIldxYf8pLCutC/tCbjIdF7VDiobuzPI+HZn9Q0BvgOvgPNgh5n7CSStql25HUG4Tw== dependencies: "@es-joy/jsdoccomment" "~0.22.1" comment-parser "1.3.1" @@ -4759,7 +4759,7 @@ eslint-plugin-promise@^6.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== -eslint-plugin-react-hooks@^4.3.0: +eslint-plugin-react-hooks@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== @@ -4817,10 +4817,10 @@ eslint-plugin-svelte@^1.1.2: dependencies: eslint-plugin-svelte3 "^3.1.2" -eslint-plugin-unicorn@^41.0.1: - version "41.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-41.0.1.tgz#b49205b38e71e227d21fb5776f8d078a1dc637ca" - integrity sha512-gF5vo2dIj0YdNMQ/IMegiBkQdQ22GBFFVpdkJP+0og3w7XD4ypea0xQVRv6iofkLVR2w0phAdikcnU01ybd4Ow== +eslint-plugin-unicorn@^42.0.0: + version "42.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz#47d60c00c263ad743403b052db689e39acbacff1" + integrity sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg== dependencies: "@babel/helper-validator-identifier" "^7.15.7" ci-info "^3.3.0" @@ -7588,12 +7588,7 @@ mustache@^4.2.0: resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== -mvdan-sh@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mvdan-sh/-/mvdan-sh-0.5.0.tgz#fa76f611a103595ad0f04f5d18e582892c46e87c" - integrity sha512-UWbdl4LHd2fUnaEcOUFVWRdWGLkNoV12cKVIPiirYd8qM5VkCoCTXErlDubevrkEG7kGohvjRxAlTQmOqG80tw== - -nanoid@^3.3.1: +nanoid@^3.3.1, nanoid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== @@ -8403,17 +8398,18 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier-plugin-pkg@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/prettier-plugin-pkg/-/prettier-plugin-pkg-0.11.2.tgz#1d9dcc5145d7c82968561e9dc1bba01511a3e221" - integrity sha512-/DdxDFvPXMxbXypj6ed6gcniLMBBZy5apulGZjlbUy/pyZjCkmlWnOmEhbPt1Timb9JGNPuamZzM2Orc2Q8Eyw== +prettier-plugin-pkg@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-pkg/-/prettier-plugin-pkg-0.13.0.tgz#27f89035879f85b62956a6d99b2692a69e898962" + integrity sha512-0eUQf15kmvcTT7x9L6p0ZX3BDLZMLdO47426e3Huc90rv0HLuiY9GTifVXCoDGaQw4EUjpOllNBEg0WS0xOHCw== -prettier-plugin-sh@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/prettier-plugin-sh/-/prettier-plugin-sh-0.8.2.tgz#ea0690e87385bcdc1cc22df63e8f182a36cb6eea" - integrity sha512-M8D4G5OqgZtoVKx+U/J/B/gVA4xUKmWflOjayxiDjCQbxz3HOv0zlpYeb6DXd5xMFl7jW2UY1fJjmDzI9pDBFA== +prettier-plugin-sh@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-sh/-/prettier-plugin-sh-0.10.0.tgz#43a543b37e320f07adf0b9db7ef8430d7d2b5bb4" + integrity sha512-sRxd+GH9xYD9EXuuEGpJSKJBBLKDQY6Fw1TViHEpF1Ce2Oo7CYKQ3fktDBwEDhnXQmo65y/+yovaJGIVR8zaAg== dependencies: - mvdan-sh "^0.5.0" + sh-syntax "^0.1.3" + synckit "^0.6.2" prettier-plugin-svelte@^2.6.0: version "2.6.0" @@ -8428,10 +8424,10 @@ prettier-plugin-toml@^0.3.1: "@toml-tools/parser" "^0.3.1" prettier "^1.16.0" -prettier@>=2.3.0, prettier@>=2.4.0, prettier@^1.16.0, prettier@^1.19.1, prettier@^2.5.1, prettier@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17" - integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A== +prettier@>=2.3.0, prettier@>=2.4.0, prettier@^1.16.0, prettier@^1.19.1, prettier@^2.5.1, prettier@^2.6.1, prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== pretty-format@^27.0.0, pretty-format@^27.5.1: version "27.5.1" @@ -9803,6 +9799,14 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +sh-syntax@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/sh-syntax/-/sh-syntax-0.1.3.tgz#ae78dc1192864f013597b5ae9914dba5dfe09326" + integrity sha512-h7PHRWnFzzIam5yFNON7deCoRb3DQBOlkP0cWXW7mTytNcDGDF3P0i1BDMmxmzuK6UxbVyANgiaQ73z4eDv2XQ== + dependencies: + nanoid "^3.3.2" + tslib "^2.3.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10226,10 +10230,10 @@ sync-threads@^1.0.1: resolved "https://registry.yarnpkg.com/sync-threads/-/sync-threads-1.0.1.tgz#1e854ce579eaca0d0f1f0885a40bc2be6237b593" integrity sha512-hIdwt/c/e1ONnr2RJmfBxEAj/J6KQQWKdToF3Qw8ZNRsTNNteGkOe63rQy9I7J5UNlr8Yl0wkzIr9wgLY94x0Q== -synckit@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.6.0.tgz#03573d0c8b6490c00bd242081bfc15919dc505a2" - integrity sha512-AYuCJsMNa/3m1UKxfM9edZEjsdz0Hj7namBHs1RAMcMxEJIBNrq3pUI5EmwtGNWPxOvozuVQtixMnzcMSWJ0xg== +synckit@^0.6.0, synckit@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.6.2.tgz#e1540b97825f2855f7170b98276e8463167f33eb" + integrity sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA== dependencies: tslib "^2.3.1"