UNPKG

unplugin-typegpu

Version:

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

1 lines 11.9 kB
{"version":3,"sources":["/Users/konradreczko/TypeGPU/wigsill/packages/unplugin-typegpu/dist/chunk-XXTHHPRC.cjs","../src/index.ts"],"names":["containsKernelDirective","node","statement","kernelDirective","removeKernelDirective","cloned","assignMetadata","magicString","metadata","wrapInAutoName","name","typegpu","createUnplugin","rawOptions","options","defu","defaultOptions","code","id","ctx","ast","tgslFunctionDefs","MagicStringAST","walk","_node","_parent","prop","index","_a","performExpressionNaming","gatherTgpuAliases","isShellImplementationCall","implementation","def","params","body","externalNames","transpileFn","isFunctionStatement","FORMAT_VERSION","embedJSON","generateTransform","index_default","vitePlugin","rollupPlugin","rolldownPlugin","webpackPlugin","rspackPlugin","esbuildPlugin","farmPlugin","babelPlugin","babel_default"],"mappings":"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","file":"/Users/konradreczko/TypeGPU/wigsill/packages/unplugin-typegpu/dist/chunk-XXTHHPRC.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 isShellImplementationCall,\n kernelDirective,\n type Options,\n performExpressionNaming,\n} from './common.ts';\n\ntype FunctionNode =\n | acorn.FunctionDeclaration\n | acorn.AnonymousFunctionDeclaration\n | acorn.FunctionExpression\n | acorn.ArrowFunctionExpression;\n\nfunction containsKernelDirective(node: FunctionNode): boolean {\n if (node.body.type === 'BlockStatement') {\n for (const statement of node.body.body) {\n if (\n statement.type === 'ExpressionStatement' &&\n statement.directive === kernelDirective\n ) {\n return true;\n }\n }\n }\n return false;\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 === kernelDirective\n ),\n );\n }\n\n return cloned;\n}\n\nfunction assignMetadata(\n magicString: MagicStringAST,\n node: acorn.AnyNode,\n metadata: string,\n) {\n magicString.prependLeft(\n node.start,\n '(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (',\n ).appendRight(\n node.end,\n `), ${metadata}) && $.f)({}))`,\n );\n}\n\nfunction wrapInAutoName(\n magicString: MagicStringAST,\n node: acorn.Node,\n name: string,\n) {\n magicString\n .prependLeft(\n node.start,\n '((globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(',\n )\n .appendRight(node.end, `, \"${name}\"))`);\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 autoNamingEnabled: options.autoNamingEnabled,\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 }[] = [];\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 performExpressionNaming(ctx, node, (node, name) => {\n wrapInAutoName(magicString, node, name);\n });\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 tgslFunctionDefs.push({\n def: removeKernelDirective(implementation),\n });\n this.skip();\n }\n }\n }\n\n if (\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'FunctionExpression' ||\n node.type === 'FunctionDeclaration'\n ) {\n if (containsKernelDirective(node)) {\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 });\n this.skip();\n }\n }\n },\n });\n\n for (\n const {\n def,\n name,\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}\" 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 assignMetadata(magicString, def, metadata);\n\n if (isFunctionStatement && name) {\n magicString.prependLeft(def.start, `const ${name} = `);\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"]}