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