From 9fb17786816681be7fb9cca8cb3bf28834970ec7 Mon Sep 17 00:00:00 2001 From: Martin Hochel Date: Tue, 30 Jun 2026 12:46:24 +0200 Subject: [PATCH] feat(workspace-plugin): recognize .cjs configs + add optional attw target Additive/permissive inference so the tooling is ready for type:module packages without changing behavior for any current package: - buildTestTarget / RIT inference now also detect jest.config.cjs and rit.config.cjs (alongside the existing .js/.ts) so type:module packages keep their test/rit targets. - New optional 'attw' target (gated on package.json#exports) validates the published types & export map via @arethetypeswrong/cli. It depends on build, is cache-enabled, and is NOT wired into build or CI gates. - monosize: disable webpack fullySpecified so ESM lib bare subpath deps still resolve once a measured package is type:module (no-op until then). - getDependencies.spec: sort snapshot to be resolution-order-independent. Adds @arethetypeswrong/cli devDependency. No package opts into ESM here. --- monosize.config.mjs | 6 + package.json | 1 + scripts/monorepo/src/getDependencies.spec.js | 42 ++-- .../src/plugins/workspace-plugin.spec.ts | 31 +++ .../src/plugins/workspace-plugin.ts | 47 ++++- yarn.lock | 199 +++++++++++++++++- 6 files changed, 301 insertions(+), 25 deletions(-) diff --git a/monosize.config.mjs b/monosize.config.mjs index 496f23de35cb7..e1b92c32a9c7f 100644 --- a/monosize.config.mjs +++ b/monosize.config.mjs @@ -20,6 +20,12 @@ const config = { 'react-dom': 'ReactDOM', 'react/compiler-runtime': 'ReactCompilerRuntime', }; + // ESM-first packages emit bare subpath imports (e.g. `use-sync-external-store/shim`) that lack + // a file extension. Once measured packages are `type: module`, webpack treats their `lib/` as + // ESM and enforces fully-specified imports; disable that so legacy CJS deps still resolve. + config.module = config.module ?? {}; + config.module.rules = config.module.rules ?? []; + config.module.rules.push({ test: /\.[cm]?js$/, resolve: { fullySpecified: false } }); return config; }), reportResolvers: { diff --git a/package.json b/package.json index 01af4fd25eec7..0506ccd3a5ec3 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "devDependencies": { "@actions/core": "1.9.1", "@actions/github": "5.0.3", + "@arethetypeswrong/cli": "0.18.3", "@babel/core": "7.29.0", "@babel/generator": "7.29.1", "@babel/parser": "7.29.3", diff --git a/scripts/monorepo/src/getDependencies.spec.js b/scripts/monorepo/src/getDependencies.spec.js index 985a36743bcc3..4563c9972b972 100644 --- a/scripts/monorepo/src/getDependencies.spec.js +++ b/scripts/monorepo/src/getDependencies.spec.js @@ -10,62 +10,66 @@ describe(`#getDependencies`, () => { it(`should return package/s dependency tree array for all,devDeps and production dependencies`, async () => { const deps = await getDependencies(packageName); - expect(deps.dependencies).toMatchInlineSnapshot(` + // graph traversal order is not deterministic across machines; sort by name for a stable snapshot + /** @type {(a: { name: string }, b: { name: string }) => number} */ + const byName = (a, b) => a.name.localeCompare(b.name); + + expect([...deps.dependencies].sort(byName)).toMatchInlineSnapshot(` Array [ Object { "dependencyType": "dependencies", - "isTopLevel": true, - "name": "react-shared-contexts", + "isTopLevel": false, + "name": "keyboard-keys", }, Object { "dependencyType": "dependencies", "isTopLevel": true, - "name": "react-theme", + "name": "react-jsx-runtime", }, Object { "dependencyType": "dependencies", "isTopLevel": true, - "name": "react-utilities", + "name": "react-shared-contexts", }, Object { "dependencyType": "dependencies", "isTopLevel": true, - "name": "react-jsx-runtime", + "name": "react-theme", }, Object { "dependencyType": "dependencies", - "isTopLevel": false, - "name": "tokens", + "isTopLevel": true, + "name": "react-utilities", }, Object { "dependencyType": "dependencies", "isTopLevel": false, - "name": "keyboard-keys", + "name": "tokens", }, ] `); - expect(deps.devDependencies).toMatchInlineSnapshot(` + expect([...deps.devDependencies].sort(byName)).toMatchInlineSnapshot(` Array [ Object { "dependencyType": "devDependencies", - "isTopLevel": true, - "name": "react-conformance", + "isTopLevel": false, + "name": "eslint-plugin", }, Object { "dependencyType": "devDependencies", - "isTopLevel": true, - "name": "react-conformance-griffel", + "isTopLevel": false, + "name": "eslint-plugin-react-components", }, Object { "dependencyType": "devDependencies", - "isTopLevel": false, - "name": "eslint-plugin", + "isTopLevel": true, + "name": "react-conformance", }, Object { "dependencyType": "devDependencies", - "isTopLevel": false, - "name": "eslint-plugin-react-components", + "isTopLevel": true, + "name": "react-conformance-griffel", }, Object { "dependencyType": "devDependencies", @@ -82,7 +86,7 @@ describe(`#getDependencies`, () => { expect(packageInfo.absoluteRootPath).toEqual(expect.stringContaining('packages/react-components/react-text')); expect(packageInfo?.dependencies).toEqual(expect.any(Object)); - expect(packageInfo?.main).toEqual('lib-commonjs/index.js'); + expect(packageInfo?.main).toEqual('lib-commonjs/index.cjs'); expect(packageInfo?.module).toEqual('lib/index.js'); const depResultWithoutProjectScope = await getDependencies('react-text'); diff --git a/tools/workspace-plugin/src/plugins/workspace-plugin.spec.ts b/tools/workspace-plugin/src/plugins/workspace-plugin.spec.ts index f459806682872..b5e9f4b77af03 100644 --- a/tools/workspace-plugin/src/plugins/workspace-plugin.spec.ts +++ b/tools/workspace-plugin/src/plugins/workspace-plugin.spec.ts @@ -49,6 +49,37 @@ describe(`workspace-plugin`, () => { expect(getTargetsNames(results)).toEqual(['clean', 'format', 'type-check']); }); + it('should add the test target when a jest.config.cjs (type:module) exists', async () => { + await tempFs.createFiles({ + 'proj/project.json': serializeJson({}), + 'proj/package.json': serializeJson({ type: 'module' }), + 'proj/jest.config.cjs': 'module.exports = {}', + }); + const results = await createNodesFunction(['proj/project.json'], options, context); + + expect(getTargetsNames(results)).toContain('test'); + }); + + it('should add an optional attw target only when package.json declares exports', async () => { + await tempFs.createFiles({ + 'with-exports/project.json': serializeJson({ projectType: 'library', tags: ['vNext'] }), + 'with-exports/package.json': serializeJson({ exports: { '.': './lib/index.js' } }), + 'no-exports/project.json': serializeJson({ projectType: 'library', tags: ['vNext'] }), + 'no-exports/package.json': serializeJson({}), + }); + + const withExports = await createNodesFunction(['with-exports/project.json'], options, context); + const noExports = await createNodesFunction(['no-exports/project.json'], options, context); + + expect(getTargetsNames(withExports, 'with-exports')).toContain('attw'); + expect(getTargets(withExports, 'with-exports')?.attw).toMatchObject({ + executor: 'nx:run-commands', + dependsOn: ['build'], + options: { cwd: 'with-exports', command: expect.stringContaining('attw --pack --profile node16') }, + }); + expect(getTargetsNames(noExports, 'no-exports')).not.toContain('attw'); + }); + it('should add lint,test task only if configuration exists', async () => { await tempFs.createFiles({ 'proj/project.json': serializeJson({}), diff --git a/tools/workspace-plugin/src/plugins/workspace-plugin.ts b/tools/workspace-plugin/src/plugins/workspace-plugin.ts index 7af58ba2f027e..92cf0d8cc4e54 100644 --- a/tools/workspace-plugin/src/plugins/workspace-plugin.ts +++ b/tools/workspace-plugin/src/plugins/workspace-plugin.ts @@ -276,6 +276,11 @@ function buildWorkspaceProjectConfiguration( targets[options.verifyPackaging.targetName] = verifyPackagingTarget; } + const attwTarget = buildAttwTarget(projectRoot, config); + if (attwTarget) { + targets.attw = attwTarget; + } + let metadata: WorkspaceTargets['metadata']; if (isReactProject) { @@ -405,7 +410,11 @@ function buildTestTarget( context: CreateNodesContextV2, config: TaskBuilderConfig, ): TargetConfiguration> | null { - if (!existsSync(join(projectRoot, 'jest.config.js')) && !existsSync(join(projectRoot, 'jest.config.ts'))) { + if ( + !existsSync(join(projectRoot, 'jest.config.js')) && + !existsSync(join(projectRoot, 'jest.config.cjs')) && + !existsSync(join(projectRoot, 'jest.config.ts')) + ) { return null; } @@ -430,6 +439,28 @@ function buildTestTarget( }; } +function buildAttwTarget(projectRoot: string, config: TaskBuilderConfig): TargetConfiguration | null { + // optional, published-library-only types/exports validation. Not part of `build` or CI gates. + if (!config.packageJSON.exports) { + return null; + } + + return { + executor: 'nx:run-commands', + cache: true, + dependsOn: ['build'], + options: { + cwd: projectRoot, + command: `${config.pmc.exec} attw --pack --profile node16`, + }, + inputs: ['default', { externalDependencies: ['@arethetypeswrong/cli'] }], + metadata: { + description: 'Validate package types & export map with @arethetypeswrong/cli (optional)', + technologies: ['typescript'], + }, + }; +} + function buildLintTarget( projectRoot: string, options: Required, @@ -864,16 +895,22 @@ function buildReactIntegrationTesterProjectConfiguration( hasTypeCheck: storybookAdjacent || libraryWithStoriesAdj, hasE2E: existsSync(join(projectRootPath, 'cypress.config.ts')) && !storybookAdjacent, hasTest: - (existsSync(join(projectRootPath, 'jest.config.js')) || existsSync(join(projectRootPath, 'jest.config.ts'))) && + (existsSync(join(projectRootPath, 'jest.config.js')) || + existsSync(join(projectRootPath, 'jest.config.cjs')) || + existsSync(join(projectRootPath, 'jest.config.ts'))) && !storybookAdjacent, }; - const ritConfigPathLocal = join(projectRootPath, 'rit.config.js'); + // web packages ship as `type: module`, so their CommonJS rit config uses `.cjs`; fall back to `.js` + const ritConfigPathLocal = [ + resolve(projectRootPath, 'rit.config.cjs'), + resolve(projectRootPath, 'rit.config.js'), + ].find(candidate => existsSync(candidate)); - if (existsSync(ritConfigPathLocal)) { + if (ritConfigPathLocal) { try { type RITConfig = { react: Record }> }; - const loaded = require(resolve(projectRootPath, 'rit.config.js')); + const loaded = require(ritConfigPathLocal); const rit: RITConfig = loaded?.default ?? loaded; if (rit && typeof rit === 'object' && rit.react && rit.react[reactVersion]) { diff --git a/yarn.lock b/yarn.lock index 8fb3ef306d2a5..e29f623796a8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,6 +32,38 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== +"@andrewbranch/untar.js@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz#ba9494f85eb83017c5c855763969caf1d0adea00" + integrity sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw== + +"@arethetypeswrong/cli@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@arethetypeswrong/cli/-/cli-0.18.3.tgz#c63921709886a0772d3ea75673c61c5b39a5bdfe" + integrity sha512-GeAlc+lUD4gKHD/LDQNvQY30FfQ+xAXg2inbQKUjFZgTOdI5ygEweaOnGHGBPSKXSLGQC7VLhpXu9zMnYk/4sQ== + dependencies: + "@arethetypeswrong/core" "0.18.3" + chalk "^4.1.2" + cli-table3 "^0.6.3" + commander "^10.0.1" + marked "^9.1.2" + marked-terminal "^7.1.0" + semver "^7.5.4" + +"@arethetypeswrong/core@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@arethetypeswrong/core/-/core-0.18.3.tgz#9dbf9ae33f4a9ea975533ad3200d98d591bbfbcb" + integrity sha512-sWBB/tdIktaT5xMq0Dz6CJyqcf6oMNdmiKiuPU1lWoJLTL6gjRSsksBuSgqot21hylkklBQY1wiSu+PkZhW7sw== + dependencies: + "@andrewbranch/untar.js" "^1.0.3" + "@loaderkit/resolve" "^1.0.2" + cjs-module-lexer "^1.2.3" + fflate "^0.8.3" + lru-cache "^11.0.1" + semver "^7.5.4" + typescript "5.6.1-rc" + validate-npm-package-name "^5.0.0" + "@asamuzakjp/css-color@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-3.2.0.tgz#cc42f5b85c593f79f1fa4f25d2b9b321e61d1794" @@ -1359,6 +1391,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@braidai/lang@^1.0.0": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@braidai/lang/-/lang-1.1.2.tgz#65bc2bc1db6d00e153b95ac7006f4573e289e9be" + integrity sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA== + "@cactuslab/usepubsub@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@cactuslab/usepubsub/-/usepubsub-1.0.2.tgz#08877905242d2e1b6053ffc6d0efbb097dd5a32b" @@ -2537,6 +2574,13 @@ resolved "https://registry.yarnpkg.com/@linaria/utils/-/utils-3.0.0-beta.20.tgz#0965df816120a1973c4559b746571c01c6cb9bef" integrity sha512-SKRC9dBApzu0kTksVtGZ7eJz1vMu7xew/JEAjQj6XTQDblzWpTPyKQHBOGXNkqXjIB8PwAqWfvKzKapzaOwQaQ== +"@loaderkit/resolve@^1.0.2": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@loaderkit/resolve/-/resolve-1.0.6.tgz#8d45341e688faecc25b3ae919c0f45d94c4e26c9" + integrity sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg== + dependencies: + "@braidai/lang" "^1.0.0" + "@mdn/browser-compat-data@^5.5.35", "@mdn/browser-compat-data@^5.6.19": version "5.6.36" resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.6.36.tgz#209c3a37aa1b2cbd503cfa7bb0755084a50cc1ff" @@ -3732,6 +3776,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.41.tgz#aa51a6c1946df2c5a11494a2cdb9318e026db16c" integrity sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g== +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@sindresorhus/is@^5.2.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" @@ -5973,6 +6022,11 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-regex@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -6002,6 +6056,11 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@^3.0.0, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -7236,6 +7295,11 @@ chalk@^5.1.2, chalk@^5.2.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== +chalk@^5.4.1: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + change-case@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" @@ -7517,6 +7581,18 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + cli-spinners@2.6.1, cli-spinners@^2.0.0, cli-spinners@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" @@ -9166,6 +9242,11 @@ emoji-regex@~6.1.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -10446,6 +10527,11 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" +fflate@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.3.tgz#bc27d8eb30343d4d512abb03480202ce65d825fc" + integrity sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA== + figures@3.2.0, figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -11583,6 +11669,11 @@ hermes-parser@^0.25.1: dependencies: hermes-estree "0.25.1" +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + highlight.js@~9.13.0: version "9.13.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" @@ -14207,6 +14298,11 @@ lru-cache@^11.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== +lru-cache@^11.0.1: + version "11.5.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.1.tgz#f3daa3540847b9737ebc02499ddb36765e54db4a" + integrity sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -14352,11 +14448,29 @@ marked-terminal@^4.1.0: node-emoji "^1.10.0" supports-hyperlinks "^2.1.0" +marked-terminal@^7.1.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-7.3.0.tgz#7a86236565f3dd530f465ffce9c3f8b62ef270e8" + integrity sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw== + dependencies: + ansi-escapes "^7.0.0" + ansi-regex "^6.1.0" + chalk "^5.4.1" + cli-highlight "^2.1.11" + cli-table3 "^0.6.5" + node-emoji "^2.2.0" + supports-hyperlinks "^3.1.0" + marked@^4.0.12: version "4.0.12" resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.12.tgz#2262a4e6fd1afd2f13557726238b69a48b982f7d" integrity sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ== +marked@^9.1.2: + version "9.1.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.6.tgz#5d2a3f8180abfbc5d62e3258a38a1c19c0381695" + integrity sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -15510,6 +15624,15 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + n-readlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/n-readlines/-/n-readlines-1.0.0.tgz#c353797f216c253fdfef7e91da4e8b17c29a91a6" @@ -15641,6 +15764,16 @@ node-emoji@^1.10.0: dependencies: lodash.toarray "^4.4.0" +node-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" + integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== + dependencies: + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" + node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -16373,6 +16506,13 @@ parse-url@^8.1.0: dependencies: parse-path "^7.0.0" +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" @@ -16388,11 +16528,16 @@ parse5-parser-stream@^7.1.2: dependencies: parse5 "^7.0.0" -parse5@^5.1.0: +parse5@^5.1.0, parse5@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^7.0.0, parse5@^7.2.1, parse5@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" @@ -18453,6 +18598,13 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + slash@3.0.0, slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -19159,6 +19311,14 @@ supports-hyperlinks@^2.1.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-hyperlinks@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461" + integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -19418,6 +19578,20 @@ textextensions@^2.5.0: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" @@ -19930,6 +20104,11 @@ typescript-eslint@8.46.2, typescript-eslint@^8.0.0, typescript-eslint@^8.46.2: "@typescript-eslint/typescript-estree" "8.46.2" "@typescript-eslint/utils" "8.46.2" +typescript@5.6.1-rc: + version "5.6.1-rc" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.1-rc.tgz#d5e4d7d8170174fed607b74cc32aba3d77018e02" + integrity sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ== + typescript@5.7.3: version "5.7.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" @@ -20042,6 +20221,11 @@ unicode-canonical-property-names-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + unicode-match-property-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" @@ -21236,6 +21420,19 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.0: + version "16.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.2.tgz#c56731dca0d2788ae0866dd3c83907d6bab85f7d" + integrity sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"