@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.
@@ -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.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": "David Sheldrick",
8
- "license": "MIT",
7
+ "author": "Srikanth Gopalakrishnan",
8
+ "license": "Apache-2.0",
9
9
  "engines": {
10
- "node": ">=14",
11
- "npm": ">5",
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.0"
72
+ "typescript": "^6.0.3"
73
73
  },
74
74
  "dependencies": {
75
75
  "@yarnpkg/lockfile": "^1.1.0",