@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 +18 -5
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/interfaces/index.d.ts +7 -0
- package/dist_ts/mod_custom/index.d.ts +17 -2
- package/dist_ts/mod_custom/index.js +190 -20
- package/dist_ts/mod_html/index.js +4 -3
- package/dist_ts/mod_html/plugins.d.ts +1 -1
- package/dist_ts/mod_html/plugins.js +2 -2
- package/dist_ts/plugins.d.ts +4 -1
- package/dist_ts/plugins.js +5 -2
- package/dist_ts/tsbundle.class.tsbundle.js +11 -2
- package/dist_ts/tsbundle.cli.js +3 -3
- package/package.json +20 -21
- package/readme.md +12 -1
- package/readme.plan.md +0 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/interfaces/index.ts +8 -0
- package/ts/mod_custom/index.ts +223 -20
- package/ts/mod_html/index.ts +3 -2
- package/ts/mod_html/plugins.ts +1 -1
- package/ts/plugins.ts +4 -1
- package/ts/tsbundle.class.tsbundle.ts +10 -4
- package/ts/tsbundle.cli.ts +2 -2
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
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
const tempDir =
|
|
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
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY3VzdG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFeEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUM7QUFDeEMsTUFBTSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQztBQUN2RCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUM5QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQWdCakQsTUFBTSxPQUFPLG1CQUFtQjtJQUN0QixHQUFHLENBQVM7SUFDWixNQUFNLENBQThCO0lBQ3BDLFVBQVUsQ0FBcUM7SUFDL0Msb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXJDLFlBQVksTUFBYyxLQUFLLENBQUMsR0FBRyxFQUFFLGFBQWlELEVBQUU7UUFDdEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUE2QixvQkFBb0IsRUFBRTtZQUMxRixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNsRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGlCQUFpQjtRQUM1QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsSUFBSSxPQUFPLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RILE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBc0M7UUFDckUsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQztRQUVsRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFDdEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRS9ELG9DQUFvQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUkscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FDbEIsSUFBSSxDQUFDLEdBQUcsRUFDUixZQUFZLENBQUMsSUFBSSxFQUNqQixjQUFjLEVBQ2Q7Z0JBQ0UsT0FBTztnQkFDUCxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLO2FBQzdDLENBQ0YsQ0FBQztZQUVGLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDaEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBRUQscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLFlBQVksQ0FBQyxJQUFJLE9BQU8sWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUYsOEVBQThFO1lBQzlFLE9BQU8sQ0FBQywwQ0FBMEM7UUFDcEQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxxQkFBcUIsSUFBSSxhQUFhLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hFLENBQUM7aUJBQU0sSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzdELENBQUM7aUJBQU0sSUFBSSxhQUFhLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hGLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMseUJBQXlCLENBQUMsY0FBYyxHQUFHLG9CQUFvQjtRQUMxRSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFVBQWtCO1FBQzlDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFVBQWtCO1FBQzdDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVU7ZUFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEUsSUFBSSxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUVPLFFBQVEsQ0FBQyxRQUFpQjtRQUNoQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLE1BQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxJQUFJLFVBQVUsS0FBSyxHQUFHLENBQUM7SUFDbkcsQ0FBQztJQUVPLGNBQWMsQ0FBQyxlQUEwQztRQUMvRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztlQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxJQUFJO2VBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSTtlQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsS0FBSyxJQUFJO2VBQzlCLGVBQWUsRUFBRSxRQUFRLEtBQUssSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDckYsQ0FBQztRQUVELElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpRUFBaUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUMzRixPQUFPLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6RixDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNyRixDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQjtRQUN2QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFrQjtRQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQXFCO1lBQy9CLEtBQUssRUFBRSxjQUFjO1lBQ3JCLElBQUksRUFBRSxhQUFhO1lBQ25CLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxhQUFhLEVBQUUsQ0FBQztTQUNqQixDQUFDO1FBQ0YsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsRUFDbEQsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQWtCO1FBQzdDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUE4QixDQUFDO1lBQ2xFLElBQ0UsTUFBTSxDQUFDLEtBQUssS0FBSyxjQUFjO2dCQUMvQixNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWE7Z0JBQzdCLE1BQU0sQ0FBQyxXQUFXLEtBQUssSUFBSTtnQkFDM0IsTUFBTSxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQzFCLENBQUM7Z0JBQ0QsT0FBTyxNQUEwQixDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBZTtRQUM1QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksQ0FBQztZQUNILE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDO29CQUNILEtBQUssSUFBSSxDQUFDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzNELENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLG9FQUFvRTtnQkFDdEUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sV0FBVyxDQUFDLFFBQWdCO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUNyQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JELEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLFNBQVMsRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQWlCLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDL0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RSxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxTQUFTLGVBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLG9CQUFvQixDQUNoQyxZQUFzQyxFQUN0QyxjQUFzQjtRQUV0QixNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEQsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFakQscUJBQXFCO1FBQ3JCLElBQUksWUFBWSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQzlCLFlBQXNDLEVBQ3RDLGNBQXNCO1FBRXRCLG1DQUFtQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFXLENBQUM7UUFDM0YsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUUzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25FLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJELHFDQUFxQztRQUNyQyxJQUFJLFlBQVksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUvQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQy9ELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsU0FBaUI7UUFDaEUsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFXLENBQUM7UUFDNUYsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0QsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3BELE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLE9BQU8sQ0FBQztZQUNaLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25FLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDakQsOENBQThDO29CQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUM1QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUMvRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2pGLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDcEUsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxZQUFZLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RCxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsT0FBTyxPQUFPLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxnQkFBb0QsRUFBRTtJQUMzRixNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFN0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUN0RCxDQUFDIn0=
|
|
@@ -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
|
-
|
|
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,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfaHRtbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLE9BQU8sV0FBVztJQUNmLGVBQWUsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDaEQsS0FBSyxDQUFDLE9BQU8sRUFDYixZQUFZLENBQ2IsQ0FBQztJQUNLLGFBQWEsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDOUMsS0FBSyxDQUFDLFlBQVksRUFDbEIsWUFBWSxDQUNiLENBQUM7SUFFSyxLQUFLLENBQUMsYUFBYTtRQUN4QixPQUFPLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxrQkFBa0I7SUFDWCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBSXhCO1FBQ0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDMUIsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ3RCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsR0FBRyxVQUFVO1NBQ2QsQ0FBQztRQUNGLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUkscUJBQXFCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDbkQsT0FBTyxDQUFDLElBQUksRUFDWixLQUFLLENBQUMsR0FBRyxDQUNBLENBQUM7UUFDWixPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDakQsT0FBTyxDQUFDLEVBQUUsRUFDVixLQUFLLENBQUMsR0FBRyxDQUNBLENBQUM7UUFDWixJQUFJLFVBQVUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEVBQUU7YUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDbEIsUUFBUSxDQUFDLE1BQU0sQ0FBQzthQUNoQixJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDekQsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2dCQUNwQix3QkFBd0IsRUFBRSxJQUFJO2dCQUM5QixxQkFBcUIsRUFBRSxJQUFJO2dCQUMzQixrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QiwyQkFBMkIsRUFBRSxJQUFJO2dCQUNqQyxjQUFjLEVBQUUsSUFBSTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0MsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGIn0=
|
|
@@ -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,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9odG1sL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFFOUIsT0FBTyxLQUFLLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMifQ==
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
|
-
|
|
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';
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// node native
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
|
|
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,
|
|
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(
|
|
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,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNidW5kbGUuY2xhc3MudHNidW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c2J1bmRsZS5jbGFzcy50c2J1bmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sUUFBUTtJQUNaLEtBQUssQ0FBQyxLQUFLLENBQ2hCLE1BQWMsRUFDZCxVQUFrQixtQkFBbUIsRUFDckMsUUFBZ0IseUJBQXlCLEVBQ3pDLE9BQStCO1FBRS9CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO1lBQzFCLFFBQVEsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixLQUFLLFVBQVU7b0JBQ2IsT0FBTywrQkFBK0IsQ0FBQztnQkFDekMsS0FBSyxRQUFRO29CQUNYLE9BQU8sNkJBQTZCLENBQUM7Z0JBQ3ZDLEtBQUssU0FBUyxDQUFDO2dCQUNmO29CQUNFLE9BQU8sOEJBQThCLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEYsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsU0FBUyxHQUFHLGFBQWEsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQW9DO1lBQ3hELEdBQUcsRUFBRSxNQUFNO1lBQ1gsSUFBSSxFQUFFLE9BQU87WUFDYixFQUFFLEVBQUUsS0FBSztZQUNULElBQUksRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzNELElBQUksRUFBRTtnQkFDSixHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUN0RCxTQUFTLEVBQ1QsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2QsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUNuRDtTQUNGLENBQ0YsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hELFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0NBQXNDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNyQixDQUFDO0NBQ0YifQ==
|
package/dist_ts/tsbundle.cli.js
CHANGED
|
@@ -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,
|
|
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.
|
|
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.
|
|
21
|
-
"@git.zone/tsrun": "^2.0.
|
|
22
|
-
"@git.zone/tstest": "^3.6.
|
|
23
|
-
"@types/node": "^
|
|
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
|
|
28
|
-
"@push.rocks/smartconfig": "^6.
|
|
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.
|
|
31
|
-
"@push.rocks/smartinteract": "^2.0.
|
|
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.
|
|
38
|
-
"
|
|
39
|
-
"
|
|
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.
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/interfaces/index.ts
CHANGED
|
@@ -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 {
|
package/ts/mod_custom/index.ts
CHANGED
|
@@ -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
|
-
|
|
56
|
-
const tempDir =
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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) {
|
package/ts/mod_html/index.ts
CHANGED
|
@@ -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
|
-
|
|
50
|
+
sortClassNames: true,
|
|
51
|
+
includeAutoGeneratedTags: true,
|
|
51
52
|
removeAttributeQuotes: true,
|
|
52
53
|
collapseWhitespace: true,
|
|
53
54
|
collapseInlineTagWhitespace: true,
|
package/ts/mod_html/plugins.ts
CHANGED
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
|
-
|
|
35
|
-
plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
|
|
36
|
-
getBundlerPath(),
|
|
37
|
-
),
|
|
43
|
+
childPath,
|
|
38
44
|
[],
|
|
39
45
|
{
|
|
40
46
|
env: {
|
package/ts/tsbundle.cli.ts
CHANGED
|
@@ -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
|