Compare commits

...

15 Commits

15 changed files with 3151 additions and 1608 deletions

View File

@ -1,5 +1,39 @@
# Changelog
## 2025-06-19 - 2.4.0 - feat(bundler)
Introduce rspack bundler support and update multi-bundler workflow
- Added full support for rspack with its own implementation in ts/mod_rspack
- Updated package.json: new dependency on @rspack/core and revised description
- Refactored bundler types and switch statement to remove deprecated rollup and parcel options
- Modified test suite to include tests for esbuild, rolldown, and rspack with bundle size comparisons
- Adjusted output configuration for esbuild and rolldown for dynamic naming and inline dynamic imports
## 2025-06-19 - 2.3.0 - feat(bundler)
Integrate rolldown bundler support and update bundler selection logic
- Added rolldown dependency to package.json
- Extended ICliOptions to include 'rolldown' as a valid bundler option
- Created ts/mod_rolldown module with buildTest and buildProduction implementations
- Updated getBundlerPath in tsbundle.class.tsbundle.ts to route to new rolldown module
- Revised readme and hints documentation for rolldown usage
## 2025-01-29 - 2.2.5 - fix(mod_assets)
Fix async handling in asset processing
- Ensured that the empty directory operation is awaited in the asset processing workflow.
## 2025-01-29 - 2.2.4 - fix(mod_assets)
Fix logging message in ensureAssetsDir to correctly state when directory is created
- Corrected logging output in ensureAssetsDir method to indicate directory creation.
## 2025-01-29 - 2.2.3 - fix(mod_assets)
Fix issue with asset directory copy
- Updated dependency '@push.rocks/smartfile' to version '^11.2.0'
- Ensure target directory is properly replaced when copying assets
## 2025-01-29 - 2.2.2 - fix(dependencies)
Update smartfile dependency and fix spacing issue in assets module

View File

@ -1,41 +1,43 @@
{
"name": "@git.zone/tsbundle",
"version": "2.2.2",
"version": "2.4.0",
"private": false,
"description": "a bundler using rollup for painless bundling of web projects",
"description": "a multi-bundler tool supporting esbuild, rolldown, and rspack for painless bundling of web projects",
"main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts",
"type": "module",
"author": "Lossless GmbH",
"license": "MIT",
"scripts": {
"test": "npm run build && (tstest test/) && (cd test && node ../cli.js --production)",
"test": "npm run build && (tstest test/ --verbose)",
"build": "(tsbuild --web --allowimplicitany)"
},
"bin": {
"tsbundle": "cli.js"
},
"devDependencies": {
"@git.zone/tsbuild": "^2.2.1",
"@git.zone/tsbuild": "^2.6.4",
"@git.zone/tsrun": "^1.3.3",
"@git.zone/tstest": "^1.0.96",
"@push.rocks/tapbundle": "^5.5.6",
"@git.zone/tstest": "^2.3.1",
"@push.rocks/tapbundle": "^6.0.3",
"@types/node": "^22.12.0"
},
"dependencies": {
"@push.rocks/early": "^4.0.4",
"@push.rocks/smartcli": "^4.0.11",
"@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartfile": "^11.1.8",
"@push.rocks/smartlog": "^3.0.7",
"@push.rocks/smartfile": "^11.2.5",
"@push.rocks/smartlog": "^3.1.8",
"@push.rocks/smartlog-destination-local": "^9.0.2",
"@push.rocks/smartpath": "^5.0.18",
"@push.rocks/smartpromise": "^4.2.2",
"@push.rocks/smartpromise": "^4.2.3",
"@push.rocks/smartspawn": "^3.0.3",
"@types/html-minifier": "^4.0.5",
"esbuild": "^0.24.2",
"esbuild": "^0.25.5",
"html-minifier": "^4.0.0",
"typescript": "5.7.3"
"rolldown": "^1.0.0-beta.18",
"@rspack/core": "^1.1.8",
"typescript": "5.8.3"
},
"files": [
"ts/**/*",
@ -51,5 +53,6 @@
],
"browserslist": [
"last 1 chrome versions"
]
],
"packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977"
}

