diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a7ac63..05e87b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,10 +13,8 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 20.11.0 - - uses: pnpm/action-setup@v2 - with: - version: 8.15.1 + node-version: 22.14.0 + - uses: pnpm/action-setup@v6 - name: Install Depdendencies run: pnpm install - name: Build all projects diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 383aa8c..3fad0e5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,9 +12,7 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 20.11.0 - - uses: pnpm/action-setup@v2 - with: - version: 8.15.1 + - uses: pnpm/action-setup@v6 - name: Install Depdendencies run: pnpm install - name: Build and run tests for pnpm-sync-lib diff --git a/packages/pnpm-sync-lib/package.json b/packages/pnpm-sync-lib/package.json index 3b93ee7..6764fce 100644 --- a/packages/pnpm-sync-lib/package.json +++ b/packages/pnpm-sync-lib/package.json @@ -1,6 +1,6 @@ { "name": "pnpm-sync-lib", - "version": "0.3.4", + "version": "0.3.5", "description": "API library for integrating \"pnpm-sync\" with your toolchain", "repository": { "type": "git", diff --git a/packages/pnpm-sync-lib/src/pnpmSyncPrepare.ts b/packages/pnpm-sync-lib/src/pnpmSyncPrepare.ts index 094fe40..0062ba9 100644 --- a/packages/pnpm-sync-lib/src/pnpmSyncPrepare.ts +++ b/packages/pnpm-sync-lib/src/pnpmSyncPrepare.ts @@ -17,7 +17,7 @@ import { IVersionSpecifier, ITargetFolder } from './interfaces'; -import { isPnpmV10, isPnpmV8, isPnpmV9, pnpmSyncGetJsonVersion } from './utilities'; +import { isPnpmV10, isPnpmV11, isPnpmV8, isPnpmV9, pnpmSyncGetJsonVersion } from './utilities'; /** * @beta @@ -224,9 +224,12 @@ export async function pnpmSyncPrepareAsync(options: IPnpmSyncPrepareOptions): Pr const pnpmModulesYaml = YAML.parse(fs.readFileSync(`${pnpmModulesYamlPath}/.modules.yaml`, 'utf8')); const pnpmVersion: string | undefined = pnpmModulesYaml?.packageManager?.split('@')[1]; - if (!pnpmVersion || !(isPnpmV8(pnpmVersion) || isPnpmV9(pnpmVersion) || isPnpmV10(pnpmVersion))) { + if ( + !pnpmVersion || + !(isPnpmV8(pnpmVersion) || isPnpmV9(pnpmVersion) || isPnpmV10(pnpmVersion) || isPnpmV11(pnpmVersion)) + ) { logMessageCallback({ - message: `The pnpm version is not supported; pnpm-sync requires pnpm version 8.x, 9.x, 10.x`, + message: `The pnpm version is not supported; pnpm-sync requires pnpm version 8.x, 9.x, 10.x, 11.x`, messageKind: LogMessageKind.ERROR, details: { messageIdentifier: LogMessageIdentifier.PREPARE_ERROR_UNSUPPORTED_PNPM_VERSION, @@ -242,7 +245,7 @@ export async function pnpmSyncPrepareAsync(options: IPnpmSyncPrepareOptions): Pr ignoreIncompatible: true }); - // currently, only support lockfileVersion 6.x, which is pnpm v8 and lockfileVersion 9.x, which is pnpm v9 + // pnpm v8 uses lockfile version 6.x; pnpm v9 through v11 use lockfile version 9.x. const lockfileVersion: string | undefined = pnpmLockfile?.lockfileVersion.toString(); if ( !pnpmLockfile || @@ -297,10 +300,11 @@ export async function pnpmSyncPrepareAsync(options: IPnpmSyncPrepareOptions): Pr if (isPnpmV9(pnpmVersion)) { return depPathToFilenameV9(injectedDependency + '@' + injectedDependencyVersion, 120); } - if (isPnpmV10(pnpmVersion)) { + if (isPnpmV10(pnpmVersion) || isPnpmV11(pnpmVersion)) { return depPathToFilenameV10( injectedDependency + '@' + injectedDependencyVersion, - // for v10 default is 120 on Linux/MacOS and 60 on Windows https://pnpm.io/next/settings#virtualstoredirmaxlength + // For pnpm v10 and v11 the default is 120 on Linux/macOS and 60 on Windows. + // https://pnpm.io/settings#virtualstoredirmaxlength process.platform === 'win32' ? 60 : 120 ); } diff --git a/packages/pnpm-sync-lib/src/utilities.ts b/packages/pnpm-sync-lib/src/utilities.ts index b4949d3..4c22fc3 100644 --- a/packages/pnpm-sync-lib/src/utilities.ts +++ b/packages/pnpm-sync-lib/src/utilities.ts @@ -43,3 +43,5 @@ export const isPnpmV8 = (pnpmVersion: string): boolean => pnpmVersion.startsWith export const isPnpmV9 = (pnpmVersion: string): boolean => pnpmVersion.startsWith('9.'); export const isPnpmV10 = (pnpmVersion: string): boolean => pnpmVersion.startsWith('10.'); + +export const isPnpmV11 = (pnpmVersion: string): boolean => pnpmVersion.startsWith('11.'); diff --git a/packages/pnpm-sync/package.json b/packages/pnpm-sync/package.json index 6f73806..03bc7b5 100644 --- a/packages/pnpm-sync/package.json +++ b/packages/pnpm-sync/package.json @@ -1,6 +1,6 @@ { "name": "pnpm-sync", - "version": "0.3.4", + "version": "0.3.5", "description": "Recopy injected dependencies whenever a project is rebuilt in your PNPM workspace", "keywords": [ "rush", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c1fed6..ae85ef7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,6 +219,8 @@ importers: tests/test-fixtures/pnpm-v10: {} + tests/test-fixtures/pnpm-v11: {} + tests/test-fixtures/pnpm-v8: {} tests/test-fixtures/pnpm-v9: {} diff --git a/tests/pnpm-sync-api-test/src/test/__snapshots__/pnpmMultiVersion.test.ts.snap b/tests/pnpm-sync-api-test/src/test/__snapshots__/pnpmMultiVersion.test.ts.snap index 80a348f..9287d91 100644 --- a/tests/pnpm-sync-api-test/src/test/__snapshots__/pnpmMultiVersion.test.ts.snap +++ b/tests/pnpm-sync-api-test/src/test/__snapshots__/pnpmMultiVersion.test.ts.snap @@ -46,7 +46,7 @@ Object { }, ], }, - "version": "0.3.4", + "version": "0.3.5", } `; @@ -93,7 +93,7 @@ Object { }, ], }, - "version": "0.3.4", + "version": "0.3.5", } `; @@ -140,6 +140,53 @@ Object { }, ], }, - "version": "0.3.4", + "version": "0.3.5", +} +`; + +exports[`pnpm multi version test pnpm v11 1`] = ` +Array [ + Object { + "details": Object { + "dotPnpmFolder": "/pnpm-sync/tests/test-fixtures/pnpm-v11/node_modules/.pnpm", + "lockfilePath": "/pnpm-sync/tests/test-fixtures/pnpm-v11/pnpm-lock.yaml", + "messageIdentifier": "prepare-starting", + }, + "message": "Starting...", + "messageKind": "verbose", + }, + Object { + "details": Object { + "messageIdentifier": "prepare-writing-file", + "pnpmSyncJsonPath": "/pnpm-sync/tests/test-fixtures/pnpm-v11/packages/sample-lib1/node_modules/.pnpm-sync.json", + "sourceProjectFolder": "/pnpm-sync/tests/test-fixtures/pnpm-v11/packages/sample-lib1", + }, + "message": "Writing...", + "messageKind": "verbose", + }, + Object { + "details": Object { + "dotPnpmFolder": "/pnpm-sync/tests/test-fixtures/pnpm-v11/node_modules/.pnpm", + "executionTimeInMs": "[TIMING]", + "lockfilePath": "/pnpm-sync/tests/test-fixtures/pnpm-v11/pnpm-lock.yaml", + "messageIdentifier": "prepare-finishing", + }, + "message": "Regenerated...", + "messageKind": "info", + }, +] +`; + +exports[`pnpm multi version test pnpm v11 2`] = ` +Object { + "postbuildInjectedCopy": Object { + "sourceFolder": "..", + "targetFolders": Array [ + Object { + "folderPath": "../../../node_modules/.pnpm/sample-lib1@file+packages+sample-lib1_@rushstack+eslint-patch@1.16.1_@rushstack+node-co_c39b755ece3ba75158e9aae0754dd9f8/node_modules/sample-lib1", + }, + ], + }, + "version": "0.3.5", } `; diff --git a/tests/pnpm-sync-api-test/src/test/pnpmMultiVersion.test.ts b/tests/pnpm-sync-api-test/src/test/pnpmMultiVersion.test.ts index c253bec..20b1983 100644 --- a/tests/pnpm-sync-api-test/src/test/pnpmMultiVersion.test.ts +++ b/tests/pnpm-sync-api-test/src/test/pnpmMultiVersion.test.ts @@ -5,44 +5,54 @@ import { ILogMessageCallbackOptions, pnpmSyncPrepareAsync } from 'pnpm-sync-lib' import { __dirname, readPnpmLockfile, scrubLog } from './testUtilities.js'; describe('pnpm multi version test', () => { - it.each(['8', '9', '10'])('pnpm v%s', async (version) => { - const logs: ILogMessageCallbackOptions[] = []; - const projectDir = path.join(__dirname, '..', '..', '..', 'test-fixtures', `pnpm-v${version}`); + it.each(['8', '9', '10', '11'])( + 'pnpm v%s', + async (version) => { + const logs: ILogMessageCallbackOptions[] = []; + const projectDir = path.join(__dirname, '..', '..', '..', 'test-fixtures', `pnpm-v${version}`); - // Clean the project directory by removing all untracked files and directories - await execa({ cwd: projectDir })`git clean -xdf`; - // Install dependencies using the specified pnpm version via corepack - await execa({ cwd: projectDir })`corepack pnpm i`; + // Remove install outputs without requiring the fixture itself to already be tracked by Git. + await Promise.all( + [ + path.join(projectDir, 'node_modules'), + path.join(projectDir, 'apps', 'sample-app1', 'node_modules'), + path.join(projectDir, 'apps', 'sample-app2', 'node_modules'), + path.join(projectDir, 'packages', 'sample-lib1', 'node_modules') + ].map((folderPath) => FileSystem.deleteFolderAsync(folderPath)) + ); + // Install dependencies using the specified pnpm version via corepack + await execa({ cwd: projectDir })`corepack pnpm i`; - await pnpmSyncPrepareAsync({ - lockfilePath: path.join(projectDir, 'pnpm-lock.yaml'), - dotPnpmFolder: path.join(projectDir, 'node_modules', '.pnpm'), - ensureFolderAsync: FileSystem.ensureFolderAsync, - readPnpmLockfile, - logMessageCallback: (options: ILogMessageCallbackOptions): void => { - logs.push(options); - } - }); + await pnpmSyncPrepareAsync({ + lockfilePath: path.join(projectDir, 'pnpm-lock.yaml'), + dotPnpmFolder: path.join(projectDir, 'node_modules', '.pnpm'), + ensureFolderAsync: FileSystem.ensureFolderAsync, + readPnpmLockfile, + logMessageCallback: (options: ILogMessageCallbackOptions): void => { + logs.push(options); + } + }); - expect(logs.map((x) => scrubLog(x))).toMatchSnapshot(); + expect(logs.map((x) => scrubLog(x))).toMatchSnapshot(); - const pnpmSyncJSONFile = path.join( - projectDir, - 'packages', - 'sample-lib1', - 'node_modules', - '.pnpm-sync.json' - ); - const pnpmSyncJSON = JSON.parse(FileSystem.readFile(pnpmSyncJSONFile)); + const pnpmSyncJSONFile = path.join( + projectDir, + 'packages', + 'sample-lib1', + 'node_modules', + '.pnpm-sync.json' + ); + const pnpmSyncJSON = JSON.parse(FileSystem.readFile(pnpmSyncJSONFile)); - // Verify that the configuration matches the expected snapshot - expect(pnpmSyncJSON).toMatchSnapshot(); + // Verify that the configuration matches the expected snapshot + expect(pnpmSyncJSON).toMatchSnapshot(); - // Verify that all target folders specified in the configuration exist - expect(() => { + // Verify that all target folders specified in the configuration exist for (const targetFolder of pnpmSyncJSON.postbuildInjectedCopy.targetFolders) { - FileSystem.exists(targetFolder.folderPath); + const targetFolderPath = path.resolve(path.dirname(pnpmSyncJSONFile), targetFolder.folderPath); + expect(FileSystem.exists(targetFolderPath)).toBe(true); } - }).not.toThrow(); - }); + }, + 120_000 + ); }); diff --git a/tests/pnpm-sync-api-test/src/test/pnpmSyncPrepare.test.ts b/tests/pnpm-sync-api-test/src/test/pnpmSyncPrepare.test.ts index ad2d643..282bc7f 100644 --- a/tests/pnpm-sync-api-test/src/test/pnpmSyncPrepare.test.ts +++ b/tests/pnpm-sync-api-test/src/test/pnpmSyncPrepare.test.ts @@ -176,7 +176,7 @@ Array [ Object { "details": Object { "actualVersion": "incompatible-version", - "expectedVersion": "0.3.4", + "expectedVersion": "0.3.5", "messageIdentifier": "prepare-replacing-file", "pnpmSyncJsonPath": "/pnpm-sync/tests/test-fixtures/sample-lib1/node_modules/.pnpm-sync.json", "sourceProjectFolder": "/pnpm-sync/tests/test-fixtures/sample-lib1", diff --git a/tests/test-fixtures/README.md b/tests/test-fixtures/README.md index 33b7cb9..22cc21e 100644 --- a/tests/test-fixtures/README.md +++ b/tests/test-fixtures/README.md @@ -67,7 +67,7 @@ Each pnpm version directory contains: Update the test file to include the new version: ```typescript // tests/pnpm-sync-api-test/src/test/pnpmMultiVersion.test.ts - it.each(['8', '9', '10', 'X'])('pnpm v%s', async (version) => { + it.each(['8', '9', '10', '11', 'X'])('pnpm v%s', async (version) => { ``` 7. **Run tests to verify**: @@ -107,4 +107,3 @@ These fixtures are used by the pnpm-sync test suite to: - Ensure proper handling of different project structures Each fixture represents a specific test scenario and should be maintained to reflect real-world usage patterns. - \ No newline at end of file diff --git a/tests/test-fixtures/pnpm-v11/apps/sample-app1/package.json b/tests/test-fixtures/pnpm-v11/apps/sample-app1/package.json new file mode 100644 index 0000000..013a40a --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/apps/sample-app1/package.json @@ -0,0 +1,22 @@ +{ + "name": "sample-app1", + "version": "0.0.0", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "sample-lib1": "workspace:*" + }, + "devDependencies": { + "typescript": "^5.8.3" + }, + "dependenciesMeta": { + "sample-lib1": { + "injected": true + } + } +} diff --git a/tests/test-fixtures/pnpm-v11/apps/sample-app1/src/index.tsx b/tests/test-fixtures/pnpm-v11/apps/sample-app1/src/index.tsx new file mode 100644 index 0000000..7c8fcfa --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/apps/sample-app1/src/index.tsx @@ -0,0 +1,8 @@ +import { Lib1Component } from 'sample-lib1'; + +export const App1Component = () => ( +
+ {'I am from sample-app1.'} + +
+); diff --git a/tests/test-fixtures/pnpm-v11/apps/sample-app1/tsconfig.json b/tests/test-fixtures/pnpm-v11/apps/sample-app1/tsconfig.json new file mode 100644 index 0000000..73a2bf7 --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/apps/sample-app1/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.app.base.json", + "compilerOptions": {}, + "include": ["src"] +} diff --git a/tests/test-fixtures/pnpm-v11/apps/sample-app2/package.json b/tests/test-fixtures/pnpm-v11/apps/sample-app2/package.json new file mode 100644 index 0000000..58ef1b9 --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/apps/sample-app2/package.json @@ -0,0 +1,22 @@ +{ + "name": "sample-app2", + "version": "0.0.0", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "react": "^17.0.0", + "react-dom": "^17.0.0", + "sample-lib1": "workspace:*" + }, + "devDependencies": { + "typescript": "^5.8.3" + }, + "dependenciesMeta": { + "sample-lib1": { + "injected": true + } + } +} diff --git a/tests/test-fixtures/pnpm-v11/apps/sample-app2/src/index.tsx b/tests/test-fixtures/pnpm-v11/apps/sample-app2/src/index.tsx new file mode 100644 index 0000000..4420f9d --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/apps/sample-app2/src/index.tsx @@ -0,0 +1,8 @@ +import { Lib1Component } from 'sample-lib1'; + +export const App2Component = () => ( +
+ {'I am from sample-app2.'} + +
+); diff --git a/tests/test-fixtures/pnpm-v11/apps/sample-app2/tsconfig.json b/tests/test-fixtures/pnpm-v11/apps/sample-app2/tsconfig.json new file mode 100644 index 0000000..73a2bf7 --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/apps/sample-app2/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.app.base.json", + "compilerOptions": {}, + "include": ["src"] +} diff --git a/tests/test-fixtures/pnpm-v11/package.json b/tests/test-fixtures/pnpm-v11/package.json new file mode 100644 index 0000000..42673ff --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/package.json @@ -0,0 +1,5 @@ +{ + "name": "pnpm-v11-workspace", + "version": "0.0.0", + "packageManager": "pnpm@11.17.0+sha512.cca3cea332ad254bb84145f966d19f4879615210346fc92c79a047f23a0d7b3cca3c3792f0076ba1f1831d277efbcf0a9119b31a9a60eca7fb3d6231f331ef72" +} diff --git a/tests/test-fixtures/pnpm-v11/packages/sample-lib1/package.json b/tests/test-fixtures/pnpm-v11/packages/sample-lib1/package.json new file mode 100644 index 0000000..072e368 --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/packages/sample-lib1/package.json @@ -0,0 +1,34 @@ +{ + "name": "sample-lib1", + "version": "0.0.0", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc" + }, + "dependencies": {}, + "devDependencies": { + "@rushstack/eslint-patch": "^1.11.0", + "@rushstack/node-core-library": "^5.13.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "typescript": "^5.8.3" + }, + "peerDependencies": { + "@rushstack/eslint-patch": "*", + "@rushstack/node-core-library": "*", + "@types/react": "17 || 18", + "@types/react-dom": "17 || 18", + "react": "17 || 18", + "react-dom": "17 || 18" + } +} diff --git a/tests/test-fixtures/pnpm-v11/packages/sample-lib1/src/index.tsx b/tests/test-fixtures/pnpm-v11/packages/sample-lib1/src/index.tsx new file mode 100644 index 0000000..bb307a4 --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/packages/sample-lib1/src/index.tsx @@ -0,0 +1 @@ +export const Lib1Component = () =>
{'I am from sample-lib1'}
; diff --git a/tests/test-fixtures/pnpm-v11/packages/sample-lib1/tsconfig.json b/tests/test-fixtures/pnpm-v11/packages/sample-lib1/tsconfig.json new file mode 100644 index 0000000..368af83 --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/packages/sample-lib1/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.lib.base.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src"] +} diff --git a/tests/test-fixtures/pnpm-v11/pnpm-lock.yaml b/tests/test-fixtures/pnpm-v11/pnpm-lock.yaml new file mode 100644 index 0000000..50ddb3c --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/pnpm-lock.yaml @@ -0,0 +1,414 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + apps/sample-app1: + dependencies: + '@types/react': + specifier: ^18.0.0 + version: 18.3.31 + '@types/react-dom': + specifier: ^18.0.0 + version: 18.3.7(@types/react@18.3.31) + react: + specifier: ^18.0.0 + version: 18.3.1 + react-dom: + specifier: ^18.0.0 + version: 18.3.1(react@18.3.1) + sample-lib1: + specifier: workspace:* + version: link:../../packages/sample-lib1 + dependenciesMeta: + sample-lib1: + injected: true + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + apps/sample-app2: + dependencies: + '@types/react': + specifier: ^17.0.0 + version: 17.0.93 + '@types/react-dom': + specifier: ^17.0.0 + version: 17.0.26(@types/react@17.0.93) + react: + specifier: ^17.0.0 + version: 17.0.2 + react-dom: + specifier: ^17.0.0 + version: 17.0.2(react@17.0.2) + sample-lib1: + specifier: workspace:* + version: file:packages/sample-lib1(@rushstack/eslint-patch@1.16.1)(@rushstack/node-core-library@5.23.3)(@types/react-dom@17.0.26(@types/react@17.0.93))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + dependenciesMeta: + sample-lib1: + injected: true + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.9.3 + + packages/sample-lib1: + devDependencies: + '@rushstack/eslint-patch': + specifier: ^1.11.0 + version: 1.16.1 + '@rushstack/node-core-library': + specifier: ^5.13.0 + version: 5.23.3 + '@types/react': + specifier: ^18.0.0 + version: 18.3.31 + '@types/react-dom': + specifier: ^18.0.0 + version: 18.3.7(@types/react@18.3.31) + react: + specifier: ^18.0.0 + version: 18.3.1 + react-dom: + specifier: ^18.0.0 + version: 18.3.1(react@18.3.1) + typescript: + specifier: ^5.8.3 + version: 5.9.3 + +packages: + + '@rushstack/eslint-patch@1.16.1': + resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} + + '@rushstack/node-core-library@5.23.3': + resolution: {integrity: sha512-f6uuza7Um65bwsIJgf0MRs7IPA5IG+A+zs1AYGQvpZmLjtTGdfHowhQw4kwF0pPhJCrU4UHNhK8Qa6tLygYZCA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@17.0.26': + resolution: {integrity: sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==} + peerDependencies: + '@types/react': ^17.0.0 + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@17.0.93': + resolution: {integrity: sha512-KM4Ty/ZTLZupiYxZVAlP+InNJS3De6uBMdq0ePa6/04+eG9Y7ftnWfst1xTLQ5rwAhgHwQ4momt/O4KepdGBTw==} + + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + + fs-extra@11.3.6: + resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} + engines: {node: '>=14.14'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + react-dom@17.0.2: + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + sample-lib1@file:packages/sample-lib1: + resolution: {directory: packages/sample-lib1, type: directory} + peerDependencies: + '@rushstack/eslint-patch': '*' + '@rushstack/node-core-library': '*' + '@types/react': 17 || 18 + '@types/react-dom': 17 || 18 + react: 17 || 18 + react-dom: 17 || 18 + + scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + +snapshots: + + '@rushstack/eslint-patch@1.16.1': {} + + '@rushstack/node-core-library@5.23.3': + dependencies: + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv-formats: 3.0.1(ajv@8.20.0) + fs-extra: 11.3.6 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.12 + semver: 7.7.4 + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@17.0.26(@types/react@17.0.93)': + dependencies: + '@types/react': 17.0.93 + + '@types/react-dom@18.3.7(@types/react@18.3.31)': + dependencies: + '@types/react': 18.3.31 + + '@types/react@17.0.93': + dependencies: + '@types/prop-types': 15.7.15 + '@types/scheduler': 0.16.8 + csstype: 3.2.3 + + '@types/react@18.3.31': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@types/scheduler@0.16.8': {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.4 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + csstype@3.2.3: {} + + es-errors@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.4: {} + + fs-extra@11.3.6: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + function-bind@1.1.2: {} + + graceful-fs@4.2.11: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + import-lazy@4.0.0: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + json-schema-traverse@1.0.0: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + object-assign@4.1.1: {} + + path-parse@1.0.7: {} + + react-dom@17.0.2(react@17.0.2): + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react@17.0.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + require-from-string@2.0.2: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + sample-lib1@file:packages/sample-lib1(@rushstack/eslint-patch@1.16.1)(@rushstack/node-core-library@5.23.3)(@types/react-dom@17.0.26(@types/react@17.0.93))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2): + dependencies: + '@rushstack/eslint-patch': 1.16.1 + '@rushstack/node-core-library': 5.23.3 + '@types/react': 17.0.93 + '@types/react-dom': 17.0.26(@types/react@17.0.93) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + + scheduler@0.20.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@7.7.4: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + typescript@5.9.3: {} + + universalify@2.0.1: {} diff --git a/tests/test-fixtures/pnpm-v11/pnpm-workspace.yaml b/tests/test-fixtures/pnpm-v11/pnpm-workspace.yaml new file mode 100644 index 0000000..e9b0dad --- /dev/null +++ b/tests/test-fixtures/pnpm-v11/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - 'apps/*' + - 'packages/*'