screw-up 1.25.0 → 1.27.0

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.
Files changed (46) hide show
  1. package/dist/index.cjs +3014 -1083
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.mjs +770 -1100
  4. package/dist/index.mjs.map +1 -1
  5. package/dist/main.cjs +3745 -1565
  6. package/dist/main.cjs.map +1 -1
  7. package/dist/main.mjs +1202 -1508
  8. package/dist/main.mjs.map +1 -1
  9. package/dist/metadata-file-Djz8vanJ.js +2514 -0
  10. package/dist/metadata-file-Djz8vanJ.js.map +1 -0
  11. package/dist/packageMetadata-B3dAY9Pw.js +29 -0
  12. package/dist/packageMetadata-B3dAY9Pw.js.map +1 -0
  13. package/dist/packageMetadata-BZlXZqjz.cjs +15 -0
  14. package/dist/packageMetadata-BwJnVnNu.cjs +55 -0
  15. package/dist/packageMetadata-BwJnVnNu.cjs.map +1 -0
  16. package/dist/src/analyzer.d.ts +38 -0
  17. package/dist/src/analyzer.d.ts.map +1 -0
  18. package/dist/src/cli-internal.d.ts +62 -0
  19. package/dist/src/cli-internal.d.ts.map +1 -0
  20. package/dist/src/cli.d.ts +13 -0
  21. package/dist/src/cli.d.ts.map +1 -0
  22. package/dist/src/default-import-fix.d.ts +22 -0
  23. package/dist/src/default-import-fix.d.ts.map +1 -0
  24. package/dist/src/fast-tags.d.ts +42 -0
  25. package/dist/src/fast-tags.d.ts.map +1 -0
  26. package/dist/src/generated/packageMetadata.d.ts +18 -0
  27. package/dist/src/generated/packageMetadata.d.ts.map +1 -0
  28. package/dist/src/git-operations.d.ts +69 -0
  29. package/dist/src/git-operations.d.ts.map +1 -0
  30. package/dist/src/index.d.ts +14 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/internal.d.ts +115 -0
  33. package/dist/src/internal.d.ts.map +1 -0
  34. package/dist/{main.d.ts → src/main.d.ts} +5 -3
  35. package/dist/src/main.d.ts.map +1 -0
  36. package/dist/src/metadata-file.d.ts +22 -0
  37. package/dist/src/metadata-file.d.ts.map +1 -0
  38. package/dist/{index.d.ts → src/types.d.ts} +72 -85
  39. package/dist/src/types.d.ts.map +1 -0
  40. package/dist/src/vite-plugin.d.ts +26 -0
  41. package/dist/src/vite-plugin.d.ts.map +1 -0
  42. package/package.json +19 -19
  43. package/dist/metadata-file-3UqfivKm.cjs +0 -2385
  44. package/dist/metadata-file-3UqfivKm.cjs.map +0 -1
  45. package/dist/metadata-file-CV4Jy39y.js +0 -2369
  46. package/dist/metadata-file-CV4Jy39y.js.map +0 -1
package/dist/main.mjs CHANGED
@@ -1,1090 +1,932 @@
1
1
  #!/usr/bin/env node
2
2
  /*!
3
- * name: screw-up
4
- * version: 1.25.0
5
- * description: Simply package metadata inserter on Vite plugin
6
- * author: Kouji Matsui (@kekyo@mi.kekyo.net)
7
- * license: MIT
8
- * repository.url: https://github.com/kekyo/screw-up.git
9
- * git.commit.hash: 8275b6db6558235b0fe73f99368acf3f9a6e1b29
10
- */
11
-
12
- import { join, dirname, resolve, isAbsolute } from "path";
13
- import { createWriteStream, createReadStream, existsSync, statSync } from "fs";
14
- import { mkdir, writeFile, stat, readdir, mkdtemp, copyFile, rm, readFile } from "fs/promises";
3
+ * name: screw-up
4
+ * version: 1.27.0
5
+ * description: Simply package metadata inserter on Vite plugin
6
+ * author: Kouji Matsui (@kekyo@mi.kekyo.net)
7
+ * license: MIT
8
+ * repository.url: https://github.com/kekyo/screw-up.git
9
+ * git.commit.hash: eb1634007fc12b0ddd13928d7688758bdfe32624
10
+ */
11
+ import { a as collectWorkspaceSiblings, c as replacePeerDependenciesWildcards, d as require_dist, i as getFetchGitMetadata, l as resolvePackageMetadata, n as generateMetadataFileContent, o as createConsoleLogger, p as __toESM, r as writeFileIfChanged, s as findWorkspaceRoot, t as ensureMetadataGitignore, u as resolveRawPackageJsonObject } from "./metadata-file-Djz8vanJ.js";
12
+ import { n as name } from "./packageMetadata-B3dAY9Pw.js";
13
+ import { copyFile, mkdir, mkdtemp, readFile, readdir, rm, stat, writeFile } from "fs/promises";
14
+ import { createReadStream, createWriteStream, existsSync, statSync } from "fs";
15
+ import { dirname, isAbsolute, join, resolve } from "path";
16
+ import { glob } from "glob";
15
17
  import { spawn } from "child_process";
16
18
  import { tmpdir } from "os";
17
19
  import { Readable } from "stream";
18
20
  import { createGunzip, createGzip } from "zlib";
19
21
  import { pipeline } from "stream/promises";