4037
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,49 @@
# tsbundle Hints and Findings
## Bundler Architecture
- tsbundle uses a child process architecture where each bundler runs in a separate process
- Configuration is passed via environment variables as JSON (IEnvTransportOptions)
- The main class `TsBundle` spawns child processes using `smartspawn.ThreadSimple`
## Bundler Implementations
- **esbuild** (default): Fully implemented, production ready, 2.2K minified
- **rolldown**: Implemented and working (beta), produces smallest bundles (1.5K minified)
- **rspack**: Implemented and working, webpack-compatible API, 6.1K minified
- **rollup**: Removed (was never implemented)
- **parcel**: Removed (was never implemented)
## Adding New Bundlers
To add a new bundler, you need:
1. Update `ICliOptions` interface to include the bundler name
2. Add case in `getBundlerPath()` switch statement
3. Create `mod_<bundler>/` directory with:
- `plugins.ts`: Import and re-export the bundler
- `index.child.ts`: Implement TsBundleProcess class with buildTest() and buildProduction()
4. Add bundler to package.json dependencies
## Rolldown Specific Notes
- Rolldown is in beta (v1.0.0-beta.18) but working well
- API: Use `rolldown()` function directly, not `rolldown.rolldown()`
- Output options go in the `write()` method, not the initial config
- Uses `dir` and `entryFileNames` instead of `file` for output (handles dynamic imports)
- Includes `inlineDynamicImports: true` to avoid chunk splitting issues
- Produces smaller minified bundles than esbuild (1.5K vs 2.2K in tests)
- Supports TypeScript via `resolve.tsconfigFilename`
## Rspack Specific Notes
- Rspack v1.3.15 - stable and production ready
- Uses webpack-compatible API (callback-based)
- Built-in SWC loader for TypeScript transpilation
- Produces larger bundles than esbuild/rolldown due to webpack runtime overhead
- Best choice if you need webpack compatibility or advanced features
- Supports ES modules output via `experiments.outputModule: true`
## CLI Usage
- Default bundler: `tsbundle` (uses esbuild)
- Specify bundler: `tsbundle --bundler=rolldown` or `tsbundle --bundler=rspack`
- Production mode: `tsbundle --production`
- Combined: `tsbundle --bundler=rolldown --production`
## Known Issues
- esbuild recently had splitting and tree-shaking disabled due to issues
- The README still mentions "a bundler using rollup" but uses esbuild by default

112
readme.plan.md Normal file
View File

@ -0,0 +1,112 @@
# tsbundle Rolldown Integration Plan
**Command to reread CLAUDE.md**: `cat ~/.claude/CLAUDE.md`
## Objective
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.
## Current State
- tsbundle currently only uses esbuild despite having interfaces for multiple bundlers
- The bundler selection logic exists but always returns esbuild
- mod_rollup and mod_parcel directories exist but are empty
- Recent commits disabled splitting and tree-shaking in esbuild due to issues
## Implementation Tasks
### Phase 1: Core Infrastructure
- [x] Update `ts/interfaces/index.ts` to include 'rolldown' in bundler union type
- [x] Fix `getBundlerPath()` in `ts/tsbundle.class.tsbundle.ts` to properly route bundlers
- [x] Remove hardcoded `bundler: 'esbuild'` from transportOptions (line 26)
- [x] Add rolldown dependency to package.json: `"rolldown": "^1.0.0-beta.18"`
### Phase 2: CLI Support
- [x] Check if `ts/tsbundle.cli.ts` already parses --bundler option
- [x] Ensure default bundler is 'esbuild' when not specified
- [x] Verify CLI passes bundler option correctly to TsBundle class
### Phase 3: Rolldown Module Implementation
- [x] Create `ts/mod_rolldown/` directory
- [x] Create `ts/mod_rolldown/plugins.ts`:
```typescript
export * from '../plugins.js';
import { rolldown } from 'rolldown';
export { rolldown }
```
- [x] Create `ts/mod_rolldown/index.child.ts` with:
- TsBundleProcess class
- getAliases() method for tsconfig path resolution
- buildTest() method (sourcemaps, no minification)
- buildProduction() method (minified output)
- run() function to read transportOptions and execute
### Phase 4: Feature Parity
- [x] Implement TypeScript compilation via rolldown
- [x] Ensure source map generation works
- [x] Support tsconfig path aliases
- [x] Match esbuild's ESM output format
- [x] Implement minification for production builds
- [x] Handle bundle: true behavior
### Phase 5: Testing
- [x] Test default behavior (should use esbuild)
- [x] Test `--bundler=esbuild` explicit selection
- [x] Test `--bundler=rolldown` selection
- [x] Compare output between esbuild and rolldown
- [ ] Verify all existing tests pass with both bundlers
## Technical Specifications
### Rolldown Configuration Mapping
| esbuild option | rolldown equivalent |
|----------------|-------------------|
| bundle: true | bundle: true |
| sourcemap: true | sourcemap: true |
| format: 'esm' | format: 'es' |
| target: 'es2022' | (use default, no direct equivalent) |
| minify: true | minify: true |
| entryPoints | input |
| outfile | output.file |
| tsconfig | resolve.tsconfigFilename |
| alias | resolve.alias |
### CLI Usage
```bash
# Default (uses esbuild)
tsbundle
# Use rolldown
tsbundle --bundler=rolldown
# Production build with rolldown
tsbundle --production --bundler=rolldown
```
## Risks and Mitigation
1. **Rolldown is beta** - Keep esbuild as default, mark rolldown as experimental
2. **API differences** - Abstract common interface, handle bundler-specific logic
3. **Missing features** - Document any limitations in README
4. **Breaking changes** - None, as esbuild remains default
## Success Criteria
- [x] Can build with esbuild (default behavior unchanged)
- [x] Can build with rolldown via --bundler flag
- [x] Both bundlers produce working ESM output
- [x] Source maps work with both bundlers
- [x] TypeScript compilation works with both
- [ ] All existing tests pass
## Implementation Status
**COMPLETED** - Rolldown has been successfully integrated as an optional bundler.
### Test Results:
- esbuild (default): Working correctly, 2.2K minified
- rolldown: Working correctly, 1.5K minified (better compression!)
- Both bundlers support all required features
- CLI properly routes to selected bundler
- Production and test modes work for both
## Future Considerations
- Once Rolldown reaches v1.0.0 stable, consider making it default
- Implement rollup and parcel modules using same pattern
- Add performance benchmarks comparing bundlers
- Consider adding --watch mode support

