import { Environment, napi } from 'napi-wasm'; import { await_promise_sync, createBundleAsync } from './async.mjs'; let wasm, initPromise, bundleAsyncInternal; export default async function init(input) { if (wasm) return; if (initPromise) { await initPromise; return; } input = input ?? new URL('lightningcss_node.wasm', import.meta.url); if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { input = fetchOrReadFromFs(input); } let env; initPromise = input .then(input => load(input, { env: { ...napi, await_promise_sync, __getrandom_custom: (ptr, len) => { let buf = env.memory.subarray(ptr, ptr + len); crypto.getRandomValues(buf); }, } })) .then(({instance}) => { instance.exports.register_module(); env = new Environment(instance); bundleAsyncInternal = createBundleAsync(env); wasm = env.exports; }); await initPromise; } export function transform(options) { return wasm.transform(options); } export function transformStyleAttribute(options) { return wasm.transformStyleAttribute(options); } export function bundle(options) { return wasm.bundle(options); } export function bundleAsync(options) { return bundleAsyncInternal(options); } export { browserslistToTargets } from './browserslistToTargets.js'; export { Features } from './flags.js'; export { composeVisitors } from './composeVisitors.js'; async function load(module, imports) { if (typeof Response === 'function' && module instanceof Response) { if (typeof WebAssembly.instantiateStreaming === 'function') { try { return await WebAssembly.instantiateStreaming(module, imports); } catch (e) { if (module.headers.get('Content-Type') != 'application/wasm') { console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); } else { throw e; } } } const bytes = await module.arrayBuffer(); return await WebAssembly.instantiate(bytes, imports); } else { const instance = await WebAssembly.instantiate(module, imports); if (instance instanceof WebAssembly.Instance) { return { instance, module }; } else { return instance; } } } async function fetchOrReadFromFs(inputPath) { try { const fs = await import('fs'); return fs.readFileSync(inputPath); } catch { return fetch(inputPath); } };