{"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"]}