View File

@ -1,17 +1,108 @@
import { expect, tap } from '@push.rocks/tapbundle';
import * as tsbundle from '../ts/index.js';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as tsbundle from '../dist_ts/index.js';
import * as path from 'path';
import * as fs from 'fs';
const testBundler = async (bundlerName: 'esbuild' | 'rolldown' | 'rspack', mode: 'test' | 'production') => {
const outputFile = `./dist_manual/${bundlerName}-${mode}.js`;
const testDir = path.join(process.cwd(), 'test');
// Clean up output directory
const outputDir = path.join(testDir, 'dist_manual');
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
// Clean up output file if exists
const outputPath = path.join(testDir, outputFile);
if (fs.existsSync(outputPath)) {
fs.rmSync(outputPath, { force: true });
}
tap.test('should bundle with esbuild', async () => {
const tsbundleInstance = new tsbundle.TsBundle();
await tsbundleInstance.build(
process.cwd() + '/test',
testDir,
'./ts_web/index.ts',
'./dist_manual/test.js',
outputFile,
{
bundler: 'esbuild'
bundler: bundlerName,
production: mode === 'production'
}
);
// Verify output file was created
expect(fs.existsSync(outputPath)).toBeTrue();
console.log(`${bundlerName} ${mode} mode: success`);
};
// Test esbuild
tap.test('should bundle with esbuild in test mode', async () => {
await testBundler('esbuild', 'test');
});
tap.test('should bundle with esbuild in production mode', async () => {
await testBundler('esbuild', 'production');
});
// Test rolldown
tap.test('should bundle with rolldown in test mode', async () => {
await testBundler('rolldown', 'test');
});
tap.test('should bundle with rolldown in production mode', async () => {
await testBundler('rolldown', 'production');
});
// Test rspack
tap.test('should bundle with rspack in test mode', async () => {
await testBundler('rspack', 'test');
});
tap.test('should bundle with rspack in production mode', async () => {
await testBundler('rspack', 'production');
});
// Test size comparison
tap.test('should show bundle size comparison', async () => {
const testDir = path.join(process.cwd(), 'test');
const sizes: Record<string, { test: number; production: number }> = {
esbuild: { test: 0, production: 0 },
rolldown: { test: 0, production: 0 },
rspack: { test: 0, production: 0 }
};
for (const bundler of ['esbuild', 'rolldown', 'rspack'] as const) {
for (const mode of ['test', 'production'] as const) {
const filePath = path.join(testDir, `dist_manual/${bundler}-${mode}.js`);
if (fs.existsSync(filePath)) {
const stats = fs.statSync(filePath);
sizes[bundler][mode] = stats.size;
}
}
}
console.log('\n📊 Bundle Size Comparison:');
console.log('┌─────────────┬────────────┬──────────────┐');
console.log('│ Bundler │ Test Mode │ Production │');
console.log('├─────────────┼────────────┼──────────────┤');
for (const bundler of ['esbuild', 'rolldown', 'rspack'] as const) {
const testSize = (sizes[bundler].test / 1024).toFixed(1) + ' KB';
const prodSize = (sizes[bundler].production / 1024).toFixed(1) + ' KB';
console.log(`${bundler.padEnd(11)}${testSize.padEnd(10)}${prodSize.padEnd(12)}`);
}
console.log('└─────────────┴────────────┴──────────────┘');
// Verify all sizes are reasonable
for (const bundler of ['esbuild', 'rolldown', 'rspack'] as const) {
expect(sizes[bundler].test).toBeGreaterThan(0);
expect(sizes[bundler].production).toBeGreaterThan(0);
// Production bundles should generally be smaller due to minification
// but rspack might be larger due to runtime overhead
if (bundler !== 'rspack') {
expect(sizes[bundler].production).toBeLessThan(sizes[bundler].test);
}
}
});
tap.start();

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@git.zone/tsbundle',
version: '2.2.2',
description: 'a bundler using rollup for painless bundling of web projects'
version: '2.4.0',
description: 'a multi-bundler tool supporting esbuild, rolldown, and rspack for painless bundling of web projects'
}

View File

@ -2,7 +2,7 @@ export interface ICliOptions {
commonjs?: boolean;
skiplibcheck?: boolean;
production?: boolean;
bundler: 'parcel' | 'esbuild' | 'rollup'
bundler: 'esbuild' | 'rolldown' | 'rspack'
}
export interface IEnvTransportOptions {

View File

@ -8,8 +8,8 @@ export class AssetsHandler {
public async ensureAssetsDir() {
const assetsDirExists = await plugins.smartfile.fs.isDirectory(this.defaultFromDirPath);
if (!assetsDirExists) {
console.log(`creating assets directory at ${this.defaultFromDirPath}`);
await plugins.smartfile.fs.ensureDir(this.defaultFromDirPath);
console.log(`created assets directory at ${this.defaultFromDirPath}`);
}
}
@ -31,8 +31,10 @@ export class AssetsHandler {
optionsArg.to = plugins.smartpath.transform.toAbsolute(optionsArg.to, paths.cwd) as string;
// lets clean theh target directory
plugins.smartfile.fs.ensureEmptyDir(optionsArg.to);
await plugins.smartfile.fs.ensureEmptyDir(optionsArg.to);
plugins.smartfile.fs.copySync(optionsArg.from, optionsArg.to);
plugins.smartfile.fs.copySync(optionsArg.from, optionsArg.to, {
replaceTargetDir: true,
});
}
}

View File

@ -39,7 +39,8 @@ export class TsBundleProcess {
target: 'es2022',
entryNames: plugins.path.parse(toArg).name,
outdir: plugins.path.parse(toArg).dir,
// splitting: true,
splitting: false,
treeShaking: false,
tsconfig: paths.tsconfigPath,
alias: await this.getAliases(),
});
@ -60,10 +61,11 @@ export class TsBundleProcess {
format: 'esm',
target: 'es2022',
minify: true,
entryNames: 'bundle',
entryNames: plugins.path.parse(toArg).name,
outdir: plugins.path.parse(toArg).dir,
tsconfig: paths.tsconfigPath,
// splitting: true,
splitting: false,
treeShaking: false,
chunkNames: 'chunks/[name]-[hash]',
alias: await this.getAliases(),
});

