Skip to content
/ presea Public

An utility function for bundling Node.js single executable applications.

License

Notifications You must be signed in to change notification settings

yjl9903/presea

Repository files navigation

presea

version CI

An utility function for bundling Node.js single executable applications.

From Node.js 20, it supports Single Executable Applications experimentally. This package integrates the binary bundle steps with unbuild following Single executable applications | Node.js v20.0.0 Document.

Installation

npm i -D presea

Usage

import { bundle } from 'presea'

await bundle('path/to/package')

CLI

This is working in progress.

npm i -g presea

echo "console.log('Hello')" > cli.js

presea cli.js

GitHub Actions

Here is an example GitHub Actions config to bundle single executable applications.

You should replace <bin> to your own binary name which is the same as your package.json or your build config.

name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  bundle:
    name: Bundle on ${{ matrix.target }}

    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        include:
          - target: linux
            os: ubuntu-latest
            binary: ./dist/<bin>
          - target: windows
            os: windows-latest
            binary: .\dist\<bin>.exe

    steps:
      - uses: actions/checkout@v3

      - name: Setup pnpm
        uses: pnpm/action-setup@v2.2.4

      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 20.x
          cache: pnpm

      - name: Install
        run: pnpm install

      - name: Build
        run: pnpm build  # now binary is located at matrix.binary

      # Upload to release and so on...

unbuild

Warning

Currently, SEA only supports for a single script, and can not require other node_modules.

But unbuild can not bundle the whole project into a single script.

See feat: unbuild bundle into a single script.

You should provide field bin in your package.json like the following config.

{
  "bin": {
    "hello": "./dist/hello.mjs"
  }
}

Import presea preset in your build.config.ts.

// build.config.ts

import { defineBuildConfig } from 'unbuild';

import { Sea } from 'presea/unbuild';

export default defineBuildConfig({
  preset: Sea(),
  // Your config...
});

Then, just run unbuild and the bundled single executable application is in your output directory.

$ npx unbuild

$ ./dist/hello world
Hello, world!

Development

  • Clone this repository
  • Use pnpm as the package manager (npm i -g pnpm)
  • Install dependencies using pnpm install
  • Build the module using pnpm build or stub the module using pnpm dev
  • Test the bundle using cd example && pnpm i && pnpm build

License

MIT License © 2023 XLor