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/index.mjs CHANGED
@@ -1,397 +1,318 @@
1
1
  /*!
2
- * name: screw-up
3
- * version: 1.25.0
4
- * description: Simply package metadata inserter on Vite plugin
5
- * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
- * license: MIT
7
- * repository.url: https://github.com/kekyo/screw-up.git
8
- * git.commit.hash: 8275b6db6558235b0fe73f99368acf3f9a6e1b29
9
- */
10
-
2
+ * name: screw-up
3
+ * version: 1.27.0
4
+ * description: Simply package metadata inserter on Vite plugin
5
+ * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
+ * license: MIT
7
+ * repository.url: https://github.com/kekyo/screw-up.git
8
+ * git.commit.hash: eb1634007fc12b0ddd13928d7688758bdfe32624
9
+ */
10
+ import { i as getFetchGitMetadata, l as resolvePackageMetadata, n as generateMetadataFileContent, o as createConsoleLogger, r as writeFileIfChanged, t as ensureMetadataGitignore } from "./metadata-file-Djz8vanJ.js";
11
+ import { i as version, n as name, t as git_commit_hash } from "./packageMetadata-B3dAY9Pw.js";
11
12
  import { readFile, readdir, writeFile } from "fs/promises";
12
13
  import { existsSync } from "fs";
13
- import { dirname, join, extname } from "path";
14
- import { c as createConsoleLogger, n as name, g as getFetchGitMetadata, v as version, a as git_commit_hash, r as resolvePackageMetadata, b as generateMetadataFileContent, w as writeFileIfChanged, e as ensureMetadataGitignore } from "./metadata-file-CV4Jy39y.js";
14
+ import { dirname, extname, join } from "path";
15
15
  import { createHash } from "crypto";