View File

@ -0,0 +1,115 @@
import * as plugins from './plugins.js';
import * as paths from '../paths.js';
import * as interfaces from '../interfaces/index.js';
import { logger } from '../tsbundle.logging.js';
export class TsBundleProcess {
constructor() {
// Nothing here
}
public async getAliases() {
try {
const aliasObject: Record<string, string> = {};
const localTsConfig = plugins.smartfile.fs.toObjectSync(
plugins.path.join(paths.cwd, 'tsconfig.json')
);
if (localTsConfig.compilerOptions && localTsConfig.compilerOptions.paths) {
for (const alias of Object.keys(localTsConfig.compilerOptions.paths)) {
const aliasPath = localTsConfig.compilerOptions.paths[alias][0];
aliasObject[alias] = aliasPath;
}
}
return aliasObject;
} catch (error) {
return {};
}
}
/**
* creates a bundle for the test enviroment
*/
public async buildTest(fromArg: string, toArg: string, argvArg: any) {
// create a bundle
const result = await plugins.rolldown({
input: fromArg,
resolve: {
alias: await this.getAliases(),
tsconfigFilename: paths.tsconfigPath,
},
});
const outputDir = plugins.path.dirname(toArg);
const outputFilename = plugins.path.basename(toArg);
await result.write({
dir: outputDir,
entryFileNames: outputFilename,
format: 'es',
sourcemap: true,
inlineDynamicImports: true,
});
}
/**
* creates a bundle for the production environment
*/
public async buildProduction(fromArg: string, toArg: string, argvArg: any) {
// create a bundle
console.log('rolldown specific:');
console.log(`from: ${fromArg}`);
console.log(`to: ${toArg}`);
const result = await plugins.rolldown({
input: fromArg,
resolve: {
alias: await this.getAliases(),
tsconfigFilename: paths.tsconfigPath,
},
experimental: {
enableComposingJsPlugins: true,
},
});
const outputDir = plugins.path.dirname(toArg);
const outputFilename = plugins.path.basename(toArg);
await result.write({
dir: outputDir,
entryFileNames: outputFilename,
format: 'es',
sourcemap: true,
minify: true,
inlineDynamicImports: true,
});
}
}
const run = async () => {
console.log('running spawned compilation process');
const transportOptions: interfaces.IEnvTransportOptions = JSON.parse(
process.env.transportOptions
);
console.log('=======> ROLLDOWN');
console.log(transportOptions);
process.chdir(transportOptions.cwd);
console.log(`switched to ${process.cwd()}`);
const tsbundleProcessInstance = new TsBundleProcess();
if (transportOptions.mode === 'test') {
console.log('building for test:');
await tsbundleProcessInstance.buildTest(
plugins.smartpath.transform.makeAbsolute(transportOptions.from, process.cwd()),
plugins.smartpath.transform.makeAbsolute(transportOptions.to, process.cwd()),
transportOptions.argv
);
} else {
console.log('building for production:');
await tsbundleProcessInstance.buildProduction(
plugins.smartpath.transform.makeAbsolute(transportOptions.from, process.cwd()),
plugins.smartpath.transform.makeAbsolute(transportOptions.to, process.cwd()),
transportOptions.argv
);
}
};
run();

