Builder
runEsBuildBuilder is the high-level entry point most
projects use. It loads federation.config.js, registers
the esbuild adapter with the core, runs the initial build, and — when
watch is on — keeps a file watcher and rebuild queue
running until you call close().
Signature
import { runEsBuildBuilder } from '@softarc/native-federation-esbuild';
const federation = await runEsBuildBuilder(
federationConfigPath: string,
options: EsBuildBuilderOptions,
): Promise<EsBuildBuilder>;
Minimal Call
const federation = await runEsBuildBuilder('federation.config.js', {
outputPath: 'dist',
entryPoints: ['src/bootstrap.tsx'],
});
await federation.close();
Everything else has a sensible default. The only required field is
outputPath — the adapter throws
[esbuild-builder] outputPath is required if it is
missing.
EsBuildBuilderOptions
| Option | Type | Default | Notes |
|---|---|---|---|
outputPath |
string |
required |
Directory that receives remoteEntry.json and the
bundled artifacts.
|
workspaceRoot |
string |
process.cwd() |
Resolved against cwd(). Useful when the build
script runs from a monorepo root.
|
tsConfig |
string |
'tsconfig.json' |
Forwarded to esbuild's tsconfig option for the
source-code bundle.
|
cachePath |
string |
core default |
If given, joined with workspaceRoot. Otherwise
the core's getDefaultCachePath is used. See
Caching.
|
projectName |
string |
— | Forwarded to the core; used for logging and cache scoping in multi-project workspaces. |
entryPoints |
string[] |
— |
Source entries for the federation build. Usually the files
referenced by exposes in
federation.config.js.
|
packageJson |
string |
— |
Path to the project's package.json. Override when
it is not next to the federation config.
|
dev |
boolean |
false |
Enables sourcemaps and disables minification in both the
source-code and node-modules esbuild contexts. Also flips the
process.env.NODE_ENV define to
"development".
|
watch |
boolean |
false |
Starts the file watcher and rebuild queue. The returned
federation object stays live until you call
close().
|
verbose |
boolean |
false |
Sets the adapter's log level to verbose. Rebuild
cancellations, watcher events and full error stacks are
logged.
|
rebuildDelay |
number |
50 (ms) |
Debounce before a rebuild fires after a file change. Clamped to a minimum of 10 ms internally. |
cacheExternalArtifacts |
boolean |
true |
Set false to force the core to re-bundle shared
node-modules on every build. Only useful when debugging cache
issues.
|
adapterConfig |
EsBuildAdapterConfig |
{ plugins: [] } |
esbuild-specific extension points. See Adapter Configuration. |
Return Value — EsBuildBuilder
interface EsBuildBuilder {
federationInfo: FederationInfo;
externals: string[];
options: NormalizedEsBuildBuilderOptions;
close(): Promise<void>;
}
-
federationInfo— the result of the last successful build (remote name, exposed modules, shared descriptors, ...). In watch mode this is a live getter — read it whenever you need a fresh snapshot. -
externals— the list of module names the core marked as shared/external, forwarded to esbuild'sexternal. -
options— the normalized, fully-defaulted options that were actually used. Handy for logging. -
close()— tears everything down: cancels any pending rebuild, stops the watcher, disposes all esbuild contexts, and callsesbuild.stop(). Always call it before exit, even in non-watch mode, so esbuild's daemon shuts down cleanly.
Watch Mode
When watch: true, the adapter:
- Creates an NF file watcher that observes every source file the initial build touched.
-
Queues a rebuild on change. Rebuilds are debounced by
rebuildDelayand serialized through aRebuildQueue— a new change mid-build cancels the in-flight rebuild viaAbortSignalrather than racing it. -
Calls
rebuildForFederationon the core, which only re-bundles the entry points whose inputs changed.
Rebuild outcomes:
-
Success — logs
Federation rebuild done.and updatesfederationInfo. -
Cancelled — a newer change came in while the
previous rebuild was still running. Logged only in
verbosemode. -
Error — logs
Federation rebuild failed!. The watcher keeps running; fix the file and the next save triggers another rebuild.
Lower-Level API — createEsBuildAdapter
If you drive buildForFederation /
rebuildForFederation yourself (e.g. integrating with a
custom dev server or another build tool's lifecycle), skip
runEsBuildBuilder and construct just the adapter:
import { createEsBuildAdapter } from '@softarc/native-federation-esbuild';
import { setBuildAdapter, buildForFederation } from '@softarc/native-federation';
const adapter = createEsBuildAdapter({ plugins: [] });
setBuildAdapter(adapter);
await buildForFederation(config, normalizedOptions, externals);
await adapter.dispose();
createEsBuildAdapter returns an
NFBuildAdapter
with three methods:
-
setup(name, options)— creates an esbuild context for a single bundle entry. Picks the source-code bundler or the node-modules bundler based onoptions.isMappingOrExposed. -
build(name, { modifiedFiles?, signal? })— rebuilds, writes output files, and returns anNFBuildAdapterResult[]with file names. Aborts cleanly whensignalfires. -
dispose(name?)— disposes a single context by name, or all contexts (plusesbuild.stop()) when called without arguments.
For 99% of projects, runEsBuildBuilder is the right
call. Reach for createEsBuildAdapter only when the
core's built-in build loop doesn't fit your workflow.