@psync/patch-package 1.0.0 → 1.0.2
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/dist/detectPackageManager.js +55 -21
- package/dist/getPackageResolution.js +50 -25
- package/dist/index.js +127 -113
- package/dist/makePatch.js +80 -52
- package/dist/parseBunLockfile.js +88 -3
- package/dist/strictMode.js +299 -0
- package/package.json +6 -6
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createStrictBaseline = createStrictBaseline;
|
|
4
|
+
exports.listTarGzEntries = listTarGzEntries;
|
|
5
|
+
exports.pruneToBaseline = pruneToBaseline;
|
|
6
|
+
const zlib_1 = require("zlib");
|
|
7
|
+
const https_1 = require("https");
|
|
8
|
+
const http_1 = require("http");
|
|
9
|
+
const url_1 = require("url");
|
|
10
|
+
const fs_extra_1 = require("fs-extra");
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
const path_2 = require("./path");
|
|
14
|
+
/**
|
|
15
|
+
* Build a baseline provider for a given package resolution.
|
|
16
|
+
*
|
|
17
|
+
* `resolution` is whatever `getPackageResolution` returned — typically:
|
|
18
|
+
* - "https://registry.yarnpkg.com/foo/-/foo-1.2.3.tgz#sha512-..." (yarn / bun.lockb)
|
|
19
|
+
* - "https://registry.npmjs.org/foo/-/foo-1.2.3.tgz" (npm via lockfile)
|
|
20
|
+
* - "1.2.3" (version-only, e.g. bun.lock text)
|
|
21
|
+
* - "npm:bar@1.2.3" (alias)
|
|
22
|
+
* - "file:./path" (local file)
|
|
23
|
+
* - "git+https://..." (git url)
|
|
24
|
+
*/
|
|
25
|
+
function createStrictBaseline({ packageName, resolution, appPath, }) {
|
|
26
|
+
return {
|
|
27
|
+
async getOriginalTarballFiles() {
|
|
28
|
+
// CASE 1: file:./path -> walk local directory and return relative paths
|
|
29
|
+
if (resolution.startsWith("file:")) {
|
|
30
|
+
const localPath = (0, path_2.resolve)(appPath, resolution.slice("file:".length));
|
|
31
|
+
if (!(0, fs_1.existsSync)(localPath))
|
|
32
|
+
return null;
|
|
33
|
+
try {
|
|
34
|
+
if ((0, fs_1.statSync)(localPath).isDirectory()) {
|
|
35
|
+
return walkLocalDirectory(localPath, localPath);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
// CASE 2: looks like a .tgz URL -> download, gunzip, parse tar
|
|
44
|
+
if (resolution.endsWith(".tgz") ||
|
|
45
|
+
resolution.endsWith(".tar.gz") ||
|
|
46
|
+
/\bhttps?:\/\/.*\.(tgz|tar\.gz)(\?|#|$)/i.test(resolution)) {
|
|
47
|
+
const url = resolution.split("#")[0];
|
|
48
|
+
try {
|
|
49
|
+
const tarball = await fetchBuffer(url);
|
|
50
|
+
return new Set(listTarGzEntries(tarball));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// CASE 3: looks like a git URL
|
|
57
|
+
if (resolution.startsWith("git+") || resolution.endsWith(".git")) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// CASE 4: plain version like "1.2.3", possibly with an `npm:` alias
|
|
61
|
+
// -> resolve via the npm registry metadata endpoint
|
|
62
|
+
const aliasResolved = parseNpmAlias(resolution);
|
|
63
|
+
const name = aliasResolved.name ?? packageName;
|
|
64
|
+
const version = aliasResolved.version ?? resolution;
|
|
65
|
+
if (!version.match(/^v?\d/))
|
|
66
|
+
return null;
|
|
67
|
+
try {
|
|
68
|
+
const tarballUrl = await fetchTarballUrlFromRegistry(name, version);
|
|
69
|
+
if (!tarballUrl)
|
|
70
|
+
return null;
|
|
71
|
+
const tarball = await fetchBuffer(tarballUrl);
|
|
72
|
+
return new Set(listTarGzEntries(tarball));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function parseNpmAlias(resolution) {
|
|
81
|
+
if (resolution.startsWith("npm:")) {
|
|
82
|
+
const rest = resolution.slice("npm:".length);
|
|
83
|
+
const atIdx = rest.lastIndexOf("@");
|
|
84
|
+
if (atIdx > 0) {
|
|
85
|
+
return { name: rest.slice(0, atIdx), version: rest.slice(atIdx + 1) };
|
|
86
|
+
}
|
|
87
|
+
return { name: rest };
|
|
88
|
+
}
|
|
89
|
+
if (/^v?\d/.test(resolution)) {
|
|
90
|
+
return { version: resolution };
|
|
91
|
+
}
|
|
92
|
+
return {};
|
|
93
|
+
}
|
|
94
|
+
/** Walks a local directory recursively and returns forward-slash relative paths. */
|
|
95
|
+
function walkLocalDirectory(root, current) {
|
|
96
|
+
const out = new Set();
|
|
97
|
+
for (const entry of (0, fs_1.readdirSync)(current, { withFileTypes: true })) {
|
|
98
|
+
const abs = (0, path_1.join)(current, entry.name);
|
|
99
|
+
const rel = abs.slice(root.length + 1).replace(/\\/g, "/");
|
|
100
|
+
if (entry.isDirectory()) {
|
|
101
|
+
out.add(rel + "/");
|
|
102
|
+
for (const sub of walkLocalDirectory(root, abs)) {
|
|
103
|
+
out.add(sub);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (entry.isFile()) {
|
|
107
|
+
out.add(rel);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Fetches the `dist.tarball` URL for a package version from the npm registry
|
|
114
|
+
* metadata endpoint. Returns null if the package/version can't be found.
|
|
115
|
+
*/
|
|
116
|
+
function fetchTarballUrlFromRegistry(name, version) {
|
|
117
|
+
const encodedName = name.startsWith("@")
|
|
118
|
+
? "@" + encodeURIComponent(name.slice(1))
|
|
119
|
+
: encodeURIComponent(name);
|
|
120
|
+
const url = `https://registry.npmjs.org/${encodedName}/${encodeURIComponent(version)}`;
|
|
121
|
+
return new Promise((resolveP) => {
|
|
122
|
+
fetchJson(url)
|
|
123
|
+
.then((json) => {
|
|
124
|
+
const tarball = json?.dist?.tarball;
|
|
125
|
+
resolveP(typeof tarball === "string" ? tarball : null);
|
|
126
|
+
})
|
|
127
|
+
.catch(() => resolveP(null));
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function fetchBuffer(url) {
|
|
131
|
+
return new Promise((resolveP, rejectP) => {
|
|
132
|
+
let parsed;
|
|
133
|
+
try {
|
|
134
|
+
parsed = new url_1.URL(url);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
rejectP(new Error(`Invalid URL: ${url}`));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const lib = parsed.protocol === "https:" ? https_1.request : http_1.request;
|
|
141
|
+
const opts = {
|
|
142
|
+
method: "GET",
|
|
143
|
+
hostname: parsed.hostname,
|
|
144
|
+
port: parsed.port || (parsed.protocol === "https:" ? 443 : 80),
|
|
145
|
+
path: parsed.pathname + parsed.search,
|
|
146
|
+
headers: {
|
|
147
|
+
"User-Agent": "patch-package",
|
|
148
|
+
Accept: "application/octet-stream, */*",
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
const req = lib(opts, (res) => {
|
|
152
|
+
if (res.statusCode &&
|
|
153
|
+
res.statusCode >= 300 &&
|
|
154
|
+
res.statusCode < 400 &&
|
|
155
|
+
res.headers.location) {
|
|
156
|
+
fetchBuffer(res.headers.location).then(resolveP, rejectP);
|
|
157
|
+
res.resume();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (res.statusCode !== 200) {
|
|
161
|
+
rejectP(new Error(`HTTP ${res.statusCode} for ${url}`));
|
|
162
|
+
res.resume();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const chunks = [];
|
|
166
|
+
res.on("data", (c) => chunks.push(c));
|
|
167
|
+
res.on("end", () => resolveP(Buffer.concat(chunks)));
|
|
168
|
+
res.on("error", rejectP);
|
|
169
|
+
});
|
|
170
|
+
req.on("error", rejectP);
|
|
171
|
+
req.setTimeout(15000, () => req.destroy(new Error("Tarball download timed out")));
|
|
172
|
+
req.end();
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function fetchJson(url) {
|
|
176
|
+
return fetchBuffer(url).then((buf) => JSON.parse(buf.toString("utf8")));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Lists the file paths inside a gzipped tarball buffer.
|
|
180
|
+
*
|
|
181
|
+
* Tar format: 512-byte header + <size> bytes of file content, padded to
|
|
182
|
+
* the next 512-byte boundary. We don't extract file contents — only the
|
|
183
|
+
* `name` field of each header is read, which is enough to compute the
|
|
184
|
+
* baseline file set.
|
|
185
|
+
*/
|
|
186
|
+
function listTarGzEntries(tarGz) {
|
|
187
|
+
const tar = (0, zlib_1.gunzipSync)(tarGz);
|
|
188
|
+
const out = [];
|
|
189
|
+
const HEADER_SIZE = 512;
|
|
190
|
+
const BLOCK_SIZE = 512;
|
|
191
|
+
// Common prefix (e.g. "package/") that npm and yarn add to every entry —
|
|
192
|
+
// stripped so paths match the user's node_modules layout.
|
|
193
|
+
let leadingPrefix = null;
|
|
194
|
+
let offset = 0;
|
|
195
|
+
while (offset + HEADER_SIZE <= tar.length) {
|
|
196
|
+
if (tar[offset] === 0 &&
|
|
197
|
+
tar.subarray(offset, offset + HEADER_SIZE).every((b) => b === 0)) {
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
const name = readCString(tar, offset, 100);
|
|
201
|
+
const sizeOctal = readCString(tar, offset + 124, 12);
|
|
202
|
+
const typeFlag = String.fromCharCode(tar[offset + 156]);
|
|
203
|
+
const entrySize = parseOctal(sizeOctal) || 0;
|
|
204
|
+
const paddedSize = Math.ceil(entrySize / BLOCK_SIZE) * BLOCK_SIZE;
|
|
205
|
+
// PAX extended header / long-name redirect — skip its blocks only.
|
|
206
|
+
if (typeFlag === "x" || typeFlag === "g" || typeFlag === "L") {
|
|
207
|
+
offset += HEADER_SIZE + paddedSize;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (leadingPrefix === null && name) {
|
|
211
|
+
const firstSlash = name.indexOf("/");
|
|
212
|
+
leadingPrefix = firstSlash >= 0 ? name.slice(0, firstSlash + 1) : "";
|
|
213
|
+
}
|
|
214
|
+
if (leadingPrefix && name.startsWith(leadingPrefix)) {
|
|
215
|
+
const cleaned = name.slice(leadingPrefix.length);
|
|
216
|
+
if (cleaned && !cleaned.endsWith("/")) {
|
|
217
|
+
out.push(cleaned);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else if (name && !name.endsWith("/")) {
|
|
221
|
+
out.push(name);
|
|
222
|
+
}
|
|
223
|
+
offset += HEADER_SIZE + paddedSize;
|
|
224
|
+
}
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
/** Read a NUL-terminated UTF-8 string of `maxLen` bytes at `offset`. */
|
|
228
|
+
function readCString(buf, offset, maxLen) {
|
|
229
|
+
const slice = buf.subarray(offset, offset + maxLen);
|
|
230
|
+
const nulIdx = slice.indexOf(0);
|
|
231
|
+
return slice.subarray(0, nulIdx < 0 ? maxLen : nulIdx).toString("utf8");
|
|
232
|
+
}
|
|
233
|
+
/** Parse an octal string (e.g. "000142") into a number. */
|
|
234
|
+
function parseOctal(s) {
|
|
235
|
+
const trimmed = s.replace(/\0/g, "").trim();
|
|
236
|
+
if (!trimmed)
|
|
237
|
+
return 0;
|
|
238
|
+
if (/^[0-7]+$/.test(trimmed)) {
|
|
239
|
+
return parseInt(trimmed, 8);
|
|
240
|
+
}
|
|
241
|
+
return 0;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Removes files from `treeRoot` whose relative paths (forward slashes, sans
|
|
245
|
+
* leading `./`) are NOT in `baseline`. Any directory that becomes empty as
|
|
246
|
+
* a side effect is also removed, so git doesn't include empty-dir noise in
|
|
247
|
+
* the resulting patch.
|
|
248
|
+
*/
|
|
249
|
+
function pruneToBaseline(treeRoot, baseline) {
|
|
250
|
+
let pruned = 0;
|
|
251
|
+
walk(treeRoot, (absPath, relativePath) => {
|
|
252
|
+
if (!(0, fs_1.statSync)(absPath).isFile())
|
|
253
|
+
return;
|
|
254
|
+
const normalized = relativePath.replace(/\\/g, "/");
|
|
255
|
+
if (!baseline.has(normalized)) {
|
|
256
|
+
(0, fs_extra_1.removeSync)(absPath);
|
|
257
|
+
pruned++;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
pruneEmptyDirs(treeRoot);
|
|
261
|
+
return { pruned };
|
|
262
|
+
}
|
|
263
|
+
function walk(root, visit) {
|
|
264
|
+
function recurse(absPath, relPath) {
|
|
265
|
+
const entries = (0, fs_1.readdirSync)(absPath, { withFileTypes: true });
|
|
266
|
+
for (const entry of entries) {
|
|
267
|
+
const childAbs = (0, path_1.join)(absPath, entry.name);
|
|
268
|
+
const childRel = relPath ? `${relPath}/${entry.name}` : entry.name;
|
|
269
|
+
if (entry.isDirectory()) {
|
|
270
|
+
recurse(childAbs, childRel);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
visit(childAbs, childRel);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
recurse(root, "");
|
|
278
|
+
}
|
|
279
|
+
function pruneEmptyDirs(root) {
|
|
280
|
+
function recurse(dir) {
|
|
281
|
+
const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
282
|
+
for (const entry of entries) {
|
|
283
|
+
if (!entry.isDirectory())
|
|
284
|
+
continue;
|
|
285
|
+
const child = (0, path_1.join)(dir, entry.name);
|
|
286
|
+
recurse(child);
|
|
287
|
+
}
|
|
288
|
+
if (dir !== root && (0, fs_1.readdirSync)(dir).length === 0) {
|
|
289
|
+
try {
|
|
290
|
+
(0, fs_1.rmdirSync)(dir);
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// ignore
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
recurse(root);
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWN0TW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdHJpY3RNb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkNBLG9EQTZEQztBQXlIRCw0Q0FrREM7QUF5QkQsMENBZUM7QUEzVEQsK0JBQWlDO0FBQ2pDLGlDQUErRDtBQUMvRCwrQkFHYTtBQUNiLDZCQUF5QjtBQUN6Qix1Q0FBcUM7QUFDckMsMkJBQWlFO0FBQ2pFLCtCQUEyQjtBQUMzQixpQ0FBK0M7QUFzQi9DOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxFQUNuQyxXQUFXLEVBQ1gsVUFBVSxFQUNWLE9BQU8sR0FLUjtJQUNDLE9BQU87UUFDTCxLQUFLLENBQUMsdUJBQXVCO1lBQzNCLHdFQUF3RTtZQUN4RSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBQSxjQUFXLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7Z0JBQ3hFLElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxTQUFTLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUE7Z0JBQ3ZDLElBQUksQ0FBQztvQkFDSCxJQUFJLElBQUEsYUFBUSxFQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7d0JBQ3RDLE9BQU8sa0JBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO29CQUNqRCxDQUFDO2dCQUNILENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLE9BQU8sSUFBSSxDQUFBO2dCQUNiLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUE7WUFDYixDQUFDO1lBRUQsK0RBQStEO1lBQy9ELElBQ0UsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FB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QzdCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQzNCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDbkIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQVk7SUFDbEMsU0FBUyxPQUFPLENBQUMsR0FBVztRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFBLGdCQUFXLEVBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDekQsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFBRSxTQUFRO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hCLENBQUM7UUFDRCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksSUFBQSxnQkFBVyxFQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUM7Z0JBQ0gsSUFBQSxjQUFTLEVBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tIFwiemxpYlwiXG5pbXBvcnQgeyByZXF1ZXN0IGFzIGh0dHBzUmVxdWVzdCwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiaHR0cHNcIlxuaW1wb3J0IHtcbiAgcmVxdWVzdCBhcyBodHRwUmVxdWVzdCxcbiAgUmVxdWVzdE9wdGlvbnMgYXMgSHR0cFJlcXVlc3RPcHRpb25zLFxufSBmcm9tIFwiaHR0cFwiXG5pbXBvcnQgeyBVUkwgfSBmcm9tIFwidXJsXCJcbmltcG9ydCB7IHJlbW92ZVN5bmMgfSBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMsIHJlYWRkaXJTeW5jLCBybWRpclN5bmMgfSBmcm9tIFwiZnNcIlxuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IHJlc29sdmUgYXMgcmVzb2x2ZVBhdGggfSBmcm9tIFwiLi9wYXRoXCJcblxuLyoqXG4gKiBTdHJpY3QtbW9kZSBzdXBwb3J0IGZvciBgcGF0Y2gtcGFja2FnZWAuXG4gKlxuICogSW4gc3RyaWN0IG1vZGUsIGFmdGVyIHRoZSB1c2VyJ3MgZWRpdGVkIGNvcHkgb2YgdGhlIHBhY2thZ2UgaGFzIGJlZW5cbiAqIHN0YWdlZCBpbiB0aGUgdGVtcCBnaXQgcmVwbywgYW55IGZpbGUgd2hvc2UgcGF0aCB3YXMgTk9UIHBhcnQgb2YgdGhlXG4gKiBvcmlnaW5hbCBwdWJsaXNoZWQgcGFja2FnZSAodGhlIHRhcmJhbGwgYXQgdGhlIHJlc29sdmVkIFVSTCkgaXMgcmVtb3ZlZFxuICogZnJvbSB0aGUgdHJlZSBiZWZvcmUgY29tcHV0aW5nIHRoZSBkaWZmLiBUaGlzIHByZXZlbnRzIHRoZVxuICogXCItLS0gL2Rldi9udWxsXCIgKFwibmV3IGZpbGVcIikgZW50cmllcyB0aGF0IGFwcGVhciB3aGVuIGEgcGFja2FnZSBtYW5hZ2VyXG4gKiBpbnN0YWxsIGluIHRoZSB0ZW1wIGRpcmVjdG9yeSBwcm9kdWNlcyBhIHNsaWdodGx5IGRpZmZlcmVudCBmaWxlIGxheW91dFxuICogdGhhbiB0aGUgdXNlcidzIGBub2RlX21vZHVsZXNgIGNvcHkuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgYmFzZWxpbmUgY2Fubm90IGJlIGRldGVybWluZWQg4oCUIGNhbGxlcnMgd2FybiB0aGVcbiAqIHVzZXIgYW5kIHByb2NlZWQgd2l0aG91dCBzdHJpY3QgZmlsdGVyaW5nLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RCYXNlbGluZVByb3ZpZGVyID0ge1xuICAvKiogU2V0IG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgKGZvcndhcmQgc2xhc2hlcykgdGhhdCB0aGUgb3JpZ2luYWxcbiAgICogcHVibGlzaGVkIHBhY2thZ2UgY29udGFpbmVkLCBvciBgbnVsbGAgaWYgbm90IGRldGVybWluYWJsZS4gKi9cbiAgZ2V0T3JpZ2luYWxUYXJiYWxsRmlsZXMoKTogUHJvbWlzZTxTZXQ8c3RyaW5nPiB8IG51bGw+XG59XG5cbi8qKlxuICogQnVpbGQgYSBiYXNlbGluZSBwcm92aWRlciBmb3IgYSBnaXZlbiBwYWNrYWdlIHJlc29sdXRpb24uXG4gKlxuICogYHJlc29sdXRpb25gIGlzIHdoYXRldmVyIGBnZXRQYWNrYWdlUmVzb2x1dGlvbmAgcmV0dXJuZWQg4oCUIHR5cGljYWxseTpcbiAqICAtIFwiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9mb28vLS9mb28tMS4yLjMudGd6I3NoYTUxMi0uLi5cIiAgKHlhcm4gLyBidW4ubG9ja2IpXG4gKiAgLSBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvby8tL2Zvby0xLjIuMy50Z3pcIiAgICAgICAgICAgICAgIChucG0gdmlhIGxvY2tmaWxlKVxuICogIC0gXCIxLjIuM1wiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbi1vbmx5LCBlLmcuIGJ1bi5sb2NrIHRleHQpXG4gKiAgLSBcIm5wbTpiYXJAMS4yLjNcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGlhcylcbiAqICAtIFwiZmlsZTouL3BhdGhcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsIGZpbGUpXG4gKiAgLSBcImdpdCtodHRwczovLy4uLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQgdXJsKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RyaWN0QmFzZWxpbmUoe1xuICBwYWNrYWdlTmFtZSxcbiAgcmVzb2x1dGlvbixcbiAgYXBwUGF0aCxcbn06IHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuICByZXNvbHV0aW9uOiBzdHJpbmdcbiAgYXBwUGF0aDogc3RyaW5nXG59KTogU3RyaWN0QmFzZWxpbmVQcm92aWRlciB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxUYXJiYWxsRmlsZXMoKSB7XG4gICAgICAvLyBDQVNFIDE6IGZpbGU6Li9wYXRoIC0+IHdhbGsgbG9jYWwgZGlyZWN0b3J5IGFuZCByZXR1cm4gcmVsYXRpdmUgcGF0aHNcbiAgICAgIGlmIChyZXNvbHV0aW9uLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkge1xuICAgICAgICBjb25zdCBsb2NhbFBhdGggPSByZXNvbHZlUGF0aChhcHBQYXRoLCByZXNvbHV0aW9uLnNsaWNlKFwiZmlsZTpcIi5sZW5ndGgpKVxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMobG9jYWxQYXRoKSkgcmV0dXJuIG51bGxcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoc3RhdFN5bmMobG9jYWxQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa0xvY2FsRGlyZWN0b3J5KGxvY2FsUGF0aCwgbG9jYWxQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICAvLyBDQVNFIDI6IGxvb2tzIGxpa2UgYSAudGd6IFVSTCAtPiBkb3dubG9hZCwgZ3VuemlwLCBwYXJzZSB0YXJcbiAgICAgIGlmIChcbiAgICAgICAgcmVzb2x1dGlvbi5lbmRzV2l0aChcIi50Z3pcIikgfHxcbiAgICAgICAgcmVzb2x1dGlvbi5lbmRzV2l0aChcIi50YXIuZ3pcIikgfHxcbiAgICAgICAgL1xcYmh0dHBzPzpcXC9cXC8uKlxcLih0Z3p8dGFyXFwuZ3opKFxcP3wjfCQpL2kudGVzdChyZXNvbHV0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlc29sdXRpb24uc3BsaXQoXCIjXCIpWzBdXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyYmFsbCA9IGF3YWl0IGZldGNoQnVmZmVyKHVybClcbiAgICAgICAgICByZXR1cm4gbmV3IFNldChsaXN0VGFyR3pFbnRyaWVzKHRhcmJhbGwpKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENBU0UgMzogbG9va3MgbGlrZSBhIGdpdCBVUkxcbiAgICAgIGlmIChyZXNvbHV0aW9uLnN0YXJ0c1dpdGgoXCJnaXQrXCIpIHx8IHJlc29sdXRpb24uZW5kc1dpdGgoXCIuZ2l0XCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIC8vIENBU0UgNDogcGxhaW4gdmVyc2lvbiBsaWtlIFwiMS4yLjNcIiwgcG9zc2libHkgd2l0aCBhbiBgbnBtOmAgYWxpYXNcbiAgICAgIC8vIC0+IHJlc29sdmUgdmlhIHRoZSBucG0gcmVnaXN0cnkgbWV0YWRhdGEgZW5kcG9pbnRcbiAgICAgIGNvbnN0IGFsaWFzUmVzb2x2ZWQgPSBwYXJzZU5wbUFsaWFzKHJlc29sdXRpb24pXG4gICAgICBjb25zdCBuYW1lID0gYWxpYXNSZXNvbHZlZC5uYW1lID8/IHBhY2thZ2VOYW1lXG4gICAgICBjb25zdCB2ZXJzaW9uID0gYWxpYXNSZXNvbHZlZC52ZXJzaW9uID8/IHJlc29sdXRpb25cbiAgICAgIGlmICghdmVyc2lvbi5tYXRjaCgvXnY/XFxkLykpIHJldHVybiBudWxsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0YXJiYWxsVXJsID0gYXdhaXQgZmV0Y2hUYXJiYWxsVXJsRnJvbVJlZ2lzdHJ5KG5hbWUsIHZlcnNpb24pXG4gICAgICAgIGlmICghdGFyYmFsbFVybCkgcmV0dXJuIG51bGxcbiAgICAgICAgY29uc3QgdGFyYmFsbCA9IGF3YWl0IGZldGNoQnVmZmVyKHRhcmJhbGxVcmwpXG4gICAgICAgIHJldHVybiBuZXcgU2V0KGxpc3RUYXJHekVudHJpZXModGFyYmFsbCkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTnBtQWxpYXMocmVzb2x1dGlvbjogc3RyaW5nKToge1xuICBuYW1lPzogc3RyaW5nXG4gIHZlcnNpb24/OiBzdHJpbmdcbn0ge1xuICBpZiAocmVzb2x1dGlvbi5zdGFydHNXaXRoKFwibnBtOlwiKSkge1xuICAgIGNvbnN0IHJlc3QgPSByZXNvbHV0aW9uLnNsaWNlKFwibnBtOlwiLmxlbmd0aClcbiAgICBjb25zdCBhdElkeCA9IHJlc3QubGFzdEluZGV4T2YoXCJAXCIpXG4gICAgaWYgKGF0SWR4ID4gMCkge1xuICAgICAgcmV0dXJuIHsgbmFtZTogcmVzdC5zbGljZSgwLCBhdElkeCksIHZlcnNpb246IHJlc3Quc2xpY2UoYXRJZHggKyAxKSB9XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IHJlc3QgfVxuICB9XG4gIGlmICgvXnY/XFxkLy50ZXN0KHJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgdmVyc2lvbjogcmVzb2x1dGlvbiB9XG4gIH1cbiAgcmV0dXJuIHt9XG59XG5cbi8qKiBXYWxrcyBhIGxvY2FsIGRpcmVjdG9yeSByZWN1cnNpdmVseSBhbmQgcmV0dXJucyBmb3J3YXJkLXNsYXNoIHJlbGF0aXZlIHBhdGhzLiAqL1xuZnVuY3Rpb24gd2Fsa0xvY2FsRGlyZWN0b3J5KHJvb3Q6IHN0cmluZywgY3VycmVudDogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGN1cnJlbnQsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGNvbnN0IGFicyA9IGpvaW4oY3VycmVudCwgZW50cnkubmFtZSlcbiAgICBjb25zdCByZWwgPSBhYnMuc2xpY2Uocm9vdC5sZW5ndGggKyAxKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBvdXQuYWRkKHJlbCArIFwiL1wiKVxuICAgICAgZm9yIChjb25zdCBzdWIgb2Ygd2Fsa0xvY2FsRGlyZWN0b3J5KHJvb3QsIGFicykpIHtcbiAgICAgICAgb3V0LmFkZChzdWIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgb3V0LmFkZChyZWwpXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBgZGlzdC50YXJiYWxsYCBVUkwgZm9yIGEgcGFja2FnZSB2ZXJzaW9uIGZyb20gdGhlIG5wbSByZWdpc3RyeVxuICogbWV0YWRhdGEgZW5kcG9pbnQuIFJldHVybnMgbnVsbCBpZiB0aGUgcGFja2FnZS92ZXJzaW9uIGNhbid0IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiBmZXRjaFRhcmJhbGxVcmxGcm9tUmVnaXN0cnkoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmVyc2lvbjogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IGVuY29kZWROYW1lID0gbmFtZS5zdGFydHNXaXRoKFwiQFwiKVxuICAgID8gXCJAXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmFtZS5zbGljZSgxKSlcbiAgICA6IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKVxuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX0vJHtlbmNvZGVVUklDb21wb25lbnQodmVyc2lvbil9YFxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVQKSA9PiB7XG4gICAgZmV0Y2hKc29uKHVybClcbiAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmJhbGwgPSBqc29uPy5kaXN0Py50YXJiYWxsXG4gICAgICAgIHJlc29sdmVQKHR5cGVvZiB0YXJiYWxsID09PSBcInN0cmluZ1wiID8gdGFyYmFsbCA6IG51bGwpXG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHJlc29sdmVQKG51bGwpKVxuICB9KVxufVxuXG5mdW5jdGlvbiBmZXRjaEJ1ZmZlcih1cmw6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZVAsIHJlamVjdFApID0+IHtcbiAgICBsZXQgcGFyc2VkOiBVUkxcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gbmV3IFVSTCh1cmwpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZWplY3RQKG5ldyBFcnJvcihgSW52YWxpZCBVUkw6ICR7dXJsfWApKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGxpYiA9IHBhcnNlZC5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IGh0dHBzUmVxdWVzdCA6IGh0dHBSZXF1ZXN0XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhvc3RuYW1lOiBwYXJzZWQuaG9zdG5hbWUsXG4gICAgICBwb3J0OiBwYXJzZWQucG9ydCB8fCAocGFyc2VkLnByb3RvY29sID09PSBcImh0dHBzOlwiID8gNDQzIDogODApLFxuICAgICAgcGF0aDogcGFyc2VkLnBhdGhuYW1lICsgcGFyc2VkLnNlYXJjaCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJVc2VyLUFnZW50XCI6IFwicGF0Y2gtcGFja2FnZVwiLFxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtLCAqLypcIixcbiAgICAgIH0sXG4gICAgfSBhcyBSZXF1ZXN0T3B0aW9ucyAmIEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgIGNvbnN0IHJlcSA9IGxpYihvcHRzLCAocmVzKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlcy5zdGF0dXNDb2RlICYmXG4gICAgICAgIHJlcy5zdGF0dXNDb2RlID49IDMwMCAmJlxuICAgICAgICByZXMuc3RhdHVzQ29kZSA8IDQwMCAmJlxuICAgICAgICByZXMuaGVhZGVycy5sb2NhdGlvblxuICAgICAgKSB7XG4gICAgICAgIGZldGNoQnVmZmVyKHJlcy5oZWFkZXJzLmxvY2F0aW9uKS50aGVuKHJlc29sdmVQLCByZWplY3RQKVxuICAgICAgICByZXMucmVzdW1lKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICByZWplY3RQKG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXNDb2RlfSBmb3IgJHt1cmx9YCkpXG4gICAgICAgIHJlcy5yZXN1bWUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXVxuICAgICAgcmVzLm9uKFwiZGF0YVwiLCAoYzogQnVmZmVyKSA9PiBjaHVua3MucHVzaChjKSlcbiAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9PiByZXNvbHZlUChCdWZmZXIuY29uY2F0KGNodW5rcykpKVxuICAgICAgcmVzLm9uKFwiZXJyb3JcIiwgcmVqZWN0UClcbiAgICB9KVxuICAgIHJlcS5vbihcImVycm9yXCIsIHJlamVjdFApXG4gICAgcmVxLnNldFRpbWVvdXQoMTUwMDAsICgpID0+XG4gICAgICByZXEuZGVzdHJveShuZXcgRXJyb3IoXCJUYXJiYWxsIGRvd25sb2FkIHRpbWVkIG91dFwiKSksXG4gICAgKVxuICAgIHJlcS5lbmQoKVxuICB9KVxufVxuXG5mdW5jdGlvbiBmZXRjaEpzb24odXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZmV0Y2hCdWZmZXIodXJsKS50aGVuKChidWYpID0+IEpTT04ucGFyc2UoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSkpXG59XG5cbi8qKlxuICogTGlzdHMgdGhlIGZpbGUgcGF0aHMgaW5zaWRlIGEgZ3ppcHBlZCB0YXJiYWxsIGJ1ZmZlci5cbiAqXG4gKiBUYXIgZm9ybWF0OiA1MTItYnl0ZSBoZWFkZXIgKyA8c2l6ZT4gYnl0ZXMgb2YgZmlsZSBjb250ZW50LCBwYWRkZWQgdG9cbiAqIHRoZSBuZXh0IDUxMi1ieXRlIGJvdW5kYXJ5LiBXZSBkb24ndCBleHRyYWN0IGZpbGUgY29udGVudHMg4oCUIG9ubHkgdGhlXG4gKiBgbmFtZWAgZmllbGQgb2YgZWFjaCBoZWFkZXIgaXMgcmVhZCwgd2hpY2ggaXMgZW5vdWdoIHRvIGNvbXB1dGUgdGhlXG4gKiBiYXNlbGluZSBmaWxlIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUYXJHekVudHJpZXModGFyR3o6IEJ1ZmZlcik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyID0gZ3VuemlwU3luYyh0YXJHeilcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IEhFQURFUl9TSVpFID0gNTEyXG4gIGNvbnN0IEJMT0NLX1NJWkUgPSA1MTJcblxuICAvLyBDb21tb24gcHJlZml4IChlLmcuIFwicGFja2FnZS9cIikgdGhhdCBucG0gYW5kIHlhcm4gYWRkIHRvIGV2ZXJ5IGVudHJ5IOKAlFxuICAvLyBzdHJpcHBlZCBzbyBwYXRocyBtYXRjaCB0aGUgdXNlcidzIG5vZGVfbW9kdWxlcyBsYXlvdXQuXG4gIGxldCBsZWFkaW5nUHJlZml4OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gIGxldCBvZmZzZXQgPSAwXG4gIHdoaWxlIChvZmZzZXQgKyBIRUFERVJfU0laRSA8PSB0YXIubGVuZ3RoKSB7XG4gICAgaWYgKFxuICAgICAgdGFyW29mZnNldF0gPT09IDAgJiZcbiAgICAgIHRhci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIEhFQURFUl9TSVpFKS5ldmVyeSgoYikgPT4gYiA9PT0gMClcbiAgICApIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IHJlYWRDU3RyaW5nKHRhciwgb2Zmc2V0LCAxMDApXG4gICAgY29uc3Qgc2l6ZU9jdGFsID0gcmVhZENTdHJpbmcodGFyLCBvZmZzZXQgKyAxMjQsIDEyKVxuICAgIGNvbnN0IHR5cGVGbGFnID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0YXJbb2Zmc2V0ICsgMTU2XSlcblxuICAgIGNvbnN0IGVudHJ5U2l6ZSA9IHBhcnNlT2N0YWwoc2l6ZU9jdGFsKSB8fCAwXG4gICAgY29uc3QgcGFkZGVkU2l6ZSA9IE1hdGguY2VpbChlbnRyeVNpemUgLyBCTE9DS19TSVpFKSAqIEJMT0NLX1NJWkVcblxuICAgIC8vIFBBWCBleHRlbmRlZCBoZWFkZXIgLyBsb25nLW5hbWUgcmVkaXJlY3Qg4oCUIHNraXAgaXRzIGJsb2NrcyBvbmx5LlxuICAgIGlmICh0eXBlRmxhZyA9PT0gXCJ4XCIgfHwgdHlwZUZsYWcgPT09IFwiZ1wiIHx8IHR5cGVGbGFnID09PSBcIkxcIikge1xuICAgICAgb2Zmc2V0ICs9IEhFQURFUl9TSVpFICsgcGFkZGVkU2l6ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAobGVhZGluZ1ByZWZpeCA9PT0gbnVsbCAmJiBuYW1lKSB7XG4gICAgICBjb25zdCBmaXJzdFNsYXNoID0gbmFtZS5pbmRleE9mKFwiL1wiKVxuICAgICAgbGVhZGluZ1ByZWZpeCA9IGZpcnN0U2xhc2ggPj0gMCA/IG5hbWUuc2xpY2UoMCwgZmlyc3RTbGFzaCArIDEpIDogXCJcIlxuICAgIH1cblxuICAgIGlmIChsZWFkaW5nUHJlZml4ICYmIG5hbWUuc3RhcnRzV2l0aChsZWFkaW5nUHJlZml4KSkge1xuICAgICAgY29uc3QgY2xlYW5lZCA9IG5hbWUuc2xpY2UobGVhZGluZ1ByZWZpeC5sZW5ndGgpXG4gICAgICBpZiAoY2xlYW5lZCAmJiAhY2xlYW5lZC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgb3V0LnB1c2goY2xlYW5lZClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUgJiYgIW5hbWUuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICBvdXQucHVzaChuYW1lKVxuICAgIH1cblxuICAgIG9mZnNldCArPSBIRUFERVJfU0laRSArIHBhZGRlZFNpemVcbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cblxuLyoqIFJlYWQgYSBOVUwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgb2YgYG1heExlbmAgYnl0ZXMgYXQgYG9mZnNldGAuICovXG5mdW5jdGlvbiByZWFkQ1N0cmluZyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG1heExlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2xpY2UgPSBidWYuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBtYXhMZW4pXG4gIGNvbnN0IG51bElkeCA9IHNsaWNlLmluZGV4T2YoMClcbiAgcmV0dXJuIHNsaWNlLnN1YmFycmF5KDAsIG51bElkeCA8IDAgPyBtYXhMZW4gOiBudWxJZHgpLnRvU3RyaW5nKFwidXRmOFwiKVxufVxuXG4vKiogUGFyc2UgYW4gb2N0YWwgc3RyaW5nIChlLmcuIFwiMDAwMTQyXCIpIGludG8gYSBudW1iZXIuICovXG5mdW5jdGlvbiBwYXJzZU9jdGFsKHM6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHRyaW1tZWQgPSBzLnJlcGxhY2UoL1xcMC9nLCBcIlwiKS50cmltKClcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gMFxuICBpZiAoL15bMC03XSskLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRyaW1tZWQsIDgpXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGZpbGVzIGZyb20gYHRyZWVSb290YCB3aG9zZSByZWxhdGl2ZSBwYXRocyAoZm9yd2FyZCBzbGFzaGVzLCBzYW5zXG4gKiBsZWFkaW5nIGAuL2ApIGFyZSBOT1QgaW4gYGJhc2VsaW5lYC4gQW55IGRpcmVjdG9yeSB0aGF0IGJlY29tZXMgZW1wdHkgYXNcbiAqIGEgc2lkZSBlZmZlY3QgaXMgYWxzbyByZW1vdmVkLCBzbyBnaXQgZG9lc24ndCBpbmNsdWRlIGVtcHR5LWRpciBub2lzZSBpblxuICogdGhlIHJlc3VsdGluZyBwYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBydW5lVG9CYXNlbGluZShcbiAgdHJlZVJvb3Q6IHN0cmluZyxcbiAgYmFzZWxpbmU6IFNldDxzdHJpbmc+LFxuKTogeyBwcnVuZWQ6IG51bWJlciB9IHtcbiAgbGV0IHBydW5lZCA9IDBcbiAgd2Fsayh0cmVlUm9vdCwgKGFic1BhdGgsIHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgIGlmICghc3RhdFN5bmMoYWJzUGF0aCkuaXNGaWxlKCkpIHJldHVyblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgICBpZiAoIWJhc2VsaW5lLmhhcyhub3JtYWxpemVkKSkge1xuICAgICAgcmVtb3ZlU3luYyhhYnNQYXRoKVxuICAgICAgcHJ1bmVkKytcbiAgICB9XG4gIH0pXG4gIHBydW5lRW1wdHlEaXJzKHRyZWVSb290KVxuICByZXR1cm4geyBwcnVuZWQgfVxufVxuXG5mdW5jdGlvbiB3YWxrKFxuICByb290OiBzdHJpbmcsXG4gIHZpc2l0OiAoYWJzUGF0aDogc3RyaW5nLCByZWxQYXRoOiBzdHJpbmcpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgZnVuY3Rpb24gcmVjdXJzZShhYnNQYXRoOiBzdHJpbmcsIHJlbFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhhYnNQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGNoaWxkQWJzID0gam9pbihhYnNQYXRoLCBlbnRyeS5uYW1lKVxuICAgICAgY29uc3QgY2hpbGRSZWwgPSByZWxQYXRoID8gYCR7cmVsUGF0aH0vJHtlbnRyeS5uYW1lfWAgOiBlbnRyeS5uYW1lXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKGNoaWxkQWJzLCBjaGlsZFJlbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpc2l0KGNoaWxkQWJzLCBjaGlsZFJlbClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVjdXJzZShyb290LCBcIlwiKVxufVxuXG5mdW5jdGlvbiBwcnVuZUVtcHR5RGlycyhyb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgZnVuY3Rpb24gcmVjdXJzZShkaXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZVxuICAgICAgY29uc3QgY2hpbGQgPSBqb2luKGRpciwgZW50cnkubmFtZSlcbiAgICAgIHJlY3Vyc2UoY2hpbGQpXG4gICAgfVxuICAgIGlmIChkaXIgIT09IHJvb3QgJiYgcmVhZGRpclN5bmMoZGlyKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJtZGlyU3luYyhkaXIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlY3Vyc2Uocm9vdClcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@psync/patch-package",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Fix broken node modules with no fuss",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"repository": "github:New-Elysium/patch-package",
|
|
7
|
-
"author": "
|
|
8
|
-
"license": "
|
|
7
|
+
"author": "Srikanth Gopalakrishnan",
|
|
8
|
+
"license": "Apache-2.0",
|
|
9
9
|
"engines": {
|
|
10
|
-
"node": ">=
|
|
11
|
-
"npm": ">
|
|
10
|
+
"node": ">=24",
|
|
11
|
+
"npm": ">10",
|
|
12
12
|
"bun": ">=1.3.14"
|
|
13
13
|
},
|
|
14
14
|
"bin": {
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"ts-jest": "^29.4.0",
|
|
70
70
|
"ts-node": "^10.9.0",
|
|
71
71
|
"tslib": "^2.8.0",
|
|
72
|
-
"typescript": "^6.0.
|
|
72
|
+
"typescript": "^6.0.3"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
75
|
"@yarnpkg/lockfile": "^1.1.0",
|