Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(plugin-command-patching): add path option to patch command (#5304)
Co-authored-by: Zoltan Kochan <z@kochan.io>
- Loading branch information
1 parent
db4e939
commit b6f788c
Showing
6 changed files
with
122 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
--- | ||
"@pnpm/plugin-commands-patching": minor | ||
"pnpm": minor | ||
--- | ||
|
||
`pnpm patch`: edit the patched package in a directory specified by the `--edit-dir` option. E.g., `pnpm patch express@3.1.0 --edit-dir=/home/xxx/src/patched-express` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,54 +1,86 @@ | ||
import fs from 'fs' | ||
import os from 'os' | ||
import path from 'path' | ||
import prepare from '@pnpm/prepare' | ||
import tempy from 'tempy' | ||
import { patch, patchCommit } from '@pnpm/plugin-commands-patching' | ||
import readProjectManifest from '@pnpm/read-project-manifest' | ||
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock' | ||
import { DEFAULT_OPTS } from './utils/index' | ||
|
||
test('patch and commit', async () => { | ||
prepare({ | ||
dependencies: { | ||
'is-positive': '1.0.0', | ||
}, | ||
describe('patch and commit', () => { | ||
let defaultPatchOption: patch.PatchCommandOptions | ||
const tempySpy = jest.spyOn(tempy, 'directory') | ||
|
||
beforeEach(() => { | ||
prepare({ | ||
dependencies: { | ||
'is-positive': '1.0.0', | ||
}, | ||
}) | ||
|
||
const cacheDir = path.resolve('cache') | ||
const storeDir = path.resolve('store') | ||
|
||
defaultPatchOption = { | ||
cacheDir, | ||
dir: process.cwd(), | ||
pnpmHomeDir: '', | ||
rawConfig: { | ||
registry: `http://localhost:${REGISTRY_MOCK_PORT}/`, | ||
}, | ||
registries: { default: `http://localhost:${REGISTRY_MOCK_PORT}/` }, | ||
storeDir, | ||
userConfig: {}, | ||
} | ||
}) | ||
const cacheDir = path.resolve('cache') | ||
const storeDir = path.resolve('store') | ||
|
||
const output = await patch.handler({ | ||
cacheDir, | ||
dir: process.cwd(), | ||
pnpmHomeDir: '', | ||
rawConfig: { | ||
registry: `http://localhost:${REGISTRY_MOCK_PORT}/`, | ||
}, | ||
registries: { default: `http://localhost:${REGISTRY_MOCK_PORT}/` }, | ||
storeDir, | ||
userConfig: {}, | ||
}, ['is-positive@1.0.0']) | ||
|
||
const userPatchDir = output.substring(output.indexOf(':') + 1).trim() | ||
|
||
// sanity check to ensure that the license file contains the expected string | ||
expect(fs.readFileSync(path.join(userPatchDir, 'license'), 'utf8')).toContain('The MIT License (MIT)') | ||
|
||
fs.appendFileSync(path.join(userPatchDir, 'index.js'), '// test patching', 'utf8') | ||
fs.unlinkSync(path.join(userPatchDir, 'license')) | ||
|
||
await patchCommit.handler({ | ||
...DEFAULT_OPTS, | ||
dir: process.cwd(), | ||
}, [userPatchDir]) | ||
|
||
const { manifest } = await readProjectManifest(process.cwd()) | ||
expect(manifest.pnpm?.patchedDependencies).toStrictEqual({ | ||
'is-positive@1.0.0': 'patches/is-positive@1.0.0.patch', | ||
|
||
test('patch and commit', async () => { | ||
const output = await patch.handler(defaultPatchOption, ['is-positive@1.0.0']) | ||
const userPatchDir = output.substring(output.indexOf(':') + 1).trim() | ||
const tempDir = os.tmpdir() // temp dir depends on the operating system (@see tempy) | ||
|
||
// store patch files(user, source) in temporary directory when not given editDir option | ||
expect(userPatchDir).toContain(tempDir) | ||
expect(fs.existsSync(userPatchDir)).toBe(true) | ||
expect(fs.existsSync(userPatchDir.replace('/user', '/source'))).toBe(true) | ||
|
||
// sanity check to ensure that the license file contains the expected string | ||
expect(fs.readFileSync(path.join(userPatchDir, 'license'), 'utf8')).toContain('The MIT License (MIT)') | ||
|
||
fs.appendFileSync(path.join(userPatchDir, 'index.js'), '// test patching', 'utf8') | ||
fs.unlinkSync(path.join(userPatchDir, 'license')) | ||
|
||
await patchCommit.handler({ | ||
...DEFAULT_OPTS, | ||
dir: process.cwd(), | ||
}, [userPatchDir]) | ||
|
||
const { manifest } = await readProjectManifest(process.cwd()) | ||
expect(manifest.pnpm?.patchedDependencies).toStrictEqual({ | ||
'is-positive@1.0.0': 'patches/is-positive@1.0.0.patch', | ||
}) | ||
const patchContent = fs.readFileSync('patches/is-positive@1.0.0.patch', 'utf8') | ||
expect(patchContent).toContain('diff --git') | ||
expect(patchContent).toContain('// test patching') | ||
expect(fs.readFileSync('node_modules/is-positive/index.js', 'utf8')).toContain('// test patching') | ||
|
||
expect(patchContent).not.toContain('The MIT License (MIT)') | ||
expect(fs.existsSync('node_modules/is-positive/license')).toBe(false) | ||
}) | ||
const patchContent = fs.readFileSync('patches/is-positive@1.0.0.patch', 'utf8') | ||
expect(patchContent).toContain('diff --git') | ||
expect(patchContent).toContain('// test patching') | ||
expect(fs.readFileSync('node_modules/is-positive/index.js', 'utf8')).toContain('// test patching') | ||
|
||
expect(patchContent).not.toContain('The MIT License (MIT)') | ||
expect(fs.existsSync('node_modules/is-positive/license')).toBe(false) | ||
test('store source files in temporary directory and user files in user directory, when given editDir option', async () => { | ||
const editDir = 'test/user/is-positive' | ||
|
||
const patchFn = async () => patch.handler({ ...defaultPatchOption, editDir }, ['is-positive@1.0.0']) | ||
const output = await patchFn() | ||
const userPatchDir = output.substring(output.indexOf(':') + 1).trim() | ||
|
||
expect(userPatchDir).toBe(editDir) | ||
expect(fs.existsSync(userPatchDir)).toBe(true) | ||
expect(fs.existsSync(path.join(tempySpy.mock.results[0].value, '/source'))).toBe(true) | ||
|
||
// If editDir already exists, it should throw an error | ||
await expect(patchFn()).rejects.toThrow(`The target directory already exists: '${editDir}'`) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,9 @@ | |
{ | ||
"path": "../config" | ||
}, | ||
{ | ||
"path": "../error" | ||
}, | ||
{ | ||
"path": "../parse-wanted-dependency" | ||
}, | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.