View File

@ -0,0 +1,5 @@
export * from '../plugins.js';
import { rolldown } from 'rolldown';
export { rolldown }

View File

@ -0,0 +1,236 @@
import * as plugins from './plugins.js';
import * as paths from '../paths.js';
import * as interfaces from '../interfaces/index.js';
import { logger } from '../tsbundle.logging.js';
export class TsBundleProcess {
constructor() {
// Nothing here
}
public async getAliases() {
try {
const aliasObject: Record<string, string> = {};
const localTsConfig = plugins.smartfile.fs.toObjectSync(
plugins.path.join(paths.cwd, 'tsconfig.json')
);
if (localTsConfig.compilerOptions && localTsConfig.compilerOptions.paths) {
for (const alias of Object.keys(localTsConfig.compilerOptions.paths)) {
const aliasPath = localTsConfig.compilerOptions.paths[alias][0];
// Convert TypeScript path to absolute path for rspack
aliasObject[alias.replace('/*', '')] = plugins.path.resolve(paths.cwd, aliasPath.replace('/*', ''));
}
}
return aliasObject;
} catch (error) {
return {};
}
}
/**
* creates a bundle for the test enviroment
*/
public async buildTest(fromArg: string, toArg: string, argvArg: any) {
const aliases = await this.getAliases();
const outputDir = plugins.path.dirname(toArg);
const outputFilename = plugins.path.basename(toArg);
const config = {
mode: 'development' as const,
entry: {
main: fromArg,
},
output: {
path: outputDir,
filename: outputFilename,
library: {
type: 'module' as const,
},
},
devtool: 'source-map' as const,
resolve: {
alias: aliases,
extensions: ['.ts', '.tsx', '.js', '.jsx'],
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: {
loader: 'builtin:swc-loader',
options: {
jsc: {
parser: {
syntax: 'typescript',
tsx: true,
decorators: true,
},
target: 'es2022',
transform: {
decoratorVersion: '2022-03',
},
},
},
},
type: 'javascript/auto',
},
],
},
experiments: {
outputModule: true,
},
};
return new Promise((resolve, reject) => {
plugins.rspack(config, (err, stats) => {
if (err) {
console.error(err.stack || err);
reject(err);
return;
}
if (stats.hasErrors()) {
console.error(stats.toString());
reject(new Error('Build failed with errors'));
return;
}
console.log(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false,
}));
resolve(undefined);
});
});
}
/**
* creates a bundle for the production environment
*/
public async buildProduction(fromArg: string, toArg: string, argvArg: any) {
console.log('rspack specific:');
console.log(`from: ${fromArg}`);
console.log(`to: ${toArg}`);
const aliases = await this.getAliases();
const outputDir = plugins.path.dirname(toArg);
const outputFilename = plugins.path.basename(toArg);
const config = {
mode: 'production' as const,
entry: {
main: fromArg,
},
output: {
path: outputDir,
filename: outputFilename,
library: {
type: 'module' as const,
},
},
devtool: 'source-map' as const,
resolve: {
alias: aliases,
extensions: ['.ts', '.tsx', '.js', '.jsx'],
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: {
loader: 'builtin:swc-loader',
options: {
jsc: {
parser: {
syntax: 'typescript',
tsx: true,
decorators: true,
},
target: 'es2022',
transform: {
decoratorVersion: '2022-03',
},
minify: {
compress: true,
mangle: true,
},
},
},
},
type: 'javascript/auto',
},
],
},
optimization: {
minimize: true,
concatenateModules: true,
usedExports: true,
sideEffects: true,
},
experiments: {
outputModule: true,
},
};
return new Promise((resolve, reject) => {
plugins.rspack(config, (err, stats) => {
if (err) {
console.error(err.stack || err);
reject(err);
return;
}
if (stats.hasErrors()) {
console.error(stats.toString());
reject(new Error('Build failed with errors'));
return;
}
console.log(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false,
}));
resolve(undefined);
});
});
}
}
const run = async () => {
console.log('running spawned compilation process');
const transportOptions: interfaces.IEnvTransportOptions = JSON.parse(
process.env.transportOptions
);
console.log('=======> RSPACK');
console.log(transportOptions);
process.chdir(transportOptions.cwd);
console.log(`switched to ${process.cwd()}`);
const tsbundleProcessInstance = new TsBundleProcess();
if (transportOptions.mode === 'test') {
console.log('building for test:');
await tsbundleProcessInstance.buildTest(
plugins.smartpath.transform.makeAbsolute(transportOptions.from, process.cwd()),
plugins.smartpath.transform.makeAbsolute(transportOptions.to, process.cwd()),
transportOptions.argv
);
} else {
console.log('building for production:');
await tsbundleProcessInstance.buildProduction(
plugins.smartpath.transform.makeAbsolute(transportOptions.from, process.cwd()),
plugins.smartpath.transform.makeAbsolute(transportOptions.to, process.cwd()),
transportOptions.argv
);
}
};
run();

5
ts/mod_rspack/plugins.ts Normal file
View File

@ -0,0 +1,5 @@
export * from '../plugins.js';
import { rspack } from '@rspack/core';
export { rspack }

View File

@ -12,10 +12,15 @@ export class TsBundle {
) {
const done = plugins.smartpromise.defer();
const getBundlerPath = () => {
if (argvArg.bundler === 'esbuild') {
return './mod_esbuild/index.child.js'
switch (argvArg.bundler) {
case 'rolldown':
return './mod_rolldown/index.child.js';
case 'rspack':
return './mod_rspack/index.child.js';
case 'esbuild':
default:
return './mod_esbuild/index.child.js';
}
return './mod_esbuild/index.child.js'
}
const transportOptions: interfaces.IEnvTransportOptions = {
cwd: cwdArg,
@ -23,7 +28,6 @@ export class TsBundle {
to: toArg,
mode: argvArg && argvArg.production ? 'production' : 'test',
argv: {
bundler: 'esbuild',
...argvArg
}
}