@antongolub/lockfile 0.0.0-snapshot.0 → 0.0.0-snapshot.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/package.json +3 -2
- package/target/es6/common.d.ts +2 -0
- package/target/es6/index.d.ts +3 -0
- package/target/es6/index.js +423 -0
- package/target/es6/index.js.map +4 -4
- package/target/es6/index.mjs +404 -12
- package/target/es6/yarn-1.d.ts +1 -0
- package/target/es6/yarn-5.d.ts +1 -0
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antongolub/lockfile",
|
|
3
|
-
"version": "0.0.0-snapshot.
|
|
3
|
+
"version": "0.0.0-snapshot.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
7
|
"description": "Read, write, and convert npm (v1, v2) and yarn (classic and berry) lockfiles in any directions with reasonable losses.",
|
|
8
8
|
"main": "./target/es6/index.mjs",
|
|
9
9
|
"type": "module",
|
|
10
|
+
"exports": "./target/es6/index.mjs",
|
|
10
11
|
"dependencies": {
|
|
11
12
|
"js-yaml": "^4.1.0"
|
|
12
13
|
},
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
"uvu": "^0.5.6"
|
|
21
22
|
},
|
|
22
23
|
"scripts": {
|
|
23
|
-
"build": "yarn build:es6 && yarn build:libdef
|
|
24
|
+
"build": "yarn build:es6 && yarn build:libdef",
|
|
24
25
|
"build:es6": "node ./build.js",
|
|
25
26
|
"build:libdef": "tsc --emitDeclarationOnly --outDir target/es6",
|
|
26
27
|
"build:esmfix": "tsc-esm-fix --target=target/es6 --ext=.mjs",
|
package/target/es6/common.d.ts
CHANGED
package/target/es6/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { parse as parseNpm1, format as formatNpm1 } from './npm-1';
|
|
2
2
|
import { parse as parseYarn1, format as formatYarn1 } from './yarn-1';
|
|
3
3
|
import { parse as parseYarn5, format as formatYarn5 } from './yarn-5';
|
|
4
|
+
import { TSnapshot } from './interface';
|
|
4
5
|
export declare const foo = "bar";
|
|
6
|
+
export { getSources } from './common';
|
|
5
7
|
export { parseNpm1, formatNpm1, parseYarn1, formatYarn1, parseYarn5, formatYarn5 };
|
|
8
|
+
export declare const parse: (lockfile: string, pkg: string) => Promise<TSnapshot>;
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
// src/main/ts/util.ts
|
|
2
|
+
var parseIntegrity = (integrity) => integrity ? integrity.split(" ").reduce((m, item) => {
|
|
3
|
+
const [k, v] = item.split("-");
|
|
4
|
+
if (k === "sha512" || k === "sha256" || k === "sha1" || k === "checksum") {
|
|
5
|
+
m[k] = v;
|
|
6
|
+
} else if (!v) {
|
|
7
|
+
m["checksum"] = k;
|
|
8
|
+
}
|
|
9
|
+
return m;
|
|
10
|
+
}, {}) : {};
|
|
11
|
+
var sortObject = (unordered) => Object.entries({ ...unordered }).sort(([a], [b]) => a > b ? 1 : -1).reduce(
|
|
12
|
+
(obj, [key, value]) => {
|
|
13
|
+
obj[key] = value;
|
|
14
|
+
return obj;
|
|
15
|
+
},
|
|
16
|
+
flushObject(unordered)
|
|
17
|
+
);
|
|
18
|
+
var flushObject = (obj) => {
|
|
19
|
+
for (const key in obj) {
|
|
20
|
+
delete obj[key];
|
|
21
|
+
}
|
|
22
|
+
return obj;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/main/ts/npm-1.ts
|
|
26
|
+
import fs from "fs";
|
|
27
|
+
var parse = async (lockfile, pkg) => {
|
|
28
|
+
const lf = await JSON.parse(lockfile);
|
|
29
|
+
const manifest = await JSON.parse(pkg);
|
|
30
|
+
const workspaces = {
|
|
31
|
+
"": {
|
|
32
|
+
name: manifest.name,
|
|
33
|
+
path: ".",
|
|
34
|
+
manifest
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const entries = {
|
|
38
|
+
"": {
|
|
39
|
+
name: manifest.name,
|
|
40
|
+
version: manifest.version,
|
|
41
|
+
dependencies: {
|
|
42
|
+
...manifest.dependencies,
|
|
43
|
+
...manifest.devDependencies
|
|
44
|
+
},
|
|
45
|
+
hashes: {},
|
|
46
|
+
ranges: []
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const getClosestVersion = (name, ...deps) => deps.find((dep) => dep[name])?.[name]?.version;
|
|
50
|
+
const upsertEntry = (name, version, data = {}) => {
|
|
51
|
+
const key = `${name}@${version}`;
|
|
52
|
+
if (!entries[key]) {
|
|
53
|
+
entries[key] = { name, version, ranges: [] };
|
|
54
|
+
}
|
|
55
|
+
return Object.assign(entries[key], data);
|
|
56
|
+
};
|
|
57
|
+
const pushRange = (name, version, range) => {
|
|
58
|
+
const entry = upsertEntry(name, version);
|
|
59
|
+
if (!entry.ranges.includes(range)) {
|
|
60
|
+
entry.ranges.push(range);
|
|
61
|
+
entry.ranges.sort();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const extractRanges = (deps, ...parents) => deps && Object.entries(deps).forEach(([_name, range]) => {
|
|
65
|
+
const _version = getClosestVersion(_name, ...parents);
|
|
66
|
+
pushRange(_name, _version, range);
|
|
67
|
+
});
|
|
68
|
+
const extractEntries = (deps, ...parents) => deps && Object.entries(deps).forEach(([name, entry]) => {
|
|
69
|
+
const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name2, { version }]) => {
|
|
70
|
+
m[name2] = version;
|
|
71
|
+
return m;
|
|
72
|
+
}, {});
|
|
73
|
+
upsertEntry(name, entry.version, {
|
|
74
|
+
hashes: parseIntegrity(entry.integrity),
|
|
75
|
+
dependencies: requires
|
|
76
|
+
});
|
|
77
|
+
extractEntries(entry.dependencies, deps, ...parents);
|
|
78
|
+
extractRanges(requires, entry.dependencies || {}, deps, ...parents);
|
|
79
|
+
});
|
|
80
|
+
extractEntries(lf.dependencies);
|
|
81
|
+
extractRanges(entries[""].dependencies, lf.dependencies || {});
|
|
82
|
+
return {
|
|
83
|
+
format: "npm-1",
|
|
84
|
+
entries: sortObject(entries),
|
|
85
|
+
workspaces
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
var formatIntegrity = (hashes) => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(" ");
|
|
89
|
+
var createIndex = () => {
|
|
90
|
+
const prod = /* @__PURE__ */ new Set();
|
|
91
|
+
const deps = /* @__PURE__ */ new Map();
|
|
92
|
+
return {
|
|
93
|
+
prod,
|
|
94
|
+
deps,
|
|
95
|
+
getDeps(entry) {
|
|
96
|
+
if (!deps.has(entry)) {
|
|
97
|
+
deps.set(entry, []);
|
|
98
|
+
}
|
|
99
|
+
return deps.get(entry);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
var isProd = (manifest, name) => !!manifest.dependencies?.[name];
|
|
104
|
+
var format = async (snap) => {
|
|
105
|
+
const root = snap.workspaces[""].manifest;
|
|
106
|
+
const entries = Object.values(snap.entries);
|
|
107
|
+
const idx = createIndex();
|
|
108
|
+
entries.forEach((entry) => {
|
|
109
|
+
entry.dependencies && Object.entries(entry.dependencies).forEach(([_name, range]) => {
|
|
110
|
+
const target = entries.find(({ name, ranges }) => name === _name && ranges.includes(range));
|
|
111
|
+
if (target) {
|
|
112
|
+
idx.getDeps(entry).push(target);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
const deptree = [];
|
|
117
|
+
const fillTree = (entry, chain = []) => {
|
|
118
|
+
const deps = idx.getDeps(entry);
|
|
119
|
+
deps.forEach((c) => isProd(root, chain[0]?.name || c.name) && idx.prod.add(c));
|
|
120
|
+
deps.sort(
|
|
121
|
+
(a, b) => idx.prod.has(a) && !idx.prod.has(b) ? -1 : idx.prod.has(b) && !idx.prod.has(a) ? 1 : a.name.localeCompare(b.name)
|
|
122
|
+
);
|
|
123
|
+
deps.forEach((dep) => deptree.push([...chain, dep]));
|
|
124
|
+
deps.forEach((dep) => fillTree(dep, [...chain, dep]));
|
|
125
|
+
};
|
|
126
|
+
const getEntry = (name, version) => entries.find((e) => e.name === name && e.version === version);
|
|
127
|
+
fillTree(getEntry(root.name, root.version));
|
|
128
|
+
const formatNpm1LockfileEntry = (entry) => {
|
|
129
|
+
const { name, version, hashes } = entry;
|
|
130
|
+
const _name = name.slice(name.indexOf("/") + 1);
|
|
131
|
+
const _entry = {
|
|
132
|
+
version,
|
|
133
|
+
resolved: `https://registry.npmjs.org/${name}/-/${_name}-${version}.tgz`,
|
|
134
|
+
integrity: formatIntegrity(hashes)
|
|
135
|
+
};
|
|
136
|
+
if (!idx.prod.has(entry)) {
|
|
137
|
+
_entry.dev = true;
|
|
138
|
+
}
|
|
139
|
+
if (entry.dependencies) {
|
|
140
|
+
_entry.requires = entry.dependencies;
|
|
141
|
+
}
|
|
142
|
+
return _entry;
|
|
143
|
+
};
|
|
144
|
+
const lf = {
|
|
145
|
+
name: root.name,
|
|
146
|
+
version: root.version,
|
|
147
|
+
lockfileVersion: 1,
|
|
148
|
+
requires: true,
|
|
149
|
+
dependencies: {}
|
|
150
|
+
};
|
|
151
|
+
const nmtree = lf;
|
|
152
|
+
const nodes = [nmtree];
|
|
153
|
+
const processEntry = (name, version, parents) => {
|
|
154
|
+
const entry = getEntry(name, version);
|
|
155
|
+
const deps = idx.getDeps(entry);
|
|
156
|
+
const queue = [];
|
|
157
|
+
deps.forEach((e) => {
|
|
158
|
+
const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name]);
|
|
159
|
+
const closest = parents[closestIndex];
|
|
160
|
+
if (closest?.dependencies?.[e.name].version === e.version) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const _entry = formatNpm1LockfileEntry(e);
|
|
164
|
+
const _parents = [_entry, ...parents];
|
|
165
|
+
const parent = closest ? _parents[closestIndex] : _parents[_parents.length - 1];
|
|
166
|
+
if (!parent.dependencies) {
|
|
167
|
+
parent.dependencies = {};
|
|
168
|
+
}
|
|
169
|
+
parent.dependencies[e.name] = _entry;
|
|
170
|
+
nodes.push(parent);
|
|
171
|
+
queue.push([e.name, e.version, _parents]);
|
|
172
|
+
});
|
|
173
|
+
queue.forEach(([name2, version2, parents2]) => processEntry(name2, version2, parents2));
|
|
174
|
+
};
|
|
175
|
+
deptree.forEach((chain) => {
|
|
176
|
+
const entry = chain[chain.length - 1];
|
|
177
|
+
const { name } = entry;
|
|
178
|
+
if (!nmtree.dependencies[name]) {
|
|
179
|
+
nmtree.dependencies[name] = formatNpm1LockfileEntry(entry);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree]));
|
|
183
|
+
nodes.forEach((node) => {
|
|
184
|
+
sortObject(node.dependencies || {});
|
|
185
|
+
if (node.requires) {
|
|
186
|
+
const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join("");
|
|
187
|
+
const snap2 = Object.entries(node.dependencies || {}).map(([name, { version }]) => `${name}@${version}`).join("");
|
|
188
|
+
if (snap1 === snap2) {
|
|
189
|
+
delete node.requires;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
fs.writeFileSync("temp/test.json", JSON.stringify(lf, null, 2));
|
|
194
|
+
fs.writeFileSync("temp/tree.json", JSON.stringify(
|
|
195
|
+
deptree.map((c) => c.map((e) => `${e.name}@${e.version}`).join(" > ")),
|
|
196
|
+
null,
|
|
197
|
+
2
|
|
198
|
+
));
|
|
199
|
+
return JSON.stringify(lf, null, 2);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// src/main/ts/yarn-1.ts
|
|
203
|
+
import { load, dump } from "js-yaml";
|
|
204
|
+
var kvEntryPattern = /^(\s+)"?([^"]+)"?\s"?([^"]+)"?$/;
|
|
205
|
+
var check = (value) => value.includes("# yarn lockfile v1");
|
|
206
|
+
var preparse = (value) => {
|
|
207
|
+
const lines = value.split("\n");
|
|
208
|
+
const _value = lines.map((line) => {
|
|
209
|
+
if (line.startsWith("#")) {
|
|
210
|
+
return "";
|
|
211
|
+
}
|
|
212
|
+
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
213
|
+
return `"${line.replaceAll('"', "").slice(0, -1)}":`;
|
|
214
|
+
}
|
|
215
|
+
const [, p, k, v] = line.match(kvEntryPattern) || [];
|
|
216
|
+
if (line.match(kvEntryPattern)) {
|
|
217
|
+
return `${p}"${k}": "${v}"`;
|
|
218
|
+
}
|
|
219
|
+
return line;
|
|
220
|
+
}, "").join("\n");
|
|
221
|
+
return load(_value);
|
|
222
|
+
};
|
|
223
|
+
var parseIntegrity2 = (integrity) => integrity.split(" ").reduce((m, item) => {
|
|
224
|
+
const [k, v] = item.split("-");
|
|
225
|
+
if (k === "sha512" || k === "sha256" || k === "sha1" || k === "checksum") {
|
|
226
|
+
m[k] = v;
|
|
227
|
+
}
|
|
228
|
+
return m;
|
|
229
|
+
}, {});
|
|
230
|
+
var parse2 = async (value) => {
|
|
231
|
+
const raw = await preparse(value);
|
|
232
|
+
const snapshot = {
|
|
233
|
+
entries: {},
|
|
234
|
+
workspaces: {},
|
|
235
|
+
format: "yarn-1"
|
|
236
|
+
};
|
|
237
|
+
Object.entries(raw).forEach((value2) => {
|
|
238
|
+
const [_key, _entry] = value2;
|
|
239
|
+
const chunks = _key.split(", ");
|
|
240
|
+
const ranges = chunks.map((r) => r.slice(r.lastIndexOf("@") + 1)).sort();
|
|
241
|
+
const { version, integrity, dependencies, optionalDependencies, resolved: source } = _entry;
|
|
242
|
+
const name = chunks[0].slice(0, chunks[0].lastIndexOf("@"));
|
|
243
|
+
const key = `${name}@${version}`;
|
|
244
|
+
const hashes = parseIntegrity2(integrity);
|
|
245
|
+
snapshot.entries[key] = {
|
|
246
|
+
name,
|
|
247
|
+
version,
|
|
248
|
+
ranges,
|
|
249
|
+
hashes,
|
|
250
|
+
dependencies,
|
|
251
|
+
optionalDependencies,
|
|
252
|
+
source
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
return snapshot;
|
|
256
|
+
};
|
|
257
|
+
var preformat = (value) => {
|
|
258
|
+
const lf = {};
|
|
259
|
+
Object.values(value.entries).forEach((entry) => {
|
|
260
|
+
const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry;
|
|
261
|
+
const key = ranges.map((r) => `${name}@${r}`).join(", ");
|
|
262
|
+
const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
|
|
263
|
+
lf[key] = {
|
|
264
|
+
version,
|
|
265
|
+
resolved: source,
|
|
266
|
+
integrity,
|
|
267
|
+
dependencies,
|
|
268
|
+
optionalDependencies
|
|
269
|
+
};
|
|
270
|
+
});
|
|
271
|
+
return lf;
|
|
272
|
+
};
|
|
273
|
+
var format2 = (value) => {
|
|
274
|
+
const lf = preformat(value);
|
|
275
|
+
const lines = dump(lf, {
|
|
276
|
+
quotingType: '"',
|
|
277
|
+
flowLevel: -1,
|
|
278
|
+
lineWidth: -1,
|
|
279
|
+
forceQuotes: true
|
|
280
|
+
}).split("\n");
|
|
281
|
+
const _value = lines.map((line) => {
|
|
282
|
+
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
283
|
+
const chunks = line.slice(0, -1).replaceAll('"', "").split(", ").map((chunk) => chunk.startsWith("@") || chunk.includes(" ") ? `"${chunk}"` : chunk);
|
|
284
|
+
return `
|
|
285
|
+
${chunks.join(", ")}:`;
|
|
286
|
+
}
|
|
287
|
+
if (line.startsWith(" integrity")) {
|
|
288
|
+
const _line = line.replace(":", "");
|
|
289
|
+
return line.includes("= ") ? _line.replaceAll('"integrity"', "integrity") : _line.replaceAll('"', "");
|
|
290
|
+
}
|
|
291
|
+
if (line.endsWith("ependencies:")) {
|
|
292
|
+
return line;
|
|
293
|
+
}
|
|
294
|
+
return line.replace(":", "");
|
|
295
|
+
}, "").join("\n");
|
|
296
|
+
return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
297
|
+
# yarn lockfile v1
|
|
298
|
+
|
|
299
|
+
${_value}`;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// src/main/ts/yarn-5.ts
|
|
303
|
+
import { load as load2, dump as dump2 } from "js-yaml";
|
|
304
|
+
var check2 = (value) => value.includes(`
|
|
305
|
+
__metadata:
|
|
306
|
+
version: 5
|
|
307
|
+
`);
|
|
308
|
+
var parse3 = async (lockfile, pkg) => {
|
|
309
|
+
const snapshot = {
|
|
310
|
+
entries: {},
|
|
311
|
+
workspaces: {},
|
|
312
|
+
format: "yarn-5"
|
|
313
|
+
};
|
|
314
|
+
const raw = load2(lockfile);
|
|
315
|
+
delete raw.__metadata;
|
|
316
|
+
Object.entries(raw).forEach((value) => {
|
|
317
|
+
const [_key, _entry] = value;
|
|
318
|
+
const chunks = _key.split(", ");
|
|
319
|
+
const ranges = chunks.map((r) => r.slice(r.lastIndexOf("@") + 1)).sort();
|
|
320
|
+
const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution: source, bin, conditions } = _entry;
|
|
321
|
+
const name = chunks[0].slice(0, chunks[0].lastIndexOf("@"));
|
|
322
|
+
const key = `${name}@${version}`;
|
|
323
|
+
const hashes = parseIntegrity(checksum);
|
|
324
|
+
snapshot.entries[key] = {
|
|
325
|
+
name,
|
|
326
|
+
version,
|
|
327
|
+
ranges,
|
|
328
|
+
hashes,
|
|
329
|
+
dependencies,
|
|
330
|
+
dependenciesMeta,
|
|
331
|
+
optionalDependencies,
|
|
332
|
+
peerDependencies,
|
|
333
|
+
peerDependenciesMeta,
|
|
334
|
+
source,
|
|
335
|
+
bin,
|
|
336
|
+
conditions
|
|
337
|
+
};
|
|
338
|
+
});
|
|
339
|
+
return snapshot;
|
|
340
|
+
};
|
|
341
|
+
var preformat2 = (value) => {
|
|
342
|
+
const lf = {};
|
|
343
|
+
Object.values(value.entries).forEach((entry) => {
|
|
344
|
+
const { name, version, ranges, hashes: { checksum }, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, bin, conditions } = entry;
|
|
345
|
+
const key = ranges.map((r) => `${name}@${r}`).join(", ");
|
|
346
|
+
const isLocal = version === "0.0.0-use.local";
|
|
347
|
+
const languageName = isLocal ? "unknown" : "node";
|
|
348
|
+
const linkType = isLocal ? "soft" : "hard";
|
|
349
|
+
lf[key] = {
|
|
350
|
+
version,
|
|
351
|
+
resolution: source,
|
|
352
|
+
dependencies,
|
|
353
|
+
dependenciesMeta,
|
|
354
|
+
optionalDependencies,
|
|
355
|
+
peerDependencies,
|
|
356
|
+
peerDependenciesMeta,
|
|
357
|
+
bin,
|
|
358
|
+
checksum,
|
|
359
|
+
conditions,
|
|
360
|
+
languageName,
|
|
361
|
+
linkType
|
|
362
|
+
};
|
|
363
|
+
});
|
|
364
|
+
return lf;
|
|
365
|
+
};
|
|
366
|
+
var format3 = (value) => {
|
|
367
|
+
const lines = dump2({
|
|
368
|
+
__metadata: {
|
|
369
|
+
version: 5,
|
|
370
|
+
cacheKey: 8
|
|
371
|
+
},
|
|
372
|
+
...preformat2(value)
|
|
373
|
+
}, {
|
|
374
|
+
quotingType: '"',
|
|
375
|
+
flowLevel: -1,
|
|
376
|
+
lineWidth: -1,
|
|
377
|
+
forceQuotes: false
|
|
378
|
+
}).split("\n").map((line) => {
|
|
379
|
+
if (line === "__metadata:") {
|
|
380
|
+
return `
|
|
381
|
+
${line}`;
|
|
382
|
+
}
|
|
383
|
+
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
384
|
+
return `
|
|
385
|
+
"${line.replaceAll('"', "").slice(0, -1)}":`;
|
|
386
|
+
}
|
|
387
|
+
if (line.startsWith(" resolution: ")) {
|
|
388
|
+
return line.replaceAll('"', "").replace(" resolution: ", ' resolution: "').concat('"');
|
|
389
|
+
}
|
|
390
|
+
return line;
|
|
391
|
+
});
|
|
392
|
+
const _value = lines.join("\n");
|
|
393
|
+
return `# This file is generated by running "yarn install" inside your project.
|
|
394
|
+
# Manual changes might be lost - proceed with caution!
|
|
395
|
+
${_value}`;
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
// src/main/ts/common.ts
|
|
399
|
+
var getSources = (snapshot) => Object.values(snapshot.entries).map((entry) => entry.source).filter(Boolean);
|
|
400
|
+
|
|
401
|
+
// src/main/ts/index.ts
|
|
402
|
+
var foo = "bar";
|
|
403
|
+
var parse4 = async (lockfile, pkg) => {
|
|
404
|
+
if (check(lockfile)) {
|
|
405
|
+
return parse2(lockfile);
|
|
406
|
+
}
|
|
407
|
+
if (check2(lockfile)) {
|
|
408
|
+
return parse3(lockfile, pkg);
|
|
409
|
+
}
|
|
410
|
+
return parse(lockfile, pkg);
|
|
411
|
+
};
|
|
412
|
+
export {
|
|
413
|
+
foo,
|
|
414
|
+
format as formatNpm1,
|
|
415
|
+
format2 as formatYarn1,
|
|
416
|
+
format3 as formatYarn5,
|
|
417
|
+
getSources,
|
|
418
|
+
parse4 as parse,
|
|
419
|
+
parse as parseNpm1,
|
|
420
|
+
parse2 as parseYarn1,
|
|
421
|
+
parse3 as parseYarn5
|
|
422
|
+
};
|
|
423
|
+
//# sourceMappingURL=index.js.map
|
package/target/es6/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/main/ts/
|
|
4
|
-
"sourcesContent": ["import {parse as parseNpm1, format as formatNpm1} from './npm-1'\nimport {parse as parseYarn1, format as formatYarn1} from './yarn-1'\nimport {parse as parseYarn5, format as formatYarn5} from './yarn-5'\n\nexport const foo = 'bar'\n\nexport {\n parseNpm1,\n formatNpm1,\n parseYarn1,\n formatYarn1,\n parseYarn5,\n formatYarn5\n}\n", "import {THashes} from \"./interface\";\n\nexport const parseIntegrity = (integrity: string): THashes =>\n integrity\n ? integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n } else if (!v){\n m['checksum'] = k\n }\n\n return m\n }, {})\n : {}\n\nexport const formatIntegrity = (hashes: THashes): string => {\n const checksum = hashes['checksum']\n if (checksum) {\n return checksum\n }\n\n return Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n}\n\nexport const sortObject = <T extends Record<string, any>>(unordered: T): T =>\n Object.entries({...unordered})\n .sort(([a], [b]) => a > b ? 1 : -1)\n .reduce((obj, [key, value]: [keyof T, T[keyof T]]) => {\n obj[key] = value\n return obj\n },\n flushObject(unordered) as T,\n )\n\nexport const flushObject = (obj: Record<string, any>) => {\n for (const key in obj) {\n delete obj[key]\n }\n\n return obj\n}", "import {TDependencies, THashes, TLockfileEntry, TManifest, TSnapshot} from './interface'\nimport {parseIntegrity, sortObject} from './util'\nimport fs from 'fs'\n\nexport type TNpm1LockfileEntry = {\n version: string\n resolved: string\n integrity: string\n dev?: boolean\n requires?: Record<string, string>\n dependencies?: TNpm1LockfileDeps\n}\n\nexport type TNpm1LockfileDeps = Record<string, TNpm1LockfileEntry>\n\nexport type TNpm1Lockfile = {\n lockfileVersion: 1\n name: string\n version: string\n requires?: true\n dependencies: TNpm1LockfileDeps\n}\n\ninterface TDepTree {\n dependencies?: Record<string, TDepTree>\n version: string\n requires?: any\n}\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n const lf: TNpm1Lockfile = await JSON.parse(lockfile)\n const manifest: TManifest = await JSON.parse(pkg)\n const workspaces = {\n \"\": {\n name: manifest.name,\n path: '.',\n manifest\n }\n }\n const entries: Record<string, TLockfileEntry> = {\n \"\": {\n name: manifest.name,\n version: manifest.version,\n dependencies: {\n ...manifest.dependencies,\n ...manifest.devDependencies,\n },\n hashes: {},\n ranges: [],\n }\n }\n const getClosestVersion = (name: string, ...deps: TNpm1LockfileDeps[]): string =>\n deps.find((dep) => dep[name])?.[name]?.version as string\n\n const upsertEntry = (name: string, version: string, data: Partial<TLockfileEntry> = {}): TLockfileEntry => {\n const key = `${name}@${version}`\n if (!entries[key]) {\n // @ts-ignore\n entries[key] = {name, version, ranges: []}\n }\n return Object.assign(entries[key], data)\n }\n const pushRange = (name: string, version: string, range: string): void => {\n const entry = upsertEntry(name, version)\n\n if (!entry.ranges.includes(range)) {\n entry.ranges.push(range)\n entry.ranges.sort()\n }\n }\n const extractRanges = (deps?: TDependencies, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([_name, range]) => {\n const _version = getClosestVersion(_name, ...parents)\n pushRange(_name, _version, range)\n })\n const extractEntries = (deps?: TNpm1LockfileDeps, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([name, entry]) => {\n const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name, {version}]) => {\n m[name] = version\n return m\n }, {} as Record<string, string>)\n\n upsertEntry(name, entry.version, {\n hashes: parseIntegrity(entry.integrity),\n dependencies: requires\n })\n\n extractEntries(entry.dependencies, deps, ...parents)\n extractRanges(requires, entry.dependencies || {}, deps, ...parents)\n })\n\n extractEntries(lf.dependencies)\n extractRanges(entries[\"\"].dependencies, lf.dependencies || {})\n\n return {\n format: 'npm-1',\n entries: sortObject(entries),\n workspaces,\n }\n}\n\n\nconst formatIntegrity = (hashes: THashes): string => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(' ')\n\nconst createIndex = () => {\n const prod = new Set()\n const deps = new Map()\n\n return {\n prod,\n deps,\n getDeps (entry: TLockfileEntry): TLockfileEntry[] {\n if (!deps.has(entry)) { deps.set(entry, [])}\n return deps.get(entry)\n }\n }\n}\n\nconst isProd = (manifest: TManifest, name: string): boolean => !!manifest.dependencies?.[name]\n\nexport const format = async (snap: TSnapshot): Promise<string> => {\n const root = snap.workspaces[''].manifest\n const entries: TLockfileEntry[]= Object.values(snap.entries)\n const idx = createIndex()\n\n entries.forEach((entry) => {\n entry.dependencies && Object.entries(entry.dependencies).forEach(([_name, range]) => {\n const target = entries.find(({name, ranges}) => name === _name && ranges.includes(range))\n if (target) {\n idx.getDeps(entry).push(target)\n }\n })\n })\n\n const deptree: TLockfileEntry[][] = []\n const fillTree = (entry: TLockfileEntry, chain: TLockfileEntry[] = []) => {\n const deps = idx.getDeps(entry)\n deps.forEach(c => isProd(root, chain[0]?.name || c.name) && idx.prod.add(c))\n\n deps\n .sort((a, b) =>\n idx.prod.has(a) && !idx.prod.has(b)\n ? -1\n : idx.prod.has(b) && !idx.prod.has(a)\n ? 1\n : a.name.localeCompare(b.name)\n )\n\n deps.forEach((dep) => deptree.push([...chain, dep]))\n deps.forEach((dep) => fillTree(dep, [...chain, dep]))\n }\n\n const getEntry = (name: string, version: string) => entries.find((e) => e.name === name && e.version === version)\n fillTree(getEntry(root.name, root.version)!)\n\n const formatNpm1LockfileEntry = (entry: TLockfileEntry): TNpm1LockfileEntry => {\n const {name, version, hashes} = entry\n const _name = name.slice(name.indexOf('/') + 1)\n const _entry: TNpm1LockfileDeps[string] = {\n version,\n resolved: `https://registry.npmjs.org/${name}/-/${_name}-${version}.tgz`,\n integrity: formatIntegrity(hashes)\n }\n\n if (!idx.prod.has(entry)) {\n _entry.dev = true\n }\n\n if (entry.dependencies) {\n _entry.requires = entry.dependencies\n }\n\n return _entry\n }\n\n const lf: TNpm1Lockfile = {\n name: root.name,\n version: root.version,\n lockfileVersion: 1,\n requires: true,\n dependencies: {}\n }\n const nmtree = lf\n const nodes: TDepTree[] = [nmtree]\n const processEntry = (name: string, version: string, parents: TNpm1LockfileEntry[]) => {\n const entry = getEntry(name, version)!\n const deps = idx.getDeps(entry)\n const queue: [string, string, TNpm1LockfileEntry[]][] = []\n\n deps.forEach((e) => {\n const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name])\n const closest = parents[closestIndex]\n if (closest?.dependencies?.[e.name].version === e.version) {\n return\n }\n\n const _entry = formatNpm1LockfileEntry(e)\n const _parents = [_entry, ...parents]\n const parent = closest\n ? _parents[closestIndex]\n : _parents[_parents.length - 1]\n\n if (!parent.dependencies) {\n parent.dependencies = {}\n }\n parent.dependencies[e.name] = _entry\n\n nodes.push(parent)\n queue.push([e.name, e.version, _parents])\n })\n\n queue.forEach(([name, version, parents]) => processEntry(name, version, parents))\n }\n\n deptree.forEach((chain) => {\n const entry = chain[chain.length - 1]\n const {name} = entry\n\n if (!nmtree.dependencies[name]) {\n nmtree.dependencies[name] = formatNpm1LockfileEntry(entry)\n }\n })\n Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree] as TNpm1LockfileEntry[]))\n\n nodes.forEach((node) => {\n sortObject(node.dependencies || {})\n\n if (node.requires) {\n const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join('')\n const snap2 = Object.entries(node.dependencies || {}).map(([name, {version}]) => `${name}@${version}`).join('')\n\n if (snap1 === snap2) {\n delete node.requires\n }\n }\n })\n\n fs.writeFileSync('temp/test.json', JSON.stringify(lf, null, 2))\n fs.writeFileSync('temp/tree.json', JSON.stringify(\n deptree.map(c => c.map(e => `${e.name}@${e.version}`).join(' > ')),\n null,\n 2\n ))\n\n return JSON.stringify(lf, null, 2)\n}\n", "import {load, dump} from 'js-yaml'\nimport {TDependencies, TSnapshot, THashes} from './interface'\n\nconst kvEntryPattern = /^(\\s+)\"?([^\"]+)\"?\\s\"?([^\"]+)\"?$/\n\nexport type TYarn1Lockfile = Record<string, {\n version: string\n resolved: string\n integrity: string\n dependencies?: TDependencies\n optionalDependencies?: TDependencies\n}>\n\nexport const preparse = (value: string): TYarn1Lockfile => {\n const lines = value.split('\\n')\n const _value = lines.map((line) => {\n if (line.startsWith('#')) {\n return ''\n }\n\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n const [,p,k,v]: string[] = line.match(kvEntryPattern) || []\n if (line.match(kvEntryPattern)) {\n return `${p}\"${k}\": \"${v}\"`\n }\n\n return line\n }, '').join('\\n')\n\n return load(_value) as TYarn1Lockfile\n}\n\nconst parseIntegrity = (integrity: string): THashes =>\n integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n }\n return m\n }, {})\n\nexport const parse = async (value: string): Promise<TSnapshot> => {\n const raw = await preparse(value)\n const snapshot: TSnapshot = {\n entries: {},\n workspaces: {},\n format: 'yarn-1',\n }\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, integrity, dependencies, optionalDependencies, resolved: source } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(integrity)\n\n snapshot.entries[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n optionalDependencies,\n source,\n }\n })\n\n return snapshot\n}\n\nexport const preformat = (value: TSnapshot): TYarn1Lockfile => {\n const lf: TYarn1Lockfile = {}\n\n Object.values(value.entries).forEach((entry) => {\n const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n\n lf[key] = {\n version,\n resolved: source as string,\n integrity,\n dependencies,\n optionalDependencies,\n }\n })\n\n return lf\n}\n\nexport const format = (value: TSnapshot): string => {\n const lf = preformat(value)\n const lines: string[] = dump(lf, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: true\n }).split('\\n')\n const _value = lines.map((line) => {\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n const chunks = line.slice(0, -1).replaceAll('\"', '').split(', ').map(chunk => chunk.startsWith('@') || chunk.includes(' ') ? `\"${chunk}\"` : chunk)\n return `\\n${chunks.join(', ')}:`\n }\n\n if (line.startsWith(' integrity')) {\n const _line = line.replace(':', '')\n\n return line.includes('= ') // multiple hashes\n ? _line.replaceAll('\"integrity\"', 'integrity')\n : _line.replaceAll('\"', '')\n }\n\n if (line.endsWith('ependencies:')) {\n return line\n }\n\n return line.replace(':', '')\n }, '').join('\\n')\n\n return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n${_value}`\n}\n", "// https://github.com/yarnpkg/berry/commit/2f9e8073d15745f9d53e6b8b42fa9c81eb143d54\n\nimport {load, dump} from 'js-yaml'\nimport {TDependencies, TDependenciesMeta, TSnapshot} from './interface'\nimport {parseIntegrity} from './util'\n\nexport type TYarn5Lockfile = Record<string, {\n version: string\n resolution: string\n conditions?: string\n checksum: string\n languageName: string\n linkType: string\n dependencies?: TDependencies\n dependenciesMeta?: TDependenciesMeta\n optionalDependencies?: TDependencies\n peerDependencies?: TDependencies\n peerDependenciesMeta?: TDependenciesMeta\n bin?: Record<string, string>\n}>\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n const snapshot: TSnapshot = {\n entries: {},\n workspaces: {},\n format: 'yarn-5',\n }\n\n const raw = load(lockfile) as TYarn5Lockfile\n\n delete raw.__metadata\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution: source, bin, conditions } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(checksum)\n\n snapshot.entries[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n source,\n bin,\n conditions,\n }\n })\n\n return snapshot\n}\n\nexport const preformat = (value: TSnapshot): TYarn5Lockfile => {\n const lf: TYarn5Lockfile = {}\n\n Object.values(value.entries).forEach((entry) => {\n const { name, version, ranges, hashes: {checksum}, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, bin, conditions } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const isLocal = version === '0.0.0-use.local'\n const languageName = isLocal ? 'unknown' : 'node'\n const linkType = isLocal ? 'soft' : 'hard'\n\n lf[key] = {\n version,\n resolution: source as string,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n checksum: checksum as string,\n conditions,\n languageName,\n linkType,\n }\n })\n\n return lf\n}\n\nexport const format = (value: TSnapshot): string => {\n const lines = dump({\n __metadata: {\n version: 5,\n cacheKey: 8,\n },\n ...preformat(value)\n }, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: false\n })\n .split('\\n')\n .map(line => {\n if (line === '__metadata:') {\n return `\\n${line}`\n }\n\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\\n\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n if (line.startsWith(' resolution: ')) {\n return line.replaceAll('\"', '').replace(' resolution: ', ' resolution: \"').concat('\"')\n }\n\n return line\n })\n\n const _value = lines.join('\\n')\n\n return `# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n${_value}`\n}"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../src/main/ts/util.ts", "../../src/main/ts/npm-1.ts", "../../src/main/ts/yarn-1.ts", "../../src/main/ts/yarn-5.ts", "../../src/main/ts/common.ts", "../../src/main/ts/index.ts"],
|
|
4
|
+
"sourcesContent": ["import {THashes} from \"./interface\";\n\nexport const parseIntegrity = (integrity: string): THashes =>\n integrity\n ? integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n } else if (!v){\n m['checksum'] = k\n }\n\n return m\n }, {})\n : {}\n\nexport const formatIntegrity = (hashes: THashes): string => {\n const checksum = hashes['checksum']\n if (checksum) {\n return checksum\n }\n\n return Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n}\n\nexport const sortObject = <T extends Record<string, any>>(unordered: T): T =>\n Object.entries({...unordered})\n .sort(([a], [b]) => a > b ? 1 : -1)\n .reduce((obj, [key, value]: [keyof T, T[keyof T]]) => {\n obj[key] = value\n return obj\n },\n flushObject(unordered) as T,\n )\n\nexport const flushObject = (obj: Record<string, any>) => {\n for (const key in obj) {\n delete obj[key]\n }\n\n return obj\n}", "import {TDependencies, THashes, TLockfileEntry, TManifest, TSnapshot} from './interface'\nimport {parseIntegrity, sortObject} from './util'\nimport fs from 'fs'\n\nexport type TNpm1LockfileEntry = {\n version: string\n resolved: string\n integrity: string\n dev?: boolean\n requires?: Record<string, string>\n dependencies?: TNpm1LockfileDeps\n}\n\nexport type TNpm1LockfileDeps = Record<string, TNpm1LockfileEntry>\n\nexport type TNpm1Lockfile = {\n lockfileVersion: 1\n name: string\n version: string\n requires?: true\n dependencies: TNpm1LockfileDeps\n}\n\ninterface TDepTree {\n dependencies?: Record<string, TDepTree>\n version: string\n requires?: any\n}\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n const lf: TNpm1Lockfile = await JSON.parse(lockfile)\n const manifest: TManifest = await JSON.parse(pkg)\n const workspaces = {\n \"\": {\n name: manifest.name,\n path: '.',\n manifest\n }\n }\n const entries: Record<string, TLockfileEntry> = {\n \"\": {\n name: manifest.name,\n version: manifest.version,\n dependencies: {\n ...manifest.dependencies,\n ...manifest.devDependencies,\n },\n hashes: {},\n ranges: [],\n }\n }\n const getClosestVersion = (name: string, ...deps: TNpm1LockfileDeps[]): string =>\n deps.find((dep) => dep[name])?.[name]?.version as string\n\n const upsertEntry = (name: string, version: string, data: Partial<TLockfileEntry> = {}): TLockfileEntry => {\n const key = `${name}@${version}`\n if (!entries[key]) {\n // @ts-ignore\n entries[key] = {name, version, ranges: []}\n }\n return Object.assign(entries[key], data)\n }\n const pushRange = (name: string, version: string, range: string): void => {\n const entry = upsertEntry(name, version)\n\n if (!entry.ranges.includes(range)) {\n entry.ranges.push(range)\n entry.ranges.sort()\n }\n }\n const extractRanges = (deps?: TDependencies, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([_name, range]) => {\n const _version = getClosestVersion(_name, ...parents)\n pushRange(_name, _version, range)\n })\n const extractEntries = (deps?: TNpm1LockfileDeps, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([name, entry]) => {\n const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name, {version}]) => {\n m[name] = version\n return m\n }, {} as Record<string, string>)\n\n upsertEntry(name, entry.version, {\n hashes: parseIntegrity(entry.integrity),\n dependencies: requires\n })\n\n extractEntries(entry.dependencies, deps, ...parents)\n extractRanges(requires, entry.dependencies || {}, deps, ...parents)\n })\n\n extractEntries(lf.dependencies)\n extractRanges(entries[\"\"].dependencies, lf.dependencies || {})\n\n return {\n format: 'npm-1',\n entries: sortObject(entries),\n workspaces,\n }\n}\n\n\nconst formatIntegrity = (hashes: THashes): string => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(' ')\n\nconst createIndex = () => {\n const prod = new Set()\n const deps = new Map()\n\n return {\n prod,\n deps,\n getDeps (entry: TLockfileEntry): TLockfileEntry[] {\n if (!deps.has(entry)) { deps.set(entry, [])}\n return deps.get(entry)\n }\n }\n}\n\nconst isProd = (manifest: TManifest, name: string): boolean => !!manifest.dependencies?.[name]\n\nexport const format = async (snap: TSnapshot): Promise<string> => {\n const root = snap.workspaces[''].manifest\n const entries: TLockfileEntry[]= Object.values(snap.entries)\n const idx = createIndex()\n\n entries.forEach((entry) => {\n entry.dependencies && Object.entries(entry.dependencies).forEach(([_name, range]) => {\n const target = entries.find(({name, ranges}) => name === _name && ranges.includes(range))\n if (target) {\n idx.getDeps(entry).push(target)\n }\n })\n })\n\n const deptree: TLockfileEntry[][] = []\n const fillTree = (entry: TLockfileEntry, chain: TLockfileEntry[] = []) => {\n const deps = idx.getDeps(entry)\n deps.forEach(c => isProd(root, chain[0]?.name || c.name) && idx.prod.add(c))\n\n deps\n .sort((a, b) =>\n idx.prod.has(a) && !idx.prod.has(b)\n ? -1\n : idx.prod.has(b) && !idx.prod.has(a)\n ? 1\n : a.name.localeCompare(b.name)\n )\n\n deps.forEach((dep) => deptree.push([...chain, dep]))\n deps.forEach((dep) => fillTree(dep, [...chain, dep]))\n }\n\n const getEntry = (name: string, version: string) => entries.find((e) => e.name === name && e.version === version)\n fillTree(getEntry(root.name, root.version)!)\n\n const formatNpm1LockfileEntry = (entry: TLockfileEntry): TNpm1LockfileEntry => {\n const {name, version, hashes} = entry\n const _name = name.slice(name.indexOf('/') + 1)\n const _entry: TNpm1LockfileDeps[string] = {\n version,\n resolved: `https://registry.npmjs.org/${name}/-/${_name}-${version}.tgz`,\n integrity: formatIntegrity(hashes)\n }\n\n if (!idx.prod.has(entry)) {\n _entry.dev = true\n }\n\n if (entry.dependencies) {\n _entry.requires = entry.dependencies\n }\n\n return _entry\n }\n\n const lf: TNpm1Lockfile = {\n name: root.name,\n version: root.version,\n lockfileVersion: 1,\n requires: true,\n dependencies: {}\n }\n const nmtree = lf\n const nodes: TDepTree[] = [nmtree]\n const processEntry = (name: string, version: string, parents: TNpm1LockfileEntry[]) => {\n const entry = getEntry(name, version)!\n const deps = idx.getDeps(entry)\n const queue: [string, string, TNpm1LockfileEntry[]][] = []\n\n deps.forEach((e) => {\n const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name])\n const closest = parents[closestIndex]\n if (closest?.dependencies?.[e.name].version === e.version) {\n return\n }\n\n const _entry = formatNpm1LockfileEntry(e)\n const _parents = [_entry, ...parents]\n const parent = closest\n ? _parents[closestIndex]\n : _parents[_parents.length - 1]\n\n if (!parent.dependencies) {\n parent.dependencies = {}\n }\n parent.dependencies[e.name] = _entry\n\n nodes.push(parent)\n queue.push([e.name, e.version, _parents])\n })\n\n queue.forEach(([name, version, parents]) => processEntry(name, version, parents))\n }\n\n deptree.forEach((chain) => {\n const entry = chain[chain.length - 1]\n const {name} = entry\n\n if (!nmtree.dependencies[name]) {\n nmtree.dependencies[name] = formatNpm1LockfileEntry(entry)\n }\n })\n Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree] as TNpm1LockfileEntry[]))\n\n nodes.forEach((node) => {\n sortObject(node.dependencies || {})\n\n if (node.requires) {\n const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join('')\n const snap2 = Object.entries(node.dependencies || {}).map(([name, {version}]) => `${name}@${version}`).join('')\n\n if (snap1 === snap2) {\n delete node.requires\n }\n }\n })\n\n fs.writeFileSync('temp/test.json', JSON.stringify(lf, null, 2))\n fs.writeFileSync('temp/tree.json', JSON.stringify(\n deptree.map(c => c.map(e => `${e.name}@${e.version}`).join(' > ')),\n null,\n 2\n ))\n\n return JSON.stringify(lf, null, 2)\n}\n", "import {load, dump} from 'js-yaml'\nimport {TDependencies, TSnapshot, THashes} from './interface'\n\nconst kvEntryPattern = /^(\\s+)\"?([^\"]+)\"?\\s\"?([^\"]+)\"?$/\n\nexport type TYarn1Lockfile = Record<string, {\n version: string\n resolved: string\n integrity: string\n dependencies?: TDependencies\n optionalDependencies?: TDependencies\n}>\n\nexport const check = (value: string): boolean => value.includes('# yarn lockfile v1')\n\nexport const preparse = (value: string): TYarn1Lockfile => {\n const lines = value.split('\\n')\n const _value = lines.map((line) => {\n if (line.startsWith('#')) {\n return ''\n }\n\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n const [,p,k,v]: string[] = line.match(kvEntryPattern) || []\n if (line.match(kvEntryPattern)) {\n return `${p}\"${k}\": \"${v}\"`\n }\n\n return line\n }, '').join('\\n')\n\n return load(_value) as TYarn1Lockfile\n}\n\nconst parseIntegrity = (integrity: string): THashes =>\n integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n }\n return m\n }, {})\n\nexport const parse = async (value: string): Promise<TSnapshot> => {\n const raw = await preparse(value)\n const snapshot: TSnapshot = {\n entries: {},\n workspaces: {},\n format: 'yarn-1',\n }\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, integrity, dependencies, optionalDependencies, resolved: source } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(integrity)\n\n snapshot.entries[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n optionalDependencies,\n source,\n }\n })\n\n return snapshot\n}\n\nexport const preformat = (value: TSnapshot): TYarn1Lockfile => {\n const lf: TYarn1Lockfile = {}\n\n Object.values(value.entries).forEach((entry) => {\n const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n\n lf[key] = {\n version,\n resolved: source as string,\n integrity,\n dependencies,\n optionalDependencies,\n }\n })\n\n return lf\n}\n\nexport const format = (value: TSnapshot): string => {\n const lf = preformat(value)\n const lines: string[] = dump(lf, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: true\n }).split('\\n')\n const _value = lines.map((line) => {\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n const chunks = line.slice(0, -1).replaceAll('\"', '').split(', ').map(chunk => chunk.startsWith('@') || chunk.includes(' ') ? `\"${chunk}\"` : chunk)\n return `\\n${chunks.join(', ')}:`\n }\n\n if (line.startsWith(' integrity')) {\n const _line = line.replace(':', '')\n\n return line.includes('= ') // multiple hashes\n ? _line.replaceAll('\"integrity\"', 'integrity')\n : _line.replaceAll('\"', '')\n }\n\n if (line.endsWith('ependencies:')) {\n return line\n }\n\n return line.replace(':', '')\n }, '').join('\\n')\n\n return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n${_value}`\n}\n", "// https://github.com/yarnpkg/berry/commit/2f9e8073d15745f9d53e6b8b42fa9c81eb143d54\n\nimport {load, dump} from 'js-yaml'\nimport {TDependencies, TDependenciesMeta, TSnapshot} from './interface'\nimport {parseIntegrity} from './util'\n\nexport type TYarn5Lockfile = Record<string, {\n version: string\n resolution: string\n conditions?: string\n checksum: string\n languageName: string\n linkType: string\n dependencies?: TDependencies\n dependenciesMeta?: TDependenciesMeta\n optionalDependencies?: TDependencies\n peerDependencies?: TDependencies\n peerDependenciesMeta?: TDependenciesMeta\n bin?: Record<string, string>\n}>\n\nexport const check = (value: string): boolean => value.includes(`\n__metadata:\n version: 5\n`)\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n const snapshot: TSnapshot = {\n entries: {},\n workspaces: {},\n format: 'yarn-5',\n }\n\n const raw = load(lockfile) as TYarn5Lockfile\n\n delete raw.__metadata\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution: source, bin, conditions } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(checksum)\n\n snapshot.entries[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n source,\n bin,\n conditions,\n }\n })\n\n return snapshot\n}\n\nexport const preformat = (value: TSnapshot): TYarn5Lockfile => {\n const lf: TYarn5Lockfile = {}\n\n Object.values(value.entries).forEach((entry) => {\n const { name, version, ranges, hashes: {checksum}, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, bin, conditions } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const isLocal = version === '0.0.0-use.local'\n const languageName = isLocal ? 'unknown' : 'node'\n const linkType = isLocal ? 'soft' : 'hard'\n\n lf[key] = {\n version,\n resolution: source as string,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n checksum: checksum as string,\n conditions,\n languageName,\n linkType,\n }\n })\n\n return lf\n}\n\nexport const format = (value: TSnapshot): string => {\n const lines = dump({\n __metadata: {\n version: 5,\n cacheKey: 8,\n },\n ...preformat(value)\n }, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: false\n })\n .split('\\n')\n .map(line => {\n if (line === '__metadata:') {\n return `\\n${line}`\n }\n\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\\n\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n if (line.startsWith(' resolution: ')) {\n return line.replaceAll('\"', '').replace(' resolution: ', ' resolution: \"').concat('\"')\n }\n\n return line\n })\n\n const _value = lines.join('\\n')\n\n return `# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n${_value}`\n}", "import {TSnapshot} from './interface'\n\nexport const normalizeOptions = () => {\n\n}\n\nexport const getSources = (snapshot: TSnapshot): string[] =>\n Object.values(snapshot.entries)\n .map(entry => entry.source as string)\n .filter(Boolean)\n", "import {parse as parseNpm1, format as formatNpm1} from './npm-1'\nimport {parse as parseYarn1, format as formatYarn1, check as checkYarn1} from './yarn-1'\nimport {parse as parseYarn5, format as formatYarn5, check as checkYarn5} from './yarn-5'\nimport {TSnapshot} from './interface'\n\nexport const foo = 'bar'\n\nexport { getSources } from './common'\n\nexport {\n parseNpm1,\n formatNpm1,\n parseYarn1,\n formatYarn1,\n parseYarn5,\n formatYarn5\n}\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n if (checkYarn1(lockfile)) {\n return parseYarn1(lockfile)\n }\n\n if (checkYarn5(lockfile)) {\n return parseYarn5(lockfile, pkg)\n }\n\n return parseNpm1(lockfile, pkg)\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["name", "version", "parents", "parseIntegrity", "parse", "value", "format", "load", "dump", "check", "parse", "load", "preformat", "format", "dump", "parse", "check"]
|
|
7
7
|
}
|
package/target/es6/index.mjs
CHANGED
|
@@ -1,16 +1,408 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/main/ts/util.ts
|
|
2
|
+
var parseIntegrity = (integrity) => integrity ? integrity.split(" ").reduce((m, item) => {
|
|
3
|
+
const [k, v] = item.split("-");
|
|
4
|
+
if (k === "sha512" || k === "sha256" || k === "sha1" || k === "checksum") {
|
|
5
|
+
m[k] = v;
|
|
6
|
+
} else if (!v) {
|
|
7
|
+
m["checksum"] = k;
|
|
8
|
+
}
|
|
9
|
+
return m;
|
|
10
|
+
}, {}) : {};
|
|
11
|
+
var sortObject = (unordered) => Object.entries({ ...unordered }).sort(([a], [b]) => a > b ? 1 : -1).reduce(
|
|
12
|
+
(obj, [key, value]) => {
|
|
13
|
+
obj[key] = value;
|
|
14
|
+
return obj;
|
|
15
|
+
},
|
|
16
|
+
flushObject(unordered)
|
|
17
|
+
);
|
|
18
|
+
var flushObject = (obj) => {
|
|
19
|
+
for (const key in obj) {
|
|
20
|
+
delete obj[key];
|
|
21
|
+
}
|
|
22
|
+
return obj;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/main/ts/npm-1.ts
|
|
26
|
+
import fs from "fs";
|
|
27
|
+
var parse = async (lockfile, pkg) => {
|
|
28
|
+
const lf = await JSON.parse(lockfile);
|
|
29
|
+
const manifest = await JSON.parse(pkg);
|
|
30
|
+
const workspaces = {
|
|
31
|
+
"": {
|
|
32
|
+
name: manifest.name,
|
|
33
|
+
path: ".",
|
|
34
|
+
manifest
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const entries = {
|
|
38
|
+
"": {
|
|
39
|
+
name: manifest.name,
|
|
40
|
+
version: manifest.version,
|
|
41
|
+
dependencies: {
|
|
42
|
+
...manifest.dependencies,
|
|
43
|
+
...manifest.devDependencies
|
|
44
|
+
},
|
|
45
|
+
hashes: {},
|
|
46
|
+
ranges: []
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const getClosestVersion = (name, ...deps) => deps.find((dep) => dep[name])?.[name]?.version;
|
|
50
|
+
const upsertEntry = (name, version, data = {}) => {
|
|
51
|
+
const key = `${name}@${version}`;
|
|
52
|
+
if (!entries[key]) {
|
|
53
|
+
entries[key] = { name, version, ranges: [] };
|
|
54
|
+
}
|
|
55
|
+
return Object.assign(entries[key], data);
|
|
56
|
+
};
|
|
57
|
+
const pushRange = (name, version, range) => {
|
|
58
|
+
const entry = upsertEntry(name, version);
|
|
59
|
+
if (!entry.ranges.includes(range)) {
|
|
60
|
+
entry.ranges.push(range);
|
|
61
|
+
entry.ranges.sort();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const extractRanges = (deps, ...parents) => deps && Object.entries(deps).forEach(([_name, range]) => {
|
|
65
|
+
const _version = getClosestVersion(_name, ...parents);
|
|
66
|
+
pushRange(_name, _version, range);
|
|
67
|
+
});
|
|
68
|
+
const extractEntries = (deps, ...parents) => deps && Object.entries(deps).forEach(([name, entry]) => {
|
|
69
|
+
const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name2, { version }]) => {
|
|
70
|
+
m[name2] = version;
|
|
71
|
+
return m;
|
|
72
|
+
}, {});
|
|
73
|
+
upsertEntry(name, entry.version, {
|
|
74
|
+
hashes: parseIntegrity(entry.integrity),
|
|
75
|
+
dependencies: requires
|
|
76
|
+
});
|
|
77
|
+
extractEntries(entry.dependencies, deps, ...parents);
|
|
78
|
+
extractRanges(requires, entry.dependencies || {}, deps, ...parents);
|
|
79
|
+
});
|
|
80
|
+
extractEntries(lf.dependencies);
|
|
81
|
+
extractRanges(entries[""].dependencies, lf.dependencies || {});
|
|
82
|
+
return {
|
|
83
|
+
format: "npm-1",
|
|
84
|
+
entries: sortObject(entries),
|
|
85
|
+
workspaces
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
var formatIntegrity = (hashes) => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(" ");
|
|
89
|
+
var createIndex = () => {
|
|
90
|
+
const prod = /* @__PURE__ */ new Set();
|
|
91
|
+
const deps = /* @__PURE__ */ new Map();
|
|
92
|
+
return {
|
|
93
|
+
prod,
|
|
94
|
+
deps,
|
|
95
|
+
getDeps(entry) {
|
|
96
|
+
if (!deps.has(entry)) {
|
|
97
|
+
deps.set(entry, []);
|
|
98
|
+
}
|
|
99
|
+
return deps.get(entry);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
var isProd = (manifest, name) => !!manifest.dependencies?.[name];
|
|
104
|
+
var format = async (snap) => {
|
|
105
|
+
const root = snap.workspaces[""].manifest;
|
|
106
|
+
const entries = Object.values(snap.entries);
|
|
107
|
+
const idx = createIndex();
|
|
108
|
+
entries.forEach((entry) => {
|
|
109
|
+
entry.dependencies && Object.entries(entry.dependencies).forEach(([_name, range]) => {
|
|
110
|
+
const target = entries.find(({ name, ranges }) => name === _name && ranges.includes(range));
|
|
111
|
+
if (target) {
|
|
112
|
+
idx.getDeps(entry).push(target);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
const deptree = [];
|
|
117
|
+
const fillTree = (entry, chain = []) => {
|
|
118
|
+
const deps = idx.getDeps(entry);
|
|
119
|
+
deps.forEach((c) => isProd(root, chain[0]?.name || c.name) && idx.prod.add(c));
|
|
120
|
+
deps.sort(
|
|
121
|
+
(a, b) => idx.prod.has(a) && !idx.prod.has(b) ? -1 : idx.prod.has(b) && !idx.prod.has(a) ? 1 : a.name.localeCompare(b.name)
|
|
122
|
+
);
|
|
123
|
+
deps.forEach((dep) => deptree.push([...chain, dep]));
|
|
124
|
+
deps.forEach((dep) => fillTree(dep, [...chain, dep]));
|
|
125
|
+
};
|
|
126
|
+
const getEntry = (name, version) => entries.find((e) => e.name === name && e.version === version);
|
|
127
|
+
fillTree(getEntry(root.name, root.version));
|
|
128
|
+
const formatNpm1LockfileEntry = (entry) => {
|
|
129
|
+
const { name, version, hashes } = entry;
|
|
130
|
+
const _name = name.slice(name.indexOf("/") + 1);
|
|
131
|
+
const _entry = {
|
|
132
|
+
version,
|
|
133
|
+
resolved: `https://registry.npmjs.org/${name}/-/${_name}-${version}.tgz`,
|
|
134
|
+
integrity: formatIntegrity(hashes)
|
|
135
|
+
};
|
|
136
|
+
if (!idx.prod.has(entry)) {
|
|
137
|
+
_entry.dev = true;
|
|
138
|
+
}
|
|
139
|
+
if (entry.dependencies) {
|
|
140
|
+
_entry.requires = entry.dependencies;
|
|
141
|
+
}
|
|
142
|
+
return _entry;
|
|
143
|
+
};
|
|
144
|
+
const lf = {
|
|
145
|
+
name: root.name,
|
|
146
|
+
version: root.version,
|
|
147
|
+
lockfileVersion: 1,
|
|
148
|
+
requires: true,
|
|
149
|
+
dependencies: {}
|
|
150
|
+
};
|
|
151
|
+
const nmtree = lf;
|
|
152
|
+
const nodes = [nmtree];
|
|
153
|
+
const processEntry = (name, version, parents) => {
|
|
154
|
+
const entry = getEntry(name, version);
|
|
155
|
+
const deps = idx.getDeps(entry);
|
|
156
|
+
const queue = [];
|
|
157
|
+
deps.forEach((e) => {
|
|
158
|
+
const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name]);
|
|
159
|
+
const closest = parents[closestIndex];
|
|
160
|
+
if (closest?.dependencies?.[e.name].version === e.version) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const _entry = formatNpm1LockfileEntry(e);
|
|
164
|
+
const _parents = [_entry, ...parents];
|
|
165
|
+
const parent = closest ? _parents[closestIndex] : _parents[_parents.length - 1];
|
|
166
|
+
if (!parent.dependencies) {
|
|
167
|
+
parent.dependencies = {};
|
|
168
|
+
}
|
|
169
|
+
parent.dependencies[e.name] = _entry;
|
|
170
|
+
nodes.push(parent);
|
|
171
|
+
queue.push([e.name, e.version, _parents]);
|
|
172
|
+
});
|
|
173
|
+
queue.forEach(([name2, version2, parents2]) => processEntry(name2, version2, parents2));
|
|
174
|
+
};
|
|
175
|
+
deptree.forEach((chain) => {
|
|
176
|
+
const entry = chain[chain.length - 1];
|
|
177
|
+
const { name } = entry;
|
|
178
|
+
if (!nmtree.dependencies[name]) {
|
|
179
|
+
nmtree.dependencies[name] = formatNpm1LockfileEntry(entry);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree]));
|
|
183
|
+
nodes.forEach((node) => {
|
|
184
|
+
sortObject(node.dependencies || {});
|
|
185
|
+
if (node.requires) {
|
|
186
|
+
const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join("");
|
|
187
|
+
const snap2 = Object.entries(node.dependencies || {}).map(([name, { version }]) => `${name}@${version}`).join("");
|
|
188
|
+
if (snap1 === snap2) {
|
|
189
|
+
delete node.requires;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
fs.writeFileSync("temp/test.json", JSON.stringify(lf, null, 2));
|
|
194
|
+
fs.writeFileSync("temp/tree.json", JSON.stringify(
|
|
195
|
+
deptree.map((c) => c.map((e) => `${e.name}@${e.version}`).join(" > ")),
|
|
196
|
+
null,
|
|
197
|
+
2
|
|
198
|
+
));
|
|
199
|
+
return JSON.stringify(lf, null, 2);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// src/main/ts/yarn-1.ts
|
|
203
|
+
import { load, dump } from "js-yaml";
|
|
204
|
+
var kvEntryPattern = /^(\s+)"?([^"]+)"?\s"?([^"]+)"?$/;
|
|
205
|
+
var preparse = (value) => {
|
|
206
|
+
const lines = value.split("\n");
|
|
207
|
+
const _value = lines.map((line) => {
|
|
208
|
+
if (line.startsWith("#")) {
|
|
209
|
+
return "";
|
|
210
|
+
}
|
|
211
|
+
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
212
|
+
return `"${line.replaceAll('"', "").slice(0, -1)}":`;
|
|
213
|
+
}
|
|
214
|
+
const [, p, k, v] = line.match(kvEntryPattern) || [];
|
|
215
|
+
if (line.match(kvEntryPattern)) {
|
|
216
|
+
return `${p}"${k}": "${v}"`;
|
|
217
|
+
}
|
|
218
|
+
return line;
|
|
219
|
+
}, "").join("\n");
|
|
220
|
+
return load(_value);
|
|
221
|
+
};
|
|
222
|
+
var parseIntegrity2 = (integrity) => integrity.split(" ").reduce((m, item) => {
|
|
223
|
+
const [k, v] = item.split("-");
|
|
224
|
+
if (k === "sha512" || k === "sha256" || k === "sha1" || k === "checksum") {
|
|
225
|
+
m[k] = v;
|
|
226
|
+
}
|
|
227
|
+
return m;
|
|
228
|
+
}, {});
|
|
229
|
+
var parse2 = async (value) => {
|
|
230
|
+
const raw = await preparse(value);
|
|
231
|
+
const snapshot = {
|
|
232
|
+
entries: {},
|
|
233
|
+
workspaces: {},
|
|
234
|
+
format: "yarn-1"
|
|
235
|
+
};
|
|
236
|
+
Object.entries(raw).forEach((value2) => {
|
|
237
|
+
const [_key, _entry] = value2;
|
|
238
|
+
const chunks = _key.split(", ");
|
|
239
|
+
const ranges = chunks.map((r) => r.slice(r.lastIndexOf("@") + 1)).sort();
|
|
240
|
+
const { version, integrity, dependencies, optionalDependencies, resolved: source } = _entry;
|
|
241
|
+
const name = chunks[0].slice(0, chunks[0].lastIndexOf("@"));
|
|
242
|
+
const key = `${name}@${version}`;
|
|
243
|
+
const hashes = parseIntegrity2(integrity);
|
|
244
|
+
snapshot.entries[key] = {
|
|
245
|
+
name,
|
|
246
|
+
version,
|
|
247
|
+
ranges,
|
|
248
|
+
hashes,
|
|
249
|
+
dependencies,
|
|
250
|
+
optionalDependencies,
|
|
251
|
+
source
|
|
252
|
+
};
|
|
253
|
+
});
|
|
254
|
+
return snapshot;
|
|
255
|
+
};
|
|
256
|
+
var preformat = (value) => {
|
|
257
|
+
const lf = {};
|
|
258
|
+
Object.values(value.entries).forEach((entry) => {
|
|
259
|
+
const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry;
|
|
260
|
+
const key = ranges.map((r) => `${name}@${r}`).join(", ");
|
|
261
|
+
const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
|
|
262
|
+
lf[key] = {
|
|
263
|
+
version,
|
|
264
|
+
resolved: source,
|
|
265
|
+
integrity,
|
|
266
|
+
dependencies,
|
|
267
|
+
optionalDependencies
|
|
268
|
+
};
|
|
269
|
+
});
|
|
270
|
+
return lf;
|
|
271
|
+
};
|
|
272
|
+
var format2 = (value) => {
|
|
273
|
+
const lf = preformat(value);
|
|
274
|
+
const lines = dump(lf, {
|
|
275
|
+
quotingType: '"',
|
|
276
|
+
flowLevel: -1,
|
|
277
|
+
lineWidth: -1,
|
|
278
|
+
forceQuotes: true
|
|
279
|
+
}).split("\n");
|
|
280
|
+
const _value = lines.map((line) => {
|
|
281
|
+
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
282
|
+
const chunks = line.slice(0, -1).replaceAll('"', "").split(", ").map((chunk) => chunk.startsWith("@") || chunk.includes(" ") ? `"${chunk}"` : chunk);
|
|
283
|
+
return `
|
|
284
|
+
${chunks.join(", ")}:`;
|
|
285
|
+
}
|
|
286
|
+
if (line.startsWith(" integrity")) {
|
|
287
|
+
const _line = line.replace(":", "");
|
|
288
|
+
return line.includes("= ") ? _line.replaceAll('"integrity"', "integrity") : _line.replaceAll('"', "");
|
|
289
|
+
}
|
|
290
|
+
if (line.endsWith("ependencies:")) {
|
|
291
|
+
return line;
|
|
292
|
+
}
|
|
293
|
+
return line.replace(":", "");
|
|
294
|
+
}, "").join("\n");
|
|
295
|
+
return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
4
296
|
# yarn lockfile v1
|
|
5
297
|
|
|
6
|
-
${
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
298
|
+
${_value}`;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
// src/main/ts/yarn-5.ts
|
|
302
|
+
import { load as load2, dump as dump2 } from "js-yaml";
|
|
303
|
+
var parse3 = async (lockfile, pkg) => {
|
|
304
|
+
const snapshot = {
|
|
305
|
+
entries: {},
|
|
306
|
+
workspaces: {},
|
|
307
|
+
format: "yarn-5"
|
|
308
|
+
};
|
|
309
|
+
const raw = load2(lockfile);
|
|
310
|
+
delete raw.__metadata;
|
|
311
|
+
Object.entries(raw).forEach((value) => {
|
|
312
|
+
const [_key, _entry] = value;
|
|
313
|
+
const chunks = _key.split(", ");
|
|
314
|
+
const ranges = chunks.map((r) => r.slice(r.lastIndexOf("@") + 1)).sort();
|
|
315
|
+
const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution: source, bin, conditions } = _entry;
|
|
316
|
+
const name = chunks[0].slice(0, chunks[0].lastIndexOf("@"));
|
|
317
|
+
const key = `${name}@${version}`;
|
|
318
|
+
const hashes = parseIntegrity(checksum);
|
|
319
|
+
snapshot.entries[key] = {
|
|
320
|
+
name,
|
|
321
|
+
version,
|
|
322
|
+
ranges,
|
|
323
|
+
hashes,
|
|
324
|
+
dependencies,
|
|
325
|
+
dependenciesMeta,
|
|
326
|
+
optionalDependencies,
|
|
327
|
+
peerDependencies,
|
|
328
|
+
peerDependenciesMeta,
|
|
329
|
+
source,
|
|
330
|
+
bin,
|
|
331
|
+
conditions
|
|
332
|
+
};
|
|
333
|
+
});
|
|
334
|
+
return snapshot;
|
|
335
|
+
};
|
|
336
|
+
var preformat2 = (value) => {
|
|
337
|
+
const lf = {};
|
|
338
|
+
Object.values(value.entries).forEach((entry) => {
|
|
339
|
+
const { name, version, ranges, hashes: { checksum }, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, bin, conditions } = entry;
|
|
340
|
+
const key = ranges.map((r) => `${name}@${r}`).join(", ");
|
|
341
|
+
const isLocal = version === "0.0.0-use.local";
|
|
342
|
+
const languageName = isLocal ? "unknown" : "node";
|
|
343
|
+
const linkType = isLocal ? "soft" : "hard";
|
|
344
|
+
lf[key] = {
|
|
345
|
+
version,
|
|
346
|
+
resolution: source,
|
|
347
|
+
dependencies,
|
|
348
|
+
dependenciesMeta,
|
|
349
|
+
optionalDependencies,
|
|
350
|
+
peerDependencies,
|
|
351
|
+
peerDependenciesMeta,
|
|
352
|
+
bin,
|
|
353
|
+
checksum,
|
|
354
|
+
conditions,
|
|
355
|
+
languageName,
|
|
356
|
+
linkType
|
|
357
|
+
};
|
|
358
|
+
});
|
|
359
|
+
return lf;
|
|
360
|
+
};
|
|
361
|
+
var format3 = (value) => {
|
|
362
|
+
const lines = dump2({
|
|
363
|
+
__metadata: {
|
|
364
|
+
version: 5,
|
|
365
|
+
cacheKey: 8
|
|
366
|
+
},
|
|
367
|
+
...preformat2(value)
|
|
368
|
+
}, {
|
|
369
|
+
quotingType: '"',
|
|
370
|
+
flowLevel: -1,
|
|
371
|
+
lineWidth: -1,
|
|
372
|
+
forceQuotes: false
|
|
373
|
+
}).split("\n").map((line) => {
|
|
374
|
+
if (line === "__metadata:") {
|
|
375
|
+
return `
|
|
376
|
+
${line}`;
|
|
377
|
+
}
|
|
378
|
+
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
379
|
+
return `
|
|
380
|
+
"${line.replaceAll('"', "").slice(0, -1)}":`;
|
|
381
|
+
}
|
|
382
|
+
if (line.startsWith(" resolution: ")) {
|
|
383
|
+
return line.replaceAll('"', "").replace(" resolution: ", ' resolution: "').concat('"');
|
|
384
|
+
}
|
|
385
|
+
return line;
|
|
386
|
+
});
|
|
387
|
+
const _value = lines.join("\n");
|
|
388
|
+
return `# This file is generated by running "yarn install" inside your project.
|
|
10
389
|
# Manual changes might be lost - proceed with caution!
|
|
11
|
-
${
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
390
|
+
${_value}`;
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
// src/main/ts/common.ts
|
|
394
|
+
var getSources = (snapshot) => Object.values(snapshot.entries).map((entry) => entry.source).filter(Boolean);
|
|
395
|
+
|
|
396
|
+
// src/main/ts/index.ts
|
|
397
|
+
var foo = "bar";
|
|
398
|
+
export {
|
|
399
|
+
foo,
|
|
400
|
+
format as formatNpm1,
|
|
401
|
+
format2 as formatYarn1,
|
|
402
|
+
format3 as formatYarn5,
|
|
403
|
+
getSources,
|
|
404
|
+
parse as parseNpm1,
|
|
405
|
+
parse2 as parseYarn1,
|
|
406
|
+
parse3 as parseYarn5
|
|
407
|
+
};
|
|
16
408
|
//# sourceMappingURL=index.js.map
|
package/target/es6/yarn-1.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export declare type TYarn1Lockfile = Record<string, {
|
|
|
6
6
|
dependencies?: TDependencies;
|
|
7
7
|
optionalDependencies?: TDependencies;
|
|
8
8
|
}>;
|
|
9
|
+
export declare const check: (value: string) => boolean;
|
|
9
10
|
export declare const preparse: (value: string) => TYarn1Lockfile;
|
|
10
11
|
export declare const parse: (value: string) => Promise<TSnapshot>;
|
|
11
12
|
export declare const preformat: (value: TSnapshot) => TYarn1Lockfile;
|
package/target/es6/yarn-5.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare type TYarn5Lockfile = Record<string, {
|
|
|
13
13
|
peerDependenciesMeta?: TDependenciesMeta;
|
|
14
14
|
bin?: Record<string, string>;
|
|
15
15
|
}>;
|
|
16
|
+
export declare const check: (value: string) => boolean;
|
|
16
17
|
export declare const parse: (lockfile: string, pkg: string) => Promise<TSnapshot>;
|
|
17
18
|
export declare const preformat: (value: TSnapshot) => TYarn5Lockfile;
|
|
18
19
|
export declare const format: (value: TSnapshot) => string;
|