@visulima/package 5.0.0-alpha.12 → 5.0.0-alpha.14

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/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## @visulima/package [5.0.0-alpha.14](https://github.com/visulima/visulima/compare/@visulima/package@5.0.0-alpha.13...@visulima/package@5.0.0-alpha.14) (2026-05-06)
2
+
3
+
4
+ ### Dependencies
5
+
6
+ * **@visulima/fs:** upgraded to 5.0.0-alpha.15
7
+
8
+ ## @visulima/package [5.0.0-alpha.13](https://github.com/visulima/visulima/compare/@visulima/package@5.0.0-alpha.12...@visulima/package@5.0.0-alpha.13) (2026-05-06)
9
+
10
+ ### Miscellaneous Chores
11
+
12
+ * **package:** apply prettier and eslint quote-style auto-fix ([0316bca](https://github.com/visulima/visulima/commit/0316bca0deca444ff12675bc760c7091ce243d31))
13
+ * **package:** housekeeping cleanup ([113978b](https://github.com/visulima/visulima/commit/113978b0babcfc7879514aec076f6e2d5e7afab0))
14
+
15
+
16
+ ### Dependencies
17
+
18
+ * **@visulima/fs:** upgraded to 5.0.0-alpha.14
19
+
1
20
  ## @visulima/package [5.0.0-alpha.12](https://github.com/visulima/visulima/compare/@visulima/package@5.0.0-alpha.11...@visulima/package@5.0.0-alpha.12) (2026-05-04)
2
21
 
3
22
  ### Miscellaneous Chores
package/dist/error.js CHANGED
@@ -1 +1 @@
1
- export { default as PackageNotFoundError } from './packem_shared/PackageNotFoundError-C0ltLzw7.js';
1
+ import{default as a}from"./packem_shared/PackageNotFoundError--qHnCLzN.js";export{a as PackageNotFoundError};
package/dist/index.js CHANGED
@@ -1,7 +1 @@
1
- export { default as PackageNotFoundError } from './packem_shared/PackageNotFoundError-C0ltLzw7.js';
2
- export { decodeSriIntegrity, parseBunLockFile, parseLockFile, parseLockFileContent, parseLockFileSync, parseNpmLockFile, parsePnpmLockFile, parseYarnLockFile } from './lockfile.js';
3
- export { findMonorepoRoot, findMonorepoRootSync } from './monorepo.js';
4
- export { findPackageRoot, findPackageRootSync } from './package.js';
5
- export { ensurePackages, findPackageJson, findPackageJsonSync, getPackageJsonProperty, hasPackageJsonAnyDependency, hasPackageJsonProperty, parsePackageJson, parsePackageJsonSync, writePackageJson, writePackageJsonSync } from './package-json.js';
6
- export { findLockFile, findLockFileSync, findPackageManager, findPackageManagerSync, generateMissingPackagesInstallMessage, getPackageManagerVersion, identifyInitiatingPackageManager } from './package-manager.js';
7
- export { isPackageInWorkspace, readPnpmCatalogs, readPnpmCatalogsSync, resolveCatalogReference, resolveCatalogReferences, resolveDependenciesCatalogReferences } from './pnpm.js';
1
+ import{default as o}from"./packem_shared/PackageNotFoundError--qHnCLzN.js";import{decodeSriIntegrity as r,parseBunLockFile as c,parseLockFile as s,parseLockFileContent as g,parseLockFileSync as i,parseNpmLockFile as t,parsePnpmLockFile as k,parseYarnLockFile as p}from"./lockfile.js";import{findMonorepoRoot as f,findMonorepoRootSync as l}from"./monorepo.js";import{findPackageRoot as y,findPackageRootSync as m}from"./package.js";import{ensurePackages as S,findPackageJson as J,findPackageJsonSync as L,getPackageJsonProperty as M,hasPackageJsonAnyDependency as x,hasPackageJsonProperty as R,parsePackageJson as C,parsePackageJsonSync as u,writePackageJson as I,writePackageJsonSync as v}from"./package-json.js";import{findLockFile as w,findLockFileSync as D,findPackageManager as N,findPackageManagerSync as A,generateMissingPackagesInstallMessage as B,getPackageManagerVersion as E,identifyInitiatingPackageManager as V}from"./package-manager.js";import{isPackageInWorkspace as Y,readPnpmCatalogs as b,readPnpmCatalogsSync as j,resolveCatalogReference as q,resolveCatalogReferences as z,resolveDependenciesCatalogReferences as G}from"./pnpm.js";export{o as PackageNotFoundError,r as decodeSriIntegrity,S as ensurePackages,w as findLockFile,D as findLockFileSync,f as findMonorepoRoot,l as findMonorepoRootSync,J as findPackageJson,L as findPackageJsonSync,N as findPackageManager,A as findPackageManagerSync,y as findPackageRoot,m as findPackageRootSync,B as generateMissingPackagesInstallMessage,M as getPackageJsonProperty,E as getPackageManagerVersion,x as hasPackageJsonAnyDependency,R as hasPackageJsonProperty,V as identifyInitiatingPackageManager,Y as isPackageInWorkspace,c as parseBunLockFile,s as parseLockFile,g as parseLockFileContent,i as parseLockFileSync,t as parseNpmLockFile,C as parsePackageJson,u as parsePackageJsonSync,k as parsePnpmLockFile,p as parseYarnLockFile,b as readPnpmCatalogs,j as readPnpmCatalogsSync,q as resolveCatalogReference,z as resolveCatalogReferences,G as resolveDependenciesCatalogReferences,I as writePackageJson,v as writePackageJsonSync};
package/dist/lockfile.js CHANGED
@@ -1,422 +1 @@
1
- import { createRequire as __cjs_createRequire } from "node:module";
2
-
3
- const __cjs_require = __cjs_createRequire(import.meta.url);
4
-
5
- const __cjs_getProcess = typeof globalThis !== "undefined" && typeof globalThis.process !== "undefined" ? globalThis.process : process;
6
-
7
- const __cjs_getBuiltinModule = (module) => {
8
- // Check if we're in Node.js and version supports getBuiltinModule
9
- if (typeof __cjs_getProcess !== "undefined" && __cjs_getProcess.versions && __cjs_getProcess.versions.node) {
10
- const [major, minor] = __cjs_getProcess.versions.node.split(".").map(Number);
11
- // Node.js 20.16.0+ and 22.3.0+
12
- if (major > 22 || (major === 22 && minor >= 3) || (major === 20 && minor >= 16)) {
13
- return __cjs_getProcess.getBuiltinModule(module);
14
- }
15
- }
16
- // Fallback to createRequire
17
- return __cjs_require(module);
18
- };
19
-
20
- const {
21
- readFileSync
22
- } = __cjs_getBuiltinModule("node:fs");
23
- const {
24
- readFile
25
- } = __cjs_getBuiltinModule("node:fs/promises");
26
- import { findUp, findUpSync } from '@visulima/fs';
27
-
28
- const INTEGRITY_ALGORITHMS = {
29
- sha256: "sha256",
30
- sha384: "sha384",
31
- sha512: "sha512"
32
- };
33
- const MAX_SRI_LENGTH = 1024;
34
- const BASE64_PAYLOAD = /^[A-Z0-9+/]+={0,2}$/i;
35
- const NPM_NODE_MODULES_PATH = /.*node_modules\/((?:@[^/]+\/)?[^/]+)$/;
36
- const QUOTE_PREFIX = /^['"]/;
37
- const QUOTE_SUFFIX = /['"]$/;
38
- const PNPM_SECTION_HEADER = /^[a-z][a-zA-Z0-9]*:\s*$/m;
39
- const PNPM_INTEGRITY = /resolution:\s*\{[^}]*integrity:\s*([^,}\s]+)/;
40
- const YARN_BLOCK = /^["']?((?:@[^/@"']+\/)?[^@"'\n]+)@[^"'\n]+["']?:?[\t\v\f\r \u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*\n((?:[\t ][^\n]*\n?)+)/gm;
41
- const YARN_VERSION = /^\s+version:?\s+"?([^"\n]+)"?/m;
42
- const YARN_INTEGRITY = /^\s+integrity[\s:]+"?([^"\s]+)"?/m;
43
- const decodeSriIntegrity = (sri) => {
44
- if (sri.length > MAX_SRI_LENGTH) {
45
- return void 0;
46
- }
47
- const dashIndex = sri.indexOf("-");
48
- if (dashIndex <= 0) {
49
- return void 0;
50
- }
51
- const algorithm = INTEGRITY_ALGORITHMS[sri.slice(0, dashIndex).toLowerCase()];
52
- if (!algorithm) {
53
- return void 0;
54
- }
55
- const payload = sri.slice(dashIndex + 1);
56
- if (!BASE64_PAYLOAD.test(payload)) {
57
- return void 0;
58
- }
59
- try {
60
- const buffer = Buffer.from(payload, "base64");
61
- if (buffer.length === 0) {
62
- return void 0;
63
- }
64
- return { algorithm, hex: buffer.toString("hex") };
65
- } catch {
66
- return void 0;
67
- }
68
- };
69
- const pushUniqueEntry = (result, seen, entry) => {
70
- const key = `${entry.name}@${entry.version}`;
71
- if (seen.has(key)) {
72
- return;
73
- }
74
- seen.add(key);
75
- result.push(entry);
76
- };
77
- const copyDepMap = (target, field, source) => {
78
- if (source && Object.keys(source).length > 0) {
79
- target[field] = { ...source };
80
- }
81
- };
82
- const liftDepMap = (source) => {
83
- if (!source) {
84
- return void 0;
85
- }
86
- const result = {};
87
- for (const [name, value] of Object.entries(source)) {
88
- result[name] = [value];
89
- }
90
- return Object.keys(result).length > 0 ? result : void 0;
91
- };
92
- const parseNpmLockFile = (content) => {
93
- const result = [];
94
- const seen = /* @__PURE__ */ new Set();
95
- let parsed;
96
- try {
97
- parsed = JSON.parse(content);
98
- } catch {
99
- return result;
100
- }
101
- if (!parsed.packages) {
102
- return result;
103
- }
104
- for (const [path, entry] of Object.entries(parsed.packages)) {
105
- if (!path || !entry.version) {
106
- continue;
107
- }
108
- const match = NPM_NODE_MODULES_PATH.exec(path);
109
- if (!match?.[1]) {
110
- continue;
111
- }
112
- const name = entry.name ?? match[1];
113
- if (name.startsWith(".")) {
114
- continue;
115
- }
116
- const lockEntry = { name, version: entry.version };
117
- if (entry.integrity) {
118
- const integrity = decodeSriIntegrity(entry.integrity);
119
- if (integrity) {
120
- lockEntry.integrity = integrity;
121
- }
122
- }
123
- copyDepMap(lockEntry, "dependencies", liftDepMap(entry.dependencies));
124
- copyDepMap(lockEntry, "peerDependencies", liftDepMap(entry.peerDependencies));
125
- copyDepMap(lockEntry, "optionalDependencies", liftDepMap(entry.optionalDependencies));
126
- pushUniqueEntry(result, seen, lockEntry);
127
- }
128
- return result;
129
- };
130
- const splitPnpmPackageKey = (raw) => {
131
- let key = raw.trim();
132
- if (key.startsWith("/")) {
133
- key = key.slice(1);
134
- }
135
- key = key.replace(QUOTE_PREFIX, "").replace(QUOTE_SUFFIX, "");
136
- const parenIndex = key.indexOf("(");
137
- if (parenIndex > 0) {
138
- key = key.slice(0, parenIndex);
139
- }
140
- const atIndex = key.lastIndexOf("@");
141
- if (atIndex <= 0) {
142
- return void 0;
143
- }
144
- const name = key.slice(0, atIndex);
145
- const version = key.slice(atIndex + 1);
146
- if (!name || !version || version.startsWith("link:") || version.startsWith("workspace:") || version.startsWith("file:")) {
147
- return void 0;
148
- }
149
- return { name, version };
150
- };
151
- const sliceTopLevelSection = (content, section) => {
152
- const header = new RegExp(String.raw`^${section}:\s*$`, "m");
153
- const start = header.exec(content);
154
- if (!start) {
155
- return void 0;
156
- }
157
- const after = start.index + start[0].length;
158
- const next = PNPM_SECTION_HEADER.exec(content.slice(after));
159
- return content.slice(after, next ? after + next.index : content.length);
160
- };
161
- const parsePnpmSnapshotEdges = (content) => {
162
- const result = /* @__PURE__ */ new Map();
163
- const body = sliceTopLevelSection(content, "snapshots");
164
- if (!body) {
165
- return result;
166
- }
167
- const entryRegex = /^ {2}(['"]?[^\s:][^:\n]*?['"]?):\s*\n((?: {4}[^\n]*\n?)+)/gm;
168
- let match;
169
- while ((match = entryRegex.exec(body) ?? void 0) !== void 0) {
170
- const keyValue = splitPnpmPackageKey(match[1]);
171
- if (!keyValue) {
172
- continue;
173
- }
174
- const baseKey = `${keyValue.name}@${keyValue.version}`;
175
- const entryBody = match[2];
176
- const existing = result.get(baseKey) ?? {};
177
- for (const field of ["dependencies", "peerDependencies", "optionalDependencies"]) {
178
- const scraped = extractPnpmDependencyMap(entryBody, field);
179
- if (!scraped) {
180
- continue;
181
- }
182
- const merged = existing[field] ?? {};
183
- for (const [depName, depVersions] of Object.entries(scraped)) {
184
- const bucket = merged[depName] ?? [];
185
- for (const depVersion of depVersions) {
186
- if (!bucket.includes(depVersion)) {
187
- bucket.push(depVersion);
188
- }
189
- }
190
- merged[depName] = bucket;
191
- }
192
- existing[field] = merged;
193
- }
194
- result.set(baseKey, existing);
195
- }
196
- return result;
197
- };
198
- const parsePnpmLockFile = (content) => {
199
- const result = [];
200
- const seen = /* @__PURE__ */ new Set();
201
- const packagesBody = sliceTopLevelSection(content, "packages");
202
- if (!packagesBody) {
203
- return result;
204
- }
205
- const snapshotEdges = parsePnpmSnapshotEdges(content);
206
- const entryRegex = /^ {2}(['"]?[^\s:][^:\n]*?['"]?):\s*\n((?: {4}[^\n]*\n?)+)/gm;
207
- let match;
208
- while ((match = entryRegex.exec(packagesBody) ?? void 0) !== void 0) {
209
- const keyValue = splitPnpmPackageKey(match[1]);
210
- if (!keyValue) {
211
- continue;
212
- }
213
- const body = match[2];
214
- const integrityMatch = PNPM_INTEGRITY.exec(body);
215
- const lockEntry = { name: keyValue.name, version: keyValue.version };
216
- if (integrityMatch?.[1]) {
217
- const integrity = decodeSriIntegrity(integrityMatch[1]);
218
- if (integrity) {
219
- lockEntry.integrity = integrity;
220
- }
221
- }
222
- const snapshot = snapshotEdges.get(`${keyValue.name}@${keyValue.version}`);
223
- copyDepMap(lockEntry, "dependencies", snapshot?.dependencies ?? extractPnpmDependencyMap(body, "dependencies"));
224
- copyDepMap(lockEntry, "peerDependencies", snapshot?.peerDependencies ?? extractPnpmDependencyMap(body, "peerDependencies"));
225
- copyDepMap(lockEntry, "optionalDependencies", snapshot?.optionalDependencies ?? extractPnpmDependencyMap(body, "optionalDependencies"));
226
- pushUniqueEntry(result, seen, lockEntry);
227
- }
228
- return result;
229
- };
230
- const extractPnpmDependencyMap = (body, section) => {
231
- const sectionRegex = new RegExp(String.raw`^ {4}${section}:\s*\n((?: {6,}[^\n]*\n?)+)`, "m");
232
- const sectionMatch = sectionRegex.exec(body);
233
- if (!sectionMatch?.[1]) {
234
- return void 0;
235
- }
236
- const map = {};
237
- const entryRegex = /^ {6}([^\s:]+):\s*([^\n]+)/gm;
238
- let match;
239
- while ((match = entryRegex.exec(sectionMatch[1]) ?? void 0) !== void 0) {
240
- const name = match[1].replace(QUOTE_PREFIX, "").replace(QUOTE_SUFFIX, "");
241
- let version = match[2].trim();
242
- version = version.replace(QUOTE_PREFIX, "").replace(QUOTE_SUFFIX, "");
243
- const parenIndex = version.indexOf("(");
244
- if (parenIndex > 0) {
245
- version = version.slice(0, parenIndex).trim();
246
- }
247
- if (!name || !version) {
248
- continue;
249
- }
250
- const bucket = map[name] ?? [];
251
- if (!bucket.includes(version)) {
252
- bucket.push(version);
253
- }
254
- map[name] = bucket;
255
- }
256
- return Object.keys(map).length > 0 ? map : void 0;
257
- };
258
- const parseYarnLockFile = (content) => {
259
- const result = [];
260
- const seen = /* @__PURE__ */ new Set();
261
- const entryRegex = YARN_BLOCK;
262
- entryRegex.lastIndex = 0;
263
- let match;
264
- while ((match = entryRegex.exec(content) ?? void 0) !== void 0) {
265
- const name = match[1].replace(QUOTE_PREFIX, "").replace(QUOTE_SUFFIX, "");
266
- if (!name) {
267
- continue;
268
- }
269
- const body = match[2];
270
- const versionMatch = YARN_VERSION.exec(body);
271
- if (!versionMatch?.[1]) {
272
- continue;
273
- }
274
- const lockEntry = { name, version: versionMatch[1].trim() };
275
- const integrityMatch = YARN_INTEGRITY.exec(body);
276
- if (integrityMatch?.[1]) {
277
- const integrity = decodeSriIntegrity(integrityMatch[1]);
278
- if (integrity) {
279
- lockEntry.integrity = integrity;
280
- }
281
- }
282
- copyDepMap(lockEntry, "dependencies", extractYarnDependencyMap(body, "dependencies"));
283
- copyDepMap(lockEntry, "peerDependencies", extractYarnDependencyMap(body, "peerDependencies"));
284
- copyDepMap(lockEntry, "optionalDependencies", extractYarnDependencyMap(body, "optionalDependencies"));
285
- pushUniqueEntry(result, seen, lockEntry);
286
- }
287
- return result;
288
- };
289
- const extractYarnDependencyMap = (body, section) => {
290
- const sectionRegex = new RegExp(String.raw`^ {2}${section}:\s*\n((?: {4,}[^\n]*\n?)+)`, "m");
291
- const sectionMatch = sectionRegex.exec(body);
292
- if (!sectionMatch?.[1]) {
293
- return void 0;
294
- }
295
- const map = {};
296
- const entryRegex = /^ {4}(['"]?[^\s:'"]+['"]?)\s*(?::\s*)?['"]([^'"\n]+)['"]/gm;
297
- let match;
298
- while ((match = entryRegex.exec(sectionMatch[1]) ?? void 0) !== void 0) {
299
- const name = match[1].replace(QUOTE_PREFIX, "").replace(QUOTE_SUFFIX, "");
300
- const version = match[2];
301
- if (name && version) {
302
- const bucket = map[name] ?? [];
303
- if (!bucket.includes(version)) {
304
- bucket.push(version);
305
- }
306
- map[name] = bucket;
307
- }
308
- }
309
- return Object.keys(map).length > 0 ? map : void 0;
310
- };
311
- const TRAILING_COMMA_REGEX = /,(?=\s*[}\]])/g;
312
- const parseBunLockFile = (content) => {
313
- const result = [];
314
- const seen = /* @__PURE__ */ new Set();
315
- let parsed;
316
- try {
317
- parsed = JSON.parse(content.replaceAll(TRAILING_COMMA_REGEX, ""));
318
- } catch {
319
- return result;
320
- }
321
- if (!parsed.packages) {
322
- return result;
323
- }
324
- for (const tuple of Object.values(parsed.packages)) {
325
- const versionKey = tuple[0];
326
- if (typeof versionKey !== "string") {
327
- continue;
328
- }
329
- const atIndex = versionKey.indexOf("@", 1);
330
- if (atIndex <= 0) {
331
- continue;
332
- }
333
- const name = versionKey.slice(0, atIndex);
334
- const version = versionKey.slice(atIndex + 1);
335
- if (!name || !version || version.startsWith("workspace:") || version.startsWith("link:") || version.startsWith("file:")) {
336
- continue;
337
- }
338
- const lockEntry = { name, version };
339
- const rawIntegrity = tuple[3];
340
- if (typeof rawIntegrity === "string" && rawIntegrity.length > 0) {
341
- const integrity = decodeSriIntegrity(rawIntegrity);
342
- if (integrity) {
343
- lockEntry.integrity = integrity;
344
- }
345
- }
346
- const metadata = tuple[2];
347
- if (metadata && typeof metadata === "object" && !Array.isArray(metadata)) {
348
- const meta = metadata;
349
- copyDepMap(lockEntry, "dependencies", liftDepMap(meta.dependencies));
350
- copyDepMap(lockEntry, "peerDependencies", liftDepMap(meta.peerDependencies));
351
- copyDepMap(lockEntry, "optionalDependencies", liftDepMap(meta.optionalDependencies));
352
- }
353
- pushUniqueEntry(result, seen, lockEntry);
354
- }
355
- return result;
356
- };
357
- const inferLockFileType = (path) => {
358
- if (path.endsWith("pnpm-lock.yaml")) {
359
- return "pnpm";
360
- }
361
- if (path.endsWith("package-lock.json")) {
362
- return "npm";
363
- }
364
- if (path.endsWith("yarn.lock")) {
365
- return "yarn";
366
- }
367
- if (path.endsWith("bun.lock")) {
368
- return "bun";
369
- }
370
- return void 0;
371
- };
372
- const parseLockFileContent = (content, type) => {
373
- switch (type) {
374
- case "bun": {
375
- return parseBunLockFile(content);
376
- }
377
- case "npm": {
378
- return parseNpmLockFile(content);
379
- }
380
- case "pnpm": {
381
- return parsePnpmLockFile(content);
382
- }
383
- case "yarn": {
384
- return parseYarnLockFile(content);
385
- }
386
- default: {
387
- return [];
388
- }
389
- }
390
- };
391
- const LOCKFILE_CANDIDATES = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
392
- const parseLockFile = async (cwd) => {
393
- const path = await findUp(LOCKFILE_CANDIDATES, {
394
- type: "file",
395
- ...cwd && { cwd }
396
- });
397
- if (!path) {
398
- throw new Error("Could not find a supported lock file (pnpm-lock.yaml, package-lock.json, yarn.lock, bun.lock)");
399
- }
400
- const type = inferLockFileType(path);
401
- if (!type) {
402
- throw new Error(`Unsupported lock file: ${path}`);
403
- }
404
- const content = await readFile(path, "utf8");
405
- return { entries: parseLockFileContent(content, type), path, type };
406
- };
407
- const parseLockFileSync = (cwd) => {
408
- const path = findUpSync(LOCKFILE_CANDIDATES, {
409
- type: "file",
410
- ...cwd && { cwd }
411
- });
412
- if (!path) {
413
- throw new Error("Could not find a supported lock file (pnpm-lock.yaml, package-lock.json, yarn.lock, bun.lock)");
414
- }
415
- const type = inferLockFileType(path);
416
- if (!type) {
417
- throw new Error(`Unsupported lock file: ${path}`);
418
- }
419
- return { entries: parseLockFileContent(readFileSync(path, "utf8"), type), path, type };
420
- };
421
-
422
- export { decodeSriIntegrity, parseBunLockFile, parseLockFile, parseLockFileContent, parseLockFileSync, parseNpmLockFile, parsePnpmLockFile, parseYarnLockFile };
1
+ var A=Object.defineProperty;var F=(n,e)=>A(n,"name",{value:e,configurable:!0});import{createRequire as M}from"node:module";import{findUp as N,findUpSync as R}from"@visulima/fs";const P=M(import.meta.url),k=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,S=F(n=>{if(typeof k<"u"&&k.versions&&k.versions.node){const[e,t]=k.versions.node.split(".").map(Number);if(e>22||e===22&&t>=3||e===20&&t>=16)return k.getBuiltinModule(n)}return P(n)},"__cjs_getBuiltinModule"),{readFileSync:B}=S("node:fs"),{readFile:C}=S("node:fs/promises");var T=Object.defineProperty,l=F((n,e)=>T(n,"name",{value:e,configurable:!0}),"g");const U={sha256:"sha256",sha384:"sha384",sha512:"sha512"},I=1024,q=/^[A-Z0-9+/]+={0,2}$/i,Y=/.*node_modules\/((?:@[^/]+\/)?[^/]+)$/,h=/^['"]/,y=/['"]$/,z=/^[a-z][a-zA-Z0-9]*:\s*$/m,J=/resolution:\s*\{[^}]*integrity:\s*([^,}\s]+)/,Z=/^["']?((?:@[^/@"']+\/)?[^@"'\n]+)@[^"'\n]+["']?:?[\t\v\f\r \u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*\n((?:[\t ][^\n]*\n?)+)/gm,K=/^\s+version:?\s+"?([^"\n]+)"?/m,G=/^\s+integrity[\s:]+"?([^"\s]+)"?/m,x=l(n=>{if(n.length>I)return;const e=n.indexOf("-");if(e<=0)return;const t=U[n.slice(0,e).toLowerCase()];if(!t)return;const s=n.slice(e+1);if(q.test(s))try{const c=Buffer.from(s,"base64");return c.length===0?void 0:{algorithm:t,hex:c.toString("hex")}}catch{return}},"decodeSriIntegrity"),w=l((n,e,t)=>{const s=`${t.name}@${t.version}`;e.has(s)||(e.add(s),n.push(t))},"pushUniqueEntry"),m=l((n,e,t)=>{t&&Object.keys(t).length>0&&(n[e]={...t})},"copyDepMap"),g=l(n=>{if(!n)return;const e={};for(const[t,s]of Object.entries(n))e[t]=[s];return Object.keys(e).length>0?e:void 0},"liftDepMap"),H=l(n=>{const e=[],t=new Set;let s;try{s=JSON.parse(n)}catch{return e}if(!s.packages)return e;for(const[c,o]of Object.entries(s.packages)){if(!c||!o.version)continue;const p=Y.exec(c);if(!p?.[1])continue;const i=o.name??p[1];if(i.startsWith("."))continue;const r={name:i,version:o.version};if(o.integrity){const a=x(o.integrity);a&&(r.integrity=a)}m(r,"dependencies",g(o.dependencies)),m(r,"peerDependencies",g(o.peerDependencies)),m(r,"optionalDependencies",g(o.optionalDependencies)),w(e,t,r)}return e},"parseNpmLockFile"),L=l(n=>{let e=n.trim();e.startsWith("/")&&(e=e.slice(1)),e=e.replace(h,"").replace(y,"");const t=e.indexOf("(");t>0&&(e=e.slice(0,t));const s=e.lastIndexOf("@");if(s<=0)return;const c=e.slice(0,s),o=e.slice(s+1);if(!(!c||!o||o.startsWith("link:")||o.startsWith("workspace:")||o.startsWith("file:")))return{name:c,version:o}},"splitPnpmPackageKey"),$=l((n,e)=>{const t=new RegExp(String.raw`^${e}:\s*$`,"m").exec(n);if(!t)return;const s=t.index+t[0].length,c=z.exec(n.slice(s));return n.slice(s,c?s+c.index:n.length)},"sliceTopLevelSection"),Q=l(n=>{const e=new Map,t=$(n,"snapshots");if(!t)return e;const s=/^ {2}(['"]?[^\s:][^:\n]*?['"]?):\s*\n((?: {4}[^\n]*\n?)+)/gm;let c;for(;(c=s.exec(t)??void 0)!==void 0;){const o=L(c[1]);if(!o)continue;const p=`${o.name}@${o.version}`,i=c[2],r=e.get(p)??{};for(const a of["dependencies","peerDependencies","optionalDependencies"]){const d=v(i,a);if(!d)continue;const u=r[a]??{};for(const[f,E]of Object.entries(d)){const D=u[f]??[];for(const j of E)D.includes(j)||D.push(j);u[f]=D}r[a]=u}e.set(p,r)}return e},"parsePnpmSnapshotEdges"),V=l(n=>{const e=[],t=new Set,s=$(n,"packages");if(!s)return e;const c=Q(n),o=/^ {2}(['"]?[^\s:][^:\n]*?['"]?):\s*\n((?: {4}[^\n]*\n?)+)/gm;let p;for(;(p=o.exec(s)??void 0)!==void 0;){const i=L(p[1]);if(!i)continue;const r=p[2],a=J.exec(r),d={name:i.name,version:i.version};if(a?.[1]){const f=x(a[1]);f&&(d.integrity=f)}const u=c.get(`${i.name}@${i.version}`);m(d,"dependencies",u?.dependencies??v(r,"dependencies")),m(d,"peerDependencies",u?.peerDependencies??v(r,"peerDependencies")),m(d,"optionalDependencies",u?.optionalDependencies??v(r,"optionalDependencies")),w(e,t,d)}return e},"parsePnpmLockFile"),v=l((n,e)=>{const t=new RegExp(String.raw`^ {4}${e}:\s*\n((?: {6,}[^\n]*\n?)+)`,"m").exec(n);if(!t?.[1])return;const s={},c=/^ {6}([^\s:]+):\s*([^\n]+)/gm;let o;for(;(o=c.exec(t[1])??void 0)!==void 0;){const p=o[1].replace(h,"").replace(y,"");let i=o[2].trim();i=i.replace(h,"").replace(y,"");const r=i.indexOf("(");if(r>0&&(i=i.slice(0,r).trim()),!p||!i)continue;const a=s[p]??[];a.includes(i)||a.push(i),s[p]=a}return Object.keys(s).length>0?s:void 0},"extractPnpmDependencyMap"),X=l(n=>{const e=[],t=new Set,s=Z;s.lastIndex=0;let c;for(;(c=s.exec(n)??void 0)!==void 0;){const o=c[1].replace(h,"").replace(y,"");if(!o)continue;const p=c[2],i=K.exec(p);if(!i?.[1])continue;const r={name:o,version:i[1].trim()},a=G.exec(p);if(a?.[1]){const d=x(a[1]);d&&(r.integrity=d)}m(r,"dependencies",b(p,"dependencies")),m(r,"peerDependencies",b(p,"peerDependencies")),m(r,"optionalDependencies",b(p,"optionalDependencies")),w(e,t,r)}return e},"parseYarnLockFile"),b=l((n,e)=>{const t=new RegExp(String.raw`^ {2}${e}:\s*\n((?: {4,}[^\n]*\n?)+)`,"m").exec(n);if(!t?.[1])return;const s={},c=/^ {4}(['"]?[^\s:'"]+['"]?)\s*(?::\s*)?['"]([^'"\n]+)['"]/gm;let o;for(;(o=c.exec(t[1])??void 0)!==void 0;){const p=o[1].replace(h,"").replace(y,""),i=o[2];if(p&&i){const r=s[p]??[];r.includes(i)||r.push(i),s[p]=r}}return Object.keys(s).length>0?s:void 0},"extractYarnDependencyMap"),ee=/,(?=\s*[}\]])/g,ne=l(n=>{const e=[],t=new Set;let s;try{s=JSON.parse(n.replaceAll(ee,""))}catch{return e}if(!s.packages)return e;for(const c of Object.values(s.packages)){const o=c[0];if(typeof o!="string")continue;const p=o.indexOf("@",1);if(p<=0)continue;const i=o.slice(0,p),r=o.slice(p+1);if(!i||!r||r.startsWith("workspace:")||r.startsWith("link:")||r.startsWith("file:"))continue;const a={name:i,version:r},d=c[3];if(typeof d=="string"&&d.length>0){const f=x(d);f&&(a.integrity=f)}const u=c[2];if(u&&typeof u=="object"&&!Array.isArray(u)){const f=u;m(a,"dependencies",g(f.dependencies)),m(a,"peerDependencies",g(f.peerDependencies)),m(a,"optionalDependencies",g(f.optionalDependencies))}w(e,t,a)}return e},"parseBunLockFile"),O=l(n=>{if(n.endsWith("pnpm-lock.yaml"))return"pnpm";if(n.endsWith("package-lock.json"))return"npm";if(n.endsWith("yarn.lock"))return"yarn";if(n.endsWith("bun.lock"))return"bun"},"inferLockFileType"),_=l((n,e)=>{switch(e){case"bun":return ne(n);case"npm":return H(n);case"pnpm":return V(n);case"yarn":return X(n);default:return[]}},"parseLockFileContent"),W=["pnpm-lock.yaml","package-lock.json","yarn.lock","bun.lock"],re=l(async n=>{const e=await N(W,{type:"file",...n&&{cwd:n}});if(!e)throw new Error("Could not find a supported lock file (pnpm-lock.yaml, package-lock.json, yarn.lock, bun.lock)");const t=O(e);if(!t)throw new Error(`Unsupported lock file: ${e}`);const s=await C(e,"utf8");return{entries:_(s,t),path:e,type:t}},"parseLockFile"),ce=l(n=>{const e=R(W,{type:"file",...n&&{cwd:n}});if(!e)throw new Error("Could not find a supported lock file (pnpm-lock.yaml, package-lock.json, yarn.lock, bun.lock)");const t=O(e);if(!t)throw new Error(`Unsupported lock file: ${e}`);return{entries:_(B(e,"utf8"),t),path:e,type:t}},"parseLockFileSync");export{x as decodeSriIntegrity,ne as parseBunLockFile,re as parseLockFile,_ as parseLockFileContent,ce as parseLockFileSync,H as parseNpmLockFile,V as parsePnpmLockFile,X as parseYarnLockFile};
package/dist/monorepo.js CHANGED
@@ -1,121 +1 @@
1
- import { createRequire as __cjs_createRequire } from "node:module";
2
-
3
- const __cjs_require = __cjs_createRequire(import.meta.url);
4
-
5
- const __cjs_getProcess = typeof globalThis !== "undefined" && typeof globalThis.process !== "undefined" ? globalThis.process : process;
6
-
7
- const __cjs_getBuiltinModule = (module) => {
8
- // Check if we're in Node.js and version supports getBuiltinModule
9
- if (typeof __cjs_getProcess !== "undefined" && __cjs_getProcess.versions && __cjs_getProcess.versions.node) {
10
- const [major, minor] = __cjs_getProcess.versions.node.split(".").map(Number);
11
- // Node.js 20.16.0+ and 22.3.0+
12
- if (major > 22 || (major === 22 && minor >= 3) || (major === 20 && minor >= 16)) {
13
- return __cjs_getProcess.getBuiltinModule(module);
14
- }
15
- }
16
- // Fallback to createRequire
17
- return __cjs_require(module);
18
- };
19
-
20
- const {
21
- existsSync,
22
- readFileSync
23
- } = __cjs_getBuiltinModule("node:fs");
24
- import { findUp, readJson, findUpSync, readJsonSync } from '@visulima/fs';
25
- import { NotFoundError } from '@visulima/fs/error';
26
- import { dirname, join } from '@visulima/path';
27
- import { findPackageManager, findPackageManagerSync } from './package-manager.js';
28
-
29
- const findMonorepoRoot = async (cwd) => {
30
- const workspaceFilePath = await findUp(["lerna.json", "turbo.json"], {
31
- type: "file",
32
- ...cwd && { cwd }
33
- });
34
- if (workspaceFilePath?.endsWith("lerna.json")) {
35
- const lerna = await readJson(workspaceFilePath);
36
- if (lerna && typeof lerna === "object" && !Array.isArray(lerna)) {
37
- const l = lerna;
38
- if (l.useWorkspaces || l.packages) {
39
- return {
40
- path: dirname(workspaceFilePath),
41
- strategy: "lerna"
42
- };
43
- }
44
- }
45
- }
46
- const isTurbo = workspaceFilePath?.endsWith("turbo.json");
47
- try {
48
- const { packageManager, path } = await findPackageManager(cwd);
49
- if (["npm", "yarn"].includes(packageManager)) {
50
- const packageJsonFilePath = join(path, "package.json");
51
- if (existsSync(packageJsonFilePath)) {
52
- const packageJson = readFileSync(join(path, "package.json"), "utf8");
53
- if (packageJson.includes("workspaces")) {
54
- return {
55
- path,
56
- strategy: isTurbo ? "turbo" : packageManager
57
- };
58
- }
59
- }
60
- } else if (packageManager === "pnpm") {
61
- const pnpmWorkspacesFilePath = join(path, "pnpm-workspace.yaml");
62
- if (existsSync(pnpmWorkspacesFilePath)) {
63
- return {
64
- path,
65
- strategy: isTurbo ? "turbo" : "pnpm"
66
- };
67
- }
68
- }
69
- } catch (error) {
70
- if (!(error instanceof NotFoundError)) {
71
- throw error;
72
- }
73
- }
74
- throw new Error(`No monorepo root could be found upwards from the directory ${cwd} using lerna, yarn, pnpm, or npm as indicators.`);
75
- };
76
- const findMonorepoRootSync = (cwd) => {
77
- const workspaceFilePath = findUpSync(["lerna.json", "turbo.json"], {
78
- type: "file",
79
- ...cwd && { cwd }
80
- });
81
- if (workspaceFilePath?.endsWith("lerna.json")) {
82
- const lerna = readJsonSync(workspaceFilePath);
83
- if (lerna.useWorkspaces || lerna.packages) {
84
- return {
85
- path: dirname(workspaceFilePath),
86
- strategy: "lerna"
87
- };
88
- }
89
- }
90
- const isTurbo = workspaceFilePath?.endsWith("turbo.json");
91
- try {
92
- const { packageManager, path } = findPackageManagerSync(cwd);
93
- if (["npm", "yarn"].includes(packageManager)) {
94
- const packageJsonFilePath = join(path, "package.json");
95
- if (existsSync(packageJsonFilePath)) {
96
- const packageJson = readFileSync(join(path, "package.json"), "utf8");
97
- if (packageJson.includes("workspaces")) {
98
- return {
99
- path,
100
- strategy: isTurbo ? "turbo" : packageManager
101
- };
102
- }
103
- }
104
- } else if (packageManager === "pnpm") {
105
- const pnpmWorkspacesFilePath = join(path, "pnpm-workspace.yaml");
106
- if (existsSync(pnpmWorkspacesFilePath)) {
107
- return {
108
- path,
109
- strategy: isTurbo ? "turbo" : "pnpm"
110
- };
111
- }
112
- }
113
- } catch (error) {
114
- if (!(error instanceof NotFoundError)) {
115
- throw error;
116
- }
117
- }
118
- throw new Error(`No monorepo root could be found upwards from the directory ${cwd} using lerna, yarn, pnpm, or npm as indicators.`);
119
- };
120
-
121
- export { findMonorepoRoot, findMonorepoRootSync };
1
+ var l=Object.defineProperty;var p=(e,n)=>l(e,"name",{value:n,configurable:!0});import{createRequire as y}from"node:module";import{findUp as j,readJson as b,findUpSync as w,readJsonSync as k}from"@visulima/fs";import{NotFoundError as u}from"@visulima/fs/error";import{dirname as d,join as s}from"@visulima/path";import{findPackageManager as _,findPackageManagerSync as M}from"./package-manager.js";const g=y(import.meta.url),i=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,h=p(e=>{if(typeof i<"u"&&i.versions&&i.versions.node){const[n,t]=i.versions.node.split(".").map(Number);if(n>22||n===22&&t>=3||n===20&&t>=16)return i.getBuiltinModule(e)}return g(e)},"__cjs_getBuiltinModule"),{existsSync:c,readFileSync:f}=h("node:fs");var S=Object.defineProperty,m=p((e,n)=>S(e,"name",{value:n,configurable:!0}),"i");const E=m(async e=>{const n=await j(["lerna.json","turbo.json"],{type:"file",...e&&{cwd:e}});if(n?.endsWith("lerna.json")){const o=await b(n);if(o&&typeof o=="object"&&!Array.isArray(o)){const r=o;if(r.useWorkspaces||r.packages)return{path:d(n),strategy:"lerna"}}}const t=n?.endsWith("turbo.json");try{const{packageManager:o,path:r}=await _(e);if(["npm","yarn"].includes(o)){const a=s(r,"package.json");if(c(a)&&f(s(r,"package.json"),"utf8").includes("workspaces"))return{path:r,strategy:t?"turbo":o}}else if(o==="pnpm"){const a=s(r,"pnpm-workspace.yaml");if(c(a))return{path:r,strategy:t?"turbo":"pnpm"}}}catch(o){if(!(o instanceof u))throw o}throw new Error(`No monorepo root could be found upwards from the directory ${e} using lerna, yarn, pnpm, or npm as indicators.`)},"findMonorepoRoot"),T=m(e=>{const n=w(["lerna.json","turbo.json"],{type:"file",...e&&{cwd:e}});if(n?.endsWith("lerna.json")){const o=k(n);if(o.useWorkspaces||o.packages)return{path:d(n),strategy:"lerna"}}const t=n?.endsWith("turbo.json");try{const{packageManager:o,path:r}=M(e);if(["npm","yarn"].includes(o)){const a=s(r,"package.json");if(c(a)&&f(s(r,"package.json"),"utf8").includes("workspaces"))return{path:r,strategy:t?"turbo":o}}else if(o==="pnpm"){const a=s(r,"pnpm-workspace.yaml");if(c(a))return{path:r,strategy:t?"turbo":"pnpm"}}}catch(o){if(!(o instanceof u))throw o}throw new Error(`No monorepo root could be found upwards from the directory ${e} using lerna, yarn, pnpm, or npm as indicators.`)},"findMonorepoRootSync");export{E as findMonorepoRoot,T as findMonorepoRootSync};