Files
BrowserOS/packages/browseros-agent/scripts/build/plugins/wasm-binary.ts
Dani Akash 290ee91a8b Add 'packages/browseros-agent/' from commit '90bd4be3008285bf3825aad3702aff98f872671a'
git-subtree-dir: packages/browseros-agent
git-subtree-mainline: 8f148d0918
git-subtree-split: 90bd4be300
2026-03-13 21:22:09 +05:30

64 lines
1.7 KiB
TypeScript

/**
* @license
* Copyright 2025 BrowserOS
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/**
* Bun plugin to handle esbuild-style `?binary` WASM imports.
*
* Transforms imports like:
* import('web-tree-sitter/tree-sitter.wasm?binary')
*
* Into inline Uint8Array exports that work in compiled Bun binaries.
*/
import { createRequire } from 'node:module'
import { isAbsolute, resolve } from 'node:path'
import type { BunPlugin } from 'bun'
export function wasmBinaryPlugin(): BunPlugin {
const require = createRequire(import.meta.url)
return {
name: 'wasm-binary',
setup(build) {
build.onResolve({ filter: /\.wasm\?binary$/ }, (args) => {
const specifier = args.path.replace(/\?binary$/, '')
const resolveDir = args.resolveDir || process.cwd()
const isBareSpecifier =
!isAbsolute(specifier) &&
!specifier.startsWith('./') &&
!specifier.startsWith('../')
let resolvedPath: string
if (isBareSpecifier) {
resolvedPath = require.resolve(specifier, {
paths: [resolveDir, process.cwd()],
})
} else {
resolvedPath = isAbsolute(specifier)
? specifier
: resolve(resolveDir, specifier)
}
return {
path: resolvedPath,
namespace: 'wasm-binary',
}
})
build.onLoad({ filter: /.*/, namespace: 'wasm-binary' }, async (args) => {
const bytes = await Bun.file(args.path).arrayBuffer()
const uint8 = new Uint8Array(bytes)
return {
contents: `export default new Uint8Array([${uint8.join(',')}]);`,
loader: 'js',
}
})
},
}
}