/* eslint-disable */
/* prettier-ignore */

/* auto-generated by NAPI-RS */

const __nodeFs = require('node:fs')
const __nodePath = require('node:path')
const { WASI: __nodeWASI } = require('node:wasi')
const { Worker } = require('node:worker_threads')

const {
  createOnMessage: __wasmCreateOnMessageForFsProxy,
  getDefaultContext: __emnapiGetDefaultContext,
  instantiateNapiModuleSync: __emnapiInstantiateNapiModuleSync,
} = require('@napi-rs/wasm-runtime')

const __rootDir = __nodePath.parse(process.cwd()).root

const __wasi = new __nodeWASI({
  version: 'preview1',
  env: process.env,
  preopens: {
    [__rootDir]: __rootDir,
  }
})

const __emnapiContext = __emnapiGetDefaultContext()

const __sharedMemory = new WebAssembly.Memory({
  initial: 4000,
  maximum: 65536,
  shared: true,
})

let __wasmFilePath = __nodePath.join(__dirname, 'satteri_napi.wasm32-wasi.wasm')
const __wasmDebugFilePath = __nodePath.join(__dirname, 'satteri_napi.wasm32-wasi.debug.wasm')

if (__nodeFs.existsSync(__wasmDebugFilePath)) {
  __wasmFilePath = __wasmDebugFilePath
} else if (!__nodeFs.existsSync(__wasmFilePath)) {
  try {
    __wasmFilePath = require.resolve('@bruits/satteri-wasm32-wasi/satteri_napi.wasm32-wasi.wasm')
  } catch {
    throw new Error('Cannot find satteri_napi.wasm32-wasi.wasm file, and @bruits/satteri-wasm32-wasi package is not installed.')
  }
}

const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } = __emnapiInstantiateNapiModuleSync(__nodeFs.readFileSync(__wasmFilePath), {
  context: __emnapiContext,
  asyncWorkPoolSize: (function() {
    const threadsSizeFromEnv = Number(process.env.NAPI_RS_ASYNC_WORK_POOL_SIZE ?? process.env.UV_THREADPOOL_SIZE)
    // NaN > 0 is false
    if (threadsSizeFromEnv > 0) {
      return threadsSizeFromEnv
    } else {
      return 4
    }
  })(),
  reuseWorker: true,
  wasi: __wasi,
  onCreateWorker() {
    const worker = new Worker(__nodePath.join(__dirname, 'wasi-worker.mjs'), {
      env: process.env,
    })
    worker.onmessage = ({ data }) => {
      __wasmCreateOnMessageForFsProxy(__nodeFs)(data)
    }

    // The main thread of Node.js waits for all the active handles before exiting.
    // But Rust threads are never waited without `thread::join`.
    // So here we hack the code of Node.js to prevent the workers from being referenced (active).
    // According to https://github.com/nodejs/node/blob/19e0d472728c79d418b74bddff588bea70a403d0/lib/internal/worker.js#L415,
    // a worker is consist of two handles: kPublicPort and kHandle.
    {
      const kPublicPort = Object.getOwnPropertySymbols(worker).find(s =>
        s.toString().includes("kPublicPort")
      );
      if (kPublicPort) {
        worker[kPublicPort].ref = () => {};
      }

      const kHandle = Object.getOwnPropertySymbols(worker).find(s =>
        s.toString().includes("kHandle")
      );
      if (kHandle) {
        worker[kHandle].ref = () => {};
      }

      worker.unref();
    }
    return worker
  },
  overwriteImports(importObject) {
    importObject.env = {
      ...importObject.env,
      ...importObject.napi,
      ...importObject.emnapi,
      memory: __sharedMemory,
    }
    return importObject
  },
  beforeInit({ instance }) {
    for (const name of Object.keys(instance.exports)) {
      if (name.startsWith('__napi_register__')) {
        instance.exports[name]()
      }
    }
  },
})
module.exports = __napiModule.exports
module.exports.applyCommandsAndConvertToHastHandle = __napiModule.exports.applyCommandsAndConvertToHastHandle
module.exports.applyCommandsToHandle = __napiModule.exports.applyCommandsToHandle
module.exports.applyCommandsToMdastHandle = __napiModule.exports.applyCommandsToMdastHandle
module.exports.compileHandle = __napiModule.exports.compileHandle
module.exports.compileMdx = __napiModule.exports.compileMdx
module.exports.convertMdastToHastHandle = __napiModule.exports.convertMdastToHastHandle
module.exports.createHastHandle = __napiModule.exports.createHastHandle
module.exports.createMdastHandle = __napiModule.exports.createMdastHandle
module.exports.createMdxHastHandle = __napiModule.exports.createMdxHastHandle
module.exports.createMdxMdastHandle = __napiModule.exports.createMdxMdastHandle
module.exports.dropHandle = __napiModule.exports.dropHandle
module.exports.getHandleSource = __napiModule.exports.getHandleSource
module.exports.getMdastFrontmatter = __napiModule.exports.getMdastFrontmatter
module.exports.getNodeData = __napiModule.exports.getNodeData
module.exports.mdastTextContentHandle = __napiModule.exports.mdastTextContentHandle
module.exports.parseEsm = __napiModule.exports.parseEsm
module.exports.parseExpression = __napiModule.exports.parseExpression
module.exports.parseToHtml = __napiModule.exports.parseToHtml
module.exports.renderHandle = __napiModule.exports.renderHandle
module.exports.serializeHandle = __napiModule.exports.serializeHandle
module.exports.setNodeData = __napiModule.exports.setNodeData
module.exports.textContentHandle = __napiModule.exports.textContentHandle
module.exports.walkHandle = __napiModule.exports.walkHandle
module.exports.walkMdastHandle = __napiModule.exports.walkMdastHandle
