@git.zone/tsbundle 2.11.4 → 2.13.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 (39) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/interfaces/index.d.ts +3 -0
  3. package/dist_ts/mod_custom/index.d.ts +10 -3
  4. package/dist_ts/mod_custom/index.js +278 -86
  5. package/dist_ts/mod_esbuild/index.child.d.ts +4 -8
  6. package/dist_ts/mod_esbuild/index.child.js +54 -44
  7. package/dist_ts/mod_esbuild/plugins.d.ts +5 -2
  8. package/dist_ts/mod_esbuild/plugins.js +5 -3
  9. package/dist_ts/mod_esbuild/workerplugin.d.ts +12 -0
  10. package/dist_ts/mod_esbuild/workerplugin.js +254 -0
  11. package/dist_ts/mod_output/artifactpublisher.d.ts +43 -0
  12. package/dist_ts/mod_output/artifactpublisher.js +925 -0
  13. package/dist_ts/mod_output/index.d.ts +1 -0
  14. package/dist_ts/mod_output/index.js +11 -3
  15. package/dist_ts/mod_presets/index.js +2 -1
  16. package/dist_ts/mod_rolldown/index.child.d.ts +4 -2
  17. package/dist_ts/mod_rolldown/index.child.js +48 -36
  18. package/dist_ts/mod_rspack/index.child.d.ts +4 -2
  19. package/dist_ts/mod_rspack/index.child.js +76 -115
  20. package/dist_ts/plugins.d.ts +3 -1
  21. package/dist_ts/plugins.js +4 -2
  22. package/dist_ts/tsbundle.class.tsbundle.js +98 -16
  23. package/package.json +7 -5
  24. package/readme.hints.md +20 -4
  25. package/readme.md +29 -6
  26. package/third-party-notices.md +29 -0
  27. package/ts/00_commitinfo_data.ts +1 -1
  28. package/ts/interfaces/index.ts +3 -0
  29. package/ts/mod_custom/index.ts +348 -96
  30. package/ts/mod_esbuild/index.child.ts +81 -47
  31. package/ts/mod_esbuild/plugins.ts +9 -2
  32. package/ts/mod_esbuild/workerplugin.ts +328 -0
  33. package/ts/mod_output/artifactpublisher.ts +1185 -0
  34. package/ts/mod_output/index.ts +10 -2
  35. package/ts/mod_presets/index.ts +1 -0
  36. package/ts/mod_rolldown/index.child.ts +66 -42
  37. package/ts/mod_rspack/index.child.ts +98 -127
  38. package/ts/plugins.ts +3 -1
  39. package/ts/tsbundle.class.tsbundle.ts +102 -14
@@ -2,18 +2,22 @@ import * as plugins from './plugins.js';
2
2
  import * as paths from '../paths.js';
3
3
  import * as interfaces from '../interfaces/index.js';
4
4
  import { TsBundle } from '../tsbundle.class.tsbundle.js';
5
- import { HtmlHandler } from '../mod_html/index.js';
6
5
  import { Base64TsOutput } from '../mod_output/index.js';
7
- const TEMP_DIR = '.nogit/tsbundle-temp';
6
+ import { chunkManifestFile, createProcessOwnership, getChunkNamespace, isProcessOwnershipActive, publishGeneratedArtifacts, startOwnershipHeartbeat, withArtifactPublicationLocks, } from '../mod_output/artifactpublisher.js';
7
+ const legacyTempDir = '.nogit/tsbundle-temp';
8
+ const localTempPrefix = 'tsbundle-temp-';
9
+ const cleanupTempPrefix = '.tsbundle-temp-cleanup-';
8
10
  const toolCacheMarkerFile = '.gitzone-tool-cache.json';
9
11
  const toolCacheOwner = '@git.zone/tsbundle';
10
12
  const tempCacheKind = 'bundle-temp-workspace';
11
13
  const staleTempThresholdMs = 24 * 60 * 60 * 1000;
