"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBuildWasmPlugin = void 0;
const buildPluginAsset_1 = require("./buildPluginAsset");
const wasmHelperId = 'vite/wasm-helper';
const wasmHelper = (opts = {}, url) => {
    let instance;
    if (url.startsWith('data:')) {
        // @ts-ignore
        const binaryString = atob(url.replace(/^data:.*?base64,/, ''));
        const bytes = new Uint8Array(binaryString.length);
        for (let i = 0; i < binaryString.length; i++) {
            bytes[i] = binaryString.charCodeAt(i);
        }
        // @ts-ignore
        instance = WebAssembly.instantiate(bytes.buffer, opts);
    }
    else {
        // https://github.com/mdn/webassembly-examples/issues/5
        // WebAssembly.instantiateStreaming requires the server to provide the
        // correct MIME type for .wasm files, which unfortunately doesn't work for
        // a lot of static file servers, so we just work around it by getting the
        // raw buffer.
        // @ts-ignore
        instance = fetch(url)
            // @ts-ignore
            .then((r) => r.arrayBuffer())
            // @ts-ignore
            .then((bytes) => WebAssembly.instantiate(bytes, opts));
    }
    return instance.then((i) => i.instance.exports);
};
const wasmHelperCode = wasmHelper.toString();
exports.createBuildWasmPlugin = (root, publicBase, assetsDir, inlineLimit) => {
    return {
        name: 'vite:wasm',
        resolveId(id) {
            if (id === wasmHelperId) {
                return id;
            }
        },
        async load(id) {
            if (id === wasmHelperId) {
                return `export default ${wasmHelperCode}`;
            }
            if (id.endsWith('.wasm')) {
                let { fileName, content, url } = await buildPluginAsset_1.resolveAsset(id, root, publicBase, assetsDir, inlineLimit);
                if (!url && fileName && content) {
                    url =
                        'import.meta.ROLLUP_FILE_URL_' +
                            this.emitFile({
                                name: fileName,
                                type: 'asset',
                                source: content
                            });
                }
                return `
import initWasm from "${wasmHelperId}"
export default opts => initWasm(opts, ${JSON.stringify(url)})
`;
            }
        }
    };
};
//# sourceMappingURL=buildPluginWasm.js.map