20
- import { glob } from "glob";
21
- import { d as resolveRawPackageJsonObject, f as findWorkspaceRoot, h as collectWorkspaceSiblings, i as replacePeerDependenciesWildcards, g as getFetchGitMetadata, _ as __screwUpDefaultImportModule0, r as resolvePackageMetadata, b as generateMetadataFileContent, w as writeFileIfChanged, e as ensureMetadataGitignore, c as createConsoleLogger, n as name } from "./metadata-file-CV4Jy39y.js";
22
- const MAX_NAME = 100;
23
- const MAX_PREFIX = 155;
24
- const getUName = (candidateName, candidateId, reflectStat) => {
25
- return candidateName != null ? candidateName : reflectStat === "all" ? candidateId.toString() : "root";
22
+ //#region node_modules/tar-vern/dist/index.js
23
+ /*!
24
+ * name: tar-vern
25
+ * version: 1.3.0
26
+ * description: Tape archiver library for Typescript
27
+ * author: Kouji Matsui (@kekyo@mi.kekyo.net)
28
+ * license: MIT
29
+ * repository.url: https://github.com/kekyo/tar-vern.git
30
+ * git.commit.hash: 7ac8b1f258e17c93767650ef047a2db9f0ffd417
31
+ */
32
+ var MAX_NAME = 100;
33
+ var MAX_PREFIX = 155;
34
+ var getUName = (candidateName, candidateId, reflectStat) => {
35
+ return candidateName !== null && candidateName !== void 0 ? candidateName : reflectStat === "all" ? candidateId.toString() : "root";
26
36
  };
27
- const getBuffer = (data) => {
28
- return Buffer.isBuffer(data) ? data : Buffer.from(data, "utf8");
37
+ var getBuffer = (data) => {
38
+ return Buffer.isBuffer(data) ? data : Buffer.from(data, "utf8");
29
39
  };
30
- const createDirectoryItem = async (path, reflectStat, options, signal) => {
31
- var _a, _b, _c, _d, _e, _f, _g, _h;
32
- const rs = reflectStat;
33
- if (options == null ? void 0 : options.directoryPath) {
34
- const stats = await stat(options.directoryPath);
35
- const mode = (_a = options == null ? void 0 : options.mode) != null ? _a : stats.mode;
36
- const uid = (_b = options == null ? void 0 : options.uid) != null ? _b : stats.uid;
37
- const gid = (_c = options == null ? void 0 : options.gid) != null ? _c : stats.gid;
38
- const date = (_d = options == null ? void 0 : options.date) != null ? _d : stats.mtime;
39
- const uname = getUName(options == null ? void 0 : options.uname, stats.uid, rs);
40
- const gname = getUName(options == null ? void 0 : options.gname, stats.gid, rs);
41
- return {
42
- kind: "directory",
43
- path,
44
- mode,
45
- uname,
46
- gname,
47
- uid,
48
- gid,
49
- date
50
- };
51
- } else {
52
- const mode = (_e = options == null ? void 0 : options.mode) != null ? _e : 493;
53
- const uid = (_f = options == null ? void 0 : options.uid) != null ? _f : 0;
54
- const gid = (_g = options == null ? void 0 : options.gid) != null ? _g : 0;
55
- const date = (_h = options == null ? void 0 : options.date) != null ? _h : /* @__PURE__ */ new Date();
56
- const uname = getUName(options == null ? void 0 : options.uname, void 0, rs);
57
- const gname = getUName(options == null ? void 0 : options.gname, void 0, rs);
58
- return {
59
- kind: "directory",
60
- path,
61
- mode,
62
- uname,
63
- gname,
64
- uid,
65
- gid,
66
- date
67
- };
68
- }
40
+ var createDirectoryItem = async (path, reflectStat, options, signal) => {
41
+ const rs = reflectStat !== null && reflectStat !== void 0 ? reflectStat : "none";
42
+ if (rs !== "none" && (options === null || options === void 0 ? void 0 : options.directoryPath)) {
43
+ var _options$mode, _options$uid, _options$gid, _options$date;
44
+ signal === null || signal === void 0 || signal.throwIfAborted();
45
+ const stats = await stat(options.directoryPath);
46
+ const mode = (_options$mode = options === null || options === void 0 ? void 0 : options.mode) !== null && _options$mode !== void 0 ? _options$mode : stats.mode;
47
+ const uid = (_options$uid = options === null || options === void 0 ? void 0 : options.uid) !== null && _options$uid !== void 0 ? _options$uid : stats.uid;
48
+ const gid = (_options$gid = options === null || options === void 0 ? void 0 : options.gid) !== null && _options$gid !== void 0 ? _options$gid : stats.gid;
49
+ const date = (_options$date = options === null || options === void 0 ? void 0 : options.date) !== null && _options$date !== void 0 ? _options$date : stats.mtime;
50
+ return {
51
+ kind: "directory",
52
+ path,
53
+ mode,
54
+ uname: getUName(options === null || options === void 0 ? void 0 : options.uname, stats.uid, rs),
55
+ gname: getUName(options === null || options === void 0 ? void 0 : options.gname, stats.gid, rs),
56
+ uid,
57
+ gid,
58
+ date
59
+ };
60
+ } else {
61
+ var _options$mode2, _options$uid2, _options$gid2, _options$date2;
62
+ const mode = (_options$mode2 = options === null || options === void 0 ? void 0 : options.mode) !== null && _options$mode2 !== void 0 ? _options$mode2 : 493;
63
+ const uid = (_options$uid2 = options === null || options === void 0 ? void 0 : options.uid) !== null && _options$uid2 !== void 0 ? _options$uid2 : 0;
64
+ const gid = (_options$gid2 = options === null || options === void 0 ? void 0 : options.gid) !== null && _options$gid2 !== void 0 ? _options$gid2 : 0;
65
+ const date = (_options$date2 = options === null || options === void 0 ? void 0 : options.date) !== null && _options$date2 !== void 0 ? _options$date2 : /* @__PURE__ */ new Date();
66
+ return {
67
+ kind: "directory",
68
+ path,
69
+ mode,
70
+ uname: getUName(options === null || options === void 0 ? void 0 : options.uname, void 0, rs),
71
+ gname: getUName(options === null || options === void 0 ? void 0 : options.gname, void 0, rs),
72
+ uid,
73
+ gid,
74
+ date
75
+ };
76
+ }
69
77
  };
70
- const createReadableFileItem = async (path, readable, options, signal) => {
71
- var _a, _b, _c, _d, _e, _f;
72
- const mode = (_a = options == null ? void 0 : options.mode) != null ? _a : 420;
73
- const uid = (_b = options == null ? void 0 : options.uid) != null ? _b : 0;
74
- const gid = (_c = options == null ? void 0 : options.gid) != null ? _c : 0;
75
- const date = (_d = options == null ? void 0 : options.date) != null ? _d : /* @__PURE__ */ new Date();
76
- const uname = (_e = options == null ? void 0 : options.uname) != null ? _e : "root";
77
- const gname = (_f = options == null ? void 0 : options.gname) != null ? _f : "root";
78
- let length = options == null ? void 0 : options.length;
79
- if (!length) {
80
- const chunks = [];
81
- length = 0;
82
- for await (const chunk of readable) {
83
- const buffer = getBuffer(chunk);
84
- chunks.push(buffer);
85
- length += buffer.length;
86
- }
87
- return {
88
- kind: "file",
89
- path,
90
- mode,
91
- uname,
92
- gname,
93
- uid,
94
- gid,
95
- date,
96
- content: {
97
- kind: "readable",
98
- length,
99
- readable: Readable.from(chunks, { signal })
100
- }
101
- };
102
- } else {
103
- return {
104
- kind: "file",
105
- path,
106
- mode,
107
- uname,
108
- gname,
109
- uid,
110
- gid,
111
- date,
112
- content: {
113
- kind: "readable",
114
- length,
115
- readable
116
- }
117
- };
118
- }
78
+ var createReadableFileItem = async (path, readable, options, signal) => {
79
+ var _options$mode4, _options$uid4, _options$gid4, _options$date4, _options$uname2, _options$gname2;
80
+ const mode = (_options$mode4 = options === null || options === void 0 ? void 0 : options.mode) !== null && _options$mode4 !== void 0 ? _options$mode4 : 420;
81
+ const uid = (_options$uid4 = options === null || options === void 0 ? void 0 : options.uid) !== null && _options$uid4 !== void 0 ? _options$uid4 : 0;
82
+ const gid = (_options$gid4 = options === null || options === void 0 ? void 0 : options.gid) !== null && _options$gid4 !== void 0 ? _options$gid4 : 0;
83
+ const date = (_options$date4 = options === null || options === void 0 ? void 0 : options.date) !== null && _options$date4 !== void 0 ? _options$date4 : /* @__PURE__ */ new Date();
84
+ const uname = (_options$uname2 = options === null || options === void 0 ? void 0 : options.uname) !== null && _options$uname2 !== void 0 ? _options$uname2 : "root";
85
+ const gname = (_options$gname2 = options === null || options === void 0 ? void 0 : options.gname) !== null && _options$gname2 !== void 0 ? _options$gname2 : "root";
86
+ let length = options === null || options === void 0 ? void 0 : options.length;
87
+ if (!length) {
88
+ const chunks = [];
89
+ length = 0;
90
+ for await (const chunk of readable) {
91
+ signal === null || signal === void 0 || signal.throwIfAborted();
92
+ const buffer = getBuffer(chunk);
93
+ chunks.push(buffer);
94
+ length += buffer.length;
95
+ }
96
+ return {
97
+ kind: "file",
98
+ path,
99
+ mode,
100
+ uname,
101
+ gname,
102
+ uid,
103
+ gid,
104
+ date,
105
+ content: {
106
+ kind: "readable",
107
+ length,
108
+ readable: Readable.from(chunks, { signal })
109
+ }
110
+ };
111
+ } else return {
112
+ kind: "file",
113
+ path,
114
+ mode,
115
+ uname,
116
+ gname,
117
+ uid,
118
+ gid,
119
+ date,
120
+ content: {
121
+ kind: "readable",
122
+ length,
123
+ readable
124
+ }
125
+ };
119
126
  };
120
- const createReadFileItem = async (path, filePath, reflectStat, options, signal) => {
121
- const rs = reflectStat;
122
- const stats = await stat(filePath);
123
- const reader = createReadStream(filePath, { signal });
124
- const mode = stats.mode;
125
- const uid = stats.uid;
126
- const gid = stats.gid;
127
- const date = stats.mtime;
128
- const uname = getUName(options == null ? void 0 : options.uname, stats.uid, rs);
129
- const gname = getUName(options == null ? void 0 : options.gname, stats.gid, rs);
130
- return await createReadableFileItem(path, reader, {
131
- length: stats.size,
132
- mode,
133
- uname,
134
- gname,
135
- uid,
136
- gid,
137
- date
138
- }, signal);
127
+ var createReadFileItem = async (path, filePath, reflectStat, options, signal) => {
128
+ var _options$mode6, _options$uid6, _options$gid6, _options$date6;
129
+ const rs = reflectStat !== null && reflectStat !== void 0 ? reflectStat : "exceptName";
130
+ signal === null || signal === void 0 || signal.throwIfAborted();
131
+ const stats = await stat(filePath);
132
+ const reader = createReadStream(filePath, { signal });
133
+ const mode = (_options$mode6 = options === null || options === void 0 ? void 0 : options.mode) !== null && _options$mode6 !== void 0 ? _options$mode6 : rs !== "none" ? stats.mode : void 0;
134
+ const uid = (_options$uid6 = options === null || options === void 0 ? void 0 : options.uid) !== null && _options$uid6 !== void 0 ? _options$uid6 : rs !== "none" ? stats.uid : void 0;
135
+ const gid = (_options$gid6 = options === null || options === void 0 ? void 0 : options.gid) !== null && _options$gid6 !== void 0 ? _options$gid6 : rs !== "none" ? stats.gid : void 0;
136
+ const date = (_options$date6 = options === null || options === void 0 ? void 0 : options.date) !== null && _options$date6 !== void 0 ? _options$date6 : rs !== "none" ? stats.mtime : void 0;
137
+ const uname = getUName(options === null || options === void 0 ? void 0 : options.uname, stats.uid, rs);
138
+ const gname = getUName(options === null || options === void 0 ? void 0 : options.gname, stats.gid, rs);
139
+ return await createReadableFileItem(path, reader, {
140
+ length: stats.size,
141
+ mode,
142
+ uname,
143
+ gname,
144
+ uid,
145
+ gid,
146
+ date
147
+ }, signal);
139
148
  };
140
- const storeReaderToFile = async (reader, path, signal) => {
141
- const writer = createWriteStream(path, { signal });
142
- await pipeline(reader, writer, { signal });
149
+ var storeReaderToFile = async (reader, path, signal) => {
150
+ await pipeline(reader, createWriteStream(path, { signal }), { signal });
143
151
  };
144
- const getAllFilesInDirectory = async (baseDir, signal) => {
145
- const collectFiles = async (currentDir, relativePath) => {
146
- try {
147
- const entries = await readdir(currentDir, { withFileTypes: true });
148
- const result = [];
149
- const tasks = entries.map(async (entry) => {
150
- signal == null ? void 0 : signal.throwIfAborted();
151
- const entryRelativePath = join(relativePath, entry.name);
152
- if (entry.isDirectory()) {
153
- const entryFullPath = join(currentDir, entry.name);
154
- const directoryContents = await collectFiles(entryFullPath, entryRelativePath);
155
- return [entryRelativePath, ...directoryContents];
156
- } else {
157
- return [entryRelativePath];
158
- }
159
- });
160
- const allResults = await Promise.all(tasks);
161
- for (const entryResults of allResults) {
162
- result.push(...entryResults);
163
- }
164
- return result;
165
- } catch (error) {
166
- console.warn(`Warning: Could not read directory ${currentDir}:`, error);
167
- return [];
168
- }
169
- };
170
- return await collectFiles(baseDir, "");
152
+ var getAllFilesInDirectory = async (baseDir, signal) => {
153
+ const collectFiles = async (currentDir, relativePath) => {
154
+ signal === null || signal === void 0 || signal.throwIfAborted();
155
+ try {
156
+ const entries = await readdir(currentDir, { withFileTypes: true });
157
+ const result = [];
158
+ const tasks = entries.map(async (entry) => {
159
+ signal === null || signal === void 0 || signal.throwIfAborted();
160
+ const entryRelativePath = join(relativePath, entry.name);
161
+ if (entry.isDirectory()) return [entryRelativePath, ...await collectFiles(join(currentDir, entry.name), entryRelativePath)];
162
+ else return [entryRelativePath];
163
+ });
164
+ const allResults = await Promise.all(tasks);
165
+ for (const entryResults of allResults) result.push(...entryResults);
166
+ return result;
167
+ } catch (error) {
168
+ console.warn(`Warning: Could not read directory ${currentDir}:`, error);
169
+ return [];
170
+ }
171
+ };
172
+ return await collectFiles(baseDir, "");
171
173
  };
172
- const createEntryItemGenerator = async function* (baseDir, relativePaths, includeDirectory, reflectStat, signal) {
173
- const rs = "exceptName";
174
- const includeDir = true;
175
- const pathsToProcess = await getAllFilesInDirectory(baseDir, signal);
176
- for (const relativePath of pathsToProcess) {
177
- const fsPath = join(baseDir, relativePath);
178
- try {
179
- signal == null ? void 0 : signal.throwIfAborted();
180
- const stats = await stat(fsPath);
181
- if (includeDir && stats.isDirectory()) {
182
- yield await createDirectoryItem(relativePath, rs, {
183
- directoryPath: fsPath
184
- }, signal);
185
- } else if (stats.isFile()) {
186
- yield await createReadFileItem(relativePath, fsPath, rs, void 0, signal);
187
- }
188
- } catch (error) {
189
- console.warn(`Warning: Could not access ${fsPath}:`, error);
190
- continue;
191
- }
192
- }
174
+ var createEntryItemGenerator = async function* (baseDir, relativePaths, includeDirectory, reflectStat, signal) {
175
+ const rs = reflectStat !== null && reflectStat !== void 0 ? reflectStat : "exceptName";
176
+ const includeDir = includeDirectory !== null && includeDirectory !== void 0 ? includeDirectory : true;
177
+ const pathsToProcess = relativePaths !== null && relativePaths !== void 0 ? relativePaths : await getAllFilesInDirectory(baseDir, signal);
178
+ for (const relativePath of pathsToProcess) {
179
+ signal === null || signal === void 0 || signal.throwIfAborted();
180
+ const fsPath = join(baseDir, relativePath);
181
+ try {
182
+ signal === null || signal === void 0 || signal.throwIfAborted();
183
+ const stats = await stat(fsPath);
184
+ if (includeDir && stats.isDirectory()) yield await createDirectoryItem(relativePath, rs, { directoryPath: fsPath }, signal);
185
+ else if (stats.isFile()) yield await createReadFileItem(relativePath, fsPath, rs, void 0, signal);
186
+ } catch (error) {
187
+ console.warn(`Warning: Could not access ${fsPath}:`, error);
188
+ continue;
189
+ }
190
+ }
193
191
  };
194
- const extractTo = async (iterator, basePath, signal) => {
195
- for await (const entry of iterator) {
196
- const targetPath = join(basePath, entry.path);
197
- if (entry.kind === "directory") {
198
- try {
199
- signal == null ? void 0 : signal.throwIfAborted();
200
- await mkdir(targetPath, { recursive: true, mode: entry.mode });
201
- } catch (error) {
202
- if (error.code !== "EEXIST") {
203
- throw error;
204
- }
205
- }
206
- } else if (entry.kind === "file") {
207
- const parentDir = dirname(targetPath);
208
- await mkdir(parentDir, { recursive: true });
209
- const fileEntry = entry;
210
- const content = await fileEntry.getContent("buffer");
211
- await writeFile(targetPath, content, { mode: entry.mode, signal });
212
- }
213
- }
192
+ var extractTo = async (iterator, basePath, signal) => {
193
+ for await (const entry of iterator) {
194
+ signal === null || signal === void 0 || signal.throwIfAborted();
195
+ const targetPath = join(basePath, entry.path);
196
+ if (entry.kind === "directory") try {
197
+ signal === null || signal === void 0 || signal.throwIfAborted();
198
+ await mkdir(targetPath, {
199
+ recursive: true,
200
+ mode: entry.mode
201
+ });
202
+ } catch (error) {
203
+ if (error.code !== "EEXIST") throw error;
204
+ }
205
+ else if (entry.kind === "file") {
206
+ const parentDir = dirname(targetPath);
207
+ signal === null || signal === void 0 || signal.throwIfAborted();
208
+ await mkdir(parentDir, { recursive: true });
209
+ await writeFile(targetPath, await entry.getContent("buffer"), {
210
+ mode: entry.mode,
211
+ signal
212
+ });
213
+ }
214
+ }
214
215
  };
215
- const utf8ByteLength = (str) => {
216
- return Buffer.byteLength(str, "utf8");
216
+ var utf8ByteLength = (str) => {
217
+ return Buffer.byteLength(str, "utf8");
217
218
  };
218
- const truncateUtf8Safe = (str, maxBytes) => {
219
- let total = 0;
220
- let i = 0;
221
- while (i < str.length) {
222
- const codePoint = str.codePointAt(i);
223
- const char = String.fromCodePoint(codePoint);
224
- const charBytes = Buffer.byteLength(char, "utf8");
225
- if (total + charBytes > maxBytes) break;
226
- total += charBytes;
227
- i += char.length;
228
- }
229
- return str.slice(0, i);
219
+ var truncateUtf8Safe = (str, maxBytes) => {
220
+ let total = 0;
221
+ let i = 0;
222
+ while (i < str.length) {
223
+ const codePoint = str.codePointAt(i);
224
+ const char = String.fromCodePoint(codePoint);
225
+ const charBytes = Buffer.byteLength(char, "utf8");
226
+ if (total + charBytes > maxBytes) break;
227
+ total += charBytes;
228
+ i += char.length;
229
+ }
230
+ return str.slice(0, i);
230
231
  };
231
- const splitPath = (path) => {
232
- var _a;
233
- if (utf8ByteLength(path) <= MAX_NAME) {
234
- return { prefix: "", name: path };
235
- }
236
- const parts = path.split("/");
237
- let name2 = (_a = parts.pop()) != null ? _a : "";
238
- let prefix = parts.join("/");
239
- if (utf8ByteLength(name2) > MAX_NAME) {
240
- name2 = truncateUtf8Safe(name2, MAX_NAME);
241
- }
242
- while (utf8ByteLength(prefix) > MAX_PREFIX) {
243
- prefix = truncateUtf8Safe(prefix, MAX_PREFIX);
244
- }
245
- return { prefix, name: name2 };
232
+ var splitPath = (path) => {
233
+ var _parts$pop;
234
+ if (utf8ByteLength(path) <= MAX_NAME) return {
235
+ prefix: "",
236
+ name: path
237
+ };
238
+ const parts = path.split("/");
239
+ let name = (_parts$pop = parts.pop()) !== null && _parts$pop !== void 0 ? _parts$pop : "";
240
+ let prefix = parts.join("/");
241
+ if (utf8ByteLength(name) > MAX_NAME) name = truncateUtf8Safe(name, MAX_NAME);
242
+ while (utf8ByteLength(prefix) > MAX_PREFIX) prefix = truncateUtf8Safe(prefix, MAX_PREFIX);
243
+ return {
244
+ prefix,
245
+ name
246
+ };
246
247
  };
247
- const getOctalBytes = (value, length) => {
248
- const str = value.toString(8).padStart(length - 1, "0") + "\0";
249
- return Buffer.from(str, "ascii");
248
+ var getOctalBytes = (value, length) => {
249
+ const str = value.toString(8).padStart(length - 1, "0") + "\0";
250
+ return Buffer.from(str, "ascii");
250
251
  };
251
- const getPaddedBytes = (buffer) => {
252
- const extra = buffer.length % 512;
253
- if (extra === 0) {
254
- return buffer;
255
- } else {
256
- return Buffer.concat([buffer, Buffer.alloc(512 - extra, 0)]);
257
- }
252
+ var getPaddedBytes = (buffer) => {
253
+ const extra = buffer.length % 512;
254
+ if (extra === 0) return buffer;
255
+ else return Buffer.concat([buffer, Buffer.alloc(512 - extra, 0)]);
258
256
  };
259
- const terminatorBytes = Buffer.alloc(1024, 0);
260
- const createTarHeader = (type, path, size, mode, uname, gname, uid, gid, date) => {
261
- const buffer = Buffer.alloc(512, 0);
262
- const { name: name2, prefix } = splitPath(path);
263
- buffer.write(name2, 0, 100, "utf8");
264
- getOctalBytes(mode & 4095, 8).copy(buffer, 100);
265
- getOctalBytes(uid, 8).copy(buffer, 108);
266
- getOctalBytes(gid, 8).copy(buffer, 116);
267
- getOctalBytes(size, 12).copy(buffer, 124);
268
- getOctalBytes(Math.floor(date.getTime() / 1e3), 12).copy(buffer, 136);
269
- Buffer.from(" ", "ascii").copy(buffer, 148);
270
- if (type === "file") {
271
- buffer.write("0", 156, 1, "ascii");
272
- } else {
273
- buffer.write("5", 156, 1, "ascii");
274
- }
275
- buffer.write("ustar\0", 257, 6, "ascii");
276
- buffer.write("00", 263, 2, "ascii");
277
- buffer.write(uname, 265, 32, "utf8");
278
- buffer.write(gname, 297, 32, "utf8");
279
- buffer.write(prefix, 345, 155, "utf8");
280
- let sum = 0;
281
- for (let i = 0; i < 512; i++) {
282
- sum += buffer[i];
283
- }
284
- getOctalBytes(sum, 8).copy(buffer, 148);
285
- return buffer;
257
+ var terminatorBytes = Buffer.alloc(1024, 0);
258
+ var createTarHeader = (type, path, size, mode, uname, gname, uid, gid, date) => {
259
+ const buffer = Buffer.alloc(512, 0);
260
+ const { name, prefix } = splitPath(path);
261
+ buffer.write(name, 0, 100, "utf8");
262
+ getOctalBytes(mode & 4095, 8).copy(buffer, 100);
263
+ getOctalBytes(uid, 8).copy(buffer, 108);
264
+ getOctalBytes(gid, 8).copy(buffer, 116);
265
+ getOctalBytes(size, 12).copy(buffer, 124);
266
+ getOctalBytes(Math.floor(date.getTime() / 1e3), 12).copy(buffer, 136);
267
+ Buffer.from(" ", "ascii").copy(buffer, 148);
268
+ if (type === "file") buffer.write("0", 156, 1, "ascii");
269
+ else buffer.write("5", 156, 1, "ascii");
270
+ buffer.write("ustar\0", 257, 6, "ascii");
271
+ buffer.write("00", 263, 2, "ascii");
272
+ buffer.write(uname, 265, 32, "utf8");
273
+ buffer.write(gname, 297, 32, "utf8");
274
+ buffer.write(prefix, 345, 155, "utf8");
275
+ let sum = 0;
276
+ for (let i = 0; i < 512; i++) sum += buffer[i];
277
+ getOctalBytes(sum, 8).copy(buffer, 148);
278
+ return buffer;
286
279
  };
287
- const createTarPacker = (entryItemGenerator, compressionType, signal) => {
288
- const entryItemIterator = async function* () {
289
- for await (const entryItem of entryItemGenerator) {
290
- switch (entryItem.kind) {
291
- // Entry is a file
292
- case "file": {
293
- const entryItemContent = entryItem.content;
294
- if (typeof entryItemContent === "string" || Buffer.isBuffer(entryItemContent)) {
295
- const contentBytes = getBuffer(entryItemContent);
296
- const tarHeaderBytes = createTarHeader(
297
- "file",
298
- entryItem.path,
299
- contentBytes.length,
300
- entryItem.mode,
301
- entryItem.uname,
302
- entryItem.gname,
303
- entryItem.uid,
304
- entryItem.gid,
305
- entryItem.date
306
- );
307
- yield tarHeaderBytes;
308
- const totalPaddedContentBytes = getPaddedBytes(contentBytes);
309
- yield totalPaddedContentBytes;
310
- } else {
311
- const content = entryItemContent;
312
- const tarHeaderBytes = createTarHeader(
313
- "file",
314
- entryItem.path,
315
- content.length,
316
- entryItem.mode,
317
- entryItem.uname,
318
- entryItem.gname,
319
- entryItem.uid,
320
- entryItem.gid,
321
- entryItem.date
322
- );
323
- yield tarHeaderBytes;
324
- let position = 0;
325
- switch (content.kind) {
326
- // Content is a generator
327
- case "generator": {
328
- for await (const contentBytes of content.generator) {
329
- yield contentBytes;
330
- position += contentBytes.length;
331
- }
332
- break;
333
- }
334
- // Content is a readable stream
335
- case "readable": {
336
- for await (const chunk of content.readable) {
337
- const contentBytes = getBuffer(chunk);
338
- yield contentBytes;
339
- position += contentBytes.length;
340
- }
341
- break;
342
- }
343
- }
344
- if (position % 512 !== 0) {
345
- yield Buffer.alloc(512 - position % 512, 0);
346
- }
347
- }
348
- break;
349
- }
350
- // Entry is a directory
351
- case "directory": {
352
- const tarHeaderBytes = createTarHeader(
353
- "directory",
354
- entryItem.path,
355
- 0,
356
- entryItem.mode,
357
- entryItem.uname,
358
- entryItem.gname,
359
- entryItem.uid,
360
- entryItem.gid,
361
- entryItem.date
362
- );
363
- yield tarHeaderBytes;
364
- break;
365
- }
366
- }
367
- }
368
- yield terminatorBytes;
369
- };
370
- const ct = compressionType;
371
- switch (ct) {
372
- // No compression
373
- case "none": {
374
- return Readable.from(entryItemIterator(), { signal });
375
- }
376
- // Gzip compression
377
- case "gzip": {
378
- const gzipStream = createGzip({ level: 9 });
379
- const entryItemStream = Readable.from(entryItemIterator(), { signal });
380
- entryItemStream.pipe(gzipStream);
381
- return gzipStream;
382
- }
383
- }
280
+ var createTarPacker = (entryItemGenerator, compressionType, signal) => {
281
+ const entryItemIterator = async function* () {
282
+ for await (const entryItem of entryItemGenerator) {
283
+ signal === null || signal === void 0 || signal.throwIfAborted();
284
+ switch (entryItem.kind) {
285
+ case "file": {
286
+ const entryItemContent = entryItem.content;
287
+ if (typeof entryItemContent === "string" || Buffer.isBuffer(entryItemContent)) {
288
+ const contentBytes = getBuffer(entryItemContent);
289
+ yield createTarHeader("file", entryItem.path, contentBytes.length, entryItem.mode, entryItem.uname, entryItem.gname, entryItem.uid, entryItem.gid, entryItem.date);
290
+ yield getPaddedBytes(contentBytes);
291
+ } else {
292
+ const content = entryItemContent;
293
+ yield createTarHeader("file", entryItem.path, content.length, entryItem.mode, entryItem.uname, entryItem.gname, entryItem.uid, entryItem.gid, entryItem.date);
294
+ let position = 0;
295
+ switch (content.kind) {
296
+ case "generator":
297
+ for await (const contentBytes of content.generator) {
298
+ signal === null || signal === void 0 || signal.throwIfAborted();
299
+ yield contentBytes;
300
+ position += contentBytes.length;
301
+ }
302
+ break;
303
+ case "readable":
304
+ for await (const chunk of content.readable) {
305
+ signal === null || signal === void 0 || signal.throwIfAborted();
306
+ const contentBytes = getBuffer(chunk);
307
+ yield contentBytes;
308
+ position += contentBytes.length;
309
+ }
310
+ break;
311
+ }
312
+ if (position % 512 !== 0) {
313
+ signal === null || signal === void 0 || signal.throwIfAborted();
314
+ yield Buffer.alloc(512 - position % 512, 0);
315
+ }
316
+ }
317
+ break;
318
+ }
319
+ case "directory":
320
+ yield createTarHeader("directory", entryItem.path, 0, entryItem.mode, entryItem.uname, entryItem.gname, entryItem.uid, entryItem.gid, entryItem.date);
321
+ break;
322
+ }
323
+ }
324
+ yield terminatorBytes;
325
+ };
326
+ switch (compressionType !== null && compressionType !== void 0 ? compressionType : "none") {
327
+ case "none": return Readable.from(entryItemIterator(), { signal });
328
+ case "gzip": {
329
+ const gzipStream = createGzip({ level: 9 });
330
+ Readable.from(entryItemIterator(), { signal }).pipe(gzipStream);
331
+ return gzipStream;
332
+ }
333
+ }
384
334
  };
385
- const parseOctalBytes = (buffer, offset, length) => {
386
- const str = buffer.subarray(offset, offset + length).toString("ascii").replace(/\0/g, "").trim();
387
- return str ? parseInt(str, 8) : 0;
335
+ var parseOctalBytes = (buffer, offset, length) => {
336
+ const str = buffer.subarray(offset, offset + length).toString("ascii").replace(/\0/g, "").trim();
337
+ return str ? parseInt(str, 8) : 0;
388
338
  };
389
- const parseString = (buffer, offset, length) => {
390
- return buffer.subarray(offset, offset + length).toString("utf8").replace(/\0/g, "").trim();
339
+ var parseString = (buffer, offset, length) => {
340
+ return buffer.subarray(offset, offset + length).toString("utf8").replace(/\0/g, "").trim();
391
341
  };
392
- const readExactBytes = async (iterator, size, signal) => {
393
- var _a;
394
- const chunks = [];
395
- let totalRead = 0;
396
- while (totalRead < size) {
397
- const { value, done } = await iterator.next();
398
- if (done) {
399
- if (totalRead === 0) {
400
- return void 0;
401
- } else {
402
- throw new Error(`Unexpected end of stream: expected ${size} bytes, got ${totalRead} bytes`);
403
- }
404
- }
405
- const chunk = getBuffer(value);
406
- const needed = size - totalRead;
407
- if (chunk.length <= needed) {
408
- chunks.push(chunk);
409
- totalRead += chunk.length;
410
- } else {
411
- chunks.push(chunk.subarray(0, needed));
412
- await ((_a = iterator.return) == null ? void 0 : _a.call(iterator, chunk.subarray(needed)));
413
- totalRead = size;
414
- }
415
- }
416
- return Buffer.concat(chunks, size);
342
+ var readExactBytes = async (iterator, size, signal) => {
343
+ const chunks = [];
344
+ let totalRead = 0;
345
+ while (totalRead < size) {
346
+ signal === null || signal === void 0 || signal.throwIfAborted();
347
+ const { value, done } = await iterator.next();
348
+ if (done) if (totalRead === 0) return;
349
+ else throw new Error(`Unexpected end of stream: expected ${size} bytes, got ${totalRead} bytes`);
350
+ const chunk = getBuffer(value);
351
+ const needed = size - totalRead;
352
+ if (chunk.length <= needed) {
353
+ chunks.push(chunk);
354
+ totalRead += chunk.length;
355
+ } else {
356
+ var _iterator$return;
357
+ chunks.push(chunk.subarray(0, needed));
358
+ await ((_iterator$return = iterator.return) === null || _iterator$return === void 0 ? void 0 : _iterator$return.call(iterator, chunk.subarray(needed)));
359
+ totalRead = size;
360
+ }
361
+ }
362
+ return Buffer.concat(chunks, size);
417
363
  };
418
- const skipExactBytes = async (iterator, size, signal) => {
419
- var _a;
420
- let totalSkipped = 0;
421
- while (totalSkipped < size) {
422
- const { value, done } = await iterator.next();
423
- if (done) {
424
- throw new Error(`Unexpected end of stream: expected to skip ${size} bytes, skipped ${totalSkipped} bytes`);
425
- }
426
- const chunk = getBuffer(value);
427
- const needed = size - totalSkipped;
428
- if (chunk.length <= needed) {
429
- totalSkipped += chunk.length;
430
- } else {
431
- await ((_a = iterator.return) == null ? void 0 : _a.call(iterator, chunk.subarray(needed)));
432
- totalSkipped = size;
433
- }
434
- }
364
+ var skipExactBytes = async (iterator, size, signal) => {
365
+ let totalSkipped = 0;
366
+ while (totalSkipped < size) {
367
+ signal === null || signal === void 0 || signal.throwIfAborted();
368
+ const { value, done } = await iterator.next();
369
+ if (done) throw new Error(`Unexpected end of stream: expected to skip ${size} bytes, skipped ${totalSkipped} bytes`);
370
+ const chunk = getBuffer(value);
371
+ const needed = size - totalSkipped;
372
+ if (chunk.length <= needed) totalSkipped += chunk.length;
373
+ else {
374
+ var _iterator$return2;
375
+ await ((_iterator$return2 = iterator.return) === null || _iterator$return2 === void 0 ? void 0 : _iterator$return2.call(iterator, chunk.subarray(needed)));
376
+ totalSkipped = size;
377
+ }
378
+ }
435
379
  };
436
- const skipPaddingBytesTo512Boundary = async (iterator, contentSize, signal) => {
437
- const padding = (512 - contentSize % 512) % 512;
438
- if (padding > 0) {
439
- await skipExactBytes(iterator, padding);
440
- }
380
+ var skipPaddingBytesTo512Boundary = async (iterator, contentSize, signal) => {
381
+ const padding = (512 - contentSize % 512) % 512;
382
+ if (padding > 0) await skipExactBytes(iterator, padding, signal);
441
383
  };
442
- const parseTarHeader = (buffer) => {
443
- if (buffer.every((b) => b === 0)) {
444
- return void 0;
445
- }
446
- const name2 = parseString(buffer, 0, 100);
447
- const mode = parseOctalBytes(buffer, 100, 8);
448
- const uid = parseOctalBytes(buffer, 108, 8);
449
- const gid = parseOctalBytes(buffer, 116, 8);
450
- const size = parseOctalBytes(buffer, 124, 12);
451
- const mtime = new Date(parseOctalBytes(buffer, 136, 12) * 1e3);
452
- const checksum = parseOctalBytes(buffer, 148, 8);
453
- const typeflag = parseString(buffer, 156, 1);
454
- const magic = parseString(buffer, 257, 6);
455
- const uname = parseString(buffer, 265, 32);
456
- const gname = parseString(buffer, 297, 32);
457
- const prefix = parseString(buffer, 345, 155);
458
- if (magic !== "ustar") {
459
- throw new Error(`Invalid tar format: magic="${magic}"`);
460
- }
461
- let calculatedSum = 0;
462
- for (let i = 0; i < 512; i++) {
463
- if (i >= 148 && i < 156) {
464
- calculatedSum += 32;
465
- } else {
466
- calculatedSum += buffer[i];
467
- }
468
- }
469
- if (calculatedSum !== checksum) {
470
- throw new Error(`Invalid checksum: expected ${checksum}, got ${calculatedSum}`);
471
- }
472
- let path = prefix ? `${prefix}/${name2}` : name2;
473
- if (path.endsWith("/")) {
474
- path = path.slice(0, -1);
475
- }
476
- const kind = typeflag === "5" ? "directory" : "file";
477
- return {
478
- kind,
479
- path,
480
- size,
481
- mode,
482
- uid,
483
- gid,
484
- mtime,
485
- uname: uname || uid.toString(),
486
- gname: gname || gid.toString(),
487
- checksum,
488
- consumed: false
489
- };
384
+ var parseTarHeader = (buffer) => {
385
+ if (buffer.every((b) => b === 0)) return;
386
+ const name = parseString(buffer, 0, 100);
387
+ const mode = parseOctalBytes(buffer, 100, 8);
388
+ const uid = parseOctalBytes(buffer, 108, 8);
389
+ const gid = parseOctalBytes(buffer, 116, 8);
390
+ const size = parseOctalBytes(buffer, 124, 12);
391
+ const mtime = /* @__PURE__ */ new Date(parseOctalBytes(buffer, 136, 12) * 1e3);
392
+ const checksum = parseOctalBytes(buffer, 148, 8);
393
+ const typeflag = parseString(buffer, 156, 1);
394
+ const magic = parseString(buffer, 257, 6);
395
+ const uname = parseString(buffer, 265, 32);
396
+ const gname = parseString(buffer, 297, 32);
397
+ const prefix = parseString(buffer, 345, 155);
398
+ if (magic !== "ustar") throw new Error(`Invalid tar format: magic="${magic}"`);
399
+ let calculatedSum = 0;
400
+ for (let i = 0; i < 512; i++) if (i >= 148 && i < 156) calculatedSum += 32;
401
+ else calculatedSum += buffer[i];
402
+ if (calculatedSum !== checksum) throw new Error(`Invalid checksum: expected ${checksum}, got ${calculatedSum}`);
403
+ let path = prefix ? `${prefix}/${name}` : name;
404
+ if (path.endsWith("/")) path = path.slice(0, -1);
405
+ return {
406
+ kind: typeflag === "5" ? "directory" : "file",
407
+ path,
408
+ size,
409
+ mode,
410
+ uid,
411
+ gid,
412
+ mtime,
413
+ uname: uname || uid.toString(),
414
+ gname: gname || gid.toString(),
415
+ checksum,
416
+ consumed: false
417
+ };
490
418
  };
491
- const createBufferedAsyncIterator = (iterable, signal) => {
492
- const buffer = [];
493
- const iterator = iterable[Symbol.asyncIterator]();
494
- return {
495
- next: async () => {
496
- if (buffer.length > 0) {
497
- return { value: buffer.shift(), done: false };
498
- }
499
- return iterator.next();
500
- },
501
- return: async (value) => {
502
- if (value !== void 0) {
503
- buffer.unshift(value);
504
- }
505
- return { value: void 0, done: false };
506
- }
507
- };
419
+ var createBufferedAsyncIterator = (iterable, signal) => {
420
+ const buffer = [];
421
+ const iterator = iterable[Symbol.asyncIterator]();
422
+ return {
423
+ next: async () => {
424
+ signal === null || signal === void 0 || signal.throwIfAborted();
425
+ if (buffer.length > 0) return {
426
+ value: buffer.shift(),
427
+ done: false
428
+ };
429
+ return iterator.next();
430
+ },
431
+ return: async (value) => {
432
+ if (value !== void 0) buffer.unshift(value);
433
+ return {
434
+ value: void 0,
435
+ done: false
436
+ };
437
+ }
438
+ };
508
439
  };
509
- const createReadableFromIterator = (iterator, size, signal, consumedRef) => {
510
- const generator = async function* () {
511
- var _a;
512
- let remainingBytes = size;
513
- while (remainingBytes > 0) {
514
- const { value, done } = await iterator.next();
515
- if (done) {
516
- throw new Error(`Unexpected end of stream: expected ${size} bytes, remaining ${remainingBytes} bytes`);
517
- }
518
- const chunk = getBuffer(value);
519
- if (chunk.length <= remainingBytes) {
520
- remainingBytes -= chunk.length;
521
- yield chunk;
522
- } else {
523
- const needed = chunk.subarray(0, remainingBytes);
524
- const excess = chunk.subarray(remainingBytes);
525
- remainingBytes = 0;
526
- await ((_a = iterator.return) == null ? void 0 : _a.call(iterator, excess));
527
- yield needed;
528
- break;
529
- }
530
- }
531
- await skipPaddingBytesTo512Boundary(iterator, size);
532
- consumedRef.consumed = true;
533
- };
534
- return Readable.from(generator(), { signal });
440
+ var createReadableFromIterator = (iterator, size, signal, consumedRef) => {
441
+ const generator = async function* () {
442
+ let remainingBytes = size;
443
+ while (remainingBytes > 0) {
444
+ signal === null || signal === void 0 || signal.throwIfAborted();
445
+ const { value, done } = await iterator.next();
446
+ if (done) throw new Error(`Unexpected end of stream: expected ${size} bytes, remaining ${remainingBytes} bytes`);
447
+ const chunk = getBuffer(value);
448
+ if (chunk.length <= remainingBytes) {
449
+ remainingBytes -= chunk.length;
450
+ yield chunk;
451
+ } else {
452
+ var _iterator$return3;
453
+ const needed = chunk.subarray(0, remainingBytes);
454
+ const excess = chunk.subarray(remainingBytes);
455
+ remainingBytes = 0;
456
+ await ((_iterator$return3 = iterator.return) === null || _iterator$return3 === void 0 ? void 0 : _iterator$return3.call(iterator, excess));
457
+ yield needed;
458
+ break;
459
+ }
460
+ }
461
+ await skipPaddingBytesTo512Boundary(iterator, size, signal);
462
+ consumedRef.consumed = true;
463
+ };
464
+ return Readable.from(generator(), { signal });
535
465
  };
536
- const createTarExtractor = async function* (readable, compressionType, signal) {
537
- const ct = compressionType;
538
- let inputStream;
539
- switch (ct) {
540
- case "gzip":
541
- const gunzip = createGunzip();
542
- readable.pipe(gunzip);
543
- inputStream = gunzip;
544
- break;
545
- case "none":
546
- default:
547
- inputStream = readable;
548
- break;
549
- }
550
- const iterator = createBufferedAsyncIterator(inputStream);
551
- let header;
552
- while (true) {
553
- if ((header == null ? void 0 : header.kind) === "file" && !header.consumed) {
554
- await skipExactBytes(iterator, header.size);
555
- await skipPaddingBytesTo512Boundary(iterator, header.size);
556
- header.consumed = true;
557
- }
558
- let headerBuffer;
559
- try {
560
- headerBuffer = await readExactBytes(iterator, 512, signal);
561
- } catch (error) {
562
- if (error instanceof Error && error.message.includes("Unexpected end of stream")) {
563
- throw new Error("Invalid tar format: incomplete header");
564
- }
565
- throw error;
566
- }
567
- if (headerBuffer === void 0) {
568
- break;
569
- }
570
- header = parseTarHeader(headerBuffer);
571
- if (!header) {
572
- const secondBlock = await readExactBytes(iterator, 512);
573
- if (secondBlock === void 0 || secondBlock.every((b) => b === 0)) {
574
- break;
575
- }
576
- throw new Error("Invalid tar format: expected terminator block");
577
- }
578
- if (header.kind === "directory") {
579
- yield {
580
- kind: "directory",
581
- path: header.path,
582
- mode: header.mode,
583
- uid: header.uid,
584
- gid: header.gid,
585
- uname: header.uname,
586
- gname: header.gname,
587
- date: header.mtime
588
- };
589
- } else {
590
- const currentHeader = header;
591
- yield {
592
- kind: "file",
593
- path: currentHeader.path,
594
- mode: currentHeader.mode,
595
- uid: currentHeader.uid,
596
- gid: currentHeader.gid,
597
- uname: currentHeader.uname,
598
- gname: currentHeader.gname,
599
- date: currentHeader.mtime,
600
- getContent: async (type) => {
601
- if (currentHeader.consumed) {
602
- throw new Error("Content has already been consumed. Multiple calls to getContent are not supported.");
603
- }
604
- switch (type) {
605
- // For string
606
- case "string": {
607
- const dataBuffer = await readExactBytes(iterator, currentHeader.size);
608
- if (dataBuffer === void 0) {
609
- throw new Error(`Unexpected end of stream while reading file data for ${currentHeader.path}`);
610
- }
611
- await skipPaddingBytesTo512Boundary(iterator, currentHeader.size);
612
- currentHeader.consumed = true;
613
- return dataBuffer.toString("utf8");
614
- }
615
- // For buffer
616
- case "buffer": {
617
- const dataBuffer = await readExactBytes(iterator, currentHeader.size);
618
- if (dataBuffer === void 0) {
619
- throw new Error(`Unexpected end of stream while reading file data for ${currentHeader.path}`);
620
- }
621
- await skipPaddingBytesTo512Boundary(iterator, currentHeader.size);
622
- currentHeader.consumed = true;
623
- return dataBuffer;
624
- }
625
- // For Readble stream
626
- case "readable": {
627
- const readable2 = createReadableFromIterator(iterator, currentHeader.size, signal, currentHeader);
628
- return readable2;
629
- }
630
- default:
631
- throw new Error(`Unsupported content type: ${type}`);
632
- }
633
- }
634
- };
635
- }
636
- }
466
+ var createTarExtractor = async function* (readable, compressionType, signal) {
467
+ const ct = compressionType !== null && compressionType !== void 0 ? compressionType : "none";
468
+ let inputStream;
469
+ switch (ct) {
470
+ case "gzip":
471
+ const gunzip = createGunzip();
472
+ readable.pipe(gunzip);
473
+ inputStream = gunzip;
474
+ break;
475
+ default:
476
+ inputStream = readable;
477
+ break;
478
+ }
479
+ const iterator = createBufferedAsyncIterator(inputStream, signal);
480
+ let header;
481
+ while (true) {
482
+ signal === null || signal === void 0 || signal.throwIfAborted();
483
+ if ((header === null || header === void 0 ? void 0 : header.kind) === "file" && !header.consumed) {
484
+ await skipExactBytes(iterator, header.size, signal);
485
+ await skipPaddingBytesTo512Boundary(iterator, header.size, signal);
486
+ header.consumed = true;
487
+ }
488
+ let headerBuffer;
489
+ try {
490
+ headerBuffer = await readExactBytes(iterator, 512, signal);
491
+ } catch (error) {
492
+ if (error instanceof Error && error.message.includes("Unexpected end of stream")) throw new Error("Invalid tar format: incomplete header");
493
+ throw error;
494
+ }
495
+ if (headerBuffer === void 0) break;
496
+ header = parseTarHeader(headerBuffer);
497
+ if (!header) {
498
+ const secondBlock = await readExactBytes(iterator, 512, signal);
499
+ if (secondBlock === void 0 || secondBlock.every((b) => b === 0)) break;
500
+ throw new Error("Invalid tar format: expected terminator block");
501
+ }
502
+ if (header.kind === "directory") yield {
503
+ kind: "directory",
504
+ path: header.path,
505
+ mode: header.mode,
506
+ uid: header.uid,
507
+ gid: header.gid,
508
+ uname: header.uname,
509
+ gname: header.gname,
510
+ date: header.mtime
511
+ };
512
+ else {
513
+ const currentHeader = header;
514
+ yield {
515
+ kind: "file",
516
+ path: currentHeader.path,
517
+ mode: currentHeader.mode,
518
+ uid: currentHeader.uid,
519
+ gid: currentHeader.gid,
520
+ uname: currentHeader.uname,
521
+ gname: currentHeader.gname,
522
+ date: currentHeader.mtime,
523
+ getContent: async (type) => {
524
+ if (currentHeader.consumed) throw new Error("Content has already been consumed. Multiple calls to getContent are not supported.");
525
+ switch (type) {
526
+ case "string": {
527
+ const dataBuffer = await readExactBytes(iterator, currentHeader.size, signal);
528
+ if (dataBuffer === void 0) throw new Error(`Unexpected end of stream while reading file data for ${currentHeader.path}`);
529
+ await skipPaddingBytesTo512Boundary(iterator, currentHeader.size, signal);
530
+ currentHeader.consumed = true;
531
+ return dataBuffer.toString("utf8");
532
+ }
533
+ case "buffer": {
534
+ const dataBuffer = await readExactBytes(iterator, currentHeader.size, signal);
535
+ if (dataBuffer === void 0) throw new Error(`Unexpected end of stream while reading file data for ${currentHeader.path}`);
536
+ await skipPaddingBytesTo512Boundary(iterator, currentHeader.size, signal);
537
+ currentHeader.consumed = true;
538
+ return dataBuffer;
539
+ }
540
+ case "readable": return createReadableFromIterator(iterator, currentHeader.size, signal, currentHeader);
541
+ default: throw new Error(`Unsupported content type: ${type}`);
542
+ }
543
+ }
544
+ };
545
+ }
546
+ }
637
547
  };
638
- const JSON5 = __resolveDefaultExport(__screwUpDefaultImportModule0);
548
+ var JSON5 = __resolveDefaultExport((/* @__PURE__ */ __toESM(require_dist(), 1)).default, false);
639
549
  globalThis.__screwUpIsInCJS_8e26734beef0 = false;
640
550
  function __resolveDefaultExport(module, isESM) {
641
- const __isInCJS = typeof globalThis !== "undefined" && globalThis.__screwUpIsInCJS_8e26734beef0 === true;
642
- const maybe = module;
643
- const hasDefault = !!(maybe && typeof maybe === "object" && "default" in maybe);
644
- const unwrapNamespaceDefault = (value) => {
645
- if (!value || typeof value !== "object") {
646
- return value;
647
- }
648
- const inner = value;
649
- const isModule = inner.__esModule === true || typeof Symbol !== "undefined" && inner[Symbol.toStringTag] === "Module";
650
- if (isModule && "default" in inner) {
651
- return inner.default;
652
- }
653
- return value;
654
- };
655
- const resolvedDefault = hasDefault ? unwrapNamespaceDefault(maybe.default) : void 0;
656
- if (__isInCJS) {
657
- return hasDefault ? resolvedDefault != null ? resolvedDefault : module : module;
658
- }
659
- return hasDefault ? resolvedDefault != null ? resolvedDefault : module : module;
551
+ const __isInCJS = typeof globalThis !== "undefined" && globalThis.__screwUpIsInCJS_8e26734beef0 === true;
552
+ const maybe = module;
553
+ const hasDefault = !!(maybe && typeof maybe === "object" && "default" in maybe);
554
+ const unwrapNamespaceDefault = (value) => {
555
+ if (!value || typeof value !== "object") return value;
556
+ const inner = value;
557
+ if ((inner.__esModule === true || typeof Symbol !== "undefined" && inner[Symbol.toStringTag] === "Module") && "default" in inner) return inner.default;
558
+ return value;
559
+ };
560
+ const resolvedDefault = hasDefault ? unwrapNamespaceDefault(maybe.default) : void 0;
561
+ if (__isInCJS) return hasDefault ? resolvedDefault !== null && resolvedDefault !== void 0 ? resolvedDefault : module : module;
562
+ if (isESM) {
563
+ if (hasDefault) return resolvedDefault;
564
+ throw new Error("Default export not found.");
565
+ }
566
+ return hasDefault ? resolvedDefault !== null && resolvedDefault !== void 0 ? resolvedDefault : module : module;
660
567
  }
661
- const readPackageJsonFile = async (packageJsonPath) => {
662
- const content = await readFile(packageJsonPath, "utf-8");
663
- return JSON5.parse(content);
568
+ var readPackageJsonFile = async (packageJsonPath) => {
569
+ const content = await readFile(packageJsonPath, "utf-8");
570
+ return JSON5.parse(content);
664
571
  };
665
- const getFilesArray = (packageJson) => {
666
- if (!packageJson || !Array.isArray(packageJson.files)) {
667
- return void 0;
668
- }
669
- const entries = packageJson.files.filter(
670
- (entry) => typeof entry === "string"
671
- );
672
- return entries.length > 0 ? entries : void 0;
572
+ var dependencySectionKeys = new Set([
573
+ "dependencies",
574
+ "devDependencies",
575
+ "peerDependencies",
576
+ "optionalDependencies"
577
+ ]);
578
+ var clonePackageJson = (packageJson) => JSON5.parse(JSON.stringify(packageJson));
579
+ var mergeResolvedPackageJson = (packedPackageJson, resolvedPackageJson) => {
580
+ const mergedPackageJson = clonePackageJson(packedPackageJson);
581
+ for (const [key, value] of Object.entries(resolvedPackageJson !== null && resolvedPackageJson !== void 0 ? resolvedPackageJson : {})) {
582
+ if (dependencySectionKeys.has(key)) continue;
583
+ mergedPackageJson[key] = value;
584
+ }
585
+ return mergedPackageJson;
586
+ };
587
+ var getFilesArray = (packageJson) => {
588
+ if (!packageJson || !Array.isArray(packageJson.files)) return;
589
+ const entries = packageJson.files.filter((entry) => typeof entry === "string");
590
+ return entries.length > 0 ? entries : void 0;
673
591
  };
674
- const isGlobPattern = (pattern) => /[*?[\]{}()]/.test(pattern);
675
- const normalizeFilesPattern = (pattern, cwd) => {
676
- const trimmed = pattern.trim();
677
- if (!trimmed) {
678
- return void 0;
679
- }
680
- const isNegated = trimmed.startsWith("!");
681
- const raw = isNegated ? trimmed.slice(1) : trimmed;
682
- if (!raw) {
683
- return void 0;
684
- }
685
- if (isGlobPattern(raw)) {
686
- return trimmed;
687
- }
688
- const fullPath = join(cwd, raw);
689
- if (existsSync(fullPath) && statSync(fullPath).isDirectory()) {
690
- const dirPattern = `${raw.replace(/\/+$/, "")}/**`;
691
- return isNegated ? `!${dirPattern}` : dirPattern;
692
- }
693
- return trimmed;
592
+ var isGlobPattern = (pattern) => /[*?[\]{}()]/.test(pattern);
593
+ var normalizeFilesPattern = (pattern, cwd) => {
594
+ const trimmed = pattern.trim();
595
+ if (!trimmed) return;
596
+ const isNegated = trimmed.startsWith("!");
597
+ const raw = isNegated ? trimmed.slice(1) : trimmed;
598
+ if (!raw) return;
599
+ if (isGlobPattern(raw)) return trimmed;
600
+ const fullPath = join(cwd, raw);
601
+ if (existsSync(fullPath) && statSync(fullPath).isDirectory()) {
602
+ const dirPattern = `${raw.replace(/\/+$/, "")}/**`;
603
+ return isNegated ? `!${dirPattern}` : dirPattern;
604
+ }
605
+ return trimmed;
694
606
  };
695
- const isSafeRelativePath = (value) => {
696
- if (isAbsolute(value)) {
697
- return false;
698
- }
699
- const segments = value.split(/[\\/]+/);
700
- if (segments.some((segment) => segment === "..")) {
701
- return false;
702
- }
703
- return true;
607
+ var isSafeRelativePath = (value) => {
608
+ if (isAbsolute(value)) return false;
609
+ if (value.split(/[\\/]+/).some((segment) => segment === "..")) return false;
610
+ return true;
704
611
  };
705
- const expandFilesPatterns = async (patterns, cwd) => {
706
- const includePatterns = [];
707
- const excludePatterns = [];
708
- for (const pattern of patterns) {
709
- const normalized = normalizeFilesPattern(pattern, cwd);
710
- if (!normalized) {
711
- continue;
712
- }
713
- if (normalized.startsWith("!")) {
714
- excludePatterns.push(normalized.slice(1));
715
- } else {
716
- includePatterns.push(normalized);
717
- }
718
- }
719
- const result = /* @__PURE__ */ new Set();
720
- for (const pattern of includePatterns) {
721
- const matches = await glob(pattern, { cwd, nodir: true });
722
- for (const match of matches) {
723
- if (isSafeRelativePath(match)) {
724
- result.add(match);
725
- }
726
- }
727
- }
728
- for (const pattern of excludePatterns) {
729
- const matches = await glob(pattern, { cwd, nodir: true });
730
- for (const match of matches) {
731
- result.delete(match);
732
- }
733
- }
734
- return result;
612
+ var expandFilesPatterns = async (patterns, cwd) => {
613
+ const includePatterns = [];
614
+ const excludePatterns = [];
615
+ for (const pattern of patterns) {
616
+ const normalized = normalizeFilesPattern(pattern, cwd);
617
+ if (!normalized) continue;
618
+ if (normalized.startsWith("!")) excludePatterns.push(normalized.slice(1));
619
+ else includePatterns.push(normalized);
620
+ }
621
+ const result = /* @__PURE__ */ new Set();
622
+ for (const pattern of includePatterns) {
623
+ const matches = await glob(pattern, {
624
+ cwd,
625
+ nodir: true
626
+ });
627
+ for (const match of matches) if (isSafeRelativePath(match)) result.add(match);
628
+ }
629
+ for (const pattern of excludePatterns) {
630
+ const matches = await glob(pattern, {
631
+ cwd,
632
+ nodir: true
633
+ });
634
+ for (const match of matches) result.delete(match);
635
+ }
636
+ return result;
735
637
  };
736
- const mergeFilesPatterns = (parentFiles, childFiles) => {
737
- const merged = [];
738
- if (parentFiles == null ? void 0 : parentFiles.length) {
739
- merged.push(...parentFiles);
740
- }
741
- if (childFiles == null ? void 0 : childFiles.length) {
742
- merged.push(...childFiles);
743
- }
744
- return merged.length > 0 ? merged : void 0;
638
+ var mergeFilesPatterns = (parentFiles, childFiles) => {
639
+ const merged = [];
640
+ if (parentFiles === null || parentFiles === void 0 ? void 0 : parentFiles.length) merged.push(...parentFiles);
641
+ if (childFiles === null || childFiles === void 0 ? void 0 : childFiles.length) merged.push(...childFiles);
642
+ return merged.length > 0 ? merged : void 0;
745
643
  };
746
- const resolveWorkspaceFilesMerge = async (targetDir, logger2) => {
747
- const workspaceRoot = await findWorkspaceRoot(targetDir, logger2);
748
- if (!workspaceRoot) {
749
- return void 0;
750
- }
751
- const rootPackagePath = join(workspaceRoot, "package.json");
752
- const targetPackagePath = join(targetDir, "package.json");
753
- if (resolve(rootPackagePath) === resolve(targetPackagePath)) {
754
- return void 0;
755
- }
756
- const [rootPackageJson, childPackageJson] = await Promise.all([
757
- readPackageJsonFile(rootPackagePath),
758
- readPackageJsonFile(targetPackagePath)
759
- ]);
760
- const parentFiles = getFilesArray(rootPackageJson);
761
- const childFiles = getFilesArray(childPackageJson);
762
- const mergedFiles = mergeFilesPatterns(parentFiles, childFiles);
763
- if (!parentFiles && !childFiles) {
764
- return void 0;
765
- }
766
- return {
767
- workspaceRoot,
768
- parentFiles,
769
- childFiles,
770
- mergedFiles
771
- };
644
+ var resolveWorkspaceFilesMerge = async (targetDir, logger) => {
645
+ const workspaceRoot = await findWorkspaceRoot(targetDir, logger);
646
+ if (!workspaceRoot) return;
647
+ const rootPackagePath = join(workspaceRoot, "package.json");
648
+ const targetPackagePath = join(targetDir, "package.json");
649
+ if (resolve(rootPackagePath) === resolve(targetPackagePath)) return;
650
+ const [rootPackageJson, childPackageJson] = await Promise.all([readPackageJsonFile(rootPackagePath), readPackageJsonFile(targetPackagePath)]);
651
+ const parentFiles = getFilesArray(rootPackageJson);
652
+ const childFiles = getFilesArray(childPackageJson);
653
+ const mergedFiles = mergeFilesPatterns(parentFiles, childFiles);
654
+ if (!parentFiles && !childFiles) return;
655
+ return {
656
+ workspaceRoot,
657
+ parentFiles,
658
+ childFiles,
659
+ mergedFiles
660
+ };
772
661
  };
773
- const runNpmPack = async (targetDir, packDestDir) => {
774
- return new Promise((res, rej) => {
775
- const npmProcess = spawn(
776
- "npm",
777
- ["pack", "--pack-destination", packDestDir],
778
- {
779
- cwd: targetDir,
780
- stdio: ["ignore", "pipe", "pipe"]
781
- }
782
- );
783
- let stdout = "";
784
- let stderr = "";
785
- npmProcess.stdout.on("data", (data) => {
786
- stdout += data.toString();
787
- });
788
- npmProcess.stderr.on("data", (data) => {
789
- stderr += data.toString();
790
- });
791
- npmProcess.on("close", (code) => {
792
- if (code === 0) {
793
- const lines = stdout.trim().split("\n");
794
- const filename = lines.find((line) => line.trim().endsWith(".tgz")) || lines[lines.length - 1];
795
- if (filename && filename.trim().endsWith(".tgz")) {
796
- const fullPath = join(packDestDir, filename.trim());
797
- res(fullPath);
798
- } else {
799
- rej(new Error("npm pack did not output a valid .tgz filename"));
800
- }
801
- } else {
802
- const errorMessage = `npm pack failed with exit code ${code}`;
803
- const fullError = stderr ? `${errorMessage}
804
- stderr: ${stderr}` : errorMessage;
805
- if (stdout) {
806
- rej(new Error(`${fullError}
807
- stdout: ${stdout}`));
808
- } else {
809
- rej(new Error(fullError));
810
- }
811
- }
812
- });
813
- npmProcess.on("error", (error) => {
814
- rej(new Error(`Failed to spawn npm pack: ${error.message}`));
815
- });
816
- });
662
+ var readPackResultPath = (packageManager, packDestDir, stdout) => {
663
+ if (packageManager === "pnpm") {
664
+ const parsed = JSON5.parse(stdout);
665
+ const packResult = Array.isArray(parsed) ? parsed[0] : parsed;
666
+ if (!(packResult === null || packResult === void 0 ? void 0 : packResult.filename) || typeof packResult.filename !== "string") throw new Error("pnpm pack did not output a valid filename");
667
+ return isAbsolute(packResult.filename) ? packResult.filename : join(packDestDir, packResult.filename);
668
+ }
669
+ const lines = stdout.trim().split("\n");
670
+ const filename = lines.find((line) => line.trim().endsWith(".tgz")) || lines[lines.length - 1];
671
+ if (!filename || !filename.trim().endsWith(".tgz")) throw new Error("npm pack did not output a valid .tgz filename");
672
+ return join(packDestDir, filename.trim());
817
673
  };
818
- const packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger2, mergeFiles = true) => {
819
- var _a, _b, _c, _d;
820
- if (!existsSync(targetDir)) {
821
- throw new Error(`Target directory is not found: ${targetDir}`);
822
- }
823
- let readmeReplacementCandidatePath = readmeReplacementPath;
824
- if (readmeReplacementCandidatePath && !existsSync(readmeReplacementCandidatePath)) {
825
- throw new Error(
826
- `README replacement file is not found: ${readmeReplacementCandidatePath}`
827
- );
828
- }
829
- const fetchGitMetadata = getFetchGitMetadata(
830
- targetDir,
831
- checkWorkingDirectoryStatus,
832
- logger2
833
- );
834
- const result = await resolveRawPackageJsonObject(
835
- targetDir,
836
- fetchGitMetadata,
837
- alwaysOverrideVersionFromGit,
838
- inheritableFields,
839
- logger2
840
- );
841
- let resolvedPackageJson = result.metadata;
842
- if (resolvedPackageJson == null ? void 0 : resolvedPackageJson.private) {
843
- return void 0;
844
- }
845
- const packageJsonReadme = resolvedPackageJson.readme;
846
- if (packageJsonReadme) {
847
- if (!readmeReplacementCandidatePath) {
848
- const packageJsonReadmeDir = result.sourceMap.get("readme");
849
- const packageJsonReadmePath = join(
850
- packageJsonReadmeDir,
851
- packageJsonReadme
852
- );
853
- if (!existsSync(packageJsonReadmePath)) {
854
- throw new Error(
855
- `README replacement file is not found: ${packageJsonReadmePath}`
856
- );
857
- }
858
- readmeReplacementCandidatePath = packageJsonReadmePath;
859
- }
860
- delete resolvedPackageJson.readme;
861
- }
862
- if (replacePeerDepsWildcards) {
863
- const workspaceRoot = await findWorkspaceRoot(targetDir, logger2);
864
- if (workspaceRoot) {
865
- const siblings = await collectWorkspaceSiblings(
866
- workspaceRoot,
867
- fetchGitMetadata,
868
- alwaysOverrideVersionFromGit,
869
- inheritableFields,
870
- logger2
871
- );
872
- if (siblings.size > 0) {
873
- resolvedPackageJson = replacePeerDependenciesWildcards(
874
- resolvedPackageJson,
875
- siblings,
876
- peerDepsVersionPrefix
877
- );
878
- }
879
- }
880
- }
881
- const filesMergeEnabled = mergeFiles && inheritableFields.has("files");
882
- const workspaceFilesMerge = filesMergeEnabled ? await resolveWorkspaceFilesMerge(targetDir, logger2) : void 0;
883
- if (filesMergeEnabled && (workspaceFilesMerge == null ? void 0 : workspaceFilesMerge.mergedFiles)) {
884
- resolvedPackageJson.files = workspaceFilesMerge.mergedFiles;
885
- }
886
- const baseTempDir = await mkdtemp(join(tmpdir(), "screw-up-npm-pack-"));
887
- await mkdir(baseTempDir, { recursive: true });
888
- try {
889
- const npmTarballPath = await runNpmPack(targetDir, baseTempDir);
890
- const stagingDir = join(baseTempDir, "staging");
891
- await mkdir(stagingDir, { recursive: true });
892
- const stream = createReadStream(npmTarballPath);
893
- await extractTo(createTarExtractor(stream, "gzip"), stagingDir);
894
- const packageRoot = join(stagingDir, "package");
895
- if (filesMergeEnabled && ((_a = workspaceFilesMerge == null ? void 0 : workspaceFilesMerge.parentFiles) == null ? void 0 : _a.length)) {
896
- const parentFiles = await expandFilesPatterns(
897
- workspaceFilesMerge.parentFiles,
898
- workspaceFilesMerge.workspaceRoot
899
- );
900
- for (const parentFile of parentFiles) {
901
- const destPath = join(packageRoot, parentFile);
902
- if (existsSync(destPath)) {
903
- continue;
904
- }
905
- await mkdir(dirname(destPath), { recursive: true });
906
- await copyFile(
907
- join(workspaceFilesMerge.workspaceRoot, parentFile),
908
- destPath
909
- );
910
- }
911
- }
912
- const packageJsonPath = join(packageRoot, "package.json");
913
- if (existsSync(packageJsonPath)) {
914
- await writeFile(
915
- packageJsonPath,
916
- JSON.stringify(resolvedPackageJson, null, 2)
917
- );
918
- }
919
- if (readmeReplacementCandidatePath) {
920
- const readmeDestPath = join(packageRoot, "README.md");
921
- await copyFile(readmeReplacementCandidatePath, readmeDestPath);
922
- }
923
- const outputFileName = `${(_c = (_b = resolvedPackageJson == null ? void 0 : resolvedPackageJson.name) == null ? void 0 : _b.replace("/", "-")) != null ? _c : "package"}-${(_d = resolvedPackageJson == null ? void 0 : resolvedPackageJson.version) != null ? _d : "0.0.0"}.tgz`;
924
- await mkdir(outputDir, { recursive: true });
925
- const outputFile = join(outputDir, outputFileName);
926
- const itemGenerator = createEntryItemGenerator(stagingDir);
927
- const packer = createTarPacker(itemGenerator, "gzip");
928
- await storeReaderToFile(packer, outputFile);
929
- return {
930
- packageFileName: outputFileName,
931
- metadata: resolvedPackageJson
932
- };
933
- } finally {
934
- await rm(baseTempDir, { recursive: true, force: true });
935
- }
674
+ /**
675
+ * Execute package manager pack and return the generated tarball path
676
+ * @param packageManager - Package manager to use
677
+ * @param targetDir - Target directory to pack
678
+ * @param packDestDir - Directory to store the generated tarball (must exist)
679
+ * @returns Path to generated tarball
680
+ */
681
+ var runPack = async (packageManager, targetDir, packDestDir) => {
682
+ const packArgs = packageManager === "pnpm" ? [
683
+ "pack",
684
+ "--json",
685
+ "--pack-destination",
686
+ packDestDir
687
+ ] : [
688
+ "pack",
689
+ "--pack-destination",
690
+ packDestDir
691
+ ];
692
+ return new Promise((res, rej) => {
693
+ const packProcess = spawn(packageManager, packArgs, {
694
+ cwd: targetDir,
695
+ stdio: [
696
+ "ignore",
697
+ "pipe",
698
+ "pipe"
699
+ ]
700
+ });
701
+ let stdout = "";
702
+ let stderr = "";
703
+ packProcess.stdout.on("data", (data) => {
704
+ stdout += data.toString();
705
+ });
706
+ packProcess.stderr.on("data", (data) => {
707
+ stderr += data.toString();
708
+ });
709
+ packProcess.on("close", (code) => {
710
+ if (code === 0) try {
711
+ res(readPackResultPath(packageManager, packDestDir, stdout.trim()));
712
+ } catch (error) {
713
+ rej(error);
714
+ }
715
+ else {
716
+ const errorMessage = `${packageManager} pack failed with exit code ${code}`;
717
+ const fullError = stderr ? `${errorMessage}\nstderr: ${stderr}` : errorMessage;
718
+ if (stdout) rej(/* @__PURE__ */ new Error(`${fullError}\nstdout: ${stdout}`));
719
+ else rej(new Error(fullError));
720
+ }
721
+ });
722
+ packProcess.on("error", (error) => {
723
+ rej(/* @__PURE__ */ new Error(`Failed to spawn ${packageManager} pack: ${error.message}`));
724
+ });
725
+ });
936
726
  };
937
- const getComputedPackageJsonObject = async (targetDir, fetchGitMetadata, alwaysOverrideVersionFromGit, inheritableFields, logger2, ignoreNotExist = false) => {
938
- if (!existsSync(targetDir)) {
939
- return void 0;
940
- }
941
- const result = await resolveRawPackageJsonObject(
942
- targetDir,
943
- fetchGitMetadata,
944
- alwaysOverrideVersionFromGit,
945
- inheritableFields,
946
- logger2,
947
- ignoreNotExist
948
- );
949
- return result.metadata;
727
+ /**
728
+ * Pack assets using npm pack delegation method
729
+ * @param targetDir - Target directory to pack
730
+ * @param outputDir - Output directory to write the tarball
731
+ * @param checkWorkingDirectoryStatus - Check working directory status
732
+ * @param inheritableFields - Package metadata fields that should be inherited from parent
733
+ * @param readmeReplacementPath - Optional path to replacement README file
734
+ * @param replacePeerDepsWildcards - Replace "*" in peerDependencies with actual versions
735
+ * @param peerDepsVersionPrefix - Version prefix for replaced peerDependencies
736
+ * @param alwaysOverrideVersionFromGit - Always override version from Git (default: true)
737
+ * @param packageManager - Package manager backend used for the initial pack
738
+ * @returns Package metadata (package.json) or undefined if failed
739
+ */
740
+ var packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger, mergeFiles = true, packageManager = "npm") => {
741
+ if (!existsSync(targetDir)) throw new Error(`Target directory is not found: ${targetDir}`);
742
+ let readmeReplacementCandidatePath = readmeReplacementPath;
743
+ if (readmeReplacementCandidatePath && !existsSync(readmeReplacementCandidatePath)) throw new Error(`README replacement file is not found: ${readmeReplacementCandidatePath}`);
744
+ const fetchGitMetadata = getFetchGitMetadata(targetDir, checkWorkingDirectoryStatus, logger);
745
+ const result = await resolveRawPackageJsonObject(targetDir, fetchGitMetadata, alwaysOverrideVersionFromGit, inheritableFields, logger);
746
+ let resolvedPackageJson = result.metadata;
747
+ if (resolvedPackageJson === null || resolvedPackageJson === void 0 ? void 0 : resolvedPackageJson.private) return;
748
+ const packageJsonReadme = resolvedPackageJson.readme;
749
+ if (packageJsonReadme) {
750
+ if (!readmeReplacementCandidatePath) {
751
+ const packageJsonReadmeDir = result.sourceMap.get("readme");
752
+ if (!packageJsonReadmeDir) throw new Error(`README replacement source directory is unknown: ${packageJsonReadme}`);
753
+ const packageJsonReadmePath = join(packageJsonReadmeDir, packageJsonReadme);
754
+ if (!existsSync(packageJsonReadmePath)) throw new Error(`README replacement file is not found: ${packageJsonReadmePath}`);
755
+ readmeReplacementCandidatePath = packageJsonReadmePath;
756
+ }
757
+ delete resolvedPackageJson.readme;
758
+ }
759
+ const workspaceRoot = replacePeerDepsWildcards ? await findWorkspaceRoot(targetDir, logger) : void 0;
760
+ const workspaceSiblings = workspaceRoot ? await collectWorkspaceSiblings(workspaceRoot, fetchGitMetadata, alwaysOverrideVersionFromGit, inheritableFields, logger) : void 0;
761
+ const filesMergeEnabled = mergeFiles && inheritableFields.has("files");
762
+ const workspaceFilesMerge = filesMergeEnabled ? await resolveWorkspaceFilesMerge(targetDir, logger) : void 0;
763
+ if (filesMergeEnabled && (workspaceFilesMerge === null || workspaceFilesMerge === void 0 ? void 0 : workspaceFilesMerge.mergedFiles)) resolvedPackageJson.files = workspaceFilesMerge.mergedFiles;
764
+ const baseTempDir = await mkdtemp(join(tmpdir(), "screw-up-npm-pack-"));
765
+ await mkdir(baseTempDir, { recursive: true });
766
+ try {
767
+ var _workspaceFilesMerge$, _finalPackageJson$nam, _finalPackageJson$nam2, _finalPackageJson$ver;
768
+ const packedTarballPath = await runPack(packageManager, targetDir, baseTempDir);
769
+ const stagingDir = join(baseTempDir, "staging");
770
+ await mkdir(stagingDir, { recursive: true });
771
+ await extractTo(createTarExtractor(createReadStream(packedTarballPath), "gzip"), stagingDir);
772
+ const packageRoot = join(stagingDir, "package");
773
+ if (filesMergeEnabled && (workspaceFilesMerge === null || workspaceFilesMerge === void 0 || (_workspaceFilesMerge$ = workspaceFilesMerge.parentFiles) === null || _workspaceFilesMerge$ === void 0 ? void 0 : _workspaceFilesMerge$.length)) {
774
+ const parentFiles = await expandFilesPatterns(workspaceFilesMerge.parentFiles, workspaceFilesMerge.workspaceRoot);
775
+ for (const parentFile of parentFiles) {
776
+ const destPath = join(packageRoot, parentFile);
777
+ if (existsSync(destPath)) continue;
778
+ await mkdir(dirname(destPath), { recursive: true });
779
+ await copyFile(join(workspaceFilesMerge.workspaceRoot, parentFile), destPath);
780
+ }
781
+ }
782
+ const packageJsonPath = join(packageRoot, "package.json");
783
+ let finalPackageJson = resolvedPackageJson;
784
+ if (existsSync(packageJsonPath)) {
785
+ finalPackageJson = mergeResolvedPackageJson(await readPackageJsonFile(packageJsonPath), resolvedPackageJson);
786
+ if (workspaceSiblings && workspaceSiblings.size > 0) finalPackageJson = replacePeerDependenciesWildcards(finalPackageJson, workspaceSiblings, peerDepsVersionPrefix);
787
+ if (packageJsonReadme) delete finalPackageJson.readme;
788
+ await writeFile(packageJsonPath, JSON.stringify(finalPackageJson, null, 2));
789
+ }
790
+ if (readmeReplacementCandidatePath) {
791
+ const readmeDestPath = join(packageRoot, "README.md");
792
+ await copyFile(readmeReplacementCandidatePath, readmeDestPath);
793
+ }
794
+ const outputFileName = `${(_finalPackageJson$nam = finalPackageJson === null || finalPackageJson === void 0 || (_finalPackageJson$nam2 = finalPackageJson.name) === null || _finalPackageJson$nam2 === void 0 ? void 0 : _finalPackageJson$nam2.replace("/", "-")) !== null && _finalPackageJson$nam !== void 0 ? _finalPackageJson$nam : "package"}-${(_finalPackageJson$ver = finalPackageJson === null || finalPackageJson === void 0 ? void 0 : finalPackageJson.version) !== null && _finalPackageJson$ver !== void 0 ? _finalPackageJson$ver : "0.0.0"}.tgz`;
795
+ await mkdir(outputDir, { recursive: true });
796
+ const outputFile = join(outputDir, outputFileName);
797
+ await storeReaderToFile(createTarPacker(createEntryItemGenerator(stagingDir), "gzip"), outputFile);
798
+ return {
799
+ packageFileName: outputFileName,
800
+ metadata: finalPackageJson
801
+ };
802
+ } finally {
803
+ await rm(baseTempDir, {
804
+ recursive: true,
805
+ force: true
806
+ });
807
+ }
950
808
  };
951
- const parseArgs = (args, argOptionMap2) => {
952
- const result = {
953
- argv: args,
954
- positional: [],
955
- options: {}
956
- };
957
- for (let i = 0; i < args.length; i++) {
958
- const arg = args[i];
959
- if (arg.startsWith("--")) {
960
- const optionName = arg.slice(2);
961
- if (!result.command) {
962
- result.options[optionName] = true;
963
- } else {
964
- const argOptions = argOptionMap2.get(result.command);
965
- if (argOptions == null ? void 0 : argOptions.has(optionName)) {
966
- i++;
967
- result.options[optionName] = args[i];
968
- } else {
969
- result.options[optionName] = true;
970
- }
971
- }
972
- } else if (arg.startsWith("-")) {
973
- const optionName = arg.slice(1);
974
- if (optionName.length == 1) {
975
- const argOptions = result.command ? argOptionMap2.get(result.command) : void 0;
976
- if (argOptions == null ? void 0 : argOptions.has(optionName)) {
977
- i++;
978
- result.options[optionName] = args[i];
979
- } else {
980
- result.options[optionName] = true;
981
- }
982
- }
983
- } else if (!result.command) {
984
- result.command = arg;
985
- } else {
986
- result.positional.push(arg);
987
- }
988
- }
989
- return result;
809
+ /**
810
+ * Get computed package.json object
811
+ * @param targetDir - Target directory to resolve package metadata
812
+ * @param fetchGitMetadata - Git metadata fetcher
813
+ * @param inheritableFields - Package metadata fields that should be inherited from parent
814
+ * @returns Computed package.json object or undefined if failed
815
+ */
816
+ var getComputedPackageJsonObject = async (targetDir, fetchGitMetadata, alwaysOverrideVersionFromGit, inheritableFields, logger, ignoreNotExist = false) => {
817
+ if (!existsSync(targetDir)) return;
818
+ return (await resolveRawPackageJsonObject(targetDir, fetchGitMetadata, alwaysOverrideVersionFromGit, inheritableFields, logger, ignoreNotExist)).metadata;
990
819
  };
991
- const defaultInheritableFields = /* @__PURE__ */ new Set([
992
- "version",
993
- "description",
994
- "author",
995
- "license",
996
- "repository",
997
- "keywords",
998
- "homepage",
999
- "bugs",
1000
- "readme",
1001
- "files"
820
+ /**
821
+ * Parse command line arguments
822
+ * @param args - Command line arguments
823
+ * @param argOptionMap - Map of command options to their argument options
824
+ * @returns Parsed arguments
825
+ */
826
+ var parseArgs = (args, argOptionMap) => {
827
+ const result = {
828
+ argv: args,
829
+ positional: [],
830
+ options: {}
831
+ };
832
+ for (let i = 0; i < args.length; i++) {
833
+ const arg = args[i];
834
+ if (arg.startsWith("--")) {
835
+ const optionName = arg.slice(2);
836
+ if (!result.command) result.options[optionName] = true;
837
+ else {
838
+ const argOptions = argOptionMap.get(result.command);
839
+ if (argOptions === null || argOptions === void 0 ? void 0 : argOptions.has(optionName)) {
840
+ i++;
841
+ result.options[optionName] = args[i];
842
+ } else result.options[optionName] = true;
843
+ }
844
+ } else if (arg.startsWith("-")) {
845
+ const optionName = arg.slice(1);
846
+ if (optionName.length == 1) {
847
+ const argOptions = result.command ? argOptionMap.get(result.command) : void 0;
848
+ if (argOptions === null || argOptions === void 0 ? void 0 : argOptions.has(optionName)) {
849
+ i++;
850
+ result.options[optionName] = args[i];
851
+ } else result.options[optionName] = true;
852
+ }
853
+ } else if (!result.command) result.command = arg;
854
+ else result.positional.push(arg);
855
+ }
856
+ return result;
857
+ };
858
+ //#endregion
859
+ //#region src/cli.ts
860
+ var defaultInheritableFields = new Set([
861
+ "version",
862
+ "description",
863
+ "author",
864
+ "license",
865
+ "repository",
866
+ "keywords",
867
+ "homepage",
868
+ "bugs",
869
+ "readme",
870
+ "files"
1002
871
  ]);
1003
- const defaultOutputMetadataKeys = [
1004
- "name",
1005
- "version",
1006
- "description",
1007
- "author",
1008
- "license",
1009
- "repository.url",
1010
- "git.commit.hash"
872
+ var defaultOutputMetadataKeys = [
873
+ "name",
874
+ "version",
875
+ "description",
876
+ "author",
877
+ "license",
878
+ "repository.url",
879
+ "git.commit.hash"
1011
880
  ];
1012
- const parseInheritableFields = (inheritableFieldsOption) => {
1013
- if (typeof inheritableFieldsOption !== "string") {
1014
- return defaultInheritableFields;
1015
- }
1016
- if (!inheritableFieldsOption.trim()) {
1017
- return /* @__PURE__ */ new Set();
1018
- }
1019
- return new Set(
1020
- inheritableFieldsOption.split(",").map((field) => field.trim()).filter((field) => field.length > 0)
1021
- );
881
+ var parseInheritableFields = (inheritableFieldsOption) => {
882
+ if (typeof inheritableFieldsOption !== "string") return defaultInheritableFields;
883
+ if (!inheritableFieldsOption.trim()) return /* @__PURE__ */ new Set();
884
+ return new Set(inheritableFieldsOption.split(",").map((field) => field.trim()).filter((field) => field.length > 0));
1022
885
  };
1023
- const parseOutputMetadataKeys = (outputMetadataKeysOption) => {
1024
- if (typeof outputMetadataKeysOption !== "string") {
1025
- return defaultOutputMetadataKeys;
1026
- }
1027
- if (!outputMetadataKeysOption.trim()) {
1028
- return [];
1029
- }
1030
- return outputMetadataKeysOption.split(",").map((key) => key.trim()).filter((key) => key.length > 0);
886
+ var parseOutputMetadataKeys = (outputMetadataKeysOption) => {
887
+ if (typeof outputMetadataKeysOption !== "string") return defaultOutputMetadataKeys;
888
+ if (!outputMetadataKeysOption.trim()) return [];
889
+ return outputMetadataKeysOption.split(",").map((key) => key.trim()).filter((key) => key.length > 0);
1031
890
  };
1032
- const readInputText = async (inputPath) => {
1033
- if (inputPath) {
1034
- const resolvedPath = resolve(inputPath);
1035
- return await readFile(resolvedPath, "utf-8");
1036
- }
1037
- return await new Promise((resolvePromise, rejectPromise) => {
1038
- let data = "";
1039
- process.stdin.setEncoding("utf-8");
1040
- process.stdin.on("data", (chunk) => {
1041
- data += chunk;
1042
- });
1043
- process.stdin.on("end", () => resolvePromise(data));
1044
- process.stdin.on("error", (err) => rejectPromise(err));
1045
- });
891
+ var readInputText = async (inputPath) => {
892
+ if (inputPath) return await readFile(resolve(inputPath), "utf-8");
893
+ return await new Promise((resolvePromise, rejectPromise) => {
894
+ let data = "";
895
+ process.stdin.setEncoding("utf-8");
896
+ process.stdin.on("data", (chunk) => {
897
+ data += chunk;
898
+ });
899
+ process.stdin.on("end", () => resolvePromise(data));
900
+ process.stdin.on("error", (err) => rejectPromise(err));
901
+ });
1046
902
  };
1047
- const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1048
- const getValueByPath = (source, path) => {
1049
- return path.split(".").reduce((current, key) => {
1050
- if (current === void 0 || current === null) {
1051
- return void 0;
1052
- }
1053
- if (typeof current !== "object" && !Array.isArray(current)) {
1054
- return void 0;
1055
- }
1056
- return current[key];
1057
- }, source);
903
+ var escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
904
+ var getValueByPath = (source, path) => {
905
+ return path.split(".").reduce((current, key) => {
906
+ if (current === void 0 || current === null) return;
907
+ if (typeof current !== "object" && !Array.isArray(current)) return;
908
+ return current[key];
909
+ }, source);
1058
910
  };
1059
- const stringifyValue = (value) => {
1060
- if (value === void 0) {
1061
- return void 0;
1062
- }
1063
- if (value === null) {
1064
- return "null";
1065
- }
1066
- if (typeof value === "object") {
1067
- try {
1068
- return JSON.stringify(value);
1069
- } catch (e) {
1070
- return String(value);
1071
- }
1072
- }
1073
- return String(value);
911
+ var stringifyValue = (value) => {
912
+ if (value === void 0) return;
913
+ if (value === null) return "null";
914
+ if (typeof value === "object") try {
915
+ return JSON.stringify(value);
916
+ } catch (_unused) {
917
+ return String(value);
918
+ }
919
+ return String(value);
1074
920
  };
1075
- const replacePlaceholders = (text, values, openBracket, closeBracket) => {
1076
- const pattern = new RegExp(
1077
- `${escapeRegExp(openBracket)}(.*?)${escapeRegExp(closeBracket)}`,
1078
- "g"
1079
- );
1080
- return text.replace(pattern, (match, key) => {
1081
- const trimmedKey = String(key).trim();
1082
- const resolvedValue = stringifyValue(getValueByPath(values, trimmedKey));
1083
- return resolvedValue !== void 0 ? resolvedValue : match;
1084
- });
921
+ var replacePlaceholders = (text, values, openBracket, closeBracket) => {
922
+ const pattern = new RegExp(`${escapeRegExp(openBracket)}(.*?)${escapeRegExp(closeBracket)}`, "g");
923
+ return text.replace(pattern, (match, key) => {
924
+ const resolvedValue = stringifyValue(getValueByPath(values, String(key).trim()));
925
+ return resolvedValue !== void 0 ? resolvedValue : match;
926
+ });
1085
927
  };
1086
- const showFormatHelp = () => {
1087
- console.info(`Usage: screw-up format [options] [output]
928
+ var showFormatHelp = () => {
929
+ console.info(`Usage: screw-up format [options] [output]
1088
930
 
1089
931
  Format input text by replacing placeholders with package metadata
1090
932
 
@@ -1101,95 +943,65 @@ Options:
1101
943
  -h, --help Show help for format command
1102
944
  `);
1103
945
  };
1104
- const parseBracketOption = (bracketOption) => {
1105
- if (!bracketOption) {
1106
- return { openBracket: "{", closeBracket: "}" };
1107
- }
1108
- const delimiterIndex = bracketOption.indexOf(",");
1109
- if (delimiterIndex === -1) {
1110
- return void 0;
1111
- }
1112
- const openBracket = bracketOption.slice(0, delimiterIndex);
1113
- const closeBracket = bracketOption.slice(delimiterIndex + 1);
1114
- if (!openBracket || !closeBracket) {
1115
- return void 0;
1116
- }
1117
- return { openBracket, closeBracket };
946
+ var parseBracketOption = (bracketOption) => {
947
+ if (!bracketOption) return {
948
+ openBracket: "{",
949
+ closeBracket: "}"
950
+ };
951
+ const delimiterIndex = bracketOption.indexOf(",");
952
+ if (delimiterIndex === -1) return;
953
+ const openBracket = bracketOption.slice(0, delimiterIndex);
954
+ const closeBracket = bracketOption.slice(delimiterIndex + 1);
955
+ if (!openBracket || !closeBracket) return;
956
+ return {
957
+ openBracket,
958
+ closeBracket
959
+ };
1118
960
  };
1119
- const formatCommand = async (args, logger2) => {
1120
- var _a, _b;
1121
- if (args.options.help || args.options.h) {
1122
- showFormatHelp();
1123
- return 1;
1124
- }
1125
- const outputPath = args.positional[0];
1126
- const inputPathOption = (_a = args.options["input"]) != null ? _a : args.options["i"];
1127
- const bracketOption = (_b = args.options["bracket"]) != null ? _b : args.options["b"];
1128
- const inheritableFieldsOption = args.options["inheritable-fields"];
1129
- const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1130
- const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1131
- const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
1132
- const bracket = parseBracketOption(
1133
- typeof bracketOption === "string" ? bracketOption : void 0
1134
- );
1135
- if (!bracket) {
1136
- logger2.error(
1137
- 'format: Invalid bracket option, expected "open,close" pattern.'
1138
- );
1139
- return 1;
1140
- }
1141
- const { openBracket, closeBracket } = bracket;
1142
- const targetDir = resolve(process.cwd());
1143
- const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1144
- const _logger = {
1145
- debug: (msg) => {
1146
- },
1147
- info: (msg) => {
1148
- },
1149
- warn: (msg) => {
1150
- },
1151
- error: logger2.error
1152
- };
1153
- try {
1154
- const fetchGitMetadata = getFetchGitMetadata(
1155
- targetDir,
1156
- checkWorkingDirectoryStatus,
1157
- _logger
1158
- );
1159
- const computedPackageJson = await getComputedPackageJsonObject(
1160
- targetDir,
1161
- fetchGitMetadata,
1162
- alwaysOverrideVersionFromGit,
1163
- inheritableFields,
1164
- _logger,
1165
- ignorePackageJsonNotExist
1166
- );
1167
- if (!computedPackageJson) {
1168
- _logger.error(`format: Unable to read package.json from: ${targetDir}`);
1169
- return 1;
1170
- }
1171
- const inputText = await readInputText(
1172
- typeof inputPathOption === "string" ? inputPathOption : void 0
1173
- );
1174
- const formattedText = replacePlaceholders(
1175
- inputText,
1176
- computedPackageJson,
1177
- openBracket,
1178
- closeBracket
1179
- );
1180
- if (outputPath) {
1181
- const resolvedOutputPath = resolve(outputPath);
1182
- await writeFile(resolvedOutputPath, formattedText);
1183
- }
1184
- process.stdout.write(formattedText);
1185
- } catch (error) {
1186
- _logger.error(`format: Failed to format text: ${error}`);
1187
- return 1;
1188
- }
1189
- return 0;
961
+ var formatCommand = async (args, logger) => {
962
+ var _args$options$input, _args$options$bracket;
963
+ if (args.options.help || args.options.h) {
964
+ showFormatHelp();
965
+ return 1;
966
+ }
967
+ const outputPath = args.positional[0];
968
+ const inputPathOption = (_args$options$input = args.options["input"]) !== null && _args$options$input !== void 0 ? _args$options$input : args.options["i"];
969
+ const bracketOption = (_args$options$bracket = args.options["bracket"]) !== null && _args$options$bracket !== void 0 ? _args$options$bracket : args.options["b"];
970
+ const inheritableFieldsOption = args.options["inheritable-fields"];
971
+ const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
972
+ const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
973
+ const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
974
+ const bracket = parseBracketOption(typeof bracketOption === "string" ? bracketOption : void 0);
975
+ if (!bracket) {
976
+ logger.error("format: Invalid bracket option, expected \"open,close\" pattern.");
977
+ return 1;
978
+ }
979
+ const { openBracket, closeBracket } = bracket;
980
+ const targetDir = resolve(process.cwd());
981
+ const inheritableFields = parseInheritableFields(inheritableFieldsOption);
982
+ const _logger = {
983
+ debug: (msg) => {},
984
+ info: (msg) => {},
985
+ warn: (msg) => {},
986
+ error: logger.error
987
+ };
988
+ try {
989
+ const computedPackageJson = await getComputedPackageJsonObject(targetDir, getFetchGitMetadata(targetDir, checkWorkingDirectoryStatus, _logger), alwaysOverrideVersionFromGit, inheritableFields, _logger, ignorePackageJsonNotExist);
990
+ if (!computedPackageJson) {
991
+ _logger.error(`format: Unable to read package.json from: ${targetDir}`);
992
+ return 1;
993
+ }
994
+ const formattedText = replacePlaceholders(await readInputText(typeof inputPathOption === "string" ? inputPathOption : void 0), computedPackageJson, openBracket, closeBracket);
995
+ if (outputPath) await writeFile(resolve(outputPath), formattedText);
996
+ process.stdout.write(formattedText);
997
+ } catch (error) {
998
+ _logger.error(`format: Failed to format text: ${error}`);
999
+ return 1;
1000
+ }
1001
+ return 0;
1190
1002
  };
1191
- const showDumpHelp = () => {
1192
- console.info(`Usage: screw-up dump [options] [directory]
1003
+ var showDumpHelp = () => {
1004
+ console.info(`Usage: screw-up dump [options] [directory]
1193
1005
 
1194
1006
  Dump computed package.json as JSON
1195
1007
 
@@ -1205,65 +1017,45 @@ Options:
1205
1017
  -h, --help Show help for dump command
1206
1018
  `);
1207
1019
  };
1208
- const dumpCommand = async (args, logger2) => {
1209
- if (args.options.help || args.options.h) {
1210
- showDumpHelp();
1211
- return 1;
1212
- }
1213
- const directory = args.positional[0];
1214
- const inheritableFieldsOption = args.options["inheritable-fields"];
1215
- const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1216
- const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1217
- const mergeFiles = !args.options["no-merge-files"];
1218
- const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
1219
- const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1220
- const targetDir = resolve(directory != null ? directory : process.cwd());
1221
- const _logger = {
1222
- debug: (msg) => {
1223
- },
1224
- info: (msg) => {
1225
- },
1226
- warn: (msg) => {
1227
- },
1228
- error: logger2.error
1229
- };
1230
- try {
1231
- const fetchGitMetadata = getFetchGitMetadata(
1232
- targetDir,
1233
- checkWorkingDirectoryStatus,
1234
- _logger
1235
- );
1236
- const computedPackageJson = await getComputedPackageJsonObject(
1237
- targetDir,
1238
- fetchGitMetadata,
1239
- alwaysOverrideVersionFromGit,
1240
- inheritableFields,
1241
- _logger,
1242
- ignorePackageJsonNotExist
1243
- );
1244
- if (computedPackageJson) {
1245
- if (mergeFiles && inheritableFields.has("files") && existsSync(join(targetDir, "package.json"))) {
1246
- const workspaceFilesMerge = await resolveWorkspaceFilesMerge(
1247
- targetDir,
1248
- _logger
1249
- );
1250
- if (workspaceFilesMerge == null ? void 0 : workspaceFilesMerge.mergedFiles) {
1251
- computedPackageJson.files = workspaceFilesMerge.mergedFiles;
1252
- }
1253
- }
1254
- console.info(JSON.stringify(computedPackageJson, null, 2));
1255
- } else {
1256
- _logger.error(`dump: Unable to read package.json from: ${targetDir}`);
1257
- return 1;
1258
- }
1259
- } catch (error) {
1260
- _logger.error(`dump: Failed to dump package.json: ${error}`);
1261
- return 1;
1262
- }
1263
- return 0;
1020
+ var dumpCommand = async (args, logger) => {
1021
+ if (args.options.help || args.options.h) {
1022
+ showDumpHelp();
1023
+ return 1;
1024
+ }
1025
+ const directory = args.positional[0];
1026
+ const inheritableFieldsOption = args.options["inheritable-fields"];
1027
+ const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1028
+ const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1029
+ const mergeFiles = !args.options["no-merge-files"];
1030
+ const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
1031
+ const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1032
+ const targetDir = resolve(directory !== null && directory !== void 0 ? directory : process.cwd());
1033
+ const _logger = {
1034
+ debug: (msg) => {},
1035
+ info: (msg) => {},
1036
+ warn: (msg) => {},
1037
+ error: logger.error
1038
+ };
1039
+ try {
1040
+ const computedPackageJson = await getComputedPackageJsonObject(targetDir, getFetchGitMetadata(targetDir, checkWorkingDirectoryStatus, _logger), alwaysOverrideVersionFromGit, inheritableFields, _logger, ignorePackageJsonNotExist);
1041
+ if (computedPackageJson) {
1042
+ if (mergeFiles && inheritableFields.has("files") && existsSync(join(targetDir, "package.json"))) {
1043
+ const workspaceFilesMerge = await resolveWorkspaceFilesMerge(targetDir, _logger);
1044
+ if (workspaceFilesMerge === null || workspaceFilesMerge === void 0 ? void 0 : workspaceFilesMerge.mergedFiles) computedPackageJson.files = workspaceFilesMerge.mergedFiles;
1045
+ }
1046
+ console.info(JSON.stringify(computedPackageJson, null, 2));
1047
+ } else {
1048
+ _logger.error(`dump: Unable to read package.json from: ${targetDir}`);
1049
+ return 1;
1050
+ }
1051
+ } catch (error) {
1052
+ _logger.error(`dump: Failed to dump package.json: ${error}`);
1053
+ return 1;
1054
+ }
1055
+ return 0;
1264
1056
  };
1265
- const showMetadataHelp = () => {
1266
- console.info(`Usage: screw-up metadata [options] [directory]
1057
+ var showMetadataHelp = () => {
1058
+ console.info(`Usage: screw-up metadata [options] [directory]
1267
1059
 
1268
1060
  Generate TypeScript metadata file from package metadata
1269
1061
 
@@ -1278,78 +1070,40 @@ Options:
1278
1070
  -h, --help Show help for metadata command
1279
1071
  `);
1280
1072
  };
1281
- const metadataCommand = async (args, logger2) => {
1282
- if (args.options.help || args.options.h) {
1283
- showMetadataHelp();
1284
- return 1;
1285
- }
1286
- const directory = args.positional[0];
1287
- const outputMetadataFilePathOption = args.options["output-metadata-file-path"];
1288
- const outputMetadataKeysOption = args.options["output-metadata-keys"];
1289
- const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1290
- const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1291
- const outputMetadataFilePath = typeof outputMetadataFilePathOption === "string" && outputMetadataFilePathOption.trim() ? outputMetadataFilePathOption : "src/generated/packageMetadata.ts";
1292
- const outputMetadataKeys = parseOutputMetadataKeys(outputMetadataKeysOption);
1293
- const targetDir = resolve(directory != null ? directory : process.cwd());
1294
- try {
1295
- const fetchGitMetadata = getFetchGitMetadata(
1296
- targetDir,
1297
- checkWorkingDirectoryStatus,
1298
- logger2
1299
- );
1300
- const result = await resolvePackageMetadata(
1301
- targetDir,
1302
- fetchGitMetadata,
1303
- alwaysOverrideVersionFromGit,
1304
- logger2
1305
- );
1306
- const metadataSourceContent = generateMetadataFileContent(
1307
- result.metadata,
1308
- outputMetadataKeys
1309
- );
1310
- const metadataSourcePath = join(targetDir, outputMetadataFilePath);
1311
- const metadataWritten = await writeFileIfChanged(
1312
- metadataSourcePath,
1313
- metadataSourceContent,
1314
- "metadata source file",
1315
- logger2
1316
- );
1317
- if (existsSync(metadataSourcePath)) {
1318
- const gitignoreWritten = await ensureMetadataGitignore(
1319
- metadataSourcePath,
1320
- logger2
1321
- );
1322
- if (gitignoreWritten) {
1323
- logger2.info(
1324
- `metadata: .gitignore is generated: ${join(
1325
- dirname(outputMetadataFilePath),
1326
- ".gitignore"
1327
- )}`
1328
- );
1329
- }
1330
- }
1331
- if (metadataWritten) {
1332
- logger2.info(
1333
- `metadata: Metadata source file is generated: ${outputMetadataFilePath}`
1334
- );
1335
- } else if (existsSync(metadataSourcePath)) {
1336
- logger2.info(
1337
- `metadata: Metadata source file is unchanged: ${outputMetadataFilePath}`
1338
- );
1339
- } else {
1340
- logger2.error(
1341
- `metadata: Failed to write metadata file: ${outputMetadataFilePath}`
1342
- );
1343
- return 1;
1344
- }
1345
- } catch (error) {
1346
- logger2.error(`metadata: Failed to generate metadata file: ${error}`);
1347
- return 1;
1348
- }
1349
- return 0;
1073
+ var metadataCommand = async (args, logger) => {
1074
+ if (args.options.help || args.options.h) {
1075
+ showMetadataHelp();
1076
+ return 1;
1077
+ }
1078
+ const directory = args.positional[0];
1079
+ const outputMetadataFilePathOption = args.options["output-metadata-file-path"];
1080
+ const outputMetadataKeysOption = args.options["output-metadata-keys"];
1081
+ const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1082
+ const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1083
+ const outputMetadataFilePath = typeof outputMetadataFilePathOption === "string" && outputMetadataFilePathOption.trim() ? outputMetadataFilePathOption : "src/generated/packageMetadata.ts";
1084
+ const outputMetadataKeys = parseOutputMetadataKeys(outputMetadataKeysOption);
1085
+ const targetDir = resolve(directory !== null && directory !== void 0 ? directory : process.cwd());
1086
+ try {
1087
+ const metadataSourceContent = generateMetadataFileContent((await resolvePackageMetadata(targetDir, getFetchGitMetadata(targetDir, checkWorkingDirectoryStatus, logger), alwaysOverrideVersionFromGit, logger)).metadata, outputMetadataKeys);
1088
+ const metadataSourcePath = join(targetDir, outputMetadataFilePath);
1089
+ const metadataWritten = await writeFileIfChanged(metadataSourcePath, metadataSourceContent, "metadata source file", logger);
1090
+ if (existsSync(metadataSourcePath)) {
1091
+ if (await ensureMetadataGitignore(metadataSourcePath, logger)) logger.info(`metadata: .gitignore is generated: ${join(dirname(outputMetadataFilePath), ".gitignore")}`);
1092
+ }
1093
+ if (metadataWritten) logger.info(`metadata: Metadata source file is generated: ${outputMetadataFilePath}`);
1094
+ else if (existsSync(metadataSourcePath)) logger.info(`metadata: Metadata source file is unchanged: ${outputMetadataFilePath}`);
1095
+ else {
1096
+ logger.error(`metadata: Failed to write metadata file: ${outputMetadataFilePath}`);
1097
+ return 1;
1098
+ }
1099
+ } catch (error) {
1100
+ logger.error(`metadata: Failed to generate metadata file: ${error}`);
1101
+ return 1;
1102
+ }
1103
+ return 0;
1350
1104
  };
1351
- const showPackHelp = () => {
1352
- console.info(`Usage: screw-up pack [options] [directory]
1105
+ var showPackHelp = () => {
1106
+ console.info(`Usage: screw-up pack [options] [directory]
1353
1107
 
1354
1108
  Pack the project into a tar archive
1355
1109
 
@@ -1359,6 +1113,7 @@ Arguments:
1359
1113
  Options:
1360
1114
  --pack-destination <path> Directory to write the tarball
1361
1115
  --readme <path> Replace README.md with specified file
1116
+ --use-pnpm Use pnpm pack and preserve workspace protocol resolution
1362
1117
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1363
1118
  --no-wds Do not check working directory status to increase version
1364
1119
  --no-git-version-override Do not override version from Git (use package.json version)
@@ -1369,62 +1124,44 @@ Options:
1369
1124
  -h, --help Show help for pack command
1370
1125
  `);
1371
1126
  };
1372
- const packCommand = async (args, logger2) => {
1373
- var _a;
1374
- if (args.options.help || args.options.h) {
1375
- showPackHelp();
1376
- return 1;
1377
- }
1378
- const directory = args.positional[0];
1379
- const packDestination = args.options["pack-destination"];
1380
- const readmeOption = args.options["readme"];
1381
- const inheritableFieldsOption = args.options["inheritable-fields"];
1382
- const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1383
- const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1384
- const mergeFiles = !args.options["no-merge-files"];
1385
- const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1386
- const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1387
- const verbose = args.options["verbose"] ? true : false;
1388
- const targetDir = resolve(directory != null ? directory : process.cwd());
1389
- const outputDir = packDestination ? resolve(packDestination) : process.cwd();
1390
- const readmeReplacementPath = readmeOption ? resolve(readmeOption) : void 0;
1391
- const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1392
- if (verbose) {
1393
- logger2.info(`pack: Creating archive of ${targetDir}...`);
1394
- }
1395
- try {
1396
- const result = await packAssets(
1397
- targetDir,
1398
- outputDir,
1399
- checkWorkingDirectoryStatus,
1400
- alwaysOverrideVersionFromGit,
1401
- inheritableFields,
1402
- readmeReplacementPath,
1403
- replacePeerDepsWildcards,
1404
- peerDepsVersionPrefix,
1405
- logger2,
1406
- mergeFiles
1407
- );
1408
- if (result) {
1409
- if (verbose) {
1410
- logger2.info(
1411
- `pack: Archive created successfully: ${result.packageFileName}`
1412
- );
1413
- } else {
1414
- logger2.info(result.packageFileName);
1415
- }
1416
- } else {
1417
- logger2.error(`pack: Unable to find any files to pack: ${targetDir}`);
1418
- return 1;
1419
- }
1420
- } catch (error) {
1421
- logger2.error(`pack: Failed to create archive: ${error}`);
1422
- return 1;
1423
- }
1424
- return 0;
1127
+ var packCommand = async (args, logger) => {
1128
+ var _args$options$peerDe;
1129
+ if (args.options.help || args.options.h) {
1130
+ showPackHelp();
1131
+ return 1;
1132
+ }
1133
+ const directory = args.positional[0];
1134
+ const packDestination = args.options["pack-destination"];
1135
+ const readmeOption = args.options["readme"];
1136
+ const inheritableFieldsOption = args.options["inheritable-fields"];
1137
+ const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1138
+ const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1139
+ const mergeFiles = !args.options["no-merge-files"];
1140
+ const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1141
+ const peerDepsVersionPrefix = (_args$options$peerDe = args.options["peer-deps-prefix"]) !== null && _args$options$peerDe !== void 0 ? _args$options$peerDe : "^";
1142
+ const packageManager = args.options["use-pnpm"] ? "pnpm" : "npm";
1143
+ const verbose = args.options["verbose"] ? true : false;
1144
+ const targetDir = resolve(directory !== null && directory !== void 0 ? directory : process.cwd());
1145
+ const outputDir = packDestination ? resolve(packDestination) : process.cwd();
1146
+ const readmeReplacementPath = readmeOption ? resolve(readmeOption) : void 0;
1147
+ const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1148
+ if (verbose) logger.info(`pack: Creating archive of ${targetDir}...`);
1149
+ try {
1150
+ const result = await packAssets(targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger, mergeFiles, packageManager);
1151
+ if (result) if (verbose) logger.info(`pack: Archive created successfully: ${result.packageFileName}`);
1152
+ else logger.info(result.packageFileName);
1153
+ else {
1154
+ logger.error(`pack: Unable to find any files to pack: ${targetDir}`);
1155
+ return 1;
1156
+ }
1157
+ } catch (error) {
1158
+ logger.error(`pack: Failed to create archive: ${error}`);
1159
+ return 1;
1160
+ }
1161
+ return 0;
1425
1162
  };
1426
- const showPublishHelp = () => {
1427
- console.info(`Usage: screw-up publish [options] [directory|package.tgz]
1163
+ var showPublishHelp = () => {
1164
+ console.info(`Usage: screw-up publish [options] [directory|package.tgz]
1428
1165
 
1429
1166
  Publish the project
1430
1167
 
@@ -1432,6 +1169,7 @@ Arguments:
1432
1169
  directory|package.tgz Directory to pack and publish, or existing tarball to publish
1433
1170
 
1434
1171
  Options:
1172
+ --use-pnpm Use pnpm pack before publish; final publish still targets npm-compatible registries
1435
1173
  All npm publish options are supported, including:
1436
1174
  --dry-run Perform a dry run
1437
1175
  --tag <tag> Tag for the published version
@@ -1446,162 +1184,124 @@ Examples:
1446
1184
  screw-up publish --dry-run --tag beta # Publish with options
1447
1185
  `);
1448
1186
  };
1449
- const runNpmPublish = async (tarballPath, npmOptions, verbose, logger2) => {
1450
- if (verbose) {
1451
- logger2.info(`publish: Publishing ${tarballPath} to npm...`);
1452
- }
1453
- const publishArgs = ["publish", tarballPath, ...npmOptions];
1454
- if (process.env.SCREW_UP_TEST_MODE === "true") {
1455
- logger2.info(`TEST_MODE: Would execute: npm ${publishArgs.join(" ")}`);
1456
- logger2.info(`TEST_MODE: Tarball path: ${tarballPath}`);
1457
- logger2.info(`TEST_MODE: Options: ${npmOptions.join(" ")}`);
1458
- logger2.info(`publish: Successfully published ${tarballPath}`);
1459
- return 0;
1460
- }
1461
- const npmProcess = spawn("npm", publishArgs, { stdio: "inherit" });
1462
- return new Promise((resolve2, reject) => {
1463
- npmProcess.on("close", (code) => {
1464
- if (code === 0) {
1465
- if (verbose) {
1466
- logger2.info(`publish: Successfully published ${tarballPath}`);
1467
- }
1468
- resolve2(code);
1469
- } else {
1470
- logger2.error(`publish: npm publish failed: ${tarballPath}`);
1471
- resolve2(code);
1472
- }
1473
- });
1474
- npmProcess.on("error", reject);
1475
- });
1187
+ var runNpmPublish = async (tarballPath, npmOptions, verbose, logger) => {
1188
+ if (verbose) logger.info(`publish: Publishing ${tarballPath} to npm...`);
1189
+ const publishArgs = [
1190
+ "publish",
1191
+ tarballPath,
1192
+ ...npmOptions
1193
+ ];
1194
+ if (process.env.SCREW_UP_TEST_MODE === "true") {
1195
+ logger.info(`TEST_MODE: Would execute: npm ${publishArgs.join(" ")}`);
1196
+ logger.info(`TEST_MODE: Tarball path: ${tarballPath}`);
1197
+ logger.info(`TEST_MODE: Options: ${npmOptions.join(" ")}`);
1198
+ logger.info(`publish: Successfully published ${tarballPath}`);
1199
+ return 0;
1200
+ }
1201
+ const npmProcess = spawn("npm", publishArgs, { stdio: "inherit" });
1202
+ return new Promise((resolve, reject) => {
1203
+ npmProcess.on("close", (code, signal) => {
1204
+ if (code === 0) {
1205
+ if (verbose) logger.info(`publish: Successfully published ${tarballPath}`);
1206
+ resolve(0);
1207
+ return;
1208
+ }
1209
+ if (signal) {
1210
+ logger.error(`publish: npm publish terminated by signal ${signal}: ${tarballPath}`);
1211
+ resolve(1);
1212
+ return;
1213
+ }
1214
+ const exitCode = code !== null && code !== void 0 ? code : 1;
1215
+ logger.error(`publish: npm publish failed with exit code ${exitCode}: ${tarballPath}`);
1216
+ resolve(exitCode);
1217
+ });
1218
+ npmProcess.on("error", reject);
1219
+ });
1476
1220
  };
1477
- const publishCommand = async (args, logger2) => {
1478
- var _a;
1479
- if (args.options.help || args.options.h) {
1480
- showPublishHelp();
1481
- return 1;
1482
- }
1483
- const path = args.positional[0];
1484
- const readmeOption = args.options["readme"];
1485
- const inheritableFieldsOption = args.options["inheritable-fields"];
1486
- const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1487
- const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1488
- const mergeFiles = !args.options["no-merge-files"];
1489
- const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1490
- const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1491
- const verbose = args.options["verbose"] ? true : false;
1492
- const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1493
- const readmeReplacementPath = readmeOption ? resolve(readmeOption) : void 0;
1494
- const npmOptions = [];
1495
- for (let i = 0; i < args.argv.length; i++) {
1496
- const arg = args.argv[i];
1497
- if (arg === "publish") ;
1498
- else if (arg === "--help" || arg === "--verbose" || arg === "-h" || arg === "--no-wds" || arg === "--no-git-version-override" || arg === "--no-merge-files" || arg === "--no-replace-peer-deps") ;
1499
- else if (arg === "--readme" || arg === "--inheritable-fields" || arg === "--peer-deps-prefix") {
1500
- i++;
1501
- } else {
1502
- npmOptions.push(arg);
1503
- }
1504
- }
1505
- try {
1506
- if (!path) {
1507
- const targetDir = process.cwd();
1508
- const outputDir = await mkdtemp(join(tmpdir(), "screw-up-publish-"));
1509
- if (verbose) {
1510
- logger2.info(`publish: Creating archive of ${targetDir}...`);
1511
- }
1512
- try {
1513
- const result = await packAssets(
1514
- targetDir,
1515
- outputDir,
1516
- checkWorkingDirectoryStatus,
1517
- alwaysOverrideVersionFromGit,
1518
- inheritableFields,
1519
- readmeReplacementPath,
1520
- replacePeerDepsWildcards,
1521
- peerDepsVersionPrefix,
1522
- logger2,
1523
- mergeFiles
1524
- );
1525
- if (result == null ? void 0 : result.metadata) {
1526
- if (verbose) {
1527
- logger2.info(
1528
- `publish: Archive created successfully: ${result.packageFileName}`
1529
- );
1530
- }
1531
- const archivePath = join(outputDir, result.packageFileName);
1532
- return await runNpmPublish(archivePath, npmOptions, verbose, logger2);
1533
- } else {
1534
- logger2.error(
1535
- `publish: Unable to find any files to pack: ${targetDir}`
1536
- );
1537
- return 1;
1538
- }
1539
- } finally {
1540
- await rm(outputDir, { recursive: true, force: true });
1541
- }
1542
- } else if (existsSync(path)) {
1543
- const pathStat = await stat(path);
1544
- if (pathStat.isFile() && (path.endsWith(".tgz") || path.endsWith(".tar.gz"))) {
1545
- return await runNpmPublish(resolve(path), npmOptions, verbose, logger2);
1546
- } else if (pathStat.isDirectory()) {
1547
- const targetDir = resolve(path);
1548
- const outputDir = await mkdtemp(join(tmpdir(), "screw-up-publish-"));
1549
- if (verbose) {
1550
- logger2.info(`publish: Creating archive of ${targetDir}...`);
1551
- }
1552
- try {
1553
- const result = await packAssets(
1554
- targetDir,
1555
- outputDir,
1556
- checkWorkingDirectoryStatus,
1557
- alwaysOverrideVersionFromGit,
1558
- inheritableFields,
1559
- readmeReplacementPath,
1560
- replacePeerDepsWildcards,
1561
- peerDepsVersionPrefix,
1562
- logger2,
1563
- mergeFiles
1564
- );
1565
- if (result == null ? void 0 : result.metadata) {
1566
- if (verbose) {
1567
- logger2.info(
1568
- `publish: Archive created successfully: ${result.packageFileName}`
1569
- );
1570
- }
1571
- const archivePath = join(outputDir, result.packageFileName);
1572
- return await runNpmPublish(
1573
- archivePath,
1574
- npmOptions,
1575
- verbose,
1576
- logger2
1577
- );
1578
- } else {
1579
- logger2.error(
1580
- `publish: Unable to find any files to pack: ${targetDir}`
1581
- );
1582
- return 1;
1583
- }
1584
- } finally {
1585
- await rm(outputDir, { recursive: true, force: true });
1586
- }
1587
- } else {
1588
- logger2.error(
1589
- `publish: Invalid path - must be a directory or .tgz/.tar.gz file: ${path}`
1590
- );
1591
- return 1;
1592
- }
1593
- } else {
1594
- logger2.error(`publish: Path does not exist: ${path}`);
1595
- return 1;
1596
- }
1597
- } catch (error) {
1598
- logger2.error(`publish: Failed to publish: ${error}`);
1599
- return 1;
1600
- }
1221
+ var publishCommand = async (args, logger) => {
1222
+ var _args$options$peerDe2;
1223
+ if (args.options.help || args.options.h) {
1224
+ showPublishHelp();
1225
+ return 1;
1226
+ }
1227
+ const path = args.positional[0];
1228
+ const readmeOption = args.options["readme"];
1229
+ const inheritableFieldsOption = args.options["inheritable-fields"];
1230
+ const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1231
+ const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1232
+ const mergeFiles = !args.options["no-merge-files"];
1233
+ const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1234
+ const peerDepsVersionPrefix = (_args$options$peerDe2 = args.options["peer-deps-prefix"]) !== null && _args$options$peerDe2 !== void 0 ? _args$options$peerDe2 : "^";
1235
+ const packageManager = args.options["use-pnpm"] ? "pnpm" : "npm";
1236
+ const verbose = args.options["verbose"] ? true : false;
1237
+ const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1238
+ const readmeReplacementPath = readmeOption ? resolve(readmeOption) : void 0;
1239
+ const npmOptions = [];
1240
+ let pathSkipped = false;
1241
+ for (let i = 0; i < args.argv.length; i++) {
1242
+ const arg = args.argv[i];
1243
+ if (arg === "publish") {} else if (arg === "--help" || arg === "--verbose" || arg === "--use-pnpm" || arg === "-h" || arg === "--no-wds" || arg === "--no-git-version-override" || arg === "--no-merge-files" || arg === "--no-replace-peer-deps") {} else if (arg === "--readme" || arg === "--inheritable-fields" || arg === "--peer-deps-prefix") i++;
1244
+ else if (!pathSkipped && path && arg === path) pathSkipped = true;
1245
+ else npmOptions.push(arg);
1246
+ }
1247
+ try {
1248
+ if (!path) {
1249
+ const targetDir = process.cwd();
1250
+ const outputDir = await mkdtemp(join(tmpdir(), "screw-up-publish-"));
1251
+ if (verbose) logger.info(`publish: Creating archive of ${targetDir}...`);
1252
+ try {
1253
+ const result = await packAssets(targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger, mergeFiles, packageManager);
1254
+ if (result === null || result === void 0 ? void 0 : result.metadata) {
1255
+ if (verbose) logger.info(`publish: Archive created successfully: ${result.packageFileName}`);
1256
+ return await runNpmPublish(join(outputDir, result.packageFileName), npmOptions, verbose, logger);
1257
+ } else {
1258
+ logger.error(`publish: Unable to find any files to pack: ${targetDir}`);
1259
+ return 1;
1260
+ }
1261
+ } finally {
1262
+ await rm(outputDir, {
1263
+ recursive: true,
1264
+ force: true
1265
+ });
1266
+ }
1267
+ } else if (existsSync(path)) {
1268
+ const pathStat = await stat(path);
1269
+ if (pathStat.isFile() && (path.endsWith(".tgz") || path.endsWith(".tar.gz"))) return await runNpmPublish(resolve(path), npmOptions, verbose, logger);
1270
+ else if (pathStat.isDirectory()) {
1271
+ const targetDir = resolve(path);
1272
+ const outputDir = await mkdtemp(join(tmpdir(), "screw-up-publish-"));
1273
+ if (verbose) logger.info(`publish: Creating archive of ${targetDir}...`);
1274
+ try {
1275
+ const result = await packAssets(targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger, mergeFiles, packageManager);
1276
+ if (result === null || result === void 0 ? void 0 : result.metadata) {
1277
+ if (verbose) logger.info(`publish: Archive created successfully: ${result.packageFileName}`);
1278
+ return await runNpmPublish(join(outputDir, result.packageFileName), npmOptions, verbose, logger);
1279
+ } else {
1280
+ logger.error(`publish: Unable to find any files to pack: ${targetDir}`);
1281
+ return 1;
1282
+ }
1283
+ } finally {
1284
+ await rm(outputDir, {
1285
+ recursive: true,
1286
+ force: true
1287
+ });
1288
+ }
1289
+ } else {
1290
+ logger.error(`publish: Invalid path - must be a directory or .tgz/.tar.gz file: ${path}`);
1291
+ return 1;
1292
+ }
1293
+ } else {
1294
+ logger.error(`publish: Path does not exist: ${path}`);
1295
+ return 1;
1296
+ }
1297
+ } catch (error) {
1298
+ logger.error(`publish: Failed to publish: ${error}`);
1299
+ return 1;
1300
+ }
1601
1301
  };
1602
- const showHelp = async () => {
1603
- const { author, license, repository_url, version, git_commit_hash } = await import("./metadata-file-CV4Jy39y.js").then((n) => n.p);
1604
- console.info(`screw-up [${version}-${git_commit_hash}]
1302
+ var showHelp = async () => {
1303
+ const { author, license, repository_url, version, git_commit_hash } = await import("./packageMetadata-B3dAY9Pw.js").then((n) => n.r);
1304
+ console.info(`screw-up [${version}-${git_commit_hash}]
1605
1305
  Easy package metadata inserter CLI
1606
1306
  Copyright (c) ${author}
1607
1307
  Repository: ${repository_url}
@@ -1629,56 +1329,50 @@ Examples:
1629
1329
  screw-up publish package.tgz # Publish existing tarball
1630
1330
  `);
1631
1331
  };
1632
- const argOptionMap = /* @__PURE__ */ new Map([
1633
- ["dump", /* @__PURE__ */ new Set(["inheritable-fields"])],
1634
- ["metadata", /* @__PURE__ */ new Set(["output-metadata-file-path", "output-metadata-keys"])],
1635
- [
1636
- "pack",
1637
- /* @__PURE__ */ new Set([
1638
- "pack-destination",
1639
- "readme",
1640
- "inheritable-fields",
1641
- "peer-deps-prefix"
1642
- ])
1643
- ],
1644
- ["format", /* @__PURE__ */ new Set(["input", "i", "bracket", "b", "inheritable-fields"])],
1645
- ["publish", /* @__PURE__ */ new Set(["inheritable-fields", "peer-deps-prefix"])]
1332
+ var argOptionMap = new Map([
1333
+ ["dump", new Set(["inheritable-fields"])],
1334
+ ["metadata", new Set(["output-metadata-file-path", "output-metadata-keys"])],
1335
+ ["pack", new Set([
1336
+ "pack-destination",
1337
+ "readme",
1338
+ "inheritable-fields",
1339
+ "peer-deps-prefix"
1340
+ ])],
1341
+ ["format", new Set([
1342
+ "input",
1343
+ "i",
1344
+ "bracket",
1345
+ "b",
1346
+ "inheritable-fields"
1347
+ ])],
1348
+ ["publish", new Set(["inheritable-fields", "peer-deps-prefix"])]
1646
1349
  ]);
1647
- const cliMain = async (args, logger2) => {
1648
- const parsedArgs = parseArgs(args, argOptionMap);
1649
- if (!parsedArgs.command && (parsedArgs.options.help || parsedArgs.options.h)) {
1650
- await showHelp();
1651
- return 1;
1652
- }
1653
- switch (parsedArgs.command) {
1654
- case "format":
1655
- return await formatCommand(parsedArgs, logger2);
1656
- case "dump":
1657
- return await dumpCommand(parsedArgs, logger2);
1658
- case "metadata":
1659
- return await metadataCommand(parsedArgs, logger2);
1660
- case "pack":
1661
- return await packCommand(parsedArgs, logger2);
1662
- case "publish":
1663
- return await publishCommand(parsedArgs, logger2);
1664
- default:
1665
- if (parsedArgs.command) {
1666
- logger2.error(`Unknown command: ${parsedArgs.command}`);
1667
- } else {
1668
- logger2.error(`Unknown command`);
1669
- }
1670
- logger2.error('Run "screw-up --help" for usage information.');
1671
- return 1;
1672
- }
1350
+ var cliMain = async (args, logger) => {
1351
+ const parsedArgs = parseArgs(args, argOptionMap);
1352
+ if (!parsedArgs.command && (parsedArgs.options.help || parsedArgs.options.h)) {
1353
+ await showHelp();
1354
+ return 1;
1355
+ }
1356
+ switch (parsedArgs.command) {
1357
+ case "format": return await formatCommand(parsedArgs, logger);
1358
+ case "dump": return await dumpCommand(parsedArgs, logger);
1359
+ case "metadata": return await metadataCommand(parsedArgs, logger);
1360
+ case "pack": return await packCommand(parsedArgs, logger);
1361
+ case "publish": return await publishCommand(parsedArgs, logger);
1362
+ default:
1363
+ if (parsedArgs.command) logger.error(`Unknown command: ${parsedArgs.command}`);
1364
+ else logger.error(`Unknown command`);
1365
+ logger.error("Run \"screw-up --help\" for usage information.");
1366
+ return 1;
1367
+ }
1673
1368
  };
1674
- const loggerPrefix = `${name}-cli`;
1675
- const logger = createConsoleLogger(loggerPrefix);
1676
- cliMain(
1677
- process.argv.slice(2),
1678
- // Remove 'node' and script path
1679
- logger
1680
- ).then((code) => process.exit(code)).catch((error) => {
1681
- logger.error(`CLI error: ${error}`);
1682
- process.exit(1);
1369
+ //#endregion
1370
+ //#region src/main.ts
1371
+ var logger = createConsoleLogger(`${name}-cli`);
1372
+ cliMain(process.argv.slice(2), logger).then((code) => process.exit(code)).catch((error) => {
1373
+ logger.error(`CLI error: ${error}`);
1374
+ process.exit(1);
1683
1375
  });
1684
- //# sourceMappingURL=main.mjs.map
1376
+ //#endregion
1377
+
1378
+ //# sourceMappingURL=main.mjs.map