14
+ const minimumTempLeaseTimeoutMs = 2 * 60 * 1000;
12
15
  export class CustomBundleHandler {
13
16
  cwd;
14
17
  config;
15
18
  cliOptions;
16
19
  didRunStartupCleanup = false;
20
+ invocationId = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
17
21
  constructor(cwd = paths.cwd, cliOptions = {}) {
18
22
  this.cwd = cwd;
19
23
  this.cliOptions = cliOptions;
@@ -55,18 +59,22 @@ export class CustomBundleHandler {
55
59
  const tempWorkspace = await this.prepareTempWorkspace();
56
60
  const tempDir = tempWorkspace.tempDir;
57
61
  const tempBundlePath = plugins.path.join(tempDir, 'bundle.js');
58
- // A marked workspace can survive a failed or explicitly retained build. Clear
59
- // only the files this build owns so an old map cannot leak into new output.
60
- await plugins.fsPromises.rm(tempBundlePath, { force: true });
61
- await plugins.fsPromises.rm(`${tempBundlePath}.map`, { force: true });
62
+ const stopTempHeartbeat = tempWorkspace.marker
63
+ ? startOwnershipHeartbeat(plugins.path.join(tempDir, toolCacheMarkerFile))
64
+ : undefined;
62
65
  // Build the bundle to temp location
63
66
  const tsbundle = new TsBundle();
64
67
  let completedSuccessfully = false;
65
68
  try {
69
+ // A marked workspace can survive a failed or explicitly retained build.
70
+ // Clear prior generated artifacts so stale chunks cannot leak into output.
71
+ await this.clearTempBuildArtifacts(tempDir);
66
72
  await tsbundle.build(this.cwd, bundleConfig.from, tempBundlePath, {
67
73
  bundler,
68
74
  production: bundleConfig.production || false,
69
75
  sourcemap: bundleConfig.sourcemap !== false,
76
+ banner: bundleConfig.banner,
77
+ chunkOwner: plugins.path.basename(bundleConfig.to),
70
78
  });
71
79
  if (outputMode === 'base64ts') {
72
80
  await this.handleBase64TsOutput(bundleConfig, tempBundlePath);
@@ -83,14 +91,15 @@ export class CustomBundleHandler {
83
91
  throw error;
84
92
  }
85
93
  finally {
94
+ stopTempHeartbeat?.();
86
95
  if (completedSuccessfully && tempWorkspace.canCleanupWorkspace && !this.shouldKeepTemp(bundleConfig)) {
87
- await this.cleanupTempWorkspace('successful bundle', tempDir);
96
+ await this.cleanupTempWorkspace('successful bundle', tempDir, tempWorkspace.marker);
88
97
  }
89
98
  else if (completedSuccessfully) {
90
99
  console.log(`Keeping tsbundle temp workspace: ${tempDir}`);
91
100
  }
92
101
  else if (tempWorkspace.cleanupOnFailure && !this.shouldKeepTemp(bundleConfig)) {
93
- await this.cleanupTempWorkspace('failed bundle', tempDir);
102
+ await this.cleanupTempWorkspace('failed bundle', tempDir, tempWorkspace.marker);
94
103
  }
95
104
  }
96
105
  }
@@ -102,37 +111,59 @@ export class CustomBundleHandler {
102
111
  if (this.shouldKeepTemp()) {
103
112
  return false;
104
113
  }
105
- const tempDir = this.getTempDir();
106
- const marker = await this.readTempMarker(tempDir);
114
+ let didCleanup = await this.cleanupStaleMarkedTempWorkspaces(this.getProjectTempRoot(), thresholdMsArg);
115
+ didCleanup = await this.cleanupStaleMarkedTempWorkspaces(plugins.os.tmpdir(), thresholdMsArg) || didCleanup;
116
+ const legacyTempPath = this.getTempDir();
117
+ const marker = await this.readTempMarker(legacyTempPath);
107
118
  if (!marker) {
108
- return false;
119
+ return didCleanup;
109
120
  }
110
121
  const createdAt = Date.parse(marker.createdAt);
111
- if (Number.isFinite(createdAt) && Date.now() - createdAt < thresholdMsArg) {
112
- return false;
122
+ if (!Number.isFinite(createdAt) || Date.now() - createdAt < thresholdMsArg) {
123
+ return didCleanup;
113
124
  }
114
- await this.cleanupTempWorkspace('stale marked temp workspace');
115
- return true;
125
+ if (this.isTempMarkerActive(marker, legacyTempPath, thresholdMsArg)) {
126
+ return didCleanup;
127
+ }
128
+ didCleanup = await this.cleanupTempWorkspace('stale marked temp workspace', legacyTempPath, marker) || didCleanup;
129
+ return didCleanup;
116
130
  }
117
131
  getTempDir() {
118
- return plugins.path.join(this.cwd, TEMP_DIR);
132
+ return plugins.path.join(this.cwd, legacyTempDir);
119
133
  }
120
- assertExpectedTempDir(tempDirArg) {
121
- const expected = plugins.path.resolve(this.cwd, TEMP_DIR);
122
- const actual = plugins.path.resolve(tempDirArg);
123
- if (actual !== expected) {
124
- throw new Error(`Refusing to clean unexpected tsbundle temp path: ${tempDirArg}`);
125
- }
134
+ getProjectTempRoot() {
135
+ return plugins.path.join(this.cwd, '.nogit');
126
136
  }
127
137
  assertManagedTempDir(tempDirArg) {
128
- const expected = plugins.path.resolve(this.cwd, TEMP_DIR);
138
+ const expected = plugins.path.resolve(this.cwd, legacyTempDir);
129
139
  const actual = plugins.path.resolve(tempDirArg);
140
+ const projectTempRoot = plugins.path.resolve(this.getProjectTempRoot());
130
141
  const osTempRoot = plugins.path.resolve(plugins.os.tmpdir());
131
- const isIsolatedTemp = plugins.path.dirname(actual) === osTempRoot
132
- && plugins.path.basename(actual).startsWith('tsbundle-temp-');
133
- if (actual !== expected && !isIsolatedTemp) {
142
+ const isExpectedTemp = actual === expected;
143
+ const basename = plugins.path.basename(actual);
144
+ const hasManagedName = basename.startsWith(localTempPrefix)
145
+ || basename.startsWith(cleanupTempPrefix);
146
+ const isProjectTemp = plugins.path.dirname(actual) === projectTempRoot && hasManagedName;
147
+ const isOsTemp = plugins.path.dirname(actual) === osTempRoot && hasManagedName;
148
+ if (!isExpectedTemp && !isProjectTemp && !isOsTemp) {
134
149
  throw new Error(`Refusing to clean unexpected tsbundle temp path: ${tempDirArg}`);
135
150
  }
151
+ const stat = plugins.fsSync.lstatSync(actual);
152
+ if (stat.isSymbolicLink()) {
153
+ throw new Error(`Refusing to use symbolic-link temp path: ${tempDirArg}`);
154
+ }
155
+ const physicalActual = plugins.fsSync.realpathSync(actual);
156
+ const physicalParent = plugins.fsSync.realpathSync(plugins.path.dirname(actual));
157
+ const physicalCwd = plugins.fsSync.realpathSync(this.cwd);
158
+ const physicalExpected = plugins.path.join(physicalCwd, legacyTempDir);
159
+ const physicalProjectTempRoot = plugins.path.join(physicalCwd, '.nogit');
160
+ const physicalOsTempRoot = plugins.fsSync.realpathSync(osTempRoot);
161
+ const isPhysicalExpected = isExpectedTemp && physicalActual === physicalExpected;
162
+ const isPhysicalProjectTemp = isProjectTemp && physicalParent === physicalProjectTempRoot;
163
+ const isPhysicalOsTemp = isOsTemp && physicalParent === physicalOsTempRoot;
164
+ if (!isPhysicalExpected && !isPhysicalProjectTemp && !isPhysicalOsTemp) {
165
+ throw new Error(`Refusing to use temp path outside its physical owner: ${tempDirArg}`);
166
+ }
136
167
  }
137
168
  isTruthy(valueArg) {
138
169
  if (typeof valueArg === 'boolean') {
@@ -144,6 +175,29 @@ export class CustomBundleHandler {
144
175
  const normalized = valueArg.toLowerCase();
145
176
  return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'y';
146
177
  }
178
+ hasErrorCode(errorArg) {
179
+ return typeof errorArg === 'object' && errorArg !== null && 'code' in errorArg;
180
+ }
181
+ isTempMarkerActive(markerArg, tempDirArg, leaseTimeoutMsArg) {
182
+ if (!markerArg.processId) {
183
+ return false;
184
+ }
185
+ return isProcessOwnershipActive({
186
+ leaseManaged: markerArg.leaseManaged,
187
+ processId: markerArg.processId,
188
+ processIdentity: markerArg.processIdentity,
189
+ }, plugins.path.join(tempDirArg, toolCacheMarkerFile), Math.max(leaseTimeoutMsArg, minimumTempLeaseTimeoutMs));
190
+ }
191
+ markersMatch(firstMarkerArg, secondMarkerArg) {
192
+ return firstMarkerArg.owner === secondMarkerArg.owner
193
+ && firstMarkerArg.kind === secondMarkerArg.kind
194
+ && firstMarkerArg.createdAt === secondMarkerArg.createdAt
195
+ && firstMarkerArg.invocationId === secondMarkerArg.invocationId
196
+ && firstMarkerArg.processId === secondMarkerArg.processId
197
+ && firstMarkerArg.processIdentity === secondMarkerArg.processIdentity
198
+ && firstMarkerArg.leaseManaged === secondMarkerArg.leaseManaged
199
+ && firstMarkerArg.schemaVersion === secondMarkerArg.schemaVersion;
200
+ }
147
201
  shouldKeepTemp(bundleConfigArg) {
148
202
  return this.isTruthy(process.env.TSBUNDLE_KEEP_TEMP)
149
203
  || this.cliOptions.keepTemp === true
@@ -152,62 +206,156 @@ export class CustomBundleHandler {
152
206
  || bundleConfigArg?.keepTemp === true;
153
207
  }
154
208
  async prepareTempWorkspace() {
155
- const tempDirArg = this.getTempDir();
156
- this.assertExpectedTempDir(tempDirArg);
157
- const marker = await this.readTempMarker(tempDirArg);
158
- if (marker) {
159
- return { tempDir: tempDirArg, canCleanupWorkspace: true, cleanupOnFailure: false };
209
+ return await this.createIsolatedTempWorkspace();
210
+ }
211
+ async createIsolatedTempWorkspace() {
212
+ const projectTempRoot = this.getProjectTempRoot();
213
+ await plugins.fsPromises.mkdir(projectTempRoot, { recursive: true });
214
+ const rootStat = plugins.fsSync.lstatSync(projectTempRoot);
215
+ if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) {
216
+ throw new Error(`Refusing to use unsafe project temp root: ${projectTempRoot}`);
160
217
  }
161
- let entries = [];
218
+ const expectedPhysicalRoot = plugins.path.join(plugins.fsSync.realpathSync(this.cwd), '.nogit');
219
+ if (plugins.fsSync.realpathSync(projectTempRoot) !== expectedPhysicalRoot) {
220
+ throw new Error(`Refusing to use project temp root outside the project: ${projectTempRoot}`);
221
+ }
222
+ const tempDir = await plugins.fsPromises.mkdtemp(plugins.path.join(projectTempRoot, localTempPrefix));
162
223
  try {
163
- entries = await plugins.fsPromises.readdir(tempDirArg);
224
+ const marker = await this.writeTempMarker(tempDir);
225
+ return {
226
+ tempDir,
227
+ canCleanupWorkspace: true,
228
+ cleanupOnFailure: true,
229
+ marker,
230
+ };
164
231
  }
165
- catch {
166
- await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
232
+ catch (error) {
233
+ await plugins.fsPromises.rm(tempDir, { recursive: true, force: true });
234
+ throw error;
167
235
  }
168
- if (entries.length > 0) {
169
- const isolatedTempDir = await this.createIsolatedTempWorkspace();
170
- console.log(`tsbundle: leaving existing unmarked temp workspace untouched: ${tempDirArg}`);
171
- console.log(`tsbundle: using isolated marked temp workspace: ${isolatedTempDir}`);
172
- return { tempDir: isolatedTempDir, canCleanupWorkspace: true, cleanupOnFailure: true };
236
+ }
237
+ async clearTempBuildArtifacts(tempDirArg) {
238
+ this.assertManagedTempDir(tempDirArg);
239
+ const entries = await plugins.fsPromises.readdir(tempDirArg, { withFileTypes: true });
240
+ for (const entry of entries) {
241
+ if (entry.name === toolCacheMarkerFile) {
242
+ continue;
243
+ }
244
+ await plugins.fsPromises.rm(plugins.path.join(tempDirArg, entry.name), {
245
+ recursive: true,
246
+ force: true,
247
+ });
173
248
  }
174
- await this.writeTempMarker(tempDirArg);
175
- return { tempDir: tempDirArg, canCleanupWorkspace: true, cleanupOnFailure: false };
176
249
  }
177
- async createIsolatedTempWorkspace() {
178
- const tempDir = await plugins.fsPromises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'tsbundle-temp-'));
179
- await this.writeTempMarker(tempDir);
180
- return tempDir;
250
+ async listBundleArtifacts(tempDirArg) {
251
+ const result = [];
252
+ const collect = async (directoryArg) => {
253
+ const entries = await plugins.fsPromises.readdir(directoryArg, { withFileTypes: true });
254
+ for (const entry of entries) {
255
+ if (entry.name === toolCacheMarkerFile || entry.name === chunkManifestFile) {
256
+ continue;
257
+ }
258
+ const entryPath = plugins.path.join(directoryArg, entry.name);
259
+ if (entry.isDirectory()) {
260
+ await collect(entryPath);
261
+ }
262
+ else if (entry.isFile()) {
263
+ result.push(entryPath);
264
+ }
265
+ }
266
+ };
267
+ await collect(tempDirArg);
268
+ return result.sort((a, b) => a.localeCompare(b));
181
269
  }
182
- async writeTempMarker(tempDirArg) {
270
+ async writeTempMarker(tempDirArg, exclusive = false) {
271
+ await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
183
272
  this.assertManagedTempDir(tempDirArg);
184
273
  const marker = {
185
274
  owner: toolCacheOwner,
186
275
  kind: tempCacheKind,
187
276
  safeToPrune: true,
188
277
  createdAt: new Date().toISOString(),
278
+ invocationId: this.invocationId,
279
+ ...createProcessOwnership(),
189
280
  schemaVersion: 1,
190
281
  };
191
- await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
192
- await plugins.fsPromises.writeFile(plugins.path.join(tempDirArg, toolCacheMarkerFile), `${JSON.stringify(marker, null, 2)}\n`);
282
+ await plugins.fsPromises.writeFile(plugins.path.join(tempDirArg, toolCacheMarkerFile), `${JSON.stringify(marker, null, 2)}\n`, { flag: exclusive ? 'wx' : 'w', mode: 0o600 });
283
+ return marker;
193
284
  }
194
285
  async readTempMarker(tempDirArg) {
195
- this.assertManagedTempDir(tempDirArg);
196
286
  try {
287
+ this.assertManagedTempDir(tempDirArg);
197
288
  const markerRaw = await plugins.fsPromises.readFile(plugins.path.join(tempDirArg, toolCacheMarkerFile), 'utf8');
198
- const marker = JSON.parse(markerRaw);
289
+ let marker;
290
+ try {
291
+ marker = JSON.parse(markerRaw);
292
+ }
293
+ catch {
294
+ return undefined;
295
+ }
199
296
  if (marker.owner === toolCacheOwner &&
200
297
  marker.kind === tempCacheKind &&
201
298
  marker.safeToPrune === true &&
299
+ (marker.invocationId === undefined || (typeof marker.invocationId === 'string'
300
+ && /^[A-Za-z0-9._-]{1,128}$/.test(marker.invocationId))) &&
301
+ (marker.processId === undefined || (typeof marker.processId === 'number'
302
+ && Number.isSafeInteger(marker.processId)
303
+ && marker.processId > 0)) &&
304
+ (marker.processIdentity === undefined || typeof marker.processIdentity === 'string') &&
305
+ (marker.leaseManaged === undefined || typeof marker.leaseManaged === 'boolean') &&
202
306
  marker.schemaVersion === 1) {
203
307
  return marker;
204
308
  }
205
309
  }
206
- catch {
207
- return undefined;
310
+ catch (error) {
311
+ if (this.hasErrorCode(error) && error.code === 'ENOENT') {
312
+ return undefined;
313
+ }
314
+ throw error;
208
315
  }
209
316
  return undefined;
210
317
  }
318
+ async cleanupStaleMarkedTempWorkspaces(rootDirectoryArg, thresholdMsArg) {
319
+ let didCleanup = false;
320
+ let entries;
321
+ try {
322
+ entries = await plugins.fsPromises.readdir(rootDirectoryArg, { withFileTypes: true });
323
+ }
324
+ catch (error) {
325
+ if (this.hasErrorCode(error) && error.code === 'ENOENT') {
326
+ return false;
327
+ }
328
+ throw error;
329
+ }
330
+ for (const entry of entries) {
331
+ if (!entry.isDirectory()
332
+ || (!entry.name.startsWith(localTempPrefix) && !entry.name.startsWith(cleanupTempPrefix))) {
333
+ continue;
334
+ }
335
+ const tempDir = plugins.path.join(rootDirectoryArg, entry.name);
336
+ let marker;
337
+ try {
338
+ marker = await this.readTempMarker(tempDir);
339
+ }
340
+ catch (error) {
341
+ if (this.hasErrorCode(error) && error.code === 'ENOENT') {
342
+ continue;
343
+ }
344
+ throw error;
345
+ }
346
+ if (!marker) {
347
+ continue;
348
+ }
349
+ const createdAt = Date.parse(marker.createdAt);
350
+ if (!Number.isFinite(createdAt)
351
+ || Date.now() - createdAt < thresholdMsArg
352
+ || this.isTempMarkerActive(marker, tempDir, thresholdMsArg)) {
353
+ continue;
354
+ }
355
+ didCleanup = await this.cleanupTempWorkspace('stale isolated temp workspace', tempDir, marker) || didCleanup;
356
+ }
357
+ return didCleanup;
358
+ }
211
359
  async getDirectorySize(pathArg) {
212
360
  let total = 0;
213
361
  let entries;
@@ -244,24 +392,60 @@ export class CustomBundleHandler {
244
392
  const decimals = unitIndex === 0 || value >= 100 ? 0 : value >= 10 ? 1 : 2;
245
393
  return `${value.toFixed(decimals)} ${units[unitIndex]}`;
246
394
  }
247
- async cleanupTempWorkspace(reasonArg, tempDir = this.getTempDir()) {
248
- this.assertManagedTempDir(tempDir);
395
+ async cleanupTempWorkspace(reasonArg, tempDir = this.getTempDir(), expectedMarkerArg) {
396
+ try {
397
+ this.assertManagedTempDir(tempDir);
398
+ }
399
+ catch (error) {
400
+ if (this.hasErrorCode(error) && error.code === 'ENOENT') {
401
+ return false;
402
+ }
403
+ throw error;
404
+ }
249
405
  const marker = await this.readTempMarker(tempDir);
250
- if (!marker) {
251
- return;
406
+ if (!marker || (expectedMarkerArg && !this.markersMatch(marker, expectedMarkerArg))) {
407
+ return false;
408
+ }
409
+ const quarantinePath = plugins.path.join(plugins.path.dirname(tempDir), `${cleanupTempPrefix}${this.invocationId}-${Math.random().toString(36).slice(2)}`);
410
+ try {
411
+ await plugins.fsPromises.rename(tempDir, quarantinePath);
252
412
  }
253
- const reclaimedBytes = await this.getDirectorySize(tempDir);
254
- await plugins.fsPromises.rm(tempDir, { recursive: true, force: true });
413
+ catch (error) {
414
+ if (this.hasErrorCode(error) && error.code === 'ENOENT') {
415
+ return false;
416
+ }
417
+ throw error;
418
+ }
419
+ const quarantinedMarker = await this.readTempMarker(quarantinePath);
420
+ if (!quarantinedMarker || !this.markersMatch(marker, quarantinedMarker)) {
421
+ try {
422
+ if (!plugins.fsSync.existsSync(tempDir)) {
423
+ await plugins.fsPromises.rename(quarantinePath, tempDir);
424
+ }
425
+ }
426
+ catch (error) {
427
+ if (!this.hasErrorCode(error) || !['EEXIST', 'ENOENT'].includes(error.code || '')) {
428
+ throw error;
429
+ }
430
+ }
431
+ return false;
432
+ }
433
+ const reclaimedBytes = await this.getDirectorySize(quarantinePath);
434
+ await plugins.fsPromises.rm(quarantinePath, { recursive: true, force: true });
255
435
  console.log(`Cleaned tsbundle temp workspace after ${reasonArg}, reclaimed ${this.formatBytes(reclaimedBytes)}`);
436
+ return true;
256
437
  }
257
438
  /**
258
439
  * Handle base64ts output mode
259
440
  */
260
441
  async handleBase64TsOutput(bundleConfig, tempBundlePath) {
261
442
  const base64Output = new Base64TsOutput(this.cwd);
262
- // Add the bundle itself
263
- const bundleContent = await plugins.fs.file(tempBundlePath).read();
264
- base64Output.addFile('bundle.js', bundleContent);
443
+ const tempDir = plugins.path.dirname(tempBundlePath);
444
+ for (const artifactPath of await this.listBundleArtifacts(tempDir)) {
445
+ const relativePath = plugins.path.relative(tempDir, artifactPath);
446
+ const artifactContent = await plugins.fs.file(artifactPath).read();
447
+ base64Output.addFile(relativePath, artifactContent);
448
+ }
265
449
  // Add included files
266
450
  if (bundleConfig.includeFiles && bundleConfig.includeFiles.length > 0) {
267
451
  for (const entry of bundleConfig.includeFiles) {
@@ -274,36 +458,47 @@ export class CustomBundleHandler {
274
458
  }
275
459
  }
276
460
  // Write the TypeScript output
277
- await base64Output.writeToFile(bundleConfig.to, bundleConfig.maxLineLength);
461
+ const outputPath = plugins.smartpath.transform.toAbsolute(bundleConfig.to, this.cwd);
462
+ await withArtifactPublicationLocks(outputPath, async () => {
463
+ await base64Output.writeToFile(bundleConfig.to, bundleConfig.maxLineLength);
464
+ });
278
465
  }
279
466
  /**
280
467
  * Handle standard bundle output mode
281
468
  */
282
469
  async handleBundleOutput(bundleConfig, tempBundlePath) {
283
- // Move bundle to final destination
284
470
  const toPath = plugins.smartpath.transform.toAbsolute(bundleConfig.to, this.cwd);
285
471
  const toDir = plugins.path.dirname(toPath);
286
- await plugins.fs.directory(toDir).create();
287
- const bundleContent = await plugins.fs.file(tempBundlePath).read();
288
- await plugins.fs.file(toPath).write(bundleContent);
289
- console.log(`Bundle written to: ${bundleConfig.to}`);
290
- if (bundleConfig.sourcemap === false) {
291
- await plugins.fsPromises.rm(`${toPath}.map`, { force: true });
292
- }
293
- // Process included files (copy them)
472
+ const tempDir = plugins.path.dirname(tempBundlePath);
473
+ const logicalOutputName = plugins.path.basename(toPath);
474
+ const additionalArtifacts = [];
294
475
  if (bundleConfig.includeFiles && bundleConfig.includeFiles.length > 0) {
295
- const htmlHandler = new HtmlHandler();
296
- const outputDir = plugins.path.dirname(toPath);
297
476
  for (const entry of bundleConfig.includeFiles) {
298
477
  const pattern = typeof entry === 'string' ? entry : entry.from;
299
- await this.copyIncludedFiles(pattern, outputDir);
478
+ additionalArtifacts.push(...await this.collectIncludedFiles(pattern, toDir));
300
479
  }
301
480
  }
481
+ await publishGeneratedArtifacts({
482
+ additionalArtifacts,
483
+ sourceDirectory: tempDir,
484
+ sourceMainPath: tempBundlePath,
485
+ targetPath: toPath,
486
+ lockTargetPath: plugins.path.join(toDir, '.tsbundle-output-directory'),
487
+ logicalOutputName,
488
+ chunkNamespace: getChunkNamespace(logicalOutputName),
489
+ sourceMapsEnabled: bundleConfig.sourcemap !== false,
490
+ });
491
+ console.log(`Bundle written to: ${bundleConfig.to}`);
492
+ for (const artifact of additionalArtifacts) {
493
+ const relativePath = plugins.path.relative(this.cwd, artifact.sourcePath);
494
+ console.log(`Copied: ${relativePath} -> ${artifact.targetPath}`);
495
+ }
302
496
  }
303
497
  /**
304
- * Copy files matching a pattern to the output directory
498
+ * Resolve files matching a pattern for transactional publication.
305
499
  */
306
- async copyIncludedFiles(pattern, outputDir) {
500
+ async collectIncludedFiles(pattern, outputDir) {
501
+ const artifacts = [];
307
502
  const absolutePattern = plugins.smartpath.transform.toAbsolute(pattern, this.cwd);
308
503
  const patternDir = plugins.path.dirname(absolutePattern);
309
504
  const patternBase = plugins.path.basename(absolutePattern);
@@ -313,7 +508,7 @@ export class CustomBundleHandler {
313
508
  const dirExists = await plugins.fs.directory(dirPath).exists();
314
509
  if (!dirExists) {
315
510
  console.log(`Directory does not exist: ${dirPath}`);
316
- return;
511
+ return artifacts;
317
512
  }
318
513
  const isRecursive = pattern.includes('**');
319
514
  let entries;
@@ -329,11 +524,8 @@ export class CustomBundleHandler {
329
524
  if (!entry.isDirectory && regex.test(entry.name)) {
330
525
  // entry.path is already absolute from smartfs
331
526
  const fullPath = entry.path;
332
- const relativePath = plugins.path.relative(this.cwd, fullPath);
333
527
  const destPath = plugins.path.join(outputDir, plugins.path.basename(entry.path));
334
- await plugins.fs.directory(plugins.path.dirname(destPath)).create();
335
- await plugins.fs.file(fullPath).copy(destPath);
336
- console.log(`Copied: ${relativePath} -> ${destPath}`);
528
+ artifacts.push({ sourcePath: fullPath, targetPath: destPath });
337
529
  }
338
530
  }
339
531
  }
@@ -341,13 +533,13 @@ export class CustomBundleHandler {
341
533
  const fileExists = await plugins.fs.file(absolutePattern).exists();
342
534
  if (!fileExists) {
343
535
  console.log(`File does not exist: ${absolutePattern}`);
344
- return;
536
+ return artifacts;
345
537
  }
346
538
  const fileName = plugins.path.basename(absolutePattern);
347
539
  const destPath = plugins.path.join(outputDir, fileName);
348
- await plugins.fs.file(absolutePattern).copy(destPath);
349
- console.log(`Copied: ${pattern} -> ${destPath}`);
540
+ artifacts.push({ sourcePath: absolutePattern, targetPath: destPath });
350
541
  }
542
+ return artifacts;
351
543
  }
352
544
  }
353
545
  /**
@@ -362,4 +554,4 @@ export async function runCustomBundles(cliOptionsArg = {}) {
362
554
  await handler.processAllBundles();
363
555
  console.log('\nCustom bundle processing complete!');
364
556
  }
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY3VzdG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFeEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUM7QUFDeEMsTUFBTSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQztBQUN2RCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUM5QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQWdCakQsTUFBTSxPQUFPLG1CQUFtQjtJQUN0QixHQUFHLENBQVM7SUFDWixNQUFNLENBQThCO0lBQ3BDLFVBQVUsQ0FBcUM7SUFDL0Msb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXJDLFlBQVksTUFBYyxLQUFLLENBQUMsR0FBRyxFQUFFLGFBQWlELEVBQUU7UUFDdEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLElB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
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY3VzdG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsNEJBQTRCLEdBRTdCLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUM7QUFDN0MsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsTUFBTSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQztBQUNwRCxNQUFNLG1CQUFtQixHQUFHLDBCQUEwQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDO0FBQzlDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFxQmhELE1BQU0sT0FBTyxtQkFBbUI7SUFDdEIsR0FBRyxDQUFTO0lBQ1osTUFBTSxDQUE4QjtJQUNwQyxVQUFVLENBQXFDO0lBQy9DLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUNwQixZQUFZLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FB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