16
- const __NOOP_HANDLER = () => {
17
- };
18
- const __NOOP_RELEASABLE = {
19
- release: __NOOP_HANDLER,
20
- [Symbol.dispose]: __NOOP_HANDLER
21
- };
22
- const toAbortError = (reason) => {
23
- if (reason instanceof Error) {
24
- return reason;
25
- }
26
- if (typeof reason === "string") {
27
- return new Error(reason);
28
- }
29
- return new Error("Operation aborted");
30
- };
31
- const onAbort = (signal, callback) => {
32
- if (!signal) {
33
- return __NOOP_RELEASABLE;
34
- }
35
- if (signal.aborted) {
36
- try {
37
- callback(toAbortError(signal.reason));
38
- } catch (error) {
39
- console.warn("AbortHook callback error: ", error);
40
- }
41
- return __NOOP_RELEASABLE;
42
- }
43
- let abortHandler;
44
- abortHandler = () => {
45
- if (abortHandler) {
46
- const reason = signal.reason;
47
- signal.removeEventListener("abort", abortHandler);
48
- abortHandler = void 0;
49
- try {
50
- callback(toAbortError(reason));
51
- } catch (error) {
52
- console.warn("AbortHook callback error: ", error);
53
- }
54
- }
55
- };
56
- const release = () => {
57
- if (abortHandler) {
58
- signal.removeEventListener("abort", abortHandler);
59
- abortHandler = void 0;
60
- }
61
- };
62
- signal.addEventListener("abort", abortHandler, { once: true });
63
- const handle = {
64
- release,
65
- [Symbol.dispose]: release
66
- };
67
- return handle;
68
- };
69
- const defer = (fn) => {
70
- if (typeof setImmediate === "function") {
71
- setImmediate(fn);
72
- } else {
73
- setTimeout(fn, 0);
74
- }
75
- };
76
- const ABORTED_ERROR$2 = () => new Error("Lock acquisition was aborted");
77
- const createLockHandle = (releaseCallback) => {
78
- let isActive = true;
79
- const release = () => {
80
- if (!isActive) {
81
- return;
82
- }
83
- isActive = false;
84
- releaseCallback();
85
- };
86
- return {
87
- get isActive() {
88
- return isActive;
89
- },
90
- release,
91
- [Symbol.dispose]: release
92
- };
93
- };
94
- const createMutex = (maxConsecutiveCalls = 20) => {
95
- let isLocked = false;
96
- const queue = [];
97
- let count = 0;
98
- const processQueue = () => {
99
- var _a;
100
- if (isLocked || queue.length === 0) {
101
- return;
102
- }
103
- const item = queue.shift();
104
- if ((_a = item.signal) == null ? void 0 : _a.aborted) {
105
- item.reject(ABORTED_ERROR$2());
106
- scheduleNextProcess();
107
- return;
108
- }
109
- isLocked = true;
110
- const lockHandle = createLockHandle(releaseLock);
111
- item.resolve(lockHandle);
112
- };
113
- const scheduleNextProcess = () => {
114
- count++;
115
- if (count >= maxConsecutiveCalls) {
116
- count = 0;
117
- defer(processQueue);
118
- } else {
119
- processQueue();
120
- }
121
- };
122
- const releaseLock = () => {
123
- if (!isLocked) {
124
- return;
125
- }
126
- isLocked = false;
127
- scheduleNextProcess();
128
- };
129
- const removeFromQueue = (item) => {
130
- const index = queue.indexOf(item);
131
- if (index !== -1) {
132
- queue.splice(index, 1);
133
- }
134
- };
135
- const lock = async (signal) => {
136
- if (signal) {
137
- if (signal.aborted) {
138
- throw ABORTED_ERROR$2();
139
- }
140
- return new Promise((resolve, reject) => {
141
- const queueItem = {
142
- resolve: void 0,
143
- reject: void 0,
144
- signal
145
- };
146
- const abortHandle = onAbort(signal, () => {
147
- removeFromQueue(queueItem);
148
- reject(ABORTED_ERROR$2());
149
- });
150
- queueItem.resolve = (handle) => {
151
- abortHandle.release();
152
- resolve(handle);
153
- };
154
- queueItem.reject = (error) => {
155
- abortHandle.release();
156
- reject(error);
157
- };
158
- queue.push(queueItem);
159
- processQueue();
160
- });
161
- } else {
162
- return new Promise((resolve, reject) => {
163
- queue.push({
164
- resolve,
165
- reject
166
- });
167
- processQueue();
168
- });
169
- }
170
- };
171
- const result = {
172
- lock,
173
- waiter: {
174
- wait: lock
175
- },
176
- get isLocked() {
177
- return isLocked;
178
- },
179
- get pendingCount() {
180
- return queue.length;
181
- }
182
- };
183
- return result;
184
- };
185
- const importConditions = ["import", "node", "default"];
186
- const stripQuery = (id) => {
187
- const queryIndex = id.indexOf("?");
188
- return queryIndex === -1 ? id : id.slice(0, queryIndex);
189
- };
190
- const isBareSpecifier = (specifier) => {
191
- if (!specifier) {
192
- return false;
193
- }
194
- if (specifier.startsWith(".")) {
195
- return false;
196
- }
197
- if (specifier.startsWith("/") || specifier.startsWith("\\")) {
198
- return false;
199
- }
200
- if (specifier.startsWith("node:")) {
201
- return false;
202
- }
203
- if (specifier.includes(":")) {
204
- return false;
205
- }
206
- return true;
207
- };
208
- const parsePackageName = (specifier) => {
209
- if (specifier.startsWith("@")) {
210
- const parts = specifier.split("/");
211
- if (parts.length >= 2) {
212
- return {
213
- packageName: `${parts[0]}/${parts[1]}`,
214
- subpath: parts.slice(2).join("/")
215
- };
216
- }
217
- }
218
- const [packageName, ...rest] = specifier.split("/");
219
- return { packageName, subpath: rest.join("/") };
220
- };
221
- const findPackageJsonPath = (packageName, importerDir) => {
222
- let current = importerDir;
223
- while (true) {
224
- const candidate = join(
225
- current,
226
- "node_modules",
227
- packageName,
228
- "package.json"
229
- );
230
- if (existsSync(candidate)) {
231
- return candidate;
232
- }
233
- const parent = dirname(current);
234
- if (parent === current) {
235
- return void 0;
236
- }
237
- current = parent;
238
- }
239
- };
240
- const readPackageJson = async (packageJsonPath) => {
241
- try {
242
- const raw = await readFile(packageJsonPath, "utf8");
243
- const parsed = JSON.parse(raw);
244
- if (parsed && typeof parsed === "object") {
245
- return parsed;
246
- }
247
- } catch (e) {
248
- return void 0;
249
- }
250
- return void 0;
251
- };
252
- const resolveExportTarget = (target, subpath, conditions) => {
253
- if (typeof target === "string") {
254
- if (subpath && subpath !== ".") {
255
- return void 0;
256
- }
257
- return target;
258
- }
259
- if (Array.isArray(target)) {
260
- for (const entry of target) {
261
- const resolved = resolveExportTarget(entry, subpath, conditions);
262
- if (resolved) {
263
- return resolved;
264
- }
265
- }
266
- return void 0;
267
- }
268
- if (!target || typeof target !== "object") {
269
- return void 0;
270
- }
271
- const record = target;
272
- const keys = Object.keys(record);
273
- const hasSubpathMap = keys.some((key) => key.startsWith("."));
274
- if (hasSubpathMap) {
275
- const subpathKey = subpath === "" || subpath === "." ? "." : subpath.startsWith("./") ? subpath : `./${subpath}`;
276
- if (!(subpathKey in record)) {
277
- return void 0;
278
- }
279
- return resolveExportTarget(record[subpathKey], ".", conditions);
280
- }
281
- for (const condition of conditions) {
282
- if (condition in record) {
283
- const resolved = resolveExportTarget(
284
- record[condition],
285
- subpath,
286
- conditions
287
- );
288
- if (resolved) {
289
- return resolved;
290
- }
291
- }
292
- }
293
- return void 0;
294
- };
295
- const inferModuleKindFromPath = (targetPath, packageType) => {
296
- const ext = extname(targetPath);
297
- if (ext === ".mjs") {
298
- return "esm";
299
- }
300
- if (ext === ".cjs") {
301
- return "cjs";
302
- }
303
- if (ext === ".js" || ext === "") {
304
- return packageType === "module" ? "esm" : "cjs";
305
- }
306
- return packageType === "module" ? "esm" : "cjs";
307
- };
308
- const resolveModuleKindFromPackage = (packageJson, subpath) => {
309
- const packageType = typeof packageJson.type === "string" ? packageJson.type : void 0;
310
- if (packageJson.exports !== void 0) {
311
- const resolved = resolveExportTarget(
312
- packageJson.exports,
313
- subpath,
314
- importConditions
315
- );
316
- if (!resolved) {
317
- return "unresolvable";
318
- }
319
- return inferModuleKindFromPath(resolved, packageType);
320
- }
321
- if (subpath) {
322
- return inferModuleKindFromPath(subpath, packageType);
323
- }
324
- const main = typeof packageJson.main === "string" ? packageJson.main : "index.js";
325
- return inferModuleKindFromPath(main, packageType);
326
- };
327
- const createNodeModuleKindResolver = () => {
328
- const packageJsonCache = /* @__PURE__ */ new Map();
329
- const resolveCache = /* @__PURE__ */ new Map();
330
- return async (specifier, importer) => {
331
- var _a;
332
- if (!isBareSpecifier(specifier)) {
333
- return "unknown";
334
- }
335
- const importerPath = stripQuery(importer);
336
- const importerDir = dirname(importerPath);
337
- const { packageName, subpath } = parsePackageName(specifier);
338
- const packageJsonPath = findPackageJsonPath(packageName, importerDir);
339
- if (!packageJsonPath) {
340
- return "unknown";
341
- }
342
- const cacheKey = `${packageJsonPath}:${subpath}`;
343
- const cached = resolveCache.get(cacheKey);
344
- if (cached) {
345
- return cached;
346
- }
347
- let packageJson = packageJsonCache.get(packageJsonPath);
348
- if (packageJson === void 0) {
349
- packageJson = (_a = await readPackageJson(packageJsonPath)) != null ? _a : null;
350
- packageJsonCache.set(packageJsonPath, packageJson);
351
- }
352
- if (!packageJson) {
353
- resolveCache.set(cacheKey, "unknown");
354
- return "unknown";
355
- }
356
- const resolved = resolveModuleKindFromPackage(packageJson, subpath);
357
- resolveCache.set(cacheKey, resolved);
358
- return resolved;
359
- };
360
- };
361
- const scanHasDefaultImport = (ts, code) => {
362
- const scanner = ts.createScanner(
363
- ts.ScriptTarget.ESNext,
364
- true,
365
- ts.LanguageVariant.Standard,
366
- code
367
- );
368
- let token = scanner.scan();
369
- while (token !== ts.SyntaxKind.EndOfFileToken) {
370
- if (token === ts.SyntaxKind.ImportKeyword) {
371
- const next = scanner.scan();
372
- if (next === ts.SyntaxKind.OpenParenToken) {
373
- token = scanner.scan();
374
- continue;
375
- }
376
- if (next === ts.SyntaxKind.Identifier || next === ts.SyntaxKind.TypeKeyword) {
377
- return true;
378
- }
379
- }
380
- token = scanner.scan();
381
- }
382
- return false;
383
- };
384
- const cjsInteropGlobalFlagPrefix = "__screwUpIsInCJS_";
385
- const cjsInteropIdLength = 12;
386
- const cjsInteropGlobalFlagAssignmentPattern = new RegExp(
387
- `\\bglobalThis\\.${cjsInteropGlobalFlagPrefix}[0-9a-f]+\\s*=\\s*false\\b`,
388
- "g"
389
- );
390
- const createCjsInteropHelperId = (seed) => {
391
- const hash = createHash("sha256").update(seed).digest("hex");
392
- return hash.slice(0, cjsInteropIdLength);
393
- };
394
- const buildHelperFunctionSource = (helperId) => `
16
+ //#region node_modules/async-primitives/dist/index.mjs
17
+ /*!
18
+ * name: async-primitives
19
+ * version: 1.5.0
20
+ * description: A collection of primitive functions for asynchronous operations
21
+ * author: Kouji Matsui (@kekyo@mi.kekyo.net)
22
+ * license: MIT
23
+ * repository.url: https://github.com/kekyo/async-primitives.git
24
+ * git.commit.hash: cd35465b7e9b9945049186e7eaeecc0bfba65766
25
+ */
26
+ var __NOOP_HANDLER = () => {};
27
+ var __NOOP_RELEASABLE = {
28
+ release: __NOOP_HANDLER,
29
+ [Symbol.dispose]: __NOOP_HANDLER
30
+ };
31
+ var toAbortError = (reason) => {
32
+ if (reason instanceof Error) return reason;
33
+ if (typeof reason === "string") return new Error(reason);
34
+ return /* @__PURE__ */ new Error("Operation aborted");
35
+ };
36
+ var onAbort = (signal, callback) => {
37
+ if (!signal) return __NOOP_RELEASABLE;
38
+ if (signal.aborted) {
39
+ try {
40
+ callback(toAbortError(signal.reason));
41
+ } catch (error) {
42
+ console.warn("AbortHook callback error: ", error);
43
+ }
44
+ return __NOOP_RELEASABLE;
45
+ }
46
+ let abortHandler = () => {
47
+ if (abortHandler) {
48
+ const reason = signal.reason;
49
+ signal.removeEventListener("abort", abortHandler);
50
+ abortHandler = void 0;
51
+ try {
52
+ callback(toAbortError(reason));
53
+ } catch (error) {
54
+ console.warn("AbortHook callback error: ", error);
55
+ }
56
+ }
57
+ };
58
+ const release = () => {
59
+ if (abortHandler) {
60
+ signal.removeEventListener("abort", abortHandler);
61
+ abortHandler = void 0;
62
+ }
63
+ };
64
+ signal.addEventListener("abort", abortHandler, { once: true });
65
+ return {
66
+ release,
67
+ [Symbol.dispose]: release
68
+ };
69
+ };
70
+ var defer = (fn) => {
71
+ if (typeof setImmediate === "function") setImmediate(fn);
72
+ else setTimeout(fn, 0);
73
+ };
74
+ var ABORTED_ERROR$2 = () => /* @__PURE__ */ new Error("Lock acquisition was aborted");
75
+ var createLockHandle = (releaseCallback) => {
76
+ let isActive = true;
77
+ const release = () => {
78
+ if (!isActive) return;
79
+ isActive = false;
80
+ releaseCallback();
81
+ };
82
+ return {
83
+ get isActive() {
84
+ return isActive;
85
+ },
86
+ release,
87
+ [Symbol.dispose]: release
88
+ };
89
+ };
90
+ var createMutex = (maxConsecutiveCalls = 20) => {
91
+ let isLocked = false;
92
+ const queue = [];
93
+ let count = 0;
94
+ const processQueue = () => {
95
+ var _a;
96
+ if (isLocked || queue.length === 0) return;
97
+ const item = queue.shift();
98
+ if ((_a = item.signal) == null ? void 0 : _a.aborted) {
99
+ item.reject(ABORTED_ERROR$2());
100
+ scheduleNextProcess();
101
+ return;
102
+ }
103
+ isLocked = true;
104
+ const lockHandle = createLockHandle(releaseLock);
105
+ item.resolve(lockHandle);
106
+ };
107
+ const scheduleNextProcess = () => {
108
+ count++;
109
+ if (count >= maxConsecutiveCalls) {
110
+ count = 0;
111
+ defer(processQueue);
112
+ } else processQueue();
113
+ };
114
+ const releaseLock = () => {
115
+ if (!isLocked) return;
116
+ isLocked = false;
117
+ scheduleNextProcess();
118
+ };
119
+ const removeFromQueue = (item) => {
120
+ const index = queue.indexOf(item);
121
+ if (index !== -1) queue.splice(index, 1);
122
+ };
123
+ const lock = async (signal) => {
124
+ if (signal) {
125
+ if (signal.aborted) throw ABORTED_ERROR$2();
126
+ return new Promise((resolve, reject) => {
127
+ const queueItem = {
128
+ resolve: void 0,
129
+ reject: void 0,
130
+ signal
131
+ };
132
+ const abortHandle = onAbort(signal, () => {
133
+ removeFromQueue(queueItem);
134
+ reject(ABORTED_ERROR$2());
135
+ });
136
+ queueItem.resolve = (handle) => {
137
+ abortHandle.release();
138
+ resolve(handle);
139
+ };
140
+ queueItem.reject = (error) => {
141
+ abortHandle.release();
142
+ reject(error);
143
+ };
144
+ queue.push(queueItem);
145
+ processQueue();
146
+ });
147
+ } else return new Promise((resolve, reject) => {
148
+ queue.push({
149
+ resolve,
150
+ reject
151
+ });
152
+ processQueue();
153
+ });
154
+ };
155
+ return {
156
+ lock,
157
+ waiter: { wait: lock },
158
+ get isLocked() {
159
+ return isLocked;
160
+ },
161
+ get pendingCount() {
162
+ return queue.length;
163
+ }
164
+ };
165
+ };
166
+ var createLogicalContext = (id) => {
167
+ return {
168
+ id,
169
+ data: /* @__PURE__ */ new Map()
170
+ };
171
+ };
172
+ createLogicalContext(Symbol("[root]"));
173
+ //#endregion
174
+ //#region src/default-import-fix.ts
175
+ var importConditions = [
176
+ "import",
177
+ "node",
178
+ "default"
179
+ ];
180
+ var stripQuery = (id) => {
181
+ const queryIndex = id.indexOf("?");
182
+ return queryIndex === -1 ? id : id.slice(0, queryIndex);
183
+ };
184
+ var isBareSpecifier = (specifier) => {
185
+ if (!specifier) return false;
186
+ if (specifier.startsWith(".")) return false;
187
+ if (specifier.startsWith("/") || specifier.startsWith("\\")) return false;
188
+ if (specifier.startsWith("node:")) return false;
189
+ if (specifier.includes(":")) return false;
190
+ return true;
191
+ };
192
+ var parsePackageName = (specifier) => {
193
+ if (specifier.startsWith("@")) {
194
+ const parts = specifier.split("/");
195
+ if (parts.length >= 2) return {
196
+ packageName: `${parts[0]}/${parts[1]}`,
197
+ subpath: parts.slice(2).join("/")
198
+ };
199
+ }
200
+ const [packageName, ...rest] = specifier.split("/");
201
+ return {
202
+ packageName,
203
+ subpath: rest.join("/")
204
+ };
205
+ };
206
+ var findPackageJsonPath = (packageName, importerDir) => {
207
+ let current = importerDir;
208
+ while (true) {
209
+ const candidate = join(current, "node_modules", packageName, "package.json");
210
+ if (existsSync(candidate)) return candidate;
211
+ const parent = dirname(current);
212
+ if (parent === current) return;
213
+ current = parent;
214
+ }
215
+ };
216
+ var readPackageJson = async (packageJsonPath) => {
217
+ try {
218
+ const raw = await readFile(packageJsonPath, "utf8");
219
+ const parsed = JSON.parse(raw);
220
+ if (parsed && typeof parsed === "object") return parsed;
221
+ } catch (_unused) {
222
+ return;
223
+ }
224
+ };
225
+ var resolveExportTarget = (target, subpath, conditions) => {
226
+ if (typeof target === "string") {
227
+ if (subpath && subpath !== ".") return;
228
+ return target;
229
+ }
230
+ if (Array.isArray(target)) {
231
+ for (const entry of target) {
232
+ const resolved = resolveExportTarget(entry, subpath, conditions);
233
+ if (resolved) return resolved;
234
+ }
235
+ return;
236
+ }
237
+ if (!target || typeof target !== "object") return;
238
+ const record = target;
239
+ if (Object.keys(record).some((key) => key.startsWith("."))) {
240
+ const subpathKey = subpath === "" || subpath === "." ? "." : subpath.startsWith("./") ? subpath : `./${subpath}`;
241
+ if (!(subpathKey in record)) return;
242
+ return resolveExportTarget(record[subpathKey], ".", conditions);
243
+ }
244
+ for (const condition of conditions) if (condition in record) {
245
+ const resolved = resolveExportTarget(record[condition], subpath, conditions);
246
+ if (resolved) return resolved;
247
+ }
248
+ };
249
+ var inferModuleKindFromPath = (targetPath, packageType) => {
250
+ const ext = extname(targetPath);
251
+ if (ext === ".mjs") return "esm";
252
+ if (ext === ".cjs") return "cjs";
253
+ if (ext === ".js" || ext === "") return packageType === "module" ? "esm" : "cjs";
254
+ return packageType === "module" ? "esm" : "cjs";
255
+ };
256
+ var resolveModuleKindFromPackage = (packageJson, subpath) => {
257
+ const packageType = typeof packageJson.type === "string" ? packageJson.type : void 0;
258
+ if (packageJson.exports !== void 0) {
259
+ const resolved = resolveExportTarget(packageJson.exports, subpath, importConditions);
260
+ if (!resolved) return "unresolvable";
261
+ return inferModuleKindFromPath(resolved, packageType);
262
+ }
263
+ if (subpath) return inferModuleKindFromPath(subpath, packageType);
264
+ return inferModuleKindFromPath(typeof packageJson.main === "string" ? packageJson.main : "index.js", packageType);
265
+ };
266
+ var createNodeModuleKindResolver = () => {
267
+ const packageJsonCache = /* @__PURE__ */ new Map();
268
+ const resolveCache = /* @__PURE__ */ new Map();
269
+ return async (specifier, importer) => {
270
+ if (!isBareSpecifier(specifier)) return "unknown";
271
+ const importerDir = dirname(stripQuery(importer));
272
+ const { packageName, subpath } = parsePackageName(specifier);
273
+ const packageJsonPath = findPackageJsonPath(packageName, importerDir);
274
+ if (!packageJsonPath) return "unknown";
275
+ const cacheKey = `${packageJsonPath}:${subpath}`;
276
+ const cached = resolveCache.get(cacheKey);
277
+ if (cached) return cached;
278
+ let packageJson = packageJsonCache.get(packageJsonPath);
279
+ if (packageJson === void 0) {
280
+ var _await$readPackageJso;
281
+ packageJson = (_await$readPackageJso = await readPackageJson(packageJsonPath)) !== null && _await$readPackageJso !== void 0 ? _await$readPackageJso : null;
282
+ packageJsonCache.set(packageJsonPath, packageJson);
283
+ }
284
+ if (!packageJson) {
285
+ resolveCache.set(cacheKey, "unknown");
286
+ return "unknown";
287
+ }
288
+ const resolved = resolveModuleKindFromPackage(packageJson, subpath);
289
+ resolveCache.set(cacheKey, resolved);
290
+ return resolved;
291
+ };
292
+ };
293
+ var scanHasDefaultImport = (ts, code) => {
294
+ const scanner = ts.createScanner(ts.ScriptTarget.ESNext, true, ts.LanguageVariant.Standard, code);
295
+ let token = scanner.scan();
296
+ while (token !== ts.SyntaxKind.EndOfFileToken) {
297
+ if (token === ts.SyntaxKind.ImportKeyword) {
298
+ const next = scanner.scan();
299
+ if (next === ts.SyntaxKind.OpenParenToken) {
300
+ token = scanner.scan();
301
+ continue;
302
+ }
303
+ if (next === ts.SyntaxKind.Identifier || next === ts.SyntaxKind.TypeKeyword) return true;
304
+ }
305
+ token = scanner.scan();
306
+ }
307
+ return false;
308
+ };
309
+ var cjsInteropGlobalFlagPrefix = "__screwUpIsInCJS_";
310
+ var cjsInteropIdLength = 12;
311
+ var cjsInteropGlobalFlagAssignmentPattern = new RegExp(`\\bglobalThis\\.${cjsInteropGlobalFlagPrefix}[0-9a-f]+\\s*=\\s*false\\b`, "g");
312
+ var createCjsInteropHelperId = (seed) => {
313
+ return createHash("sha256").update(seed).digest("hex").slice(0, cjsInteropIdLength);
314
+ };
315
+ var buildHelperFunctionSource = (helperId) => `
395
316
  globalThis.${cjsInteropGlobalFlagPrefix}${helperId} = false;
