@git.zone/tsbundle 2.10.4 → 2.11.1

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/.smartconfig.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "@git.zone/cli": {
3
+ "schemaVersion": 2,
3
4
  "projectType": "npm",
4
5
  "module": {
5
6
  "githost": "gitlab.com",
@@ -11,11 +12,23 @@
11
12
  "projectDomain": "git.zone"
12
13
  },
13
14
  "release": {
14
- "registries": [
15
- "https://verdaccio.lossless.digital",
16
- "https://registry.npmjs.org"
17
- ],
18
- "accessLevel": "public"
15
+ "targets": {
16
+ "git": {
17
+ "enabled": true,
18
+ "remote": "origin",
19
+ "pushBranch": true,
20
+ "pushTags": true
21
+ },
22
+ "npm": {
23
+ "enabled": true,
24
+ "registries": [
25
+ "https://verdaccio.lossless.digital",
26
+ "https://registry.npmjs.org"
27
+ ],
28
+ "accessLevel": "public",
29
+ "alreadyPublished": "success"
30
+ }
31
+ }
19
32
  }
20
33
  },
21
34
  "@ship.zone/szci": {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsbundle',
6
- version: '2.10.4',
6
+ version: '2.11.1',
7
7
  description: 'a multi-bundler tool supporting esbuild, rolldown, and rspack for painless bundling of web projects'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHFHQUFxRztDQUNuSCxDQUFBIn0=
@@ -2,8 +2,13 @@ export interface ICliOptions {
2
2
  commonjs?: boolean;
3
3
  skiplibcheck?: boolean;
4
4
  production?: boolean;
5
+ keepTemp?: boolean;
5
6
  bundler: 'esbuild' | 'rolldown' | 'rspack';
6
7
  }
8
+ export interface ICustomBundleCliOptions {
9
+ keepTemp?: boolean;
10
+ 'keep-temp'?: boolean;
11
+ }
7
12
  export interface IEnvTransportOptions {
8
13
  cwd: string;
9
14
  from: string;
@@ -25,9 +30,11 @@ export interface IBundleConfig {
25
30
  production?: boolean;
26
31
  includeFiles?: TIncludeFile[];
27
32
  maxLineLength?: number;
33
+ keepTemp?: boolean;
28
34
  }
29
35
  export interface ITsbundleConfig {
30
36
  bundles: IBundleConfig[];
37
+ keepTemp?: boolean;
31
38
  }
32
39
  export interface IBase64File {
33
40
  path: string;
@@ -2,7 +2,9 @@ import * as interfaces from '../interfaces/index.js';
2
2
  export declare class CustomBundleHandler {
3
3
  private cwd;
4
4
  private config;
5
- constructor(cwd?: string);
5
+ private cliOptions;
6
+ private didRunStartupCleanup;
7
+ constructor(cwd?: string, cliOptions?: interfaces.ICustomBundleCliOptions);
6
8
  /**
7
9
  * Load configuration from .smartconfig.json
8
10
  */
@@ -15,6 +17,19 @@ export declare class CustomBundleHandler {
15
17
  * Process a single bundle configuration
16
18
  */
17
19
  processSingleBundle(bundleConfig: interfaces.IBundleConfig): Promise<void>;
20
+ cleanupStaleTempWorkspace(thresholdMsArg?: number): Promise<boolean>;
21
+ private getTempDir;
22
+ private assertExpectedTempDir;
23
+ private assertManagedTempDir;
24
+ private isTruthy;
25
+ private shouldKeepTemp;
26
+ private prepareTempWorkspace;
27
+ private createIsolatedTempWorkspace;
28
+ private writeTempMarker;
29
+ private readTempMarker;
30
+ private getDirectorySize;
31
+ private formatBytes;
32
+ private cleanupTempWorkspace;
18
33
  /**
19
34
  * Handle base64ts output mode
20
35
  */
@@ -31,4 +46,4 @@ export declare class CustomBundleHandler {
31
46
  /**
32
47
  * Run the custom bundle command
33
48
  */
34
- export declare function runCustomBundles(): Promise<void>;
49
+ export declare function runCustomBundles(cliOptionsArg?: interfaces.ICustomBundleCliOptions): Promise<void>;
@@ -5,11 +5,18 @@ import { TsBundle } from '../tsbundle.class.tsbundle.js';
5
5
  import { HtmlHandler } from '../mod_html/index.js';
6
6
  import { Base64TsOutput } from '../mod_output/index.js';
7
7
  const TEMP_DIR = '.nogit/tsbundle-temp';
8
+ const toolCacheMarkerFile = '.gitzone-tool-cache.json';
9
+ const toolCacheOwner = '@git.zone/tsbundle';
10
+ const tempCacheKind = 'bundle-temp-workspace';
11
+ const staleTempThresholdMs = 24 * 60 * 60 * 1000;
8
12
  export class CustomBundleHandler {
9
13
  cwd;
10
14
  config;
11
- constructor(cwd = paths.cwd) {
15
+ cliOptions;
16
+ didRunStartupCleanup = false;
17
+ constructor(cwd = paths.cwd, cliOptions = {}) {
12
18
  this.cwd = cwd;
19
+ this.cliOptions = cliOptions;
13
20
  }
14
21
  /**
15
22
  * Load configuration from .smartconfig.json
@@ -31,6 +38,7 @@ export class CustomBundleHandler {
31
38
  * Process all configured bundles
32
39
  */
33
40
  async processAllBundles() {
41
+ await this.cleanupStaleTempWorkspace();
34
42
  for (let i = 0; i < this.config.bundles.length; i++) {
35
43
  const bundleConfig = this.config.bundles[i];
36
44
  console.log(`\nProcessing bundle ${i + 1}/${this.config.bundles.length}: ${bundleConfig.from} -> ${bundleConfig.to}`);
@@ -41,42 +49,204 @@ export class CustomBundleHandler {
41
49
  * Process a single bundle configuration
42
50
  */
43
51
  async processSingleBundle(bundleConfig) {
52
+ await this.cleanupStaleTempWorkspace();
44
53
  const outputMode = bundleConfig.outputMode || 'bundle';
45
54
  const bundler = bundleConfig.bundler || 'esbuild';
46
- // Determine temp output path
47
- const tempDir = plugins.path.join(this.cwd, TEMP_DIR);
55
+ const tempWorkspace = await this.prepareTempWorkspace();
56
+ const tempDir = tempWorkspace.tempDir;
48
57
  const tempBundlePath = plugins.path.join(tempDir, 'bundle.js');
49
- // Ensure temp directory exists
50
- await plugins.fs.directory(tempDir).create();
51
58
  // Build the bundle to temp location
52
59
  const tsbundle = new TsBundle();
60
+ let completedSuccessfully = false;
53
61
  try {
54
62
  await tsbundle.build(this.cwd, bundleConfig.from, tempBundlePath, {
55
63
  bundler,
56
64
  production: bundleConfig.production || false,
57
65
  });
66
+ if (outputMode === 'base64ts') {
67
+ await this.handleBase64TsOutput(bundleConfig, tempBundlePath);
68
+ }
69
+ else {
70
+ await this.handleBundleOutput(bundleConfig, tempBundlePath);
71
+ }
72
+ completedSuccessfully = true;
58
73
  }
59
74
  catch (error) {
60
75
  console.error(`\n\x1b[31m❌ Bundle failed: ${bundleConfig.from} -> ${bundleConfig.to}\x1b[0m`);
61
76
  // Don't re-print error details - they were already shown by the child process
62
77
  return; // Skip output handling since build failed
63
78
  }
64
- if (outputMode === 'base64ts') {
65
- await this.handleBase64TsOutput(bundleConfig, tempBundlePath);
79
+ finally {
80
+ if (completedSuccessfully && tempWorkspace.canCleanupWorkspace && !this.shouldKeepTemp(bundleConfig)) {
81
+ await this.cleanupTempWorkspace('successful bundle', tempDir);
82
+ }
83
+ else if (completedSuccessfully) {
84
+ console.log(`Keeping tsbundle temp workspace: ${tempDir}`);
85
+ }
86
+ else if (tempWorkspace.cleanupOnFailure && !this.shouldKeepTemp(bundleConfig)) {
87
+ await this.cleanupTempWorkspace('failed bundle', tempDir);
88
+ }
66
89
  }
67
- else {
68
- await this.handleBundleOutput(bundleConfig, tempBundlePath);
90
+ }
91
+ async cleanupStaleTempWorkspace(thresholdMsArg = staleTempThresholdMs) {
92
+ if (this.didRunStartupCleanup) {
93
+ return false;
94
+ }
95
+ this.didRunStartupCleanup = true;
96
+ if (this.shouldKeepTemp()) {
97
+ return false;
98
+ }
99
+ const tempDir = this.getTempDir();
100
+ const marker = await this.readTempMarker(tempDir);
101
+ if (!marker) {
102
+ return false;
103
+ }
104
+ const createdAt = Date.parse(marker.createdAt);
105
+ if (Number.isFinite(createdAt) && Date.now() - createdAt < thresholdMsArg) {
106
+ return false;
107
+ }
108
+ await this.cleanupTempWorkspace('stale marked temp workspace');
109
+ return true;
110
+ }
111
+ getTempDir() {
112
+ return plugins.path.join(this.cwd, TEMP_DIR);
113
+ }
114
+ assertExpectedTempDir(tempDirArg) {
115
+ const expected = plugins.path.resolve(this.cwd, TEMP_DIR);
116
+ const actual = plugins.path.resolve(tempDirArg);
117
+ if (actual !== expected) {
118
+ throw new Error(`Refusing to clean unexpected tsbundle temp path: ${tempDirArg}`);
119
+ }
120
+ }
121
+ assertManagedTempDir(tempDirArg) {
122
+ const expected = plugins.path.resolve(this.cwd, TEMP_DIR);
123
+ const actual = plugins.path.resolve(tempDirArg);
124
+ const osTempRoot = plugins.path.resolve(plugins.os.tmpdir());
125
+ const isIsolatedTemp = plugins.path.dirname(actual) === osTempRoot
126
+ && plugins.path.basename(actual).startsWith('tsbundle-temp-');
127
+ if (actual !== expected && !isIsolatedTemp) {
128
+ throw new Error(`Refusing to clean unexpected tsbundle temp path: ${tempDirArg}`);
129
+ }
130
+ }
131
+ isTruthy(valueArg) {
132
+ if (typeof valueArg === 'boolean') {
133
+ return valueArg;
134
+ }
135
+ if (typeof valueArg !== 'string') {
136
+ return false;
69
137
  }
70
- // Clean up temp file
71
- const tempFileExists = await plugins.fs.file(tempBundlePath).exists();
72
- if (tempFileExists) {
73
- await plugins.fs.file(tempBundlePath).delete();
138
+ const normalized = valueArg.toLowerCase();
139
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'y';
140
+ }
141
+ shouldKeepTemp(bundleConfigArg) {
142
+ return this.isTruthy(process.env.TSBUNDLE_KEEP_TEMP)
143
+ || this.cliOptions.keepTemp === true
144
+ || this.cliOptions['keep-temp'] === true
145
+ || this.config?.keepTemp === true
146
+ || bundleConfigArg?.keepTemp === true;
147
+ }
148
+ async prepareTempWorkspace() {
149
+ const tempDirArg = this.getTempDir();
150
+ this.assertExpectedTempDir(tempDirArg);
151
+ const marker = await this.readTempMarker(tempDirArg);
152
+ if (marker) {
153
+ return { tempDir: tempDirArg, canCleanupWorkspace: true, cleanupOnFailure: false };
154
+ }
155
+ let entries = [];
156
+ try {
157
+ entries = await plugins.fsPromises.readdir(tempDirArg);
158
+ }
159
+ catch {
160
+ await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
161
+ }
162
+ if (entries.length > 0) {
163
+ const isolatedTempDir = await this.createIsolatedTempWorkspace();
164
+ console.log(`tsbundle: leaving existing unmarked temp workspace untouched: ${tempDirArg}`);
165
+ console.log(`tsbundle: using isolated marked temp workspace: ${isolatedTempDir}`);
166
+ return { tempDir: isolatedTempDir, canCleanupWorkspace: true, cleanupOnFailure: true };
167
+ }
168
+ await this.writeTempMarker(tempDirArg);
169
+ return { tempDir: tempDirArg, canCleanupWorkspace: true, cleanupOnFailure: false };
170
+ }
171
+ async createIsolatedTempWorkspace() {
172
+ const tempDir = await plugins.fsPromises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'tsbundle-temp-'));
173
+ await this.writeTempMarker(tempDir);
174
+ return tempDir;
175
+ }
176
+ async writeTempMarker(tempDirArg) {
177
+ this.assertManagedTempDir(tempDirArg);
178
+ const marker = {
179
+ owner: toolCacheOwner,
180
+ kind: tempCacheKind,
181
+ safeToPrune: true,
182
+ createdAt: new Date().toISOString(),
183
+ schemaVersion: 1,
184
+ };
185
+ await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
186
+ await plugins.fsPromises.writeFile(plugins.path.join(tempDirArg, toolCacheMarkerFile), `${JSON.stringify(marker, null, 2)}\n`);
187
+ }
188
+ async readTempMarker(tempDirArg) {
189
+ this.assertManagedTempDir(tempDirArg);
190
+ try {
191
+ const markerRaw = await plugins.fsPromises.readFile(plugins.path.join(tempDirArg, toolCacheMarkerFile), 'utf8');
192
+ const marker = JSON.parse(markerRaw);
193
+ if (marker.owner === toolCacheOwner &&
194
+ marker.kind === tempCacheKind &&
195
+ marker.safeToPrune === true &&
196
+ marker.schemaVersion === 1) {
197
+ return marker;
198
+ }
199
+ }
200
+ catch {
201
+ return undefined;
74
202
  }
75
- const tempSourceMapPath = `${tempBundlePath}.map`;
76
- const tempSourceMapExists = await plugins.fs.file(tempSourceMapPath).exists();
77
- if (tempSourceMapExists) {
78
- await plugins.fs.file(tempSourceMapPath).delete();
203
+ return undefined;
204
+ }
205
+ async getDirectorySize(pathArg) {
206
+ let total = 0;
207
+ let entries;
208
+ try {
209
+ entries = await plugins.fsPromises.readdir(pathArg, { withFileTypes: true });
210
+ }
211
+ catch {
212
+ return 0;
213
+ }
214
+ for (const entry of entries) {
215
+ const entryPath = plugins.path.join(pathArg, entry.name);
216
+ if (entry.isDirectory()) {
217
+ total += await this.getDirectorySize(entryPath);
218
+ }
219
+ else if (entry.isFile()) {
220
+ try {
221
+ total += (await plugins.fsPromises.stat(entryPath)).size;
222
+ }
223
+ catch {
224
+ // Ignore files that disappear while cleanup is inspecting the tree.
225
+ }
226
+ }
227
+ }
228
+ return total;
229
+ }
230
+ formatBytes(bytesArg) {
231
+ const units = ['B', 'KiB', 'MiB', 'GiB', 'TiB'];
232
+ let value = bytesArg;
233
+ let unitIndex = 0;
234
+ while (value >= 1024 && unitIndex < units.length - 1) {
235
+ value = value / 1024;
236
+ unitIndex++;
237
+ }
238
+ const decimals = unitIndex === 0 || value >= 100 ? 0 : value >= 10 ? 1 : 2;
239
+ return `${value.toFixed(decimals)} ${units[unitIndex]}`;
240
+ }
241
+ async cleanupTempWorkspace(reasonArg, tempDir = this.getTempDir()) {
242
+ this.assertManagedTempDir(tempDir);
243
+ const marker = await this.readTempMarker(tempDir);
244
+ if (!marker) {
245
+ return;
79
246
  }
247
+ const reclaimedBytes = await this.getDirectorySize(tempDir);
248
+ await plugins.fsPromises.rm(tempDir, { recursive: true, force: true });
249
+ console.log(`Cleaned tsbundle temp workspace after ${reasonArg}, reclaimed ${this.formatBytes(reclaimedBytes)}`);
80
250
  }
81
251
  /**
82
252
  * Handle base64ts output mode
@@ -174,8 +344,8 @@ export class CustomBundleHandler {
174
344
  /**
175
345
  * Run the custom bundle command
176
346
  */
177
- export async function runCustomBundles() {
178
- const handler = new CustomBundleHandler();
347
+ export async function runCustomBundles(cliOptionsArg = {}) {
348
+ const handler = new CustomBundleHandler(paths.cwd, cliOptionsArg);
179
349
  const hasConfig = await handler.loadConfig();
180
350
  if (!hasConfig) {
181
351
  return;
@@ -183,4 +353,4 @@ export async function runCustomBundles() {
183
353
  await handler.processAllBundles();
184
354
  console.log('\nCustom bundle processing complete!');
185
355
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY3VzdG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFeEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUM7QUFFeEMsTUFBTSxPQUFPLG1CQUFtQjtJQUN0QixHQUFHLENBQVM7SUFDWixNQUFNLENBQThCO0lBRTVDLFlBQVksTUFBYyxLQUFLLENBQUMsR0FBRztRQUNqQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUE2QixvQkFBb0IsRUFBRTtZQUMxRixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NB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
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY3VzdG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFeEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUM7QUFDeEMsTUFBTSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQztBQUN2RCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUM5QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQWdCakQsTUFBTSxPQUFPLG1CQUFtQjtJQUN0QixHQUFHLENBQVM7SUFDWixNQUFNLENBQThCO0lBQ3BDLFVBQVUsQ0FBcUM7SUFDL0Msb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXJDLFlBQVksTUFBYyxLQUFLLENBQUMsR0FBRyxFQUFFLGFBQWlELEVBQUU7UUFDdEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLElB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
@@ -24,11 +24,12 @@ export class HtmlHandler {
24
24
  .encoding('utf8')
25
25
  .read());
26
26
  if (options.minify) {
27
- fileString = plugins.htmlMinifier.minify(fileString, {
27
+ fileString = await plugins.htmlMinifier.minify(fileString, {
28
28
  minifyCSS: true,
29
29
  minifyJS: true,
30
30
  sortAttributes: true,
31
- sortClassName: true,
31
+ sortClassNames: true,
32
+ includeAutoGeneratedTags: true,
32
33
  removeAttributeQuotes: true,
33
34
  collapseWhitespace: true,
34
35
  collapseInlineTagWhitespace: true,
@@ -41,4 +42,4 @@ export class HtmlHandler {
41
42
  console.log(`html processing succeeded!`);
42
43
  }
43
44
  }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfaHRtbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLE9BQU8sV0FBVztJQUNmLGVBQWUsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDaEQsS0FBSyxDQUFDLE9BQU8sRUFDYixZQUFZLENBQ2IsQ0FBQztJQUNLLGFBQWEsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDOUMsS0FBSyxDQUFDLFlBQVksRUFDbEIsWUFBWSxDQUNiLENBQUM7SUFFSyxLQUFLLENBQUMsYUFBYTtRQUN4QixPQUFPLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxrQkFBa0I7SUFDWCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBSXhCO1FBQ0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDMUIsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ3RCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsR0FBRyxVQUFVO1NBQ2QsQ0FBQztRQUNGLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUkscUJBQXFCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDbkQsT0FBTyxDQUFDLElBQUksRUFDWixLQUFLLENBQUMsR0FBRyxDQUNBLENBQUM7UUFDWixPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDakQsT0FBTyxDQUFDLEVBQUUsRUFDVixLQUFLLENBQUMsR0FBRyxDQUNBLENBQUM7UUFDWixJQUFJLFVBQVUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEVBQUU7YUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDbEIsUUFBUSxDQUFDLE1BQU0sQ0FBQzthQUNoQixJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ25ELFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLGNBQWMsRUFBRSxJQUFJO2dCQUNwQixhQUFhLEVBQUUsSUFBSTtnQkFDbkIscUJBQXFCLEVBQUUsSUFBSTtnQkFDM0Isa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsMkJBQTJCLEVBQUUsSUFBSTtnQkFDakMsY0FBYyxFQUFFLElBQUk7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRiJ9
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfaHRtbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLE9BQU8sV0FBVztJQUNmLGVBQWUsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDaEQsS0FBSyxDQUFDLE9BQU8sRUFDYixZQUFZLENBQ2IsQ0FBQztJQUNLLGFBQWEsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDOUMsS0FBSyxDQUFDLFlBQVksRUFDbEIsWUFBWSxDQUNiLENBQUM7SUFFSyxLQUFLLENBQUMsYUFBYTtRQUN4QixPQUFPLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxrQkFBa0I7SUFDWCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBSXhCO1FBQ0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDMUIsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ3RCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsR0FBRyxVQUFVO1NBQ2QsQ0FBQztRQUNGLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUkscUJBQXFCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDbkQsT0FBTyxDQUFDLElBQUksRUFDWixLQUFLLENBQUMsR0FBRyxDQUNBLENBQUM7UUFDWixPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDakQsT0FBTyxDQUFDLEVBQUUsRUFDVixLQUFLLENBQUMsR0FBRyxDQUNBLENBQUM7UUFDWixJQUFJLFVBQVUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEVBQUU7YUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDbEIsUUFBUSxDQUFDLE1BQU0sQ0FBQzthQUNoQixJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDekQsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2dCQUNwQix3QkFBd0IsRUFBRSxJQUFJO2dCQUM5QixxQkFBcUIsRUFBRSxJQUFJO2dCQUMzQixrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QiwyQkFBMkIsRUFBRSxJQUFJO2dCQUNqQyxjQUFjLEVBQUUsSUFBSTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0MsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGIn0=
@@ -1,3 +1,3 @@
1
1
  export * from '../plugins.js';
2
- import * as htmlMinifier from 'html-minifier';
2
+ import * as htmlMinifier from 'html-minifier-next';
3
3
  export { htmlMinifier };
@@ -1,4 +1,4 @@
1
1
  export * from '../plugins.js';
2
- import * as htmlMinifier from 'html-minifier';
2
+ import * as htmlMinifier from 'html-minifier-next';
3
3
  export { htmlMinifier };
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9odG1sL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFFOUIsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7QUFFOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDIn0=
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9odG1sL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFFOUIsT0FBTyxLQUFLLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMifQ==
@@ -1,5 +1,8 @@
1
1
  import * as path from 'path';
2
- export { path };
2
+ import * as fsSync from 'node:fs';
3
+ import * as fsPromises from 'node:fs/promises';
4
+ import * as os from 'node:os';
5
+ export { fsPromises, fsSync, os, path };
3
6
  import * as smartconfig from '@push.rocks/smartconfig';
4
7
  import * as smartcli from '@push.rocks/smartcli';
5
8
  import * as smartfs from '@push.rocks/smartfs';
@@ -1,6 +1,9 @@
1
1
  // node native
2
2
  import * as path from 'path';
3
- export { path };
3
+ import * as fsSync from 'node:fs';
4
+ import * as fsPromises from 'node:fs/promises';
5
+ import * as os from 'node:os';
6
+ export { fsPromises, fsSync, os, path };
4
7
  // pushrocks scope
5
8
  import * as smartconfig from '@push.rocks/smartconfig';
6
9
  import * as smartcli from '@push.rocks/smartcli';
@@ -14,4 +17,4 @@ import * as smartspawn from '@push.rocks/smartspawn';
14
17
  export { smartconfig, smartcli, smartfs, smartinteract, smartlog, smartlogDestinationLocal, smartpath, smartpromise, smartspawn, };
15
18
  // Create a shared SmartFs instance using Node provider
16
19
  export const fs = new smartfs.SmartFs(new smartfs.SmartFsProviderNode());
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixrQkFBa0I7QUFDbEIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLFFBQVEsRUFDUixPQUFPLEVBQ1AsYUFBYSxFQUNiLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEdBQ1gsQ0FBQztBQUVGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyJ9
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0FBRXhDLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLHdCQUF3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFDTCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE9BQU8sRUFDUCxhQUFhLEVBQ2IsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsR0FDWCxDQUFDO0FBRUYsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDIn0=
@@ -15,6 +15,15 @@ export class TsBundle {
15
15
  return './mod_esbuild/index.child.js';
16
16
  }
17
17
  };
18
+ const moduleDir = plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url);
19
+ const childRelativePath = getBundlerPath();
20
+ let childPath = plugins.path.join(moduleDir, childRelativePath);
21
+ if (!plugins.fsSync.existsSync(childPath)) {
22
+ const distChildPath = plugins.path.join(moduleDir, '..', 'dist_ts', childRelativePath);
23
+ if (plugins.fsSync.existsSync(distChildPath)) {
24
+ childPath = distChildPath;
25
+ }
26
+ }
18
27
  const transportOptions = {
19
28
  cwd: cwdArg,
20
29
  from: fromArg,
@@ -24,7 +33,7 @@ export class TsBundle {
24
33
  ...argvArg,
25
34
  },
26
35
  };
27
- const threadsimple = new plugins.smartspawn.ThreadSimple(plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), getBundlerPath()), [], {
36
+ const threadsimple = new plugins.smartspawn.ThreadSimple(childPath, [], {
28
37
  env: {
29
38
  ...process.env,
30
39
  transportOptions: JSON.stringify(transportOptions),
@@ -42,4 +51,4 @@ export class TsBundle {
42
51
  await done.promise;
43
52
  }
44
53
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNidW5kbGUuY2xhc3MudHNidW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c2J1bmRsZS5jbGFzcy50c2J1bmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sUUFBUTtJQUNaLEtBQUssQ0FBQyxLQUFLLENBQ2hCLE1BQWMsRUFDZCxVQUFrQixtQkFBbUIsRUFDckMsUUFBZ0IseUJBQXlCLEVBQ3pDLE9BQStCO1FBRS9CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO1lBQzFCLFFBQVEsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixLQUFLLFVBQVU7b0JBQ2IsT0FBTywrQkFBK0IsQ0FBQztnQkFDekMsS0FBSyxRQUFRO29CQUNYLE9BQU8sNkJBQTZCLENBQUM7Z0JBQ3ZDLEtBQUssU0FBUyxDQUFDO2dCQUNmO29CQUNFLE9BQU8sOEJBQThCLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQW9DO1lBQ3hELEdBQUcsRUFBRSxNQUFNO1lBQ1gsSUFBSSxFQUFFLE9BQU87WUFDYixFQUFFLEVBQUUsS0FBSztZQUNULElBQUksRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzNELElBQUksRUFBRTtnQkFDSixHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDZixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUMvRCxjQUFjLEVBQUUsQ0FDakIsRUFDRCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztnQkFDZCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO2FBQ25EO1NBQ0YsQ0FDRixDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQyxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3JCLENBQUM7Q0FDRiJ9
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNidW5kbGUuY2xhc3MudHNidW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c2J1bmRsZS5jbGFzcy50c2J1bmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sUUFBUTtJQUNaLEtBQUssQ0FBQyxLQUFLLENBQ2hCLE1BQWMsRUFDZCxVQUFrQixtQkFBbUIsRUFDckMsUUFBZ0IseUJBQXlCLEVBQ3pDLE9BQStCO1FBRS9CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO1lBQzFCLFFBQVEsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixLQUFLLFVBQVU7b0JBQ2IsT0FBTywrQkFBK0IsQ0FBQztnQkFDekMsS0FBSyxRQUFRO29CQUNYLE9BQU8sNkJBQTZCLENBQUM7Z0JBQ3ZDLEtBQUssU0FBUyxDQUFDO2dCQUNmO29CQUNFLE9BQU8sOEJBQThCLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEYsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsU0FBUyxHQUFHLGFBQWEsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQW9DO1lBQ3hELEdBQUcsRUFBRSxNQUFNO1lBQ1gsSUFBSSxFQUFFLE9BQU87WUFDYixFQUFFLEVBQUUsS0FBSztZQUNULElBQUksRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzNELElBQUksRUFBRTtnQkFDSixHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUN0RCxTQUFTLEVBQ1QsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2QsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUNuRDtTQUNGLENBQ0YsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hELFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0NBQXNDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNyQixDQUFDO0NBQ0YifQ==
@@ -5,11 +5,11 @@ export const runCli = async () => {
5
5
  const tsBundleCli = new plugins.smartcli.Smartcli();
6
6
  // Default command: run custom bundles from .smartconfig.json
7
7
  tsBundleCli.standardCommand().subscribe(async (argvArg) => {
8
- await runCustomBundles();
8
+ await runCustomBundles(argvArg);
9
9
  });
10
10
  // Explicit custom command (same as default)
11
11
  tsBundleCli.addCommand('custom').subscribe(async (argvArg) => {
12
- await runCustomBundles();
12
+ await runCustomBundles(argvArg);
13
13
  });
14
14
  // Interactive init wizard
15
15
  tsBundleCli.addCommand('init').subscribe(async (argvArg) => {
@@ -17,4 +17,4 @@ export const runCli = async () => {
17
17
  });
18
18
  tsBundleCli.startParse();
19
19
  };
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNidW5kbGUuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHNidW5kbGUuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRXBELDZEQUE2RDtJQUM3RCxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4RCxNQUFNLGdCQUFnQixFQUFFLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCw0Q0FBNEM7SUFDNUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQzNELE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztJQUVILDBCQUEwQjtJQUMxQixXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDekQsTUFBTSxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMzQixDQUFDLENBQUMifQ==
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNidW5kbGUuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHNidW5kbGUuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRXBELDZEQUE2RDtJQUM3RCxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4RCxNQUFNLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRUgsNENBQTRDO0lBQzVDLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUMzRCxNQUFNLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRUgsMEJBQTBCO0lBQzFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN6RCxNQUFNLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzNCLENBQUMsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@git.zone/tsbundle",
3
- "version": "2.10.4",
3
+ "version": "2.11.1",
4
4
  "private": false,
5
5
  "description": "a multi-bundler tool supporting esbuild, rolldown, and rspack for painless bundling of web projects",
6
6
  "main": "dist_ts/index.js",
@@ -8,36 +8,31 @@
8
8
  "type": "module",
9
9
  "author": "Task Venture Capital GmbH",
10
10
  "license": "MIT",
11
- "scripts": {
12
- "test": "pnpm run build && (tstest test/ --verbose)",
13
- "build": "(tsbuild --web)",
14
- "buildDocs": "tsdoc"
15
- },
16
11
  "bin": {
17
12
  "tsbundle": "./cli.js"
18
13
  },
19
14
  "devDependencies": {
20
- "@git.zone/tsbuild": "^4.4.0",
21
- "@git.zone/tsrun": "^2.0.3",
22
- "@git.zone/tstest": "^3.6.5",
23
- "@types/node": "^25.6.2"
15
+ "@git.zone/tsbuild": "^4.4.2",
16
+ "@git.zone/tsrun": "^2.0.5",
17
+ "@git.zone/tstest": "^3.6.6",
18
+ "@types/node": "^26.1.0",
19
+ "lit": "^3.3.3"
24
20
  },
25
21
  "dependencies": {
26
22
  "@push.rocks/early": "^4.0.4",
27
- "@push.rocks/smartcli": "^4.0.21",
28
- "@push.rocks/smartconfig": "^6.1.1",
23
+ "@push.rocks/smartcli": "^4.3.0",
24
+ "@push.rocks/smartconfig": "^6.2.0",
29
25
  "@push.rocks/smartdelay": "^3.1.0",
30
- "@push.rocks/smartfs": "^1.5.1",
31
- "@push.rocks/smartinteract": "^2.0.16",
26
+ "@push.rocks/smartfs": "^1.6.0",
27
+ "@push.rocks/smartinteract": "^2.0.17",
32
28
  "@push.rocks/smartlog": "^3.2.2",
33
29
  "@push.rocks/smartlog-destination-local": "^9.0.2",
34
30
  "@push.rocks/smartpath": "^6.0.0",
35
31
  "@push.rocks/smartpromise": "^4.2.4",
36
32
  "@push.rocks/smartspawn": "^3.0.4",
37
- "@rspack/core": "^2.0.2",
38
- "@types/html-minifier": "^4.0.6",
39
- "esbuild": "^0.28.0",
40
- "html-minifier": "^4.0.0",
33
+ "@rspack/core": "^2.1.2",
34
+ "esbuild": "^0.28.1",
35
+ "html-minifier-next": "^5.2.2",
41
36
  "rolldown": "1.0.0",
42
37
  "typescript": "6.0.3"
43
38
  },
@@ -56,7 +51,6 @@
56
51
  "browserslist": [
57
52
  "last 1 chrome versions"
58
53
  ],
59
- "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977",
60
54
  "repository": {
61
55
  "type": "git",
62
56
  "url": "https://code.foss.global/git.zone/tsbundle.git"
@@ -64,5 +58,10 @@
64
58
  "bugs": {
65
59
  "url": "https://gitlab.com/gitzone/tsbundle/issues"
66
60
  },
67
- "homepage": "https://gitlab.com/gitzone/tsbundle#readme"
68
- }
61
+ "homepage": "https://gitlab.com/gitzone/tsbundle#readme",
62
+ "scripts": {
63
+ "test": "pnpm run build && (tstest test/ --verbose)",
64
+ "build": "(tsbuild --web)",
65
+ "buildDocs": "tsdoc"
66
+ }
67
+ }
package/readme.md CHANGED
@@ -48,6 +48,7 @@ Your bundles will be built according to your `.smartconfig.json` configuration.
48
48
  | Command | Description |
49
49
  |---------|-------------|
50
50
  | `tsbundle` | Build all bundles from `.smartconfig.json` configuration |
51
+ | `tsbundle --keep-temp` | Build all bundles and keep `.nogit/tsbundle-temp` for debugging |
51
52
  | `tsbundle custom` | Same as above (explicit) |
52
53
  | `tsbundle init` | Interactive wizard to create/update bundle configuration |
53
54
 
@@ -58,6 +59,7 @@ tsbundle uses `.smartconfig.json` for configuration. Here's an example:
58
59
  ```json
59
60
  {
60
61
  "@git.zone/tsbundle": {
62
+ "keepTemp": false,
61
63
  "bundles": [
62
64
  {
63
65
  "from": "./ts_web/index.ts",
@@ -89,6 +91,15 @@ tsbundle uses `.smartconfig.json` for configuration. Here's an example:
89
91
  | `production` | `boolean` | `false` | Enable minification |
90
92
  | `includeFiles` | `string[]` | `[]` | Glob patterns for additional files (HTML, assets) |
91
93
  | `maxLineLength` | `number` | `0` (unlimited) | For `base64ts` mode: max chars per line in output |
94
+ | `keepTemp` | `boolean` | `false` | Keep `.nogit/tsbundle-temp` after this bundle for debugging |
95
+
96
+ Top-level `keepTemp: true` keeps the temp workspace for all bundles. Per-bundle `keepTemp` only affects that bundle. `TSBUNDLE_KEEP_TEMP=true` and `--keep-temp` are supported for one-off debugging.
97
+
98
+ ### Temporary Workspace Cleanup
99
+
100
+ Custom bundle builds use `.nogit/tsbundle-temp` as an intermediate workspace. tsbundle writes `.gitzone-tool-cache.json` into tool-owned temp workspaces and removes marked temp data after successful output handling. On startup, stale marked temp workspaces are pruned so interrupted builds do not accumulate indefinitely.
101
+
102
+ If `.nogit/tsbundle-temp` already exists and is non-empty without a valid marker, tsbundle does not claim or delete the directory. It only removes the temp files created by the current build.
92
103
 
93
104
  ### Output Modes
94
105
 
@@ -193,7 +204,7 @@ Process multiple bundle configurations from `.smartconfig.json`:
193
204
  ```typescript
194
205
  import { CustomBundleHandler } from '@git.zone/tsbundle';
195
206
 
196
- const handler = new CustomBundleHandler(process.cwd());
207
+ const handler = new CustomBundleHandler(process.cwd(), { keepTemp: false });
197
208
  const hasConfig = await handler.loadConfig();
198
209
  if (hasConfig) {
199
210
  await handler.processAllBundles();
package/readme.plan.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # tsbundle Rolldown Integration Plan
2
2
 
3
- **Command to reread CLAUDE.md**: `cat ~/.claude/CLAUDE.md`
4
-
5
3
  ## Objective
6
4
 
7
5
  Add Rolldown as an optional bundler to tsbundle while keeping esbuild as the default bundler. This allows users to experiment with Rolldown using `--bundler=rolldown` flag.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsbundle',
6
- version: '2.10.4',
6
+ version: '2.11.1',
7
7
  description: 'a multi-bundler tool supporting esbuild, rolldown, and rspack for painless bundling of web projects'
8
8
  }
@@ -2,9 +2,15 @@ export interface ICliOptions {
2
2
  commonjs?: boolean;
3
3
  skiplibcheck?: boolean;
4
4
  production?: boolean;
5
+ keepTemp?: boolean;
5
6
  bundler: 'esbuild' | 'rolldown' | 'rspack';
6
7
  }
7
8
 
9
+ export interface ICustomBundleCliOptions {
10
+ keepTemp?: boolean;
11
+ 'keep-temp'?: boolean;
12
+ }
13
+
8
14
  export interface IEnvTransportOptions {
9
15
  cwd: string;
10
16
  from: string;
@@ -27,10 +33,12 @@ export interface IBundleConfig {
27
33
  production?: boolean;
28
34
  includeFiles?: TIncludeFile[];
29
35
  maxLineLength?: number; // For base64ts output: max chars per line. 0 or undefined = unlimited (default)
36
+ keepTemp?: boolean;
30
37
  }
31
38
 
32
39
  export interface ITsbundleConfig {
33
40
  bundles: IBundleConfig[];
41
+ keepTemp?: boolean;
34
42
  }
35
43
 
36
44
  export interface IBase64File {
@@ -6,13 +6,34 @@ import { HtmlHandler } from '../mod_html/index.js';
6
6
  import { Base64TsOutput } from '../mod_output/index.js';
7
7
 
8
8
  const TEMP_DIR = '.nogit/tsbundle-temp';
9
+ const toolCacheMarkerFile = '.gitzone-tool-cache.json';
10
+ const toolCacheOwner = '@git.zone/tsbundle';
11
+ const tempCacheKind = 'bundle-temp-workspace';
12
+ const staleTempThresholdMs = 24 * 60 * 60 * 1000;
13
+
14
+ interface IToolCacheMarker {
15
+ owner: string;
16
+ kind: string;
17
+ safeToPrune: boolean;
18
+ createdAt: string;
19
+ schemaVersion: 1;
20
+ }
21
+
22
+ interface ITempWorkspace {
23
+ tempDir: string;
24
+ canCleanupWorkspace: boolean;
25
+ cleanupOnFailure: boolean;
26
+ }
9
27
 
10
28
  export class CustomBundleHandler {
11
29
  private cwd: string;
12
30
  private config!: interfaces.ITsbundleConfig;
31
+ private cliOptions: interfaces.ICustomBundleCliOptions;
32
+ private didRunStartupCleanup = false;
13
33
 
14
- constructor(cwd: string = paths.cwd) {
34
+ constructor(cwd: string = paths.cwd, cliOptions: interfaces.ICustomBundleCliOptions = {}) {
15
35
  this.cwd = cwd;
36
+ this.cliOptions = cliOptions;
16
37
  }
17
38
 
18
39
  /**
@@ -38,6 +59,7 @@ export class CustomBundleHandler {
38
59
  * Process all configured bundles
39
60
  */
40
61
  public async processAllBundles(): Promise<void> {
62
+ await this.cleanupStaleTempWorkspace();
41
63
  for (let i = 0; i < this.config.bundles.length; i++) {
42
64
  const bundleConfig = this.config.bundles[i];
43
65
  console.log(`\nProcessing bundle ${i + 1}/${this.config.bundles.length}: ${bundleConfig.from} -> ${bundleConfig.to}`);
@@ -49,18 +71,17 @@ export class CustomBundleHandler {
49
71
  * Process a single bundle configuration
50
72
  */
51
73
  public async processSingleBundle(bundleConfig: interfaces.IBundleConfig): Promise<void> {
74
+ await this.cleanupStaleTempWorkspace();
52
75
  const outputMode = bundleConfig.outputMode || 'bundle';
53
76
  const bundler = bundleConfig.bundler || 'esbuild';
54
77
 
55
- // Determine temp output path
56
- const tempDir = plugins.path.join(this.cwd, TEMP_DIR);
78
+ const tempWorkspace = await this.prepareTempWorkspace();
79
+ const tempDir = tempWorkspace.tempDir;
57
80
  const tempBundlePath = plugins.path.join(tempDir, 'bundle.js');
58
81
 
59
- // Ensure temp directory exists
60
- await plugins.fs.directory(tempDir).create();
61
-
62
82
  // Build the bundle to temp location
63
83
  const tsbundle = new TsBundle();
84
+ let completedSuccessfully = false;
64
85
  try {
65
86
  await tsbundle.build(
66
87
  this.cwd,
@@ -71,28 +92,210 @@ export class CustomBundleHandler {
71
92
  production: bundleConfig.production || false,
72
93
  }
73
94
  );
95
+
96
+ if (outputMode === 'base64ts') {
97
+ await this.handleBase64TsOutput(bundleConfig, tempBundlePath);
98
+ } else {
99
+ await this.handleBundleOutput(bundleConfig, tempBundlePath);
100
+ }
101
+
102
+ completedSuccessfully = true;
74
103
  } catch (error: any) {
75
104
  console.error(`\n\x1b[31m❌ Bundle failed: ${bundleConfig.from} -> ${bundleConfig.to}\x1b[0m`);
76
105
  // Don't re-print error details - they were already shown by the child process
77
106
  return; // Skip output handling since build failed
107
+ } finally {
108
+ if (completedSuccessfully && tempWorkspace.canCleanupWorkspace && !this.shouldKeepTemp(bundleConfig)) {
109
+ await this.cleanupTempWorkspace('successful bundle', tempDir);
110
+ } else if (completedSuccessfully) {
111
+ console.log(`Keeping tsbundle temp workspace: ${tempDir}`);
112
+ } else if (tempWorkspace.cleanupOnFailure && !this.shouldKeepTemp(bundleConfig)) {
113
+ await this.cleanupTempWorkspace('failed bundle', tempDir);
114
+ }
78
115
  }
116
+ }
79
117
 
80
- if (outputMode === 'base64ts') {
81
- await this.handleBase64TsOutput(bundleConfig, tempBundlePath);
82
- } else {
83
- await this.handleBundleOutput(bundleConfig, tempBundlePath);
118
+ public async cleanupStaleTempWorkspace(thresholdMsArg = staleTempThresholdMs): Promise<boolean> {
119
+ if (this.didRunStartupCleanup) {
120
+ return false;
121
+ }
122
+ this.didRunStartupCleanup = true;
123
+
124
+ if (this.shouldKeepTemp()) {
125
+ return false;
126
+ }
127
+
128
+ const tempDir = this.getTempDir();
129
+ const marker = await this.readTempMarker(tempDir);
130
+ if (!marker) {
131
+ return false;
132
+ }
133
+
134
+ const createdAt = Date.parse(marker.createdAt);
135
+ if (Number.isFinite(createdAt) && Date.now() - createdAt < thresholdMsArg) {
136
+ return false;
137
+ }
138
+
139
+ await this.cleanupTempWorkspace('stale marked temp workspace');
140
+ return true;
141
+ }
142
+
143
+ private getTempDir(): string {
144
+ return plugins.path.join(this.cwd, TEMP_DIR);
145
+ }
146
+
147
+ private assertExpectedTempDir(tempDirArg: string): void {
148
+ const expected = plugins.path.resolve(this.cwd, TEMP_DIR);
149
+ const actual = plugins.path.resolve(tempDirArg);
150
+ if (actual !== expected) {
151
+ throw new Error(`Refusing to clean unexpected tsbundle temp path: ${tempDirArg}`);
152
+ }
153
+ }
154
+
155
+ private assertManagedTempDir(tempDirArg: string): void {
156
+ const expected = plugins.path.resolve(this.cwd, TEMP_DIR);
157
+ const actual = plugins.path.resolve(tempDirArg);
158
+ const osTempRoot = plugins.path.resolve(plugins.os.tmpdir());
159
+ const isIsolatedTemp = plugins.path.dirname(actual) === osTempRoot
160
+ && plugins.path.basename(actual).startsWith('tsbundle-temp-');
161
+ if (actual !== expected && !isIsolatedTemp) {
162
+ throw new Error(`Refusing to clean unexpected tsbundle temp path: ${tempDirArg}`);
163
+ }
164
+ }
165
+
166
+ private isTruthy(valueArg: unknown): boolean {
167
+ if (typeof valueArg === 'boolean') {
168
+ return valueArg;
169
+ }
170
+ if (typeof valueArg !== 'string') {
171
+ return false;
172
+ }
173
+ const normalized = valueArg.toLowerCase();
174
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'y';
175
+ }
176
+
177
+ private shouldKeepTemp(bundleConfigArg?: interfaces.IBundleConfig): boolean {
178
+ return this.isTruthy(process.env.TSBUNDLE_KEEP_TEMP)
179
+ || this.cliOptions.keepTemp === true
180
+ || this.cliOptions['keep-temp'] === true
181
+ || this.config?.keepTemp === true
182
+ || bundleConfigArg?.keepTemp === true;
183
+ }
184
+
185
+ private async prepareTempWorkspace(): Promise<ITempWorkspace> {
186
+ const tempDirArg = this.getTempDir();
187
+ this.assertExpectedTempDir(tempDirArg);
188
+ const marker = await this.readTempMarker(tempDirArg);
189
+ if (marker) {
190
+ return { tempDir: tempDirArg, canCleanupWorkspace: true, cleanupOnFailure: false };
191
+ }
192
+
193
+ let entries: string[] = [];
194
+ try {
195
+ entries = await plugins.fsPromises.readdir(tempDirArg);
196
+ } catch {
197
+ await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
84
198
  }
85
199
 
86
- // Clean up temp file
87
- const tempFileExists = await plugins.fs.file(tempBundlePath).exists();
88
- if (tempFileExists) {
89
- await plugins.fs.file(tempBundlePath).delete();
200
+ if (entries.length > 0) {
201
+ const isolatedTempDir = await this.createIsolatedTempWorkspace();
202
+ console.log(`tsbundle: leaving existing unmarked temp workspace untouched: ${tempDirArg}`);
203
+ console.log(`tsbundle: using isolated marked temp workspace: ${isolatedTempDir}`);
204
+ return { tempDir: isolatedTempDir, canCleanupWorkspace: true, cleanupOnFailure: true };
90
205
  }
91
- const tempSourceMapPath = `${tempBundlePath}.map`;
92
- const tempSourceMapExists = await plugins.fs.file(tempSourceMapPath).exists();
93
- if (tempSourceMapExists) {
94
- await plugins.fs.file(tempSourceMapPath).delete();
206
+
207
+ await this.writeTempMarker(tempDirArg);
208
+ return { tempDir: tempDirArg, canCleanupWorkspace: true, cleanupOnFailure: false };
209
+ }
210
+
211
+ private async createIsolatedTempWorkspace(): Promise<string> {
212
+ const tempDir = await plugins.fsPromises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'tsbundle-temp-'));
213
+ await this.writeTempMarker(tempDir);
214
+ return tempDir;
215
+ }
216
+
217
+ private async writeTempMarker(tempDirArg: string): Promise<void> {
218
+ this.assertManagedTempDir(tempDirArg);
219
+ const marker: IToolCacheMarker = {
220
+ owner: toolCacheOwner,
221
+ kind: tempCacheKind,
222
+ safeToPrune: true,
223
+ createdAt: new Date().toISOString(),
224
+ schemaVersion: 1,
225
+ };
226
+ await plugins.fsPromises.mkdir(tempDirArg, { recursive: true });
227
+ await plugins.fsPromises.writeFile(
228
+ plugins.path.join(tempDirArg, toolCacheMarkerFile),
229
+ `${JSON.stringify(marker, null, 2)}\n`,
230
+ );
231
+ }
232
+
233
+ private async readTempMarker(tempDirArg: string): Promise<IToolCacheMarker | undefined> {
234
+ this.assertManagedTempDir(tempDirArg);
235
+ try {
236
+ const markerRaw = await plugins.fsPromises.readFile(plugins.path.join(tempDirArg, toolCacheMarkerFile), 'utf8');
237
+ const marker = JSON.parse(markerRaw) as Partial<IToolCacheMarker>;
238
+ if (
239
+ marker.owner === toolCacheOwner &&
240
+ marker.kind === tempCacheKind &&
241
+ marker.safeToPrune === true &&
242
+ marker.schemaVersion === 1
243
+ ) {
244
+ return marker as IToolCacheMarker;
245
+ }
246
+ } catch {
247
+ return undefined;
248
+ }
249
+
250
+ return undefined;
251
+ }
252
+
253
+ private async getDirectorySize(pathArg: string): Promise<number> {
254
+ let total = 0;
255
+ let entries;
256
+ try {
257
+ entries = await plugins.fsPromises.readdir(pathArg, { withFileTypes: true });
258
+ } catch {
259
+ return 0;
260
+ }
261
+
262
+ for (const entry of entries) {
263
+ const entryPath = plugins.path.join(pathArg, entry.name);
264
+ if (entry.isDirectory()) {
265
+ total += await this.getDirectorySize(entryPath);
266
+ } else if (entry.isFile()) {
267
+ try {
268
+ total += (await plugins.fsPromises.stat(entryPath)).size;
269
+ } catch {
270
+ // Ignore files that disappear while cleanup is inspecting the tree.
271
+ }
272
+ }
273
+ }
274
+
275
+ return total;
276
+ }
277
+
278
+ private formatBytes(bytesArg: number): string {
279
+ const units = ['B', 'KiB', 'MiB', 'GiB', 'TiB'];
280
+ let value = bytesArg;
281
+ let unitIndex = 0;
282
+ while (value >= 1024 && unitIndex < units.length - 1) {
283
+ value = value / 1024;
284
+ unitIndex++;
285
+ }
286
+ const decimals = unitIndex === 0 || value >= 100 ? 0 : value >= 10 ? 1 : 2;
287
+ return `${value.toFixed(decimals)} ${units[unitIndex]}`;
288
+ }
289
+
290
+ private async cleanupTempWorkspace(reasonArg: string, tempDir = this.getTempDir()): Promise<void> {
291
+ this.assertManagedTempDir(tempDir);
292
+ const marker = await this.readTempMarker(tempDir);
293
+ if (!marker) {
294
+ return;
95
295
  }
296
+ const reclaimedBytes = await this.getDirectorySize(tempDir);
297
+ await plugins.fsPromises.rm(tempDir, { recursive: true, force: true });
298
+ console.log(`Cleaned tsbundle temp workspace after ${reasonArg}, reclaimed ${this.formatBytes(reclaimedBytes)}`);
96
299
  }
97
300
 
98
301
  /**
@@ -207,8 +410,8 @@ export class CustomBundleHandler {
207
410
  /**
208
411
  * Run the custom bundle command
209
412
  */
210
- export async function runCustomBundles(): Promise<void> {
211
- const handler = new CustomBundleHandler();
413
+ export async function runCustomBundles(cliOptionsArg: interfaces.ICustomBundleCliOptions = {}): Promise<void> {
414
+ const handler = new CustomBundleHandler(paths.cwd, cliOptionsArg);
212
415
  const hasConfig = await handler.loadConfig();
213
416
 
214
417
  if (!hasConfig) {
@@ -43,11 +43,12 @@ export class HtmlHandler {
43
43
  .encoding('utf8')
44
44
  .read()) as string;
45
45
  if (options.minify) {
46
- fileString = plugins.htmlMinifier.minify(fileString, {
46
+ fileString = await plugins.htmlMinifier.minify(fileString, {
47
47
  minifyCSS: true,
48
48
  minifyJS: true,
49
49
  sortAttributes: true,
50
- sortClassName: true,
50
+ sortClassNames: true,
51
+ includeAutoGeneratedTags: true,
51
52
  removeAttributeQuotes: true,
52
53
  collapseWhitespace: true,
53
54
  collapseInlineTagWhitespace: true,
@@ -1,5 +1,5 @@
1
1
  export * from '../plugins.js';
2
2
 
3
- import * as htmlMinifier from 'html-minifier';
3
+ import * as htmlMinifier from 'html-minifier-next';
4
4
 
5
5
  export { htmlMinifier };
package/ts/plugins.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  // node native
2
2
  import * as path from 'path';
3
+ import * as fsSync from 'node:fs';
4
+ import * as fsPromises from 'node:fs/promises';
5
+ import * as os from 'node:os';
3
6
 
4
- export { path };
7
+ export { fsPromises, fsSync, os, path };
5
8
 
6
9
  // pushrocks scope
7
10
  import * as smartconfig from '@push.rocks/smartconfig';
@@ -21,6 +21,15 @@ export class TsBundle {
21
21
  return './mod_esbuild/index.child.js';
22
22
  }
23
23
  };
24
+ const moduleDir = plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url);
25
+ const childRelativePath = getBundlerPath();
26
+ let childPath = plugins.path.join(moduleDir, childRelativePath);
27
+ if (!plugins.fsSync.existsSync(childPath)) {
28
+ const distChildPath = plugins.path.join(moduleDir, '..', 'dist_ts', childRelativePath);
29
+ if (plugins.fsSync.existsSync(distChildPath)) {
30
+ childPath = distChildPath;
31
+ }
32
+ }
24
33
  const transportOptions: interfaces.IEnvTransportOptions = {
25
34
  cwd: cwdArg,
26
35
  from: fromArg,
@@ -31,10 +40,7 @@ export class TsBundle {
31
40
  },
32
41
  };
33
42
  const threadsimple = new plugins.smartspawn.ThreadSimple(
34
- plugins.path.join(
35
- plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
36
- getBundlerPath(),
37
- ),
43
+ childPath,
38
44
  [],
39
45
  {
40
46
  env: {
@@ -7,12 +7,12 @@ export const runCli = async () => {
7
7
 
8
8
  // Default command: run custom bundles from .smartconfig.json
9
9
  tsBundleCli.standardCommand().subscribe(async (argvArg) => {
10
- await runCustomBundles();
10
+ await runCustomBundles(argvArg);
11
11
  });
12
12
 
13
13
  // Explicit custom command (same as default)
14
14
  tsBundleCli.addCommand('custom').subscribe(async (argvArg) => {
15
- await runCustomBundles();
15
+ await runCustomBundles(argvArg);
16
16
  });
17
17
 
18
18
  // Interactive init wizard