UNPKG

unplugin-typegpu

Version:

Build plugins for TypeGPU, enabling seamless JavaScript -> WGSL transpilation and improved debugging.

1 lines 11.2 kB
{"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-LI2BURW4.cjs","../src/index.ts"],"names":["getKernelDirective","node","statement","kernelDirectives","removeKernelDirective","cloned","typegpu","createUnplugin","rawOptions","options","defu","defaultOptions","code","id","ctx","ast","tgslFunctionDefs","magicString","MagicStringAST","walk","_node","_parent","prop","index","_a","gatherTgpuAliases","isShellImplementationCall","implementation","directive","def","name","removeJsImplementation","params","body","externalNames","transpileFn","isFunctionStatement","metadata","FORMAT_VERSION","embedJSON"],"mappings":"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","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-LI2BURW4.cjs","sourcesContent":[null,"import type * as acorn from 'acorn';\nimport defu from 'defu';\nimport { type Node, walk } from 'estree-walker';\nimport { generateTransform, MagicStringAST } from 'magic-string-ast';\nimport { FORMAT_VERSION } from 'tinyest';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport { createUnplugin, type UnpluginInstance } from 'unplugin';\nimport babel from './babel.ts';\nimport {\n type Context,\n defaultOptions,\n embedJSON,\n gatherTgpuAliases,\n getErrorMessage,\n isShellImplementationCall,\n type KernelDirective,\n kernelDirectives,\n type Options,\n} from './common.ts';\n\ntype FunctionNode =\n | acorn.FunctionDeclaration\n | acorn.AnonymousFunctionDeclaration\n | acorn.FunctionExpression\n | acorn.ArrowFunctionExpression;\n\nfunction getKernelDirective(node: FunctionNode): KernelDirective | undefined {\n if (node.body.type === 'BlockStatement') {\n for (const statement of node.body.body) {\n if (statement.type === 'ExpressionStatement') {\n if (kernelDirectives.includes(statement.directive as KernelDirective)) {\n return statement.directive as KernelDirective;\n }\n }\n }\n }\n}\n\nfunction removeKernelDirective(node: FunctionNode) {\n const cloned = structuredClone(node);\n\n if (cloned.body.type === 'BlockStatement') {\n cloned.body.body = cloned.body.body.filter(\n (statement) =>\n !(\n statement.type === 'ExpressionStatement' &&\n statement.directive &&\n kernelDirectives.includes(statement.directive as KernelDirective)\n ),\n );\n }\n\n return cloned;\n}\n\nconst typegpu: UnpluginInstance<Options, false> = createUnplugin(\n (rawOptions) => {\n const options = defu(rawOptions, defaultOptions);\n\n return {\n name: 'unplugin-typegpu' as const,\n enforce: options.enforce,\n transform: {\n filter: {\n id: options,\n },\n handler(code, id) {\n const ctx: Context = {\n tgpuAliases: new Set<string>(\n options.forceTgpuAlias ? [options.forceTgpuAlias] : [],\n ),\n fileId: id,\n };\n\n const ast = this.parse(code, {\n allowReturnOutsideFunction: true,\n }) as Node;\n\n const tgslFunctionDefs: {\n def: FunctionNode;\n name?: string | undefined;\n removeJsImplementation: boolean;\n }[] = [];\n\n const magicString = new MagicStringAST(code);\n\n walk(ast, {\n enter(_node, _parent, prop, index) {\n const node = _node as acorn.AnyNode;\n\n if (node.type === 'ImportDeclaration') {\n gatherTgpuAliases(node, ctx);\n }\n\n if (node.type === 'CallExpression') {\n if (isShellImplementationCall(node, ctx)) {\n const implementation = node.arguments[0];\n\n if (\n implementation &&\n (implementation.type === 'FunctionExpression' ||\n implementation.type === 'ArrowFunctionExpression')\n ) {\n const directive = getKernelDirective(implementation);\n tgslFunctionDefs.push({\n def: removeKernelDirective(implementation),\n removeJsImplementation: directive !== 'kernel & js',\n });\n this.skip();\n }\n }\n }\n\n if (\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'FunctionExpression' ||\n node.type === 'FunctionDeclaration'\n ) {\n const directive = getKernelDirective(node);\n if (directive) {\n tgslFunctionDefs.push({\n def: removeKernelDirective(node),\n name: node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression'\n ? node.id?.name\n : _parent?.type === 'VariableDeclarator'\n ? _parent.id.type === 'Identifier'\n ? _parent.id.name\n : undefined\n : undefined,\n removeJsImplementation: directive !== 'kernel & js',\n });\n this.skip();\n }\n }\n },\n });\n\n for (\n const {\n def,\n name,\n removeJsImplementation,\n } of tgslFunctionDefs\n ) {\n const { params, body, externalNames } = transpileFn(def);\n const isFunctionStatement = def.type === 'FunctionDeclaration';\n\n if (\n isFunctionStatement &&\n name &&\n code\n .slice(0, def.start)\n .search(new RegExp(`(?<![\\\\w_.])${name}(?![\\\\w_])`)) !== -1\n ) {\n console.warn(\n `File ${id}: function \"${name}\", containing ${\n removeJsImplementation ? 'kernel' : 'kernel & js'\n } directive, might have been referenced before its usage. Function statements are no longer hoisted after being transformed by the plugin.`,\n );\n }\n\n const metadata = `{\n v: ${FORMAT_VERSION},\n ast: ${embedJSON({ params, body, externalNames })},\n externals: {${externalNames.join(', ')}},\n }`;\n\n // Wrap the implementation in a set to `globalThis` to associate the name, AST and externals with the implementation.\n magicString.appendLeft(\n def.start,\n `${isFunctionStatement && name ? `const ${name} = ` : ''}\n (($) => ((globalThis.__TYPEGPU_META__ ??= new WeakMap()).set(\n $.f = (`,\n ).appendRight(\n def.end,\n `) , ${metadata}) && $.f))({})`,\n );\n\n if (removeJsImplementation) {\n magicString.overwriteNode(\n def,\n `() => {\n throw new Error(\\`${getErrorMessage(name)}\\`);\n }`,\n );\n }\n }\n\n return generateTransform(magicString, id);\n },\n },\n };\n },\n);\n\nexport type { Options } from './common.ts';\n\nexport default typegpu;\n\nexport const vitePlugin = typegpu.vite;\nexport const rollupPlugin = typegpu.rollup;\nexport const rolldownPlugin = typegpu.rolldown;\nexport const webpackPlugin = typegpu.webpack;\nexport const rspackPlugin = typegpu.rspack;\nexport const esbuildPlugin = typegpu.esbuild;\nexport const farmPlugin = typegpu.farm;\nexport const babelPlugin = babel;\n"]}