@git.zone/tsbundle

a bundler based on esbuild for easy project bundling

readme.md for @git.zone/tsbundle

A powerful multi-bundler tool supporting esbuild, rolldown, and rspack for painless bundling of web projects.

Issue Reporting and Security

For reporting bugs, issues, or security vulnerabilities, please visit community.foss.global/. This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a code.foss.global/ account to submit Pull Requests directly.

Installation

# Global installation for CLI usage
pnpm add -g @git.zone/tsbundle

# Local installation for project usage
pnpm add --save-dev @git.zone/tsbundle

Quick Start

Interactive Setup

The easiest way to get started is with the interactive wizard:

tsbundle init

This guides you through setting up your bundle configuration with preset options:

Build Your Bundles

Once configured, simply run:

tsbundle

Your bundles will be built according to your smartconfig.json configuration.

CLI Commands

Command Description
tsbundle Build all bundles from smartconfig.json configuration
tsbundle custom Same as above (explicit)
tsbundle init Interactive wizard to create/update bundle configuration

Configuration

tsbundle uses smartconfig.json for configuration. Here's an example:

{
  "@git.zone/tsbundle": {
    "bundles": [
      {
        "from": "./ts_web/index.ts",
        "to": "./dist_bundle/bundle.js",
        "outputMode": "bundle",
        "bundler": "esbuild",
        "production": false
      },
      {
        "from": "./ts_web/index.ts",
        "to": "./dist_serve/bundle.js",
        "outputMode": "bundle",
        "bundler": "esbuild",
        "includeFiles": ["./html/**/*.html", "./assets/**/*"]
      }
    ]
  }
}

Bundle Configuration Options

Option Type Default Description
from string - Entry point TypeScript file
to string - Output file path
outputMode "bundle" | "base64ts" "bundle" Output format (see below)
bundler "esbuild" | "rolldown" | "rspack" "esbuild" Which bundler to use
production boolean false Enable minification
includeFiles string[] [] Glob patterns for additional files (HTML, assets)
maxLineLength number 0 (unlimited) For base64ts mode: max chars per line in output

Output Modes

bundle (default)

Standard JavaScript bundle output. Additional files specified in includeFiles are copied to the output directory.

base64ts

Generates a TypeScript file with base64-encoded content - perfect for Deno compile scenarios where you need everything embedded in a single executable:

// Auto-generated by tsbundle
export const files: { path: string; contentBase64: string }[] = [
  { path: "bundle.js", contentBase64: "Y29uc3QgaGVsbG8gPSAid29ybGQi..." },
  { path: "index.html", contentBase64: "PCFET0NUWVBFIGh0bWw+..." },
];

If you're working with AI tools that have line length limitations, set maxLineLength (e.g., 200) to split long base64 strings across multiple lines.

Available Bundlers

tsbundle supports three modern bundlers, each with different strengths:

Bundler Speed Bundle Size Best For
esbuild Fastest Medium Development, quick iterations
rolldown Fast Smallest Production builds, tree-shaking
rspack Fast Largest (webpack runtime) Webpack compatibility

API Usage

TsBundle Class

The core bundling class, usable programmatically:

import { TsBundle } from '@git.zone/tsbundle';

const bundler = new TsBundle();

await bundler.build(
  process.cwd(),           // Working directory
  './src/index.ts',        // Entry point
  './dist/bundle.js',      // Output path
  {
    bundler: 'esbuild',    // 'esbuild' | 'rolldown' | 'rspack'
    production: true
  }
);

Each bundler runs in a separate child process via smartspawn.ThreadSimple, keeping the main process clean and isolated from bundler-specific dependencies.

HtmlHandler Class

Process and optionally minify HTML files:

import { HtmlHandler } from '@git.zone/tsbundle';

const htmlHandler = new HtmlHandler();

await htmlHandler.processHtml({
  from: './html/index.html',
  to: './dist/index.html',
  minify: true
});

AssetsHandler Class

Copy static assets between directories:

import { AssetsHandler } from '@git.zone/tsbundle';

const assetsHandler = new AssetsHandler();

await assetsHandler.processAssets({
  from: './assets',
  to: './dist/assets'
});

Base64TsOutput Class

Generate TypeScript files with base64-encoded content for embedding:

import { Base64TsOutput } from '@git.zone/tsbundle';

const output = new Base64TsOutput(process.cwd());
output.addFile('bundle.js', bundleBuffer);
await output.addFilesFromGlob('./html/**/*.html');
await output.writeToFile('./ts/embedded-bundle.ts', 200); // optional maxLineLength

CustomBundleHandler Class

Process multiple bundle configurations from smartconfig.json:

import { CustomBundleHandler } from '@git.zone/tsbundle';

const handler = new CustomBundleHandler(process.cwd());
const hasConfig = await handler.loadConfig();
if (hasConfig) {
  await handler.processAllBundles();
}

Embedding for Deno Compile

For single-executable scenarios with Deno:

tsbundle init
# Select "custom", set outputMode to "base64ts"

Config:

{
  "@git.zone/tsbundle": {
    "bundles": [
      {
        "from": "./ts_web/index.ts",
        "to": "./ts/embedded-bundle.ts",
        "outputMode": "base64ts",
        "bundler": "esbuild",
        "production": true,
        "includeFiles": ["./html/index.html"],
        "maxLineLength": 200
      }
    ]
  }
}

