Helpers for Nim JS builds with Bun bundling/tree-shaking.
Use Atlas for dependencies:
atlas installImport build procs directly:
import bunnery/buildPreferred high-level procs:
buildNimAndBundleJsfor Nim source -> Nim JS -> Bun bundlecombinePrebuiltNimJsfor prebuilt Nim JS + app JS -> Bun bundle
Example:
import bunnery/build
let cmds = buildNimAndBundleJs(
nimEntry = "src/main.nim",
cssEntries = @["src/styles.css"],
run = false
)
echo cmds.nimCmd
echo cmds.bundleCmdnimJsOut = ""means Nim uses its default JS output location (<nimEntry>.js).bundleOut = ""means Bunnery writes to<entry>.bundle.js.- For
buildNimAndBundleJs, this is based on resolvednimJsOut. - For
combinePrebuiltNimJs, this is based onprebuiltNimJs.
- For
Bundle JS with one or more CSS files:
import bunnery/build
discard buildNimAndBundleJs(
nimEntry = "src/main.nim",
cssEntries = @["src/styles.css", "src/theme.css"],
bundleOut = "dist/app.bundle.js",
run = true
)Bundle a prebuilt JS entry with CSS directly:
import bunnery/build
discard bundleJs(
entryJs = "src/app.js",
cssEntries = @["src/styles.css"],
bundleOut = "dist/site.bundle.js",
run = true
)Use this when you want your own task in config.nims or .nimble.
config.nims example:
import bunnery/build
task buildWeb, "Compile Nim to JS, then bundle with Bun":
discard buildNimAndBundleJs(
nimEntry = "src/main.nim",
nimFlags = "-d:release",
cssEntries = @["src/styles.css"],
run = true
).nimble example:
import bunnery/build
task buildWeb, "Build browser bundle":
discard buildNimAndBundleJs(
nimEntry = "src/main.nim",
nimJsOut = "",
bundleOut = "",
cssEntries = @["src/styles.css", "src/theme.css"],
bunFlags = "--sourcemap",
run = true
)combinePrebuiltNimJs example (config.nims):
import bunnery/build
task bundleCombined, "Compile Nim JS with nim js, then combine with app JS":
let prebuiltNimJs = "build/prebuilt/main.js"
exec("nim js -d:release --out:" & prebuiltNimJs & " src/main.nim")
discard combinePrebuiltNimJs(
prebuiltNimJs = prebuiltNimJs,
appJsEntry = "src/app.js",
cssEntries = @["src/styles.css"],
bundleOut = "dist/app.bundle.js",
run = true
)Task definitions are in bunnery/tasks and should be included from NimScript files (config.nims or .nimble):
include bunnery/tasksThis adds:
bunBuildbunCombinebunDownload
Env vars supported by tasks:
BUNNERY_NIM_ENTRYBUNNERY_NIM_JS_OUTBUNNERY_BUNDLE_OUTBUNNERY_CSS_ENTRIES(comma-separated, e.g.src/styles.css,src/theme.css)BUNNERY_NIM_FLAGSBUNNERY_BUN_FLAGSBUNNERY_PREBUILT_NIM_JSBUNNERY_APP_JS_ENTRYBUN_VERSION(optional, forbunDownload)
Runnable NimScript sample:
nim e --path:src tests/samples/include_bunnery.nims