mirror of
https://github.com/pnpm/pnpm.git
synced 2026-01-14 01:48:25 -05:00
* fix: should not delete state.json info after apply patch * Update .changeset/yellow-dodos-press.md Co-authored-by: Khải <hvksmr1996@gmail.com> * Update .changeset/yellow-dodos-press.md Co-authored-by: Khải <hvksmr1996@gmail.com> * test: patch-commit multiple times * refactor: remove unused deleteEditDirState * fix: read patch state from correct directory --------- Co-authored-by: Khải <hvksmr1996@gmail.com> Co-authored-by: Zoltan Kochan <z@kochan.io>
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import fs from 'fs'
|
|
import path from 'path'
|
|
import util from 'util'
|
|
|
|
export type EditDir = string & { __brand: 'patch-edit-dir' }
|
|
|
|
export interface EditDirState {
|
|
patchedPkg: string
|
|
applyToAll: boolean
|
|
}
|
|
|
|
export type State = Record<EditDir, EditDirState>
|
|
|
|
export interface EditDirKeyInput {
|
|
editDir: string
|
|
}
|
|
|
|
const createEditDirKey = (opts: EditDirKeyInput): EditDir => opts.editDir as EditDir
|
|
|
|
export interface ReadEditDirStateOptions extends EditDirKeyInput {
|
|
modulesDir: string
|
|
}
|
|
|
|
export function readEditDirState (opts: ReadEditDirStateOptions): EditDirState | undefined {
|
|
const state = readStateFile(opts.modulesDir)
|
|
if (!state) return undefined
|
|
const key = createEditDirKey(opts)
|
|
return state[key]
|
|
}
|
|
|
|
export interface WriteEditDirStateOptions extends ReadEditDirStateOptions, EditDirState {}
|
|
|
|
export function writeEditDirState (opts: WriteEditDirStateOptions): void {
|
|
modifyStateFile(opts.modulesDir, state => {
|
|
const key = createEditDirKey(opts)
|
|
state[key] = {
|
|
patchedPkg: opts.patchedPkg,
|
|
applyToAll: opts.applyToAll,
|
|
}
|
|
})
|
|
}
|
|
|
|
function modifyStateFile (modulesDir: string, modifyState: (state: State) => void): void {
|
|
const filePath = getStateFilePath(modulesDir)
|
|
let state = readStateFile(modulesDir)
|
|
if (!state) {
|
|
state = {}
|
|
fs.mkdirSync(path.dirname(filePath), { recursive: true })
|
|
}
|
|
modifyState(state)
|
|
fs.writeFileSync(filePath, JSON.stringify(state, undefined, 2))
|
|
}
|
|
|
|
function readStateFile (modulesDir: string): State | undefined {
|
|
let fileContent: string
|
|
try {
|
|
fileContent = fs.readFileSync(getStateFilePath(modulesDir), 'utf-8')
|
|
} catch (err) {
|
|
if (util.types.isNativeError(err) && 'code' in err && err.code === 'ENOENT') {
|
|
return undefined
|
|
}
|
|
throw err
|
|
}
|
|
return JSON.parse(fileContent)
|
|
}
|
|
|
|
function getStateFilePath (modulesDir: string): string {
|
|
return path.join(modulesDir, '.pnpm_patches', 'state.json')
|
|
}
|