396
317
  function __resolveDefaultExport<T>(module: T | { default?: T }, isESM: boolean): T {
397
318
  const __isInCJS =
@@ -430,713 +351,462 @@ function __resolveDefaultExport<T>(module: T | { default?: T }, isESM: boolean):
430
351
 
431
352
  return hasDefault ? ((resolvedDefault as T) ?? (module as T)) : (module as T);
432
353
  }`;
433
- const injectCjsInteropFlag = (code) => {
434
- let changed = false;
435
- const nextCode = code.replace(
436
- cjsInteropGlobalFlagAssignmentPattern,
437
- (match) => {
438
- changed = true;
439
- return match.replace(/\bfalse\b/, "true ");
440
- }
441
- );
442
- return { code: nextCode, changed };
443
- };
444
- const hasResolveDefaultExport = (ts, sourceFile) => {
445
- return sourceFile.statements.some((statement) => {
446
- var _a, _b;
447
- if (ts.isFunctionDeclaration(statement)) {
448
- return ((_a = statement.name) == null ? void 0 : _a.text) === "__resolveDefaultExport";
449
- }
450
- if (ts.isVariableStatement(statement)) {
451
- return statement.declarationList.declarations.some((declaration) => {
452
- return ts.isIdentifier(declaration.name) && declaration.name.text === "__resolveDefaultExport";
453
- });
454
- }
455
- if (ts.isImportDeclaration(statement)) {
456
- const importClause = statement.importClause;
457
- if (!importClause) {
458
- return false;
459
- }
460
- if (((_b = importClause.name) == null ? void 0 : _b.text) === "__resolveDefaultExport") {
461
- return true;
462
- }
463
- if (importClause.namedBindings) {
464
- if (ts.isNamespaceImport(importClause.namedBindings)) {
465
- return importClause.namedBindings.name.text === "__resolveDefaultExport";
466
- }
467
- if (ts.isNamedImports(importClause.namedBindings)) {
468
- return importClause.namedBindings.elements.some(
469
- (element) => {
470
- var _a2;
471
- return element.name.text === "__resolveDefaultExport" || ((_a2 = element.propertyName) == null ? void 0 : _a2.text) === "__resolveDefaultExport";
472
- }
473
- );
474
- }
475
- }
476
- }
477
- return false;
478
- });
479
- };
480
- const isTypeOnlyImportClause = (ts, importClause) => {
481
- const phaseModifier = importClause.phaseModifier;
482
- if (phaseModifier !== void 0) {
483
- return phaseModifier === ts.SyntaxKind.TypeKeyword;
484
- }
485
- return Boolean(importClause.isTypeOnly);
486
- };
487
- const getScriptKind = (ts, id) => {
488
- if (id.endsWith(".tsx")) {
489
- return ts.ScriptKind.TSX;
490
- }
491
- if (id.endsWith(".jsx")) {
492
- return ts.ScriptKind.JSX;
493
- }
494
- if (id.endsWith(".mts")) {
495
- const mts = ts.ScriptKind["MTS"];
496
- return mts != null ? mts : ts.ScriptKind.TS;
497
- }
498
- if (id.endsWith(".cts")) {
499
- const cts = ts.ScriptKind["CTS"];
500
- return cts != null ? cts : ts.ScriptKind.TS;
501
- }
502
- if (id.endsWith(".ts")) {
503
- return ts.ScriptKind.TS;
504
- }
505
- if (id.endsWith(".mjs")) {
506
- return ts.ScriptKind.JS;
507
- }
508
- if (id.endsWith(".cjs")) {
509
- return ts.ScriptKind.JS;
510
- }
511
- return ts.ScriptKind.JS;
512
- };
513
- const formatModuleSpecifier = (specifier) => {
514
- const escaped = specifier.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
515
- return `'${escaped}'`;
516
- };
517
- const buildNamedImport = (moduleName, namedBindings) => {
518
- const elements = namedBindings.elements.map((specifier) => {
519
- const alias = specifier.propertyName ? `${specifier.propertyName.text} as ${specifier.name.text}` : specifier.name.text;
520
- return specifier.isTypeOnly ? `type ${alias}` : alias;
521
- }).join(", ");
522
- return `import { ${elements} } from ${formatModuleSpecifier(moduleName)};`;
523
- };
524
- const transformDefaultImports = async (ts, code, id, resolveModuleKind) => {
525
- const normalizedId = stripQuery(id);
526
- const sourceFile = ts.createSourceFile(
527
- normalizedId,
528
- code,
529
- ts.ScriptTarget.ESNext,
530
- false,
531
- getScriptKind(ts, normalizedId)
532
- );
533
- const edits = [];
534
- let needsHelper = false;
535
- const helperPresent = hasResolveDefaultExport(ts, sourceFile);
536
- let namespaceIndex = 0;
537
- const usedNamespace = (base) => {
538
- let candidate = `${base}${namespaceIndex}`;
539
- while (code.includes(candidate)) {
540
- namespaceIndex += 1;
541
- candidate = `${base}${namespaceIndex}`;
542
- }
543
- namespaceIndex += 1;
544
- return candidate;
545
- };
546
- for (const statement of sourceFile.statements) {
547
- if (!ts.isImportDeclaration(statement)) {
548
- continue;
549
- }
550
- const importClause = statement.importClause;
551
- if (!importClause || !importClause.name) {
552
- continue;
553
- }
554
- if (isTypeOnlyImportClause(ts, importClause)) {
555
- continue;
556
- }
557
- if (!ts.isStringLiteral(statement.moduleSpecifier)) {
558
- continue;
559
- }
560
- const moduleName = statement.moduleSpecifier.text;
561
- const moduleKind = await resolveModuleKind(moduleName, normalizedId);
562
- if (moduleKind === "unknown" || moduleKind === "unresolvable") {
563
- continue;
564
- }
565
- const isESM = moduleKind === "esm";
566
- const defaultName = importClause.name.text;
567
- const replacementImports = [];
568
- let namespaceName;
569
- if (importClause.namedBindings && ts.isNamespaceImport(importClause.namedBindings)) {
570
- namespaceName = importClause.namedBindings.name.text;
571
- replacementImports.push(
572
- `import * as ${namespaceName} from ${formatModuleSpecifier(moduleName)};`
573
- );
574
- } else {
575
- namespaceName = usedNamespace("__screwUpDefaultImportModule");
576
- replacementImports.push(
577
- `import * as ${namespaceName} from ${formatModuleSpecifier(moduleName)};`
578
- );
579
- if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) {
580
- replacementImports.push(
581
- buildNamedImport(moduleName, importClause.namedBindings)
582
- );
583
- }
584
- }
585
- const replacement = `${replacementImports.join("\n")}
586
- const ${defaultName} = __resolveDefaultExport(${namespaceName}, ${isESM});`;
587
- edits.push({
588
- start: statement.getStart(sourceFile),
589
- end: statement.getEnd(),
590
- text: replacement
591
- });
592
- needsHelper = true;
593
- }
594
- if (edits.length === 0) {
595
- return { code, changed: false };
596
- }
597
- if (needsHelper && !helperPresent) {
598
- const importStatements = sourceFile.statements.filter(
599
- ts.isImportDeclaration
600
- );
601
- const lastImport = importStatements[importStatements.length - 1];
602
- if (lastImport) {
603
- const newline = code.includes("\r\n") ? "\r\n" : "\n";
604
- const helperId = createCjsInteropHelperId(normalizedId);
605
- edits.push({
606
- start: lastImport.getEnd(),
607
- end: lastImport.getEnd(),
608
- text: `${newline}${buildHelperFunctionSource(helperId)}${newline}`
609
- });
610
- }
611
- }
612
- edits.sort((a, b) => b.start - a.start);
613
- let nextCode = code;
614
- for (const edit of edits) {
615
- nextCode = nextCode.slice(0, edit.start) + edit.text + nextCode.slice(edit.end);
616
- }
617
- return { code: nextCode, changed: true };
618
- };
619
- const generateBanner = (metadata, outputKeys) => {
620
- const parts = [];
621
- for (const key of outputKeys) {
622
- const value = metadata[key];
623
- if (value) {
624
- parts.push(`${key}: ${value}`);
625
- }
626
- }
627
- return parts.length > 0 ? `/*!
628
- * ${parts.join("\n * ")}
629
- */` : "";
630
- };
631
- const insertBannerHeader = (content, banner) => {
632
- const lines = content.split("\n");
633
- if (lines.length > 0 && lines[0].startsWith("#!")) {
634
- return lines[0] + "\n" + banner + "\n" + lines.slice(1).join("\n");
635
- } else {
636
- return banner + "\n" + content;
637
- }
638
- };
639
- const splitShebang = (content) => {
640
- if (!content.startsWith("#!")) {
641
- return { shebang: "", rest: content };
642
- }
643
- const newlineIndex = content.indexOf("\n");
644
- if (newlineIndex === -1) {
645
- return { shebang: `${content}
646
- `, rest: "" };
647
- }
648
- return {
649
- shebang: content.slice(0, newlineIndex + 1),
650
- rest: content.slice(newlineIndex + 1)
651
- };
652
- };
653
- const ensureTrailingNewline = (value, newline) => value.endsWith(newline) ? value : value + newline;
654
- const mergeBanners = (currentBanner, existingBanner) => {
655
- if (!currentBanner) {
656
- return existingBanner;
657
- }
658
- if (!existingBanner) {
659
- return currentBanner;
660
- }
661
- if (existingBanner.includes(currentBanner)) {
662
- return existingBanner;
663
- }
664
- const shebangMatch = existingBanner.match(/^(#![^\r\n]*)(\r?\n)?([\s\S]*)$/);
665
- if (shebangMatch) {
666
- const [, shebangLine, newlineSeq2 = "\n", rest = ""] = shebangMatch;
667
- if (rest.startsWith(currentBanner)) {
668
- return existingBanner;
669
- }
670
- const currentWithNewline2 = ensureTrailingNewline(currentBanner, newlineSeq2);
671
- if (rest.length === 0) {
672
- return `${shebangLine}${newlineSeq2}${currentWithNewline2}`;
673
- }
674
- return `${shebangLine}${newlineSeq2}${currentWithNewline2}${rest}`;
675
- }
676
- const newlineSeq = existingBanner.includes("\r\n") ? "\r\n" : "\n";
677
- const currentWithNewline = ensureTrailingNewline(currentBanner, newlineSeq);
678
- return `${currentWithNewline}${existingBanner}`;
679
- };
680
- const countInsertedLines = (bannerWithTrailingNewline) => {
681
- return bannerWithTrailingNewline.split("\n").length - 1;
682
- };
683
- const stringifyAssetSource = (source) => typeof source === "string" ? source : Buffer.from(source).toString("utf-8");
684
- const applyLineOffsetToSourceMap = (source, lineOffset) => {
685
- if (lineOffset <= 0) {
686
- return void 0;
687
- }
688
- const original = stringifyAssetSource(source);
689
- let map;
690
- try {
691
- map = JSON.parse(original);
692
- } catch (e) {
693
- return void 0;
694
- }
695
- if (!map || typeof map.mappings !== "string") {
696
- return void 0;
697
- }
698
- const prefix = ";".repeat(lineOffset);
699
- if (map.mappings.startsWith(prefix)) {
700
- return void 0;
701
- }
702
- map.mappings = prefix + map.mappings;
703
- const serialized = JSON.stringify(map);
704
- return original.endsWith("\n") ? `${serialized}
705
- ` : serialized;
706
- };
707
- const applyLineOffsetToSourceMapObject = (map, lineOffset) => {
708
- if (!map || lineOffset <= 0 || typeof map.mappings !== "string") {
709
- return;
710
- }
711
- const prefix = ";".repeat(lineOffset);
712
- if (map.mappings.startsWith(prefix)) {
713
- return;
714
- }
715
- map.mappings = prefix + map.mappings;
716
- };
717
- const screwUp = (options = {}) => {
718
- const {
719
- fixDefaultImport = true,
720
- outputKeys = [
721
- "name",
722
- "version",
723
- "description",
724
- "author",
725
- "license",
726
- "repository.url",
727
- "git.commit.hash"
728
- ],
729
- assetFilters = ["\\.d\\.ts$"],
730
- outputMetadataFile = false,
731
- outputMetadataFilePath = "src/generated/packageMetadata.ts",
732
- outputMetadataKeys = [
733
- "name",
734
- "version",
735
- "description",
736
- "author",
737
- "license",
738
- "repository.url",
739
- "git.commit.hash"
740
- ],
741
- checkWorkingDirectoryStatus = true,
742
- alwaysOverrideVersionFromGit = true,
743
- insertMetadataBanner = true
744
- } = options;
745
- const assetFiltersRegex = assetFilters.map((filter) => new RegExp(filter));
746
- const generateMetadataSourceLocker = createMutex();
747
- const resolveModuleKind = createNodeModuleKindResolver();
748
- let typescriptPromise;
749
- const loggerPrefix = `${name}-vite`;
750
- let logger = createConsoleLogger(loggerPrefix);
751
- let banner = "";
752
- let metadata;
753
- let projectRoot;
754
- let fetchGitMetadata = () => Promise.resolve({});
755
- const loadTypeScript = async () => {
756
- if (!typescriptPromise) {
757
- typescriptPromise = import("typescript").catch(() => void 0);
758
- }
759
- return typescriptPromise;
760
- };
761
- const resolveOutputBanner = async (outputOptions, chunk) => {
762
- var _a, _b;
763
- const outputBanner = outputOptions.banner;
764
- if (typeof outputBanner === "function") {
765
- const resolved = await outputBanner(chunk);
766
- return (_a = resolved != null ? resolved : banner) != null ? _a : "";
767
- }
768
- return (_b = outputBanner != null ? outputBanner : banner) != null ? _b : "";
769
- };
770
- const generateMetadataSourceFiles = async () => {
771
- const result = await resolvePackageMetadata(
772
- projectRoot,
773
- fetchGitMetadata,
774
- alwaysOverrideVersionFromGit,
775
- logger
776
- );
777
- metadata = result.metadata;
778
- banner = generateBanner(metadata, outputKeys);
779
- if (outputMetadataFile) {
780
- const metadataSourceContent = generateMetadataFileContent(
781
- metadata,
782
- outputMetadataKeys
783
- );
784
- const metadataSourcePath = join(projectRoot, outputMetadataFilePath);
785
- const metadataWritten = await writeFileIfChanged(
786
- metadataSourcePath,
787
- metadataSourceContent,
788
- "metadata source file",
789
- logger
790
- );
791
- if (existsSync(metadataSourcePath)) {
792
- const gitignoreWritten = await ensureMetadataGitignore(
793
- metadataSourcePath,
794
- logger
795
- );
796
- if (gitignoreWritten) {
797
- logger.info(
798
- `generateMetadataSourceFile: .gitignore is generated: ${join(
799
- dirname(outputMetadataFilePath),
800
- ".gitignore"
801
- )}`
802
- );
803
- }
804
- }
805
- return metadataWritten;
806
- }
807
- return false;
808
- };
809
- const generateMetadataFileFromKeys = async (keys) => {
810
- if (outputMetadataFile) {
811
- const metadataSourcePath = join(projectRoot, outputMetadataFilePath);
812
- if (!existsSync(metadataSourcePath)) {
813
- const dummyMetadata = {};
814
- keys.forEach((key) => {
815
- dummyMetadata[key] = "[Require first build]";
816
- });
817
- const dummyContent = generateMetadataFileContent(dummyMetadata, keys);
818
- return await writeFileIfChanged(
819
- metadataSourcePath,
820
- dummyContent,
821
- "dummy metadata source file",
822
- logger
823
- );
824
- }
825
- }
826
- return false;
827
- };
828
- return {
829
- name: "screw-up",
830
- // Ensure screw-up runs before other plugins
831
- // (especially vite-plugin-dts, avoid packageMetadata.ts is not found)
832
- enforce: "pre",
833
- // Plugin starting
834
- applyToEnvironment: async (penv) => {
835
- logger.info(`${version}-${git_commit_hash}: Started.`);
836
- projectRoot = penv.config.root;
837
- if (projectRoot && await generateMetadataFileFromKeys(outputMetadataKeys)) {
838
- logger.info(
839
- `applyToEnvironment: Dummy metadata source file is generated: ${outputMetadataFilePath}`
840
- );
841
- }
842
- return true;
843
- },
844
- // Build configuration phase
845
- config: (config) => {
846
- var _a, _b, _c;
847
- if (!insertMetadataBanner) {
848
- return;
849
- }
850
- (_a = config.build) != null ? _a : config.build = {};
851
- const rollupOptions = (_c = (_b = config.build).rollupOptions) != null ? _c : _b.rollupOptions = {};
852
- const ensureOutputs = () => {
853
- if (Array.isArray(rollupOptions.output)) {
854
- const outputs2 = rollupOptions.output;
855
- if (outputs2.length === 0) {
856
- const output2 = {};
857
- outputs2.push(output2);
858
- return outputs2;
859
- }
860
- outputs2.forEach((output2, index) => {
861
- if (!output2) {
862
- outputs2[index] = {};
863
- }
864
- });
865
- return outputs2;
866
- }
867
- if (rollupOptions.output) {
868
- return [rollupOptions.output];
869
- }
870
- const output = {};
871
- rollupOptions.output = output;
872
- return [output];
873
- };
874
- const outputs = ensureOutputs();
875
- outputs.forEach((output) => {
876
- const previousBanner = output.banner;
877
- const resolvePreviousBanner = async (chunk) => {
878
- if (typeof previousBanner === "function") {
879
- const resolved = await previousBanner(chunk);
880
- return resolved != null ? resolved : "";
881
- }
882
- return previousBanner != null ? previousBanner : "";
883
- };
884
- output.banner = async (chunk) => {
885
- const existingBanner = await resolvePreviousBanner(chunk);
886
- const currentBanner = banner != null ? banner : "";
887
- return mergeBanners(currentBanner, existingBanner);
888
- };
889
- });
890
- },
891
- transform: async (code, id) => {
892
- if (!fixDefaultImport || !id || id.includes("\0")) {
893
- return;
894
- }
895
- const cleanId = id.split("?")[0];
896
- if (cleanId.includes("node_modules")) {
897
- return;
898
- }
899
- if (cleanId.endsWith(".d.ts") || cleanId.endsWith(".d.mts") || cleanId.endsWith(".d.cts")) {
900
- return;
901
- }
902
- if (!/\.(?:[cm]?[jt]sx?|[cm]js)$/.test(cleanId)) {
903
- return;
904
- }
905
- const ts = await loadTypeScript();
906
- if (!ts) {
907
- return;
908
- }
909
- const hasDefaultImport = scanHasDefaultImport(ts, code);
910
- if (cleanId.includes("/src/") || cleanId.includes("\\src\\")) {
911
- logger.debug(
912
- `[fixDefaultImport] scan ${cleanId}: ${hasDefaultImport ? "hit" : "miss"}`
913
- );
914
- }
915
- if (!hasDefaultImport) {
916
- return;
917
- }
918
- const result = await transformDefaultImports(
919
- ts,
920
- code,
921
- cleanId,
922
- resolveModuleKind
923
- );
924
- if (result.changed) {
925
- return {
926
- code: result.code,
927
- map: null
928
- };
929
- }
930
- },
931
- // Configuration resolved phase
932
- configResolved: async (config) => {
933
- const l = await generateMetadataSourceLocker.lock();
934
- try {
935
- const tempEnableLogging = true;
936
- projectRoot = config.root;
937
- if (tempEnableLogging || (config == null ? void 0 : config.logger)) {
938
- logger = createConsoleLogger(loggerPrefix, config.logger);
939
- }
940
- logger.debug(`configResolved: Started.`);
941
- fetchGitMetadata = getFetchGitMetadata(
942
- projectRoot,
943
- checkWorkingDirectoryStatus,
944
- logger
945
- );
946
- if (await generateMetadataSourceFiles()) {
947
- logger.info(
948
- `configResolved: Metadata source file is generated: ${outputMetadataFilePath}`
949
- );
950
- }
951
- } finally {
952
- logger.debug(`configResolved: Exited.`);
953
- l.release();
954
- }
955
- },
956
- // Server hook
957
- configureServer: async (server) => {
958
- const l = await generateMetadataSourceLocker.lock();
959
- try {
960
- logger.debug(`configureServer: Started.`);
961
- if (outputMetadataFile && server.watcher) {
962
- const metadataSourcePath = join(projectRoot, outputMetadataFilePath);
963
- server.watcher.unwatch(metadataSourcePath);
964
- logger.debug(
965
- `configureServer: Excluded from watcher: ${outputMetadataFilePath}`
966
- );
967
- }
968
- if (await generateMetadataSourceFiles()) {
969
- logger.info(
970
- `configureServer: Metadata source file is generated: ${outputMetadataFilePath}`
971
- );
972
- }
973
- } finally {
974
- logger.debug(`configureServer: Exited.`);
975
- l.release();
976
- }
977
- },
978
- // Build start phase
979
- buildStart: async () => {
980
- const l = await generateMetadataSourceLocker.lock();
981
- try {
982
- logger.debug(`buildStart: Started.`);
983
- if (await generateMetadataSourceFiles()) {
984
- logger.info(
985
- `buildStart: Metadata source file is generated: ${outputMetadataFilePath}`
986
- );
987
- }
988
- } finally {
989
- logger.debug(`buildStart: Exited.`);
990
- l.release();
991
- }
992
- },
993
- renderChunk: (code, chunk, outputOptions) => {
994
- if (!fixDefaultImport || outputOptions.format !== "cjs") {
995
- return null;
996
- }
997
- const result = injectCjsInteropFlag(code);
998
- if (!result.changed) {
999
- return null;
1000
- }
1001
- return { code: result.code, map: null };
1002
- },
1003
- // Generate bundle phase
1004
- generateBundle: {
1005
- order: "post",
1006
- handler: async (outputOptions, bundle) => {
1007
- if (insertMetadataBanner) {
1008
- let chunkCount = 0;
1009
- for (const fileName in bundle) {
1010
- const output = bundle[fileName];
1011
- if (output.type === "chunk") {
1012
- const chunk = output;
1013
- const resolvedBanner = await resolveOutputBanner(
1014
- outputOptions,
1015
- chunk
1016
- );
1017
- if (!resolvedBanner) {
1018
- continue;
1019
- }
1020
- const { shebang: bannerShebang, rest: bannerRest } = splitShebang(resolvedBanner);
1021
- const bannerCore = bannerRest.trimEnd();
1022
- if (!bannerCore || chunk.code.includes(bannerCore)) {
1023
- continue;
1024
- }
1025
- const originalCode = chunk.code;
1026
- let nextCode = originalCode;
1027
- if (bannerShebang && !nextCode.startsWith("#!")) {
1028
- nextCode = `${bannerShebang}${nextCode}`;
1029
- }
1030
- const bannerBlock = ensureTrailingNewline(bannerCore, "\n");
1031
- nextCode = insertBannerHeader(nextCode, bannerBlock);
1032
- if (nextCode === originalCode) {
1033
- continue;
1034
- }
1035
- const lineOffset = nextCode.split("\n").length - originalCode.split("\n").length;
1036
- chunk.code = nextCode;
1037
- if (lineOffset > 0 && chunk.map) {
1038
- applyLineOffsetToSourceMapObject(chunk.map, lineOffset);
1039
- }
1040
- const mapFileName = `${fileName}.map`;
1041
- const mapAsset = bundle[mapFileName];
1042
- if (lineOffset > 0 && mapAsset && mapAsset.type === "asset" && mapAsset.source !== void 0) {
1043
- const adjusted = applyLineOffsetToSourceMap(
1044
- mapAsset.source,
1045
- lineOffset
1046
- );
1047
- if (adjusted !== void 0) {
1048
- mapAsset.source = adjusted;
1049
- }
1050
- }
1051
- chunkCount++;
1052
- }
1053
- }
1054
- if (chunkCount >= 1) {
1055
- logger.debug(
1056
- `generateBundle: Banner header reinserted: ${chunkCount} file(s)`
1057
- );
1058
- }
1059
- let assetCount = 0;
1060
- for (const fileName in bundle) {
1061
- const chunk = bundle[fileName];
1062
- if (
1063
- // Only treat assets that match filters; JS chunks already handled via rollup banner
1064
- chunk.type === "asset" && assetFiltersRegex.some((filter) => filter.test(fileName))
1065
- ) {
1066
- if (typeof chunk.source === "string") {
1067
- const bannerBlock = `${banner}
1068
- `;
1069
- chunk.source = insertBannerHeader(chunk.source, bannerBlock);
1070
- const lineOffset = countInsertedLines(bannerBlock);
1071
- const mapFileName = `${fileName}.map`;
1072
- const mapAsset = bundle[mapFileName];
1073
- if (mapAsset && mapAsset.type === "asset" && mapAsset.source !== void 0) {
1074
- const adjusted = applyLineOffsetToSourceMap(
1075
- mapAsset.source,
1076
- lineOffset
1077
- );
1078
- if (adjusted !== void 0) {
1079
- mapAsset.source = adjusted;
1080
- }
1081
- }
1082
- assetCount++;
1083
- }
1084
- }
1085
- }
1086
- if (assetCount >= 1) {
1087
- logger.debug(
1088
- `generateBundle: Banner header inserted: ${assetCount} file(s)`
1089
- );
1090
- }
1091
- }
1092
- }
1093
- },
1094
- // Write bundle phase
1095
- writeBundle: async (options2) => {
1096
- if (!insertMetadataBanner || !options2.dir) return;
1097
- try {
1098
- const files = await readdir(options2.dir, { recursive: true });
1099
- let count = 0;
1100
- for (const file of files) {
1101
- const filePath = join(options2.dir, file);
1102
- if (assetFiltersRegex.some((filter) => filter.test(file))) {
1103
- try {
1104
- const content = await readFile(filePath, "utf-8");
1105
- if (!content.includes(banner)) {
1106
- const bannerBlock = `${banner}
1107
- `;
1108
- await writeFile(
1109
- filePath,
1110
- insertBannerHeader(content, bannerBlock)
1111
- );
1112
- const lineOffset = countInsertedLines(bannerBlock);
1113
- const mapPath = `${filePath}.map`;
1114
- try {
1115
- const mapContent = await readFile(mapPath, "utf-8");
1116
- const adjusted = applyLineOffsetToSourceMap(
1117
- mapContent,
1118
- lineOffset
1119
- );
1120
- if (adjusted !== void 0) {
1121
- await writeFile(mapPath, adjusted);
1122
- }
1123
- } catch (e) {
1124
- }
1125
- count++;
1126
- }
1127
- } catch (error) {
1128
- }
1129
- }
1130
- }
1131
- if (count >= 1) {
1132
- logger.debug(`writeBundle: Banner header inserted: ${count} file(s)`);
1133
- }
1134
- } catch (error) {
1135
- }
1136
- }
1137
- };
1138
- };
1139
- export {
1140
- screwUp as default
1141
- };
1142
- //# sourceMappingURL=index.mjs.map
354
+ var injectCjsInteropFlag = (code) => {
355
+ let changed = false;
356
+ return {
357
+ code: code.replace(cjsInteropGlobalFlagAssignmentPattern, (match) => {
358
+ changed = true;
359
+ return match.replace(/\bfalse\b/, "true ");
360
+ }),
361
+ changed
362
+ };
363
+ };
364
+ var hasResolveDefaultExport = (ts, sourceFile) => {
365
+ return sourceFile.statements.some((statement) => {
366
+ if (ts.isFunctionDeclaration(statement)) {
367
+ var _statement$name;
368
+ return ((_statement$name = statement.name) === null || _statement$name === void 0 ? void 0 : _statement$name.text) === "__resolveDefaultExport";
369
+ }
370
+ if (ts.isVariableStatement(statement)) return statement.declarationList.declarations.some((declaration) => {
371
+ return ts.isIdentifier(declaration.name) && declaration.name.text === "__resolveDefaultExport";
372
+ });
373
+ if (ts.isImportDeclaration(statement)) {
374
+ var _importClause$name;
375
+ const importClause = statement.importClause;
376
+ if (!importClause) return false;
377
+ if (((_importClause$name = importClause.name) === null || _importClause$name === void 0 ? void 0 : _importClause$name.text) === "__resolveDefaultExport") return true;
378
+ if (importClause.namedBindings) {
379
+ if (ts.isNamespaceImport(importClause.namedBindings)) return importClause.namedBindings.name.text === "__resolveDefaultExport";
380
+ if (ts.isNamedImports(importClause.namedBindings)) return importClause.namedBindings.elements.some((element) => {
381
+ var _element$propertyName;
382
+ return element.name.text === "__resolveDefaultExport" || ((_element$propertyName = element.propertyName) === null || _element$propertyName === void 0 ? void 0 : _element$propertyName.text) === "__resolveDefaultExport";
383
+ });
384
+ }
385
+ }
386
+ return false;
387
+ });
388
+ };
389
+ var isTypeOnlyImportClause = (ts, importClause) => {
390
+ const phaseModifier = importClause.phaseModifier;
391
+ if (phaseModifier !== void 0) return phaseModifier === ts.SyntaxKind.TypeKeyword;
392
+ return Boolean(importClause.isTypeOnly);
393
+ };
394
+ var getScriptKind = (ts, id) => {
395
+ if (id.endsWith(".tsx")) return ts.ScriptKind.TSX;
396
+ if (id.endsWith(".jsx")) return ts.ScriptKind.JSX;
397
+ if (id.endsWith(".mts")) {
398
+ const mts = ts.ScriptKind["MTS"];
399
+ return mts !== null && mts !== void 0 ? mts : ts.ScriptKind.TS;
400
+ }
401
+ if (id.endsWith(".cts")) {
402
+ const cts = ts.ScriptKind["CTS"];
403
+ return cts !== null && cts !== void 0 ? cts : ts.ScriptKind.TS;
404
+ }
405
+ if (id.endsWith(".ts")) return ts.ScriptKind.TS;
406
+ if (id.endsWith(".mjs")) return ts.ScriptKind.JS;
407
+ if (id.endsWith(".cjs")) return ts.ScriptKind.JS;
408
+ return ts.ScriptKind.JS;
409
+ };
410
+ var formatModuleSpecifier = (specifier) => {
411
+ return `'${specifier.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
412
+ };
413
+ var buildNamedImport = (moduleName, namedBindings) => {
414
+ return `import { ${namedBindings.elements.map((specifier) => {
415
+ const alias = specifier.propertyName ? `${specifier.propertyName.text} as ${specifier.name.text}` : specifier.name.text;
416
+ return specifier.isTypeOnly ? `type ${alias}` : alias;
417
+ }).join(", ")} } from ${formatModuleSpecifier(moduleName)};`;
418
+ };
419
+ var transformDefaultImports = async (ts, code, id, resolveModuleKind) => {
420
+ const normalizedId = stripQuery(id);
421
+ const sourceFile = ts.createSourceFile(normalizedId, code, ts.ScriptTarget.ESNext, false, getScriptKind(ts, normalizedId));
422
+ const edits = [];
423
+ let needsHelper = false;
424
+ const helperPresent = hasResolveDefaultExport(ts, sourceFile);
425
+ let namespaceIndex = 0;
426
+ const usedNamespace = (base) => {
427
+ let candidate = `${base}${namespaceIndex}`;
428
+ while (code.includes(candidate)) {
429
+ namespaceIndex += 1;
430
+ candidate = `${base}${namespaceIndex}`;
431
+ }
432
+ namespaceIndex += 1;
433
+ return candidate;
434
+ };
435
+ for (const statement of sourceFile.statements) {
436
+ var _namespaceName;
437
+ if (!ts.isImportDeclaration(statement)) continue;
438
+ const importClause = statement.importClause;
439
+ if (!importClause || !importClause.name) continue;
440
+ if (isTypeOnlyImportClause(ts, importClause)) continue;
441
+ if (!ts.isStringLiteral(statement.moduleSpecifier)) continue;
442
+ const moduleName = statement.moduleSpecifier.text;
443
+ const moduleKind = await resolveModuleKind(moduleName, normalizedId);
444
+ if (moduleKind === "unknown" || moduleKind === "unresolvable") continue;
445
+ const isESM = moduleKind === "esm";
446
+ const isCJS = moduleKind === "cjs";
447
+ const defaultName = importClause.name.text;
448
+ const replacementImports = [];
449
+ let namespaceName;
450
+ let defaultImportName;
451
+ if (importClause.namedBindings && ts.isNamespaceImport(importClause.namedBindings)) {
452
+ namespaceName = importClause.namedBindings.name.text;
453
+ replacementImports.push(`import * as ${namespaceName} from ${formatModuleSpecifier(moduleName)};`);
454
+ } else if (isCJS) {
455
+ defaultImportName = usedNamespace("__screwUpDefaultImportModule");
456
+ replacementImports.push(`import ${defaultImportName} from ${formatModuleSpecifier(moduleName)};`);
457
+ if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) replacementImports.push(buildNamedImport(moduleName, importClause.namedBindings));
458
+ } else {
459
+ namespaceName = usedNamespace("__screwUpDefaultImportModule");
460
+ replacementImports.push(`import * as ${namespaceName} from ${formatModuleSpecifier(moduleName)};`);
461
+ if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) replacementImports.push(buildNamedImport(moduleName, importClause.namedBindings));
462
+ }
463
+ const interopSource = (_namespaceName = namespaceName) !== null && _namespaceName !== void 0 ? _namespaceName : defaultImportName;
464
+ const replacement = `${replacementImports.join("\n")}\nconst ${defaultName} = __resolveDefaultExport(${interopSource}, ${isESM});`;
465
+ edits.push({
466
+ start: statement.getStart(sourceFile),
467
+ end: statement.getEnd(),
468
+ text: replacement
469
+ });
470
+ needsHelper = true;
471
+ }
472
+ if (edits.length === 0) return {
473
+ code,
474
+ changed: false
475
+ };
476
+ if (needsHelper && !helperPresent) {
477
+ const importStatements = sourceFile.statements.filter(ts.isImportDeclaration);
478
+ const lastImport = importStatements[importStatements.length - 1];
479
+ if (lastImport) {
480
+ const newline = code.includes("\r\n") ? "\r\n" : "\n";
481
+ const helperId = createCjsInteropHelperId(normalizedId);
482
+ edits.push({
483
+ start: lastImport.getEnd(),
484
+ end: lastImport.getEnd(),
485
+ text: `${newline}${buildHelperFunctionSource(helperId)}${newline}`
486
+ });
487
+ }
488
+ }
489
+ edits.sort((a, b) => b.start - a.start);
490
+ let nextCode = code;
491
+ for (const edit of edits) nextCode = nextCode.slice(0, edit.start) + edit.text + nextCode.slice(edit.end);
492
+ return {
493
+ code: nextCode,
494
+ changed: true
495
+ };
496
+ };
497
+ //#endregion
498
+ //#region src/vite-plugin.ts
499
+ /**
500
+ * Generate banner string from package.json metadata
501
+ * @param metadata - Package metadata
502
+ * @param outputKeys - Array of keys to output in specified order
503
+ * @returns Banner string
504
+ */
505
+ var generateBanner = (metadata, outputKeys) => {
506
+ const parts = [];
507
+ for (const key of outputKeys) {
508
+ const value = metadata[key];
509
+ if (value) parts.push(`${key}: ${value}`);
510
+ }
511
+ return parts.length > 0 ? `/*!\n * ${parts.join("\n * ")}\n */` : "";
512
+ };
513
+ /**
514
+ * Insert banner header at appropriate position considering shebang
515
+ * @param content - The content to insert banner into
516
+ * @param banner - The banner header to insert
517
+ * @returns Content with banner header inserted
518
+ */
519
+ var insertBannerHeader = (content, banner) => {
520
+ const lines = content.split("\n");
521
+ if (lines.length > 0 && lines[0].startsWith("#!")) return lines[0] + "\n" + banner + "\n" + lines.slice(1).join("\n");
522
+ else return banner + "\n" + content;
523
+ };
524
+ /**
525
+ * Adds a trailing newline to the banner text when needed so subsequent
526
+ * concatenations do not collapse onto the last line.
527
+ */
528
+ var ensureTrailingNewline = (value, newline) => value.endsWith(newline) ? value : value + newline;
529
+ /**
530
+ * Merge screw-up's metadata banner with an existing Rollup banner, keeping any
531
+ * shebang line at the very top and preventing duplicate metadata blocks.
532
+ */
533
+ var mergeBanners = (currentBanner, existingBanner) => {
534
+ if (!currentBanner) return existingBanner;
535
+ if (!existingBanner) return currentBanner;
536
+ if (existingBanner.includes(currentBanner)) return existingBanner;
537
+ const shebangMatch = existingBanner.match(/^(#![^\r\n]*)(\r?\n)?([\s\S]*)$/);
538
+ if (shebangMatch) {
539
+ const [, shebangLine, newlineSeq = "\n", rest = ""] = shebangMatch;
540
+ if (rest.startsWith(currentBanner)) return existingBanner;
541
+ const currentWithNewline = ensureTrailingNewline(currentBanner, newlineSeq);
542
+ if (rest.length === 0) return `${shebangLine}${newlineSeq}${currentWithNewline}`;
543
+ return `${shebangLine}${newlineSeq}${currentWithNewline}${rest}`;
544
+ }
545
+ return `${ensureTrailingNewline(currentBanner, existingBanner.includes("\r\n") ? "\r\n" : "\n")}${existingBanner}`;
546
+ };
547
+ /**
548
+ * Count how many newline characters exist in the banner block.
549
+ * The result equals the line delta that needs to be applied to sourcemaps.
550
+ */
551
+ var countInsertedLines = (bannerWithTrailingNewline) => {
552
+ return bannerWithTrailingNewline.split("\n").length - 1;
553
+ };
554
+ /**
555
+ * Convert asset payloads to UTF-8 strings to simplify sourcemap adjustments.
556
+ */
557
+ var stringifyAssetSource = (source) => typeof source === "string" ? source : Buffer.from(source).toString("utf-8");
558
+ /**
559
+ * Prepend the specified number of empty lines to a sourcemap by adding semicolons
560
+ * at the beginning of the VLQ mappings string.
561
+ * @returns Updated sourcemap JSON string, or undefined if no change is needed.
562
+ */
563
+ var applyLineOffsetToSourceMap = (source, lineOffset) => {
564
+ if (lineOffset <= 0) return;
565
+ const original = stringifyAssetSource(source);
566
+ let map;
567
+ try {
568
+ map = JSON.parse(original);
569
+ } catch (_unused) {
570
+ return;
571
+ }
572
+ if (!map || typeof map.mappings !== "string") return;
573
+ const prefix = ";".repeat(lineOffset);
574
+ if (map.mappings.startsWith(prefix)) return;
575
+ map.mappings = prefix + map.mappings;
576
+ const serialized = JSON.stringify(map);
577
+ return original.endsWith("\n") ? `${serialized}\n` : serialized;
578
+ };
579
+ /**
580
+ * Vite plugin that adds banner to the bundled code
581
+ * @param options - Plugin options
582
+ * @returns Vite plugin
583
+ */
584
+ var screwUp = (options = {}) => {
585
+ const { fixDefaultImport = true, outputKeys = [
586
+ "name",
587
+ "version",
588
+ "description",
589
+ "author",
590
+ "license",
591
+ "repository.url",
592
+ "git.commit.hash"
593
+ ], assetFilters = ["\\.d\\.ts$"], outputMetadataFile = false, outputMetadataFilePath = "src/generated/packageMetadata.ts", outputMetadataKeys = [
594
+ "name",
595
+ "version",
596
+ "description",
597
+ "author",
598
+ "license",
599
+ "repository.url",
600
+ "git.commit.hash"
601
+ ], checkWorkingDirectoryStatus = true, alwaysOverrideVersionFromGit = true, insertMetadataBanner = true } = options;
602
+ const assetFiltersRegex = assetFilters.map((filter) => new RegExp(filter));
603
+ const generateMetadataSourceLocker = createMutex();
604
+ const resolveModuleKind = createNodeModuleKindResolver();
605
+ let typescriptPromise;
606
+ const loggerPrefix = `${name}-vite`;
607
+ let logger = createConsoleLogger(loggerPrefix);
608
+ let banner = "";
609
+ let metadata;
610
+ let projectRoot;
611
+ let fetchGitMetadata = () => Promise.resolve({});
612
+ const loadTypeScript = async () => {
613
+ if (!typescriptPromise) typescriptPromise = import("typescript").catch(() => void 0);
614
+ return typescriptPromise;
615
+ };
616
+ const generateMetadataSourceFiles = async () => {
617
+ metadata = (await resolvePackageMetadata(projectRoot, fetchGitMetadata, alwaysOverrideVersionFromGit, logger)).metadata;
618
+ banner = generateBanner(metadata, outputKeys);
619
+ if (outputMetadataFile) {
620
+ const metadataSourceContent = generateMetadataFileContent(metadata, outputMetadataKeys);
621
+ const metadataSourcePath = join(projectRoot, outputMetadataFilePath);
622
+ const metadataWritten = await writeFileIfChanged(metadataSourcePath, metadataSourceContent, "metadata source file", logger);
623
+ if (existsSync(metadataSourcePath)) {
624
+ if (await ensureMetadataGitignore(metadataSourcePath, logger)) logger.info(`generateMetadataSourceFile: .gitignore is generated: ${join(dirname(outputMetadataFilePath), ".gitignore")}`);
625
+ }
626
+ return metadataWritten;
627
+ }
628
+ return false;
629
+ };
630
+ const generateMetadataFileFromKeys = async (keys) => {
631
+ if (outputMetadataFile) {
632
+ const metadataSourcePath = join(projectRoot, outputMetadataFilePath);
633
+ if (!existsSync(metadataSourcePath)) {
634
+ const dummyMetadata = {};
635
+ keys.forEach((key) => {
636
+ dummyMetadata[key] = "[Require first build]";
637
+ });
638
+ return await writeFileIfChanged(metadataSourcePath, generateMetadataFileContent(dummyMetadata, keys), "dummy metadata source file", logger);
639
+ }
640
+ }
641
+ return false;
642
+ };
643
+ return {
644
+ name: "screw-up",
645
+ enforce: "pre",
646
+ applyToEnvironment: async (penv) => {
647
+ logger.info(`${version}-${git_commit_hash}: Started.`);
648
+ projectRoot = penv.config.root;
649
+ if (projectRoot && await generateMetadataFileFromKeys(outputMetadataKeys)) logger.info(`applyToEnvironment: Dummy metadata source file is generated: ${outputMetadataFilePath}`);
650
+ return true;
651
+ },
652
+ config: (config) => {
653
+ var _config$build, _config$build2, _config$build2$rolldo;
654
+ if (!insertMetadataBanner) return;
655
+ (_config$build = config.build) !== null && _config$build !== void 0 || (config.build = {});
656
+ const rolldownOptions = (_config$build2$rolldo = (_config$build2 = config.build).rolldownOptions) !== null && _config$build2$rolldo !== void 0 ? _config$build2$rolldo : _config$build2.rolldownOptions = {};
657
+ const ensureOutputs = () => {
658
+ if (Array.isArray(rolldownOptions.output)) {
659
+ const outputs = rolldownOptions.output;
660
+ if (outputs.length === 0) {
661
+ outputs.push({});
662
+ return outputs;
663
+ }
664
+ outputs.forEach((output, index) => {
665
+ if (!output) outputs[index] = {};
666
+ });
667
+ return outputs;
668
+ }
669
+ if (rolldownOptions.output) return [rolldownOptions.output];
670
+ const output = {};
671
+ rolldownOptions.output = output;
672
+ return [output];
673
+ };
674
+ ensureOutputs().forEach((output) => {
675
+ const previousBanner = output.banner;
676
+ const resolvePreviousBanner = async (chunk) => {
677
+ if (typeof previousBanner === "function") {
678
+ const resolved = await previousBanner(chunk);
679
+ return resolved !== null && resolved !== void 0 ? resolved : "";
680
+ }
681
+ return previousBanner !== null && previousBanner !== void 0 ? previousBanner : "";
682
+ };
683
+ output.banner = async (chunk) => {
684
+ var _banner;
685
+ const existingBanner = await resolvePreviousBanner(chunk);
686
+ return mergeBanners((_banner = banner) !== null && _banner !== void 0 ? _banner : "", existingBanner);
687
+ };
688
+ });
689
+ },
690
+ transform: async (code, id) => {
691
+ if (!fixDefaultImport || !id || id.includes("\0")) return;
692
+ const cleanId = id.split("?")[0];
693
+ if (cleanId.includes("node_modules")) return;
694
+ if (cleanId.endsWith(".d.ts") || cleanId.endsWith(".d.mts") || cleanId.endsWith(".d.cts")) return;
695
+ if (!/\.(?:[cm]?[jt]sx?|[cm]js)$/.test(cleanId)) return;
696
+ const ts = await loadTypeScript();
697
+ if (!ts) return;
698
+ const hasDefaultImport = scanHasDefaultImport(ts, code);
699
+ if (cleanId.includes("/src/") || cleanId.includes("\\src\\")) logger.debug(`[fixDefaultImport] scan ${cleanId}: ${hasDefaultImport ? "hit" : "miss"}`);
700
+ if (!hasDefaultImport) return;
701
+ const result = await transformDefaultImports(ts, code, cleanId, resolveModuleKind);
702
+ if (result.changed) return {
703
+ code: result.code,
704
+ map: null
705
+ };
706
+ },
707
+ configResolved: async (config) => {
708
+ const l = await generateMetadataSourceLocker.lock();
709
+ try {
710
+ projectRoot = config.root;
711
+ logger = createConsoleLogger(loggerPrefix, config.logger);
712
+ logger.debug(`configResolved: Started.`);
713
+ fetchGitMetadata = getFetchGitMetadata(projectRoot, checkWorkingDirectoryStatus, logger);
714
+ if (await generateMetadataSourceFiles()) logger.info(`configResolved: Metadata source file is generated: ${outputMetadataFilePath}`);
715
+ } finally {
716
+ logger.debug(`configResolved: Exited.`);
717
+ l.release();
718
+ }
719
+ },
720
+ configureServer: async (server) => {
721
+ const l = await generateMetadataSourceLocker.lock();
722
+ try {
723
+ logger.debug(`configureServer: Started.`);
724
+ if (outputMetadataFile && server.watcher) {
725
+ const metadataSourcePath = join(projectRoot, outputMetadataFilePath);
726
+ server.watcher.unwatch(metadataSourcePath);
727
+ logger.debug(`configureServer: Excluded from watcher: ${outputMetadataFilePath}`);
728
+ }
729
+ if (await generateMetadataSourceFiles()) logger.info(`configureServer: Metadata source file is generated: ${outputMetadataFilePath}`);
730
+ } finally {
731
+ logger.debug(`configureServer: Exited.`);
732
+ l.release();
733
+ }
734
+ },
735
+ buildStart: async () => {
736
+ const l = await generateMetadataSourceLocker.lock();
737
+ try {
738
+ logger.debug(`buildStart: Started.`);
739
+ if (await generateMetadataSourceFiles()) logger.info(`buildStart: Metadata source file is generated: ${outputMetadataFilePath}`);
740
+ } finally {
741
+ logger.debug(`buildStart: Exited.`);
742
+ l.release();
743
+ }
744
+ },
745
+ renderChunk: (code, chunk, outputOptions) => {
746
+ if (!fixDefaultImport || outputOptions.format !== "cjs") return null;
747
+ const result = injectCjsInteropFlag(code);
748
+ if (!result.changed) return null;
749
+ return {
750
+ code: result.code,
751
+ map: null
752
+ };
753
+ },
754
+ generateBundle: {
755
+ order: "post",
756
+ handler: async (_outputOptions, bundle) => {
757
+ if (insertMetadataBanner) {
758
+ let assetCount = 0;
759
+ for (const fileName in bundle) {
760
+ const chunk = bundle[fileName];
761
+ if (chunk.type === "asset" && assetFiltersRegex.some((filter) => filter.test(fileName))) {
762
+ if (typeof chunk.source === "string") {
763
+ const bannerBlock = `${banner}\n`;
764
+ chunk.source = insertBannerHeader(chunk.source, bannerBlock);
765
+ const lineOffset = countInsertedLines(bannerBlock);
766
+ const mapAsset = bundle[`${fileName}.map`];
767
+ if (mapAsset && mapAsset.type === "asset" && mapAsset.source !== void 0) {
768
+ const adjusted = applyLineOffsetToSourceMap(mapAsset.source, lineOffset);
769
+ if (adjusted !== void 0) mapAsset.source = adjusted;
770
+ }
771
+ assetCount++;
772
+ }
773
+ }
774
+ }
775
+ if (assetCount >= 1) logger.debug(`generateBundle: Banner header inserted: ${assetCount} file(s)`);
776
+ }
777
+ }
778
+ },
779
+ writeBundle: async (options) => {
780
+ if (!insertMetadataBanner || !options.dir) return;
781
+ try {
782
+ const files = await readdir(options.dir, { recursive: true });
783
+ let count = 0;
784
+ for (const file of files) {
785
+ const filePath = join(options.dir, file);
786
+ if (assetFiltersRegex.some((filter) => filter.test(file))) try {
787
+ const content = await readFile(filePath, "utf-8");
788
+ if (!content.includes(banner)) {
789
+ const bannerBlock = `${banner}\n`;
790
+ await writeFile(filePath, insertBannerHeader(content, bannerBlock));
791
+ const lineOffset = countInsertedLines(bannerBlock);
792
+ const mapPath = `${filePath}.map`;
793
+ try {
794
+ const adjusted = applyLineOffsetToSourceMap(await readFile(mapPath, "utf-8"), lineOffset);
795
+ if (adjusted !== void 0) await writeFile(mapPath, adjusted);
796
+ } catch (_unused2) {}
797
+ count++;
798
+ }
799
+ } catch (error) {}
800
+ }
801
+ if (count >= 1) logger.debug(`writeBundle: Banner header inserted: ${count} file(s)`);
802
+ } catch (error) {}
803
+ }
804
+ };
805
+ };
806
+ //#endregion
807
+ //#region src/index.ts
808
+ var src_default = screwUp;
809
+ //#endregion
810
+ export { src_default as default };
811
+
812
+ //# sourceMappingURL=index.mjs.map