diff --git a/.changeset/fast-ants-tie.md b/.changeset/fast-ants-tie.md new file mode 100644 index 0000000000..05ac7cd597 --- /dev/null +++ b/.changeset/fast-ants-tie.md @@ -0,0 +1,6 @@ +--- +"@pnpm/local-resolver": patch +"pnpm": patch +--- + +Print a warning when installing a dependency from a non-existent directory [#7159](https://github.com/pnpm/pnpm/issues/7159) diff --git a/.changeset/heavy-candles-retire.md b/.changeset/heavy-candles-retire.md new file mode 100644 index 0000000000..9d59715055 --- /dev/null +++ b/.changeset/heavy-candles-retire.md @@ -0,0 +1,5 @@ +--- +"@pnpm/local-resolver": major +--- + +`@pnpm/logger` added as a peer dependency. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ace94863c..9698ca03f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4917,6 +4917,9 @@ importers: '@pnpm/graceful-fs': specifier: workspace:* version: link:../../fs/graceful-fs + '@pnpm/logger': + specifier: ^5.0.0 + version: 5.0.0 '@pnpm/read-project-manifest': specifier: workspace:* version: link:../../pkg-manifest/read-project-manifest diff --git a/resolving/local-resolver/package.json b/resolving/local-resolver/package.json index bb84b5b131..c36c0a1460 100644 --- a/resolving/local-resolver/package.json +++ b/resolving/local-resolver/package.json @@ -45,6 +45,9 @@ "@types/normalize-path": "^3.0.0", "@types/ssri": "^7.1.2" }, + "peerDependencies": { + "@pnpm/logger": "^5.0.0" + }, "funding": "https://opencollective.com/pnpm", "exports": { ".": "./lib/index.js" diff --git a/resolving/local-resolver/src/index.ts b/resolving/local-resolver/src/index.ts index 6753824eb8..53206ad4eb 100644 --- a/resolving/local-resolver/src/index.ts +++ b/resolving/local-resolver/src/index.ts @@ -10,6 +10,7 @@ import { } from '@pnpm/resolver-base' import { type DependencyManifest } from '@pnpm/types' import ssri from 'ssri' +import { logger } from '@pnpm/logger' import { parsePref, type WantedLocalDependency } from './parsePref' export type { WantedLocalDependency } @@ -59,6 +60,10 @@ export async function resolveFromLocal ( throw new PnpmError('LINKED_PKG_DIR_NOT_FOUND', `Could not install from "${spec.fetchSpec}" as it does not exist.`) } + logger.warn({ + message: `Installing a dependency from a non-existent directory: ${spec.fetchSpec}`, + prefix: opts.projectDir, + }) localDependencyManifest = { name: path.basename(spec.fetchSpec), version: '0.0.0', diff --git a/resolving/local-resolver/test/index.ts b/resolving/local-resolver/test/index.ts index 6558e198d2..c9d9c77f17 100644 --- a/resolving/local-resolver/test/index.ts +++ b/resolving/local-resolver/test/index.ts @@ -3,6 +3,7 @@ import path from 'path' import { resolveFromLocal } from '@pnpm/local-resolver' import { type DirectoryResolution } from '@pnpm/resolver-base' import normalize from 'normalize-path' +import { logger } from '@pnpm/logger' test('resolve directory', async () => { const resolveResult = await resolveFromLocal({ pref: '..' }, { projectDir: __dirname }) @@ -128,12 +129,18 @@ test('fail when resolving from not existing directory an injected dependency', a }) test('do not fail when resolving from not existing directory', async () => { + jest.spyOn(logger, 'warn') const wantedDependency = { pref: 'link:./dir-does-not-exist' } const resolveResult = await resolveFromLocal(wantedDependency, { projectDir: __dirname }) expect(resolveResult?.manifest).toStrictEqual({ name: 'dir-does-not-exist', version: '0.0.0', }) + expect(logger.warn).toHaveBeenCalledWith({ + message: `Installing a dependency from a non-existent directory: ${path.join(__dirname, './dir-does-not-exist')}`, + prefix: __dirname, + }) + ;(logger.warn as jest.Mock).mockRestore() }) test('throw error when the path: protocol is used', async () => {