Then in your Deno app:

import { files } from './ts/embedded-bundle.ts';

// Decode and serve your embedded files
const bundle = files.find(f => f.path === 'bundle.js');
const html = files.find(f => f.path === 'html/index.html');

const bundleContent = atob(bundle.contentBase64);
const htmlContent = atob(html.contentBase64);

Project Structure Recommendations

your-project/
├── ts_web/              # Web bundle entry points
│   └── index.ts
├── ts/                  # Library/node entry points
│   └── index.ts
├── html/                # HTML templates
│   └── index.html
├── assets/              # Static assets (images, fonts, etc.)
├── dist_bundle/         # Output for element/npm bundles
├── dist_serve/          # Output for website bundles
└── smartconfig.json     # tsbundle configuration

This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the LICENSE file.

Please note: The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.

Trademarks

This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.

Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.

Company Information

Task Venture Capital GmbH Registered at District Court Bremen HRB 35230 HB, Germany

By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

changelog.md for @git.zone/tsbundle

2026-03-24 - 2.10.0 - feat(config)

migrate project configuration to smartconfig.json and update bundler dependencies

2026-03-24 - 2.9.3 - fix(config)

migrate configuration loading and init output from npmextra.json to smartconfig.json

2026-03-11 - 2.9.2 - fix(mod_esbuild)

preserve function and class names in esbuild output by enabling keepNames in both dev and prod configs

2026-03-05 - 2.9.1 - fix(mod_custom)

use absolute smartfs entry.path instead of joining with dirPath when building fullPath

2026-02-24 - 2.9.0 - feat(exports)

expose mod_custom, mod_output and interfaces from entry; make processSingleBundle public

2026-02-24 - 2.8.4 - fix()

no changes — empty diff, nothing to commit

2026-01-23 - 2.8.3 - fix(mod_output)

use pattern base dir when computing relative paths for files to serve

2026-01-23 - 2.8.2 - fix(mod_output)

resolve absolute and relative entry.path correctly when adding files

2026-01-12 - 2.8.1 - fix(readme)

document maxLineLength option for base64ts output and add example and tip

2026-01-12 - 2.8.0 - feat(tsbundle)

add configurable maxLineLength for base64ts output and improve build/error handling in child builds

2026-01-12 - 2.7.4 - fix(deps)

bump @push.rocks/smartcli dependency to ^4.0.20

2026-01-12 - 2.7.3 - fix(mod_output)

wrap long base64 file contents and format generated TypeScript output to avoid extremely long lines

2026-01-12 - 2.7.2 - fix(readme)

update README to add interactive setup (tsbundle init), expand quick start and usage examples, include pnpm install, document embedding/base64ts output with Deno example, add project structure recommendations, and clarify license/trademark wording

2026-01-11 - 2.7.1 - fix(package.json)

update repository URL to code.foss.global

2026-01-11 - 2.7.0 - feat(tsbundle)

add npmextra-driven custom bundles, base64-ts output and interactive init wizard

2025-12-02 - 2.6.3 - fix(cli)

Use basename when collecting HTML files for the website CLI command to ensure correct relative paths

2025-11-30 - 2.6.2 - fix(deps)

Bump dependencies and migrate test fixtures to ts_web

2025-11-23 - 2.6.1 - fix(license)

2025-11-23 - 2.6.0 - feat(core)

Integrate Rolldown as optional bundler, migrate filesystem to smartfs, and update bundler/tooling

2025-11-17 - 2.5.2 - fix(tsconfig)

Update TypeScript configs to ES2022 and remove deprecated compiler flags

2025-06-26 - 2.5.1 - fix(readme)

Update license and legal information section in readme

2025-06-26 - 2.5.0 - feat(documentation)

Improve README with comprehensive installation, usage, and API reference details

2025-06-26 - 2.4.1 - fix(tests)

Improve decorator tests and add LitElement component tests for better validation

2025-06-19 - 2.4.0 - feat(bundler)

Introduce rspack bundler support and update multi-bundler workflow

2025-06-19 - 2.3.0 - feat(bundler)

Integrate rolldown bundler support and update bundler selection logic

2025-01-29 - 2.2.5 - fix(mod_assets)

Fix async handling in asset processing

2025-01-29 - 2.2.4 - fix(mod_assets)

Fix logging message in ensureAssetsDir to correctly state when directory is created

2025-01-29 - 2.2.3 - fix(mod_assets)

Fix issue with asset directory copy

2025-01-29 - 2.2.2 - fix(dependencies)

Update smartfile dependency and fix spacing issue in assets module

2025-01-29 - 2.2.1 - fix(index)

Export mod_assets for programmatic use

2025-01-29 - 2.2.0 - feat(AssetsHandler)

Add asset handling to the CLI workflow

2025-01-28 - 2.1.1 - fix(core)

Update dependencies and remove GitLab CI configuration.

2024-10-27 - 2.1.0 - feat(mod_esbuild)

Add alias support to esbuild bundling process

2022-05-04 - 2.0.0-2.0.1 - Breaking and Fix Changes

Released version 2.0.0 with breaking changes and subsequent fixes.

2023-10-03 - 2.0.10 - Fix Updates

Ongoing updates and improvements.

2024-01-10 - 2.0.11-2.0.15 - Minor Fixes

Cumulative fixes and updates from recent releases.