@graftsync/adapter-patch 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/adapter.d.ts +5 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +310 -0
- package/dist/adapter.js.map +1 -0
- package/dist/appliers.d.ts +61 -0
- package/dist/appliers.d.ts.map +1 -0
- package/dist/appliers.js +417 -0
- package/dist/appliers.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/installed.d.ts +19 -0
- package/dist/installed.d.ts.map +1 -0
- package/dist/installed.js +113 -0
- package/dist/installed.js.map +1 -0
- package/dist/patchfile.d.ts +28 -0
- package/dist/patchfile.d.ts.map +1 -0
- package/dist/patchfile.js +43 -0
- package/dist/patchfile.js.map +1 -0
- package/dist/pnpm.d.ts +29 -0
- package/dist/pnpm.d.ts.map +1 -0
- package/dist/pnpm.js +113 -0
- package/dist/pnpm.js.map +1 -0
- package/dist/vendor.d.ts +43 -0
- package/dist/vendor.d.ts.map +1 -0
- package/dist/vendor.js +300 -0
- package/dist/vendor.js.map +1 -0
- package/package.json +43 -3
- package/README.md +0 -3
package/dist/appliers.js
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
// How a patch variant is actually applied at install time, per package manager.
|
|
2
|
+
//
|
|
3
|
+
// Variants are always package-relative git patches (the format pnpm and bun write). Each
|
|
4
|
+
// applier wires the package manager so that the *selected* variant is applied, and reports
|
|
5
|
+
// any configuration that would apply something else or fail silently:
|
|
6
|
+
//
|
|
7
|
+
// pnpm patchedDependencies (name-only key) + ignorePatchFailures: false
|
|
8
|
+
// bun package.json patchedDependencies["<pkg>@<installed>"]; bun silently ignores
|
|
9
|
+
// name-only keys and keys for other versions, so the key tracks the version
|
|
10
|
+
// yarn (default for yarn 2+ / berry, Plug'n'Play or node-modules) package.json
|
|
11
|
+
// resolutions["<pkg>"] = "patch:<pkg>@npm%3A<version>#./<variant>"; yarn applies
|
|
12
|
+
// the patch while fetching, records it in yarn.lock, and fails on a bad hunk
|
|
13
|
+
// vendor (default for upm; works with any package manager that supports overrides)
|
|
14
|
+
// pristine + variant built into .grafts/.vendor/<pkg>-<version>.tgz, installed
|
|
15
|
+
// through overrides/resolutions and the root's own dependency
|
|
16
|
+
// graft (default for npm < 12, yarn classic, anything with node_modules + postinstall)
|
|
17
|
+
// Graft applies the variants itself: `graft apply --installed` in postinstall;
|
|
18
|
+
// refused under Plug'n'Play (no node_modules to patch)
|
|
19
|
+
// patch-package (opt-in) a generated <pkg>+<version>.patch in a graft-owned dir, applied by
|
|
20
|
+
// `patch-package --error-on-fail --error-on-warn` in postinstall; without those
|
|
21
|
+
// flags patch-package exits 0 on a failed patch (outside CI)
|
|
22
|
+
import { spawnSync } from 'node:child_process';
|
|
23
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
24
|
+
import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
25
|
+
import path from 'node:path';
|
|
26
|
+
import { detectPackageManager, findPnpRuntime } from '@graftsync/core';
|
|
27
|
+
import { configurePnpmPatch, findPnpmWorkspaceRoot, pnpmConfigProblems } from './pnpm.js';
|
|
28
|
+
import { vendorConfigure, vendorProblems } from './vendor.js';
|
|
29
|
+
/** Pick the applier: explicit config wins, then the project's package manager. */
|
|
30
|
+
export function selectApplier(root, configured) {
|
|
31
|
+
const pm = detectPackageManager(root);
|
|
32
|
+
// npm 12+ patches natively; older npm silently ignores patchedDependencies, so it gets the built-in applier.
|
|
33
|
+
const npmDefault = pm === 'npm' && (npmMajor(root) ?? 0) >= NPM_NATIVE_PATCH_MAJOR ? 'npm' : 'graft';
|
|
34
|
+
const name = (configured ?? { pnpm: 'pnpm', npm: npmDefault, bun: 'bun', yarn: 'graft', 'yarn-berry': 'yarn', upm: 'vendor' }[pm]);
|
|
35
|
+
const applier = APPLIERS[name];
|
|
36
|
+
if (!applier)
|
|
37
|
+
throw new Error(`unknown patch applier "${configured}" (expected pnpm | npm | bun | yarn | graft | patch-package | vendor)`);
|
|
38
|
+
return applier;
|
|
39
|
+
}
|
|
40
|
+
const posix = (p) => p.split(path.sep).join('/');
|
|
41
|
+
const keyIsFor = (key, pkg) => key === pkg || (key.startsWith(`${pkg}@`) && key.length > pkg.length + 1);
|
|
42
|
+
/** Nearest directory at or above `from` with a package.json (the install root). */
|
|
43
|
+
export function manifestRoot(from) {
|
|
44
|
+
let dir = path.resolve(from);
|
|
45
|
+
let found;
|
|
46
|
+
for (;;) {
|
|
47
|
+
if (existsSync(path.join(dir, 'package.json')))
|
|
48
|
+
found ??= dir;
|
|
49
|
+
if (['bun.lock', 'bun.lockb', 'package-lock.json', 'yarn.lock', 'upm.lock', 'pnpm-lock.yaml'].some((f) => existsSync(path.join(dir, f))))
|
|
50
|
+
return dir;
|
|
51
|
+
const parent = path.dirname(dir);
|
|
52
|
+
if (parent === dir)
|
|
53
|
+
return found ?? path.resolve(from);
|
|
54
|
+
dir = parent;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function readManifest(root) {
|
|
58
|
+
const file = path.join(root, 'package.json');
|
|
59
|
+
const text = await readFile(file, 'utf8');
|
|
60
|
+
return { file, text, json: JSON.parse(text) };
|
|
61
|
+
}
|
|
62
|
+
async function writeManifest(m) {
|
|
63
|
+
const indent = /^[ \t]+/m.exec(m.text)?.[0] ?? ' ';
|
|
64
|
+
const next = `${JSON.stringify(m.json, null, indent)}\n`;
|
|
65
|
+
if (next !== m.text)
|
|
66
|
+
await writeFile(m.file, next);
|
|
67
|
+
return next !== m.text;
|
|
68
|
+
}
|
|
69
|
+
export const pnpmApplier = {
|
|
70
|
+
name: 'pnpm',
|
|
71
|
+
problems: (root, pkg, _version, variantPath) => pnpmConfigProblems(root, pkg, variantPath),
|
|
72
|
+
async configure(root, pkg, _version, variantPath) {
|
|
73
|
+
const r = await configurePnpmPatch(root, pkg, variantPath);
|
|
74
|
+
return { files: [r.file] };
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
/** npm gained native `patchedDependencies` in v12. Earlier versions ignore the field silently. */
|
|
78
|
+
export const NPM_NATIVE_PATCH_MAJOR = 12;
|
|
79
|
+
const npmVersionCache = new Map();
|
|
80
|
+
/**
|
|
81
|
+
* Major version of npm for this project: the `packageManager` field ("npm@12.2.1") when the
|
|
82
|
+
* root declares one, otherwise the `npm` on PATH.
|
|
83
|
+
*/
|
|
84
|
+
export function npmMajor(root) {
|
|
85
|
+
const installRoot = manifestRoot(root);
|
|
86
|
+
if (npmVersionCache.has(installRoot))
|
|
87
|
+
return npmVersionCache.get(installRoot);
|
|
88
|
+
let version;
|
|
89
|
+
try {
|
|
90
|
+
const declared = /^npm@(\d+)/.exec(String(JSON.parse(readFileSync(path.join(installRoot, 'package.json'), 'utf8')).packageManager ?? ''));
|
|
91
|
+
version = declared?.[1];
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// no readable manifest
|
|
95
|
+
}
|
|
96
|
+
if (!version) {
|
|
97
|
+
const r = spawnSync('npm', ['--version'], { cwd: installRoot, encoding: 'utf8', shell: process.platform === 'win32' });
|
|
98
|
+
version = r.status === 0 ? /^(\d+)/.exec(r.stdout.trim())?.[1] : undefined;
|
|
99
|
+
}
|
|
100
|
+
const major = version ? Number(version) : undefined;
|
|
101
|
+
npmVersionCache.set(installRoot, major);
|
|
102
|
+
return major;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* npm 12+ native patches: root package.json `patchedDependencies[<pkg>]` (name-only key) →
|
|
106
|
+
* variant. npm applies patches during install (also with --ignore-scripts), records their hash
|
|
107
|
+
* in package-lock.json, and fails the install on a patch that does not apply or matches nothing.
|
|
108
|
+
*/
|
|
109
|
+
export const npmApplier = {
|
|
110
|
+
name: 'npm',
|
|
111
|
+
async problems(root, pkg, _version, variantPath) {
|
|
112
|
+
const installRoot = manifestRoot(root);
|
|
113
|
+
const problems = [];
|
|
114
|
+
const major = npmMajor(root);
|
|
115
|
+
if (major === undefined || major < NPM_NATIVE_PATCH_MAJOR) {
|
|
116
|
+
problems.push(`npm ${major ?? '(not found)'} ignores patchedDependencies silently; native npm patches need npm >= ${NPM_NATIVE_PATCH_MAJOR} (use the "graft" or "vendor" applier otherwise)`);
|
|
117
|
+
}
|
|
118
|
+
const { json } = await readManifest(installRoot);
|
|
119
|
+
const entries = Object.entries((json.patchedDependencies ?? {})).filter(([k]) => keyIsFor(k, pkg));
|
|
120
|
+
const expected = posix(path.relative(installRoot, variantPath));
|
|
121
|
+
if (!entries.some(([k]) => k === pkg))
|
|
122
|
+
problems.push(`package.json patchedDependencies has no "${pkg}" entry (expected "${pkg}": "${expected}")`);
|
|
123
|
+
for (const [k, p] of entries) {
|
|
124
|
+
if (k !== pkg)
|
|
125
|
+
problems.push(`package.json patchedDependencies["${k}"] is version-specific; graft manages ${pkg} with a name-only key`);
|
|
126
|
+
else if (path.resolve(installRoot, p) !== path.resolve(variantPath))
|
|
127
|
+
problems.push(`package.json patchedDependencies["${pkg}"] points to ${p}, but the selected variant is ${expected}`);
|
|
128
|
+
}
|
|
129
|
+
return problems;
|
|
130
|
+
},
|
|
131
|
+
async configure(root, pkg, _version, variantPath) {
|
|
132
|
+
const major = npmMajor(root);
|
|
133
|
+
if (major === undefined || major < NPM_NATIVE_PATCH_MAJOR) {
|
|
134
|
+
throw new Error(`npm ${major ?? '(not found)'} ignores patchedDependencies silently; the "npm" applier needs npm >= ${NPM_NATIVE_PATCH_MAJOR}`);
|
|
135
|
+
}
|
|
136
|
+
const installRoot = manifestRoot(root);
|
|
137
|
+
const m = await readManifest(installRoot);
|
|
138
|
+
const patched = (m.json.patchedDependencies ??= {});
|
|
139
|
+
for (const k of Object.keys(patched))
|
|
140
|
+
if (keyIsFor(k, pkg))
|
|
141
|
+
delete patched[k];
|
|
142
|
+
patched[pkg] = posix(path.relative(installRoot, variantPath));
|
|
143
|
+
await writeManifest(m);
|
|
144
|
+
return { files: [m.file] };
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
export const bunApplier = {
|
|
148
|
+
name: 'bun',
|
|
149
|
+
async problems(root, pkg, version, variantPath) {
|
|
150
|
+
const installRoot = manifestRoot(root);
|
|
151
|
+
const { json } = await readManifest(installRoot);
|
|
152
|
+
const entries = Object.entries((json.patchedDependencies ?? {})).filter(([k]) => keyIsFor(k, pkg));
|
|
153
|
+
const expectedKey = `${pkg}@${version}`;
|
|
154
|
+
const expectedPath = posix(path.relative(installRoot, variantPath));
|
|
155
|
+
const problems = [];
|
|
156
|
+
if (!entries.some(([k]) => k === expectedKey)) {
|
|
157
|
+
problems.push(`package.json patchedDependencies has no "${expectedKey}" entry (expected "${expectedKey}": "${expectedPath}"); bun ignores keys for other versions and name-only keys`);
|
|
158
|
+
}
|
|
159
|
+
for (const [k, p] of entries) {
|
|
160
|
+
if (k !== expectedKey)
|
|
161
|
+
problems.push(`package.json patchedDependencies["${k}"] does not match the installed ${pkg}@${version}; bun silently skips it`);
|
|
162
|
+
else if (path.resolve(installRoot, p) !== path.resolve(variantPath))
|
|
163
|
+
problems.push(`package.json patchedDependencies["${k}"] points to ${p}, but the selected variant is ${expectedPath}`);
|
|
164
|
+
}
|
|
165
|
+
return problems;
|
|
166
|
+
},
|
|
167
|
+
async configure(root, pkg, version, variantPath) {
|
|
168
|
+
const installRoot = manifestRoot(root);
|
|
169
|
+
const m = await readManifest(installRoot);
|
|
170
|
+
const patched = (m.json.patchedDependencies ??= {});
|
|
171
|
+
for (const k of Object.keys(patched))
|
|
172
|
+
if (keyIsFor(k, pkg))
|
|
173
|
+
delete patched[k];
|
|
174
|
+
patched[`${pkg}@${version}`] = posix(path.relative(installRoot, variantPath));
|
|
175
|
+
await writeManifest(m);
|
|
176
|
+
return { files: [m.file] };
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* Appliers that patch files under node_modules after install cannot work under yarn
|
|
181
|
+
* Plug'n'Play, where packages stay in zip archives and there is no node_modules.
|
|
182
|
+
*/
|
|
183
|
+
function pnpRefusal(installRoot, applier) {
|
|
184
|
+
const pnp = findPnpRuntime(installRoot);
|
|
185
|
+
if (!pnp)
|
|
186
|
+
return undefined;
|
|
187
|
+
return `the "${applier}" applier patches node_modules, but this project uses yarn Plug'n'Play (${pnp}); use the "yarn" applier (yarn's patch: protocol, the default for yarn 2+) or "vendor", or set \`nodeLinker: node-modules\` in .yarnrc.yml`;
|
|
188
|
+
}
|
|
189
|
+
/** yarn 2+ `patch:` descriptor applying `relPatch` (posix, relative to the project root) to `pkg@version` from npm. */
|
|
190
|
+
export function yarnPatchSpec(pkg, version, relPatch) {
|
|
191
|
+
const rel = relPatch.startsWith('../') ? relPatch : `./${relPatch}`;
|
|
192
|
+
return `patch:${pkg}@npm%3A${version}#${rel}`;
|
|
193
|
+
}
|
|
194
|
+
/** Resolution keys other than the name-only one that also select `pkg` (e.g. `ms@npm:^2`, `foo/ms`, `**\/ms@^2`). */
|
|
195
|
+
const otherResolutionKeys = (resolutions, pkg) => Object.keys(resolutions).filter((k) => k !== pkg && (keyIsFor(k, pkg) || k.endsWith(`/${pkg}`) || k.includes(`/${pkg}@`)));
|
|
196
|
+
/** Root dependency specs the yarn applier rewrites: plain versions/ranges, `patch:` specs, and vendored tarballs. */
|
|
197
|
+
function yarnDeclaredSpec(declared, version) {
|
|
198
|
+
const plain = /^([~^]?)\d[^\s|<>=]*$/.exec(declared);
|
|
199
|
+
if (plain)
|
|
200
|
+
return `${plain[1]}${version}`;
|
|
201
|
+
if (declared.startsWith('patch:') || (declared.startsWith('file:') && declared.includes('.grafts/.vendor/')))
|
|
202
|
+
return version;
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
const DEP_FIELDS = ['dependencies', 'devDependencies', 'optionalDependencies'];
|
|
206
|
+
/**
|
|
207
|
+
* yarn 2+ native patches through the `patch:` protocol: a name-only root resolution
|
|
208
|
+
* `"<pkg>": "patch:<pkg>@npm%3A<version>#./<variant>"` makes every copy of `pkg` resolve to
|
|
209
|
+
* `pkg@version` with the variant applied, under Plug'n'Play and `nodeLinker: node-modules`
|
|
210
|
+
* alike. yarn applies the patch at fetch time (no install scripts), stores the patched
|
|
211
|
+
* package with its own checksum in yarn.lock, and fails the install on a hunk that does not
|
|
212
|
+
* apply. Like `vendor`, the resolution pins the version, so a bare reinstall follows.
|
|
213
|
+
*/
|
|
214
|
+
export const yarnApplier = {
|
|
215
|
+
name: 'yarn',
|
|
216
|
+
async problems(root, pkg, version, variantPath) {
|
|
217
|
+
const installRoot = manifestRoot(root);
|
|
218
|
+
const problems = [];
|
|
219
|
+
if (detectPackageManager(installRoot) !== 'yarn-berry') {
|
|
220
|
+
problems.push('the "yarn" applier needs yarn 2+ (berry); yarn classic has no patch: protocol (use the "graft" or "vendor" applier)');
|
|
221
|
+
}
|
|
222
|
+
const { json } = await readManifest(installRoot);
|
|
223
|
+
const resolutions = (json.resolutions ?? {});
|
|
224
|
+
const expected = yarnPatchSpec(pkg, version, posix(path.relative(installRoot, variantPath)));
|
|
225
|
+
if (resolutions[pkg] !== expected)
|
|
226
|
+
problems.push(`package.json resolutions["${pkg}"] must be "${expected}"${resolutions[pkg] ? ` (is "${resolutions[pkg]}")` : ''}`);
|
|
227
|
+
for (const k of otherResolutionKeys(resolutions, pkg)) {
|
|
228
|
+
problems.push(`package.json resolutions["${k}"] also resolves ${pkg} and can select an unpatched copy; graft manages ${pkg} with the name-only resolution — remove it`);
|
|
229
|
+
}
|
|
230
|
+
for (const field of DEP_FIELDS) {
|
|
231
|
+
const declared = json[field]?.[pkg];
|
|
232
|
+
if (typeof declared === 'string' && declared.startsWith('patch:')) {
|
|
233
|
+
problems.push(`package.json ${field}["${pkg}"] is a patch: descriptor ("${declared}"); graft patches ${pkg} through resolutions — set it to "${version}"`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return problems;
|
|
237
|
+
},
|
|
238
|
+
async configure(root, pkg, version, variantPath) {
|
|
239
|
+
const installRoot = manifestRoot(root);
|
|
240
|
+
if (detectPackageManager(installRoot) !== 'yarn-berry') {
|
|
241
|
+
throw new Error('the "yarn" applier needs yarn 2+ (berry); yarn classic has no patch: protocol (use the "graft" or "vendor" applier)');
|
|
242
|
+
}
|
|
243
|
+
const m = await readManifest(installRoot);
|
|
244
|
+
const resolutions = (m.json.resolutions ??= {});
|
|
245
|
+
for (const k of Object.keys(resolutions))
|
|
246
|
+
if (k !== pkg && keyIsFor(k, pkg))
|
|
247
|
+
delete resolutions[k];
|
|
248
|
+
resolutions[pkg] = yarnPatchSpec(pkg, version, posix(path.relative(installRoot, variantPath)));
|
|
249
|
+
for (const field of DEP_FIELDS) {
|
|
250
|
+
const declared = m.json[field]?.[pkg];
|
|
251
|
+
const next = typeof declared === 'string' ? yarnDeclaredSpec(declared, version) : undefined;
|
|
252
|
+
if (next)
|
|
253
|
+
m.json[field][pkg] = next;
|
|
254
|
+
}
|
|
255
|
+
await writeManifest(m);
|
|
256
|
+
return { files: [m.file], install: 'reinstall' };
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
export const PATCH_PACKAGE_DIR = '.grafts/.patch-package';
|
|
260
|
+
const PATCH_PACKAGE_FLAGS = ['--error-on-fail', '--error-on-warn'];
|
|
261
|
+
const patchPackageCommand = (dir) => `patch-package --patch-dir ${dir} ${PATCH_PACKAGE_FLAGS.join(' ')}`;
|
|
262
|
+
/** patch-package's file name for pkg@version (`@scope/name` → `@scope+name`). */
|
|
263
|
+
export const patchPackageFileName = (pkg, version) => `${pkg.replace('/', '+')}+${version}.patch`;
|
|
264
|
+
/** Convert a package-relative variant into patch-package's format (paths under node_modules/<pkg>/). */
|
|
265
|
+
export function toPatchPackageFormat(variant, pkg) {
|
|
266
|
+
const prefix = `node_modules/${pkg}/`;
|
|
267
|
+
return variant
|
|
268
|
+
.split('\n')
|
|
269
|
+
.filter((line) => !line.startsWith('index '))
|
|
270
|
+
.map((line) => {
|
|
271
|
+
let m = /^diff --git a\/(.+) b\/(.+)$/.exec(line);
|
|
272
|
+
if (m)
|
|
273
|
+
return `diff --git a/${prefix}${m[1]} b/${prefix}${m[2]}`;
|
|
274
|
+
m = /^(---|\+\+\+) ([ab])\/(.+)$/.exec(line);
|
|
275
|
+
if (m)
|
|
276
|
+
return `${m[1]} ${m[2]}/${prefix}${m[3]}`;
|
|
277
|
+
return line;
|
|
278
|
+
})
|
|
279
|
+
.join('\n');
|
|
280
|
+
}
|
|
281
|
+
export const patchPackageApplier = {
|
|
282
|
+
name: 'patch-package',
|
|
283
|
+
async problems(root, pkg, version, variantPath) {
|
|
284
|
+
const installRoot = manifestRoot(root);
|
|
285
|
+
const dir = path.join(installRoot, PATCH_PACKAGE_DIR);
|
|
286
|
+
const { json } = await readManifest(installRoot);
|
|
287
|
+
const problems = [];
|
|
288
|
+
const refusal = pnpRefusal(installRoot, 'patch-package');
|
|
289
|
+
if (refusal)
|
|
290
|
+
problems.push(refusal);
|
|
291
|
+
const postinstall = json.scripts?.postinstall ?? '';
|
|
292
|
+
const ours = postinstall.split(/&&|;/).map((s) => s.trim()).find((s) => /\bpatch-package\b/.test(s) && s.includes(PATCH_PACKAGE_DIR));
|
|
293
|
+
if (!ours)
|
|
294
|
+
problems.push(`package.json scripts.postinstall must run \`${patchPackageCommand(PATCH_PACKAGE_DIR)}\``);
|
|
295
|
+
else
|
|
296
|
+
for (const flag of PATCH_PACKAGE_FLAGS)
|
|
297
|
+
if (!ours.includes(flag))
|
|
298
|
+
problems.push(`postinstall's patch-package call must pass ${flag}; without it a failed patch exits 0 and installs the package unmodified`);
|
|
299
|
+
if (!json.devDependencies?.['patch-package'] && !json.dependencies?.['patch-package'])
|
|
300
|
+
problems.push('patch-package must be a devDependency');
|
|
301
|
+
const expectedFile = path.join(dir, patchPackageFileName(pkg, version));
|
|
302
|
+
const prefix = patchPackageFileName(pkg, '').replace(/\.patch$/, '');
|
|
303
|
+
const ownFiles = existsSync(dir) ? (await readdir(dir)).filter((f) => f.startsWith(prefix) && /^\d/.test(f.slice(prefix.length))) : [];
|
|
304
|
+
if (!existsSync(expectedFile)) {
|
|
305
|
+
problems.push(`${posix(path.relative(installRoot, expectedFile))} is missing; run \`graft apply\``);
|
|
306
|
+
}
|
|
307
|
+
else if ((await readFile(expectedFile, 'utf8')) !== toPatchPackageFormat(await readFile(variantPath, 'utf8'), pkg)) {
|
|
308
|
+
problems.push(`${posix(path.relative(installRoot, expectedFile))} is stale (it no longer matches ${posix(path.relative(installRoot, variantPath))}); run \`graft apply\``);
|
|
309
|
+
}
|
|
310
|
+
for (const f of ownFiles.filter((f) => f !== path.basename(expectedFile)))
|
|
311
|
+
problems.push(`${PATCH_PACKAGE_DIR}/${f} is for another version of ${pkg}; remove it`);
|
|
312
|
+
// A plain `patch-package` call (default patches/ dir) patching the same package would compete.
|
|
313
|
+
const defaultDir = path.join(installRoot, 'patches');
|
|
314
|
+
if (/\bpatch-package\b(?![^&;]*--patch-dir)/.test(postinstall) && existsSync(defaultDir)) {
|
|
315
|
+
for (const f of (await readdir(defaultDir)).filter((f) => f.startsWith(prefix) && /^\d/.test(f.slice(prefix.length)))) {
|
|
316
|
+
problems.push(`patches/${f} also patches ${pkg}; graft manages ${pkg} in ${PATCH_PACKAGE_DIR} — remove it`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return problems;
|
|
320
|
+
},
|
|
321
|
+
async configure(root, pkg, version, variantPath) {
|
|
322
|
+
const installRoot = manifestRoot(root);
|
|
323
|
+
const refusal = pnpRefusal(installRoot, 'patch-package');
|
|
324
|
+
if (refusal)
|
|
325
|
+
throw new Error(refusal);
|
|
326
|
+
const dir = path.join(installRoot, PATCH_PACKAGE_DIR);
|
|
327
|
+
await mkdir(dir, { recursive: true });
|
|
328
|
+
const prefix = patchPackageFileName(pkg, '').replace(/\.patch$/, '');
|
|
329
|
+
for (const f of await readdir(dir))
|
|
330
|
+
if (f.startsWith(prefix) && /^\d/.test(f.slice(prefix.length)))
|
|
331
|
+
await rm(path.join(dir, f));
|
|
332
|
+
const file = path.join(dir, patchPackageFileName(pkg, version));
|
|
333
|
+
await writeFile(file, toPatchPackageFormat(await readFile(variantPath, 'utf8'), pkg));
|
|
334
|
+
const m = await readManifest(installRoot);
|
|
335
|
+
const scripts = (m.json.scripts ??= {});
|
|
336
|
+
const command = patchPackageCommand(PATCH_PACKAGE_DIR);
|
|
337
|
+
const parts = (scripts.postinstall ?? '').split('&&').map((s) => s.trim()).filter(Boolean);
|
|
338
|
+
const i = parts.findIndex((p) => /\bpatch-package\b/.test(p) && p.includes(PATCH_PACKAGE_DIR));
|
|
339
|
+
if (i === -1)
|
|
340
|
+
parts.push(command);
|
|
341
|
+
else
|
|
342
|
+
parts[i] = command;
|
|
343
|
+
scripts.postinstall = parts.join(' && ');
|
|
344
|
+
await writeManifest(m);
|
|
345
|
+
return { files: [file, m.file] };
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
export const GRAFT_POSTINSTALL = 'graft apply --installed';
|
|
349
|
+
/** Is our postinstall step present? */
|
|
350
|
+
const hasGraftPostinstall = (postinstall) => postinstall.split(/&&|;/).some((s) => s.trim() === GRAFT_POSTINSTALL || /\bgraft apply --installed\b/.test(s));
|
|
351
|
+
export const graftApplier = {
|
|
352
|
+
name: 'graft',
|
|
353
|
+
async problems(root, pkg) {
|
|
354
|
+
const installRoot = manifestRoot(root);
|
|
355
|
+
const { json } = await readManifest(installRoot);
|
|
356
|
+
const problems = [];
|
|
357
|
+
const refusal = pnpRefusal(installRoot, 'graft');
|
|
358
|
+
if (refusal)
|
|
359
|
+
problems.push(refusal);
|
|
360
|
+
const postinstall = json.scripts?.postinstall ?? '';
|
|
361
|
+
if (!hasGraftPostinstall(postinstall))
|
|
362
|
+
problems.push(`package.json scripts.postinstall must run \`${GRAFT_POSTINSTALL}\` (Graft's built-in applier)`);
|
|
363
|
+
if (!json.devDependencies?.['@graftsync/cli'] && !json.dependencies?.['@graftsync/cli'])
|
|
364
|
+
problems.push('@graftsync/cli must be a (dev)dependency so postinstall can run `graft`');
|
|
365
|
+
// Competing appliers for the same package would double-apply or fail.
|
|
366
|
+
const prefix = patchPackageFileName(pkg, '').replace(/\.patch$/, '');
|
|
367
|
+
for (const dir of [PATCH_PACKAGE_DIR, 'patches']) {
|
|
368
|
+
const full = path.join(installRoot, dir);
|
|
369
|
+
if (!existsSync(full))
|
|
370
|
+
continue;
|
|
371
|
+
for (const f of (await readdir(full)).filter((f) => f.startsWith(prefix) && /^\d/.test(f.slice(prefix.length)))) {
|
|
372
|
+
problems.push(`${dir}/${f} also patches ${pkg} (patch-package); graft applies ${pkg} itself — remove it`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (Object.keys((json.patchedDependencies ?? {})).some((k) => keyIsFor(k, pkg))) {
|
|
376
|
+
problems.push(`package.json patchedDependencies also patches ${pkg}; graft applies ${pkg} itself — remove the entry`);
|
|
377
|
+
}
|
|
378
|
+
return problems;
|
|
379
|
+
},
|
|
380
|
+
async configure(root, pkg) {
|
|
381
|
+
const installRoot = manifestRoot(root);
|
|
382
|
+
const refusal = pnpRefusal(installRoot, 'graft');
|
|
383
|
+
if (refusal)
|
|
384
|
+
throw new Error(refusal);
|
|
385
|
+
// Remove graft-owned patch-package artifacts for this package (switching appliers).
|
|
386
|
+
const dir = path.join(installRoot, PATCH_PACKAGE_DIR);
|
|
387
|
+
const prefix = patchPackageFileName(pkg, '').replace(/\.patch$/, '');
|
|
388
|
+
if (existsSync(dir))
|
|
389
|
+
for (const f of await readdir(dir))
|
|
390
|
+
if (f.startsWith(prefix) && /^\d/.test(f.slice(prefix.length)))
|
|
391
|
+
await rm(path.join(dir, f));
|
|
392
|
+
const m = await readManifest(installRoot);
|
|
393
|
+
const scripts = (m.json.scripts ??= {});
|
|
394
|
+
const parts = (scripts.postinstall ?? '')
|
|
395
|
+
.split('&&')
|
|
396
|
+
.map((x) => x.trim())
|
|
397
|
+
.filter(Boolean)
|
|
398
|
+
// Drop the patch-package step Graft itself added (switching from the patch-package applier).
|
|
399
|
+
.filter((x) => !(/\bpatch-package\b/.test(x) && x.includes(PATCH_PACKAGE_DIR)));
|
|
400
|
+
if (!parts.some(hasGraftPostinstall))
|
|
401
|
+
parts.push(GRAFT_POSTINSTALL);
|
|
402
|
+
scripts.postinstall = parts.join(' && ');
|
|
403
|
+
await writeManifest(m);
|
|
404
|
+
return { files: [m.file] };
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
export const vendorApplier = {
|
|
408
|
+
name: 'vendor',
|
|
409
|
+
problems: (root, pkg, version, variantPath, ctx) => vendorProblems({ upstream: ctx?.upstream, graftRoot: root, installRoot: manifestRoot(root) }, pkg, version, variantPath),
|
|
410
|
+
async configure(root, pkg, version, variantPath, ctx) {
|
|
411
|
+
const r = await vendorConfigure({ upstream: ctx?.upstream, graftRoot: root, installRoot: manifestRoot(root) }, pkg, version, variantPath);
|
|
412
|
+
return { ...r, install: 'reinstall' };
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
const APPLIERS = { pnpm: pnpmApplier, npm: npmApplier, bun: bunApplier, yarn: yarnApplier, graft: graftApplier, 'patch-package': patchPackageApplier, vendor: vendorApplier };
|
|
416
|
+
export { findPnpmWorkspaceRoot };
|
|
417
|
+
//# sourceMappingURL=appliers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appliers.js","sourceRoot":"","sources":["../src/appliers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createPatchAdapter, patchAdapter, MECHANISM } from './adapter.js';
|
|
2
|
+
export * from './patchfile.js';
|
|
3
|
+
export * from './pnpm.js';
|
|
4
|
+
export { manifestRoot, bunApplier, npmApplier, yarnApplier, yarnPatchSpec, npmMajor, NPM_NATIVE_PATCH_MAJOR, vendorApplier, graftApplier, GRAFT_POSTINSTALL, patchPackageApplier, pnpmApplier, selectApplier, toPatchPackageFormat, patchPackageFileName, PATCH_PACKAGE_DIR, type ApplierName, type ApplierContext, type PatchApplier } from './appliers.js';
|
|
5
|
+
export { buildVendorTarball, installVendoredTarball, tarballContents, vendoredTarballProblems, vendorFileName, VENDOR_DIR, type TarballBuilder, type VendorContext } from './vendor.js';
|
|
6
|
+
export { applyToInstalledCopy, findInstalledCopies, writeNewInode } from './installed.js';
|
|
7
|
+
export { patchAdapter as default } from './adapter.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7V,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,uBAAuB,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACxL,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createPatchAdapter, patchAdapter, MECHANISM } from './adapter.js';
|
|
2
|
+
export * from './patchfile.js';
|
|
3
|
+
export * from './pnpm.js';
|
|
4
|
+
export { manifestRoot, bunApplier, npmApplier, yarnApplier, yarnPatchSpec, npmMajor, NPM_NATIVE_PATCH_MAJOR, vendorApplier, graftApplier, GRAFT_POSTINSTALL, patchPackageApplier, pnpmApplier, selectApplier, toPatchPackageFormat, patchPackageFileName, PATCH_PACKAGE_DIR } from './appliers.js';
|
|
5
|
+
export { buildVendorTarball, installVendoredTarball, tarballContents, vendoredTarballProblems, vendorFileName, VENDOR_DIR } from './vendor.js';
|
|
6
|
+
export { applyToInstalledCopy, findInstalledCopies, writeNewInode } from './installed.js';
|
|
7
|
+
export { patchAdapter as default } from './adapter.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAA4D,MAAM,eAAe,CAAC;AAC7V,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,uBAAuB,EAAE,cAAc,EAAE,UAAU,EAA2C,MAAM,aAAa,CAAC;AACxL,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { InstalledCopyResult } from '@graftsync/core';
|
|
2
|
+
import { type FilePatch } from './patchfile.js';
|
|
3
|
+
export interface InstalledCopy {
|
|
4
|
+
dir: string;
|
|
5
|
+
version: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Every installed copy of `pkg` under `root`'s node_modules tree (hoisted and nested),
|
|
9
|
+
* deduplicated by real path. pnpm's virtual store (`.pnpm`) is skipped: pnpm patches natively.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findInstalledCopies(root: string, pkg: string, maxDepth?: number): Promise<InstalledCopy[]>;
|
|
12
|
+
/** Replace `file` with `content` through a new inode (never writes into a hardlinked store file). */
|
|
13
|
+
export declare function writeNewInode(file: string, content: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Plan (and then apply) one variant to one installed copy. All files are checked before any is
|
|
16
|
+
* written, so a copy is never left half-patched.
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyToInstalledCopy(copy: InstalledCopy, patches: FilePatch[]): Promise<Pick<InstalledCopyResult, 'action' | 'files' | 'reason'>>;
|
|
19
|
+
//# sourceMappingURL=installed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.d.ts","sourceRoot":"","sources":["../src/installed.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAyB5G;AAED,qGAAqG;AACrG,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF;AAID;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,CA0CvJ"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Graft's built-in patch applier: apply variants directly to installed package copies.
|
|
2
|
+
//
|
|
3
|
+
// Runs from the project's postinstall (`graft apply --installed`), so it must be:
|
|
4
|
+
// - offline: it patches the installed file itself, never fetching pristine upstream;
|
|
5
|
+
// - idempotent: a file the patch no longer fits but whose *reverse* fits is already patched;
|
|
6
|
+
// - store-safe: package managers hardlink files from a global store (pnpm, bun, some npm
|
|
7
|
+
// setups), so files are replaced by rename (new inode), never edited in place;
|
|
8
|
+
// - strict: anything that does not fit fails the install.
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { chmod, lstat, mkdir, readdir, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { reversePatch, applyPatch } from 'diff';
|
|
13
|
+
import { patchTarget } from './patchfile.js';
|
|
14
|
+
/**
|
|
15
|
+
* Every installed copy of `pkg` under `root`'s node_modules tree (hoisted and nested),
|
|
16
|
+
* deduplicated by real path. pnpm's virtual store (`.pnpm`) is skipped: pnpm patches natively.
|
|
17
|
+
*/
|
|
18
|
+
export async function findInstalledCopies(root, pkg, maxDepth = 12) {
|
|
19
|
+
const copies = new Map();
|
|
20
|
+
const visited = new Set();
|
|
21
|
+
const visit = async (nodeModules, depth) => {
|
|
22
|
+
if (depth > maxDepth || !existsSync(nodeModules))
|
|
23
|
+
return;
|
|
24
|
+
const real = await realpath(nodeModules);
|
|
25
|
+
if (visited.has(real))
|
|
26
|
+
return;
|
|
27
|
+
visited.add(real);
|
|
28
|
+
const candidate = path.join(nodeModules, pkg, 'package.json');
|
|
29
|
+
if (existsSync(candidate)) {
|
|
30
|
+
const dir = await realpath(path.dirname(candidate));
|
|
31
|
+
const { version } = JSON.parse(await readFile(candidate, 'utf8'));
|
|
32
|
+
if (version && !copies.has(dir))
|
|
33
|
+
copies.set(dir, { dir, version });
|
|
34
|
+
}
|
|
35
|
+
const entries = await readdir(nodeModules, { withFileTypes: true }).catch(() => []);
|
|
36
|
+
for (const e of entries) {
|
|
37
|
+
if (e.name.startsWith('.'))
|
|
38
|
+
continue; // .bin, .cache, .pnpm, .package-lock.json …
|
|
39
|
+
const names = e.name.startsWith('@')
|
|
40
|
+
? (await readdir(path.join(nodeModules, e.name)).catch(() => [])).map((n) => `${e.name}/${n}`)
|
|
41
|
+
: [e.name];
|
|
42
|
+
for (const name of names)
|
|
43
|
+
await visit(path.join(nodeModules, name, 'node_modules'), depth + 1);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
await visit(path.join(root, 'node_modules'), 0);
|
|
47
|
+
return [...copies.values()];
|
|
48
|
+
}
|
|
49
|
+
/** Replace `file` with `content` through a new inode (never writes into a hardlinked store file). */
|
|
50
|
+
export async function writeNewInode(file, content) {
|
|
51
|
+
const previous = await stat(file).catch(() => undefined);
|
|
52
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
53
|
+
const tmp = `${file}.graft-${process.pid}-${Date.now()}`;
|
|
54
|
+
await writeFile(tmp, content);
|
|
55
|
+
if (previous)
|
|
56
|
+
await chmod(tmp, previous.mode & 0o7777);
|
|
57
|
+
await rename(tmp, file);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Plan (and then apply) one variant to one installed copy. All files are checked before any is
|
|
61
|
+
* written, so a copy is never left half-patched.
|
|
62
|
+
*/
|
|
63
|
+
export async function applyToInstalledCopy(copy, patches) {
|
|
64
|
+
const plan = [];
|
|
65
|
+
for (const p of patches) {
|
|
66
|
+
const target = patchTarget(p);
|
|
67
|
+
const file = path.join(copy.dir, target);
|
|
68
|
+
const exists = existsSync(file) && (await lstat(file)).isFile();
|
|
69
|
+
const content = exists ? await readFile(file, 'utf8') : undefined;
|
|
70
|
+
if (p.oldFile === null) {
|
|
71
|
+
// Creates a file.
|
|
72
|
+
const created = applyPatch('', p.raw, { fuzzFactor: 0 });
|
|
73
|
+
if (created === false)
|
|
74
|
+
return { action: 'failed', files: [], reason: `${target}: cannot build the created file` };
|
|
75
|
+
if (content === undefined)
|
|
76
|
+
plan.push({ file, content: created });
|
|
77
|
+
else if (content === created)
|
|
78
|
+
plan.push({ file, already: true });
|
|
79
|
+
else
|
|
80
|
+
return { action: 'failed', files: [], reason: `${target} already exists upstream with different content` };
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (content === undefined) {
|
|
84
|
+
if (p.newFile === null) {
|
|
85
|
+
plan.push({ file, already: true }); // deletion already done
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
return { action: 'failed', files: [], reason: `${target} is missing in the installed copy` };
|
|
89
|
+
}
|
|
90
|
+
const forward = applyPatch(content, p.raw, { fuzzFactor: 0 });
|
|
91
|
+
if (forward !== false) {
|
|
92
|
+
plan.push(p.newFile === null ? { file, remove: true } : { file: path.join(copy.dir, p.newFile), content: forward });
|
|
93
|
+
if (p.newFile && p.newFile !== target)
|
|
94
|
+
plan.push({ file, remove: true });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (applyPatch(content, reversePatch(p.raw), { fuzzFactor: 0 }) !== false) {
|
|
98
|
+
plan.push({ file, already: true });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
return { action: 'failed', files: [], reason: `${target}: the patch does not apply to the installed copy (and it is not already applied)` };
|
|
102
|
+
}
|
|
103
|
+
const writes = plan.filter((x) => !x.already);
|
|
104
|
+
for (const w of writes) {
|
|
105
|
+
if (w.remove)
|
|
106
|
+
await rm(w.file, { force: true });
|
|
107
|
+
else
|
|
108
|
+
await writeNewInode(w.file, w.content);
|
|
109
|
+
}
|
|
110
|
+
const files = plan.map((x) => path.relative(copy.dir, x.file).split(path.sep).join('/'));
|
|
111
|
+
return { action: writes.length ? 'patched' : 'already-patched', files };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=installed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.js","sourceRoot":"","sources":["../src/installed.ts"],"names":[],"mappings":"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"}
|