You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
1 year ago
|
import type { PostResourceTransformer } from '../types'
|
||
|
|
||
|
import path from 'path'
|
||
|
import { promises as fs } from 'fs'
|
||
|
import wabtModule from 'wabt'
|
||
|
|
||
|
const wabtModulePromise = wabtModule()
|
||
|
|
||
|
const transformer : PostResourceTransformer = {
|
||
|
extension: "wat",
|
||
|
transform: async (src) => {
|
||
|
const wasmPath = path.join(process.cwd(), 'scripts', src)
|
||
|
const wasmContents = await fs.readFile(wasmPath)
|
||
|
|
||
|
const wasmTextFileName = path.basename(src)
|
||
|
const wasmBinFileName = wasmTextFileName.replace(/\.wat$/, '.wasm')
|
||
|
const wabt = await wabtModulePromise
|
||
|
|
||
|
const wasmParsed = wabt.parseWat(wasmTextFileName, wasmContents)
|
||
|
const { buffer: wasmBinary } = wasmParsed.toBinary({ write_debug_names: true })
|
||
|
const wasmDestText = path.join(process.cwd(), '.next/static/scripts', src)
|
||
|
const wasmDestBinary = wasmDestText.replace(/\.wat$/, '.wasm')
|
||
|
const destDir = path.dirname(wasmDestText)
|
||
|
await fs.mkdir(destDir, { recursive: true })
|
||
|
await fs.writeFile(wasmDestText, wasmContents)
|
||
|
await fs.writeFile(wasmDestBinary, wasmBinary)
|
||
|
|
||
|
return {
|
||
|
type: 'wasm',
|
||
|
name: wasmBinFileName,
|
||
|
binaryPath: path.join('/_next/static/scripts/', src.replace(/\.wat$/, '.wasm')),
|
||
|
textPath: path.join('/_next/static/scripts/', src),
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default transformer
|