unplugin-typegpu 0.8.0-alpha.1 → 0.8.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/babel.cjs +1 -1
  2. package/babel.js +1 -1
  3. package/bun.cjs +1 -1
  4. package/bun.js +1 -1
  5. package/chunk-AAPWVTYT.js +2 -0
  6. package/chunk-AAPWVTYT.js.map +1 -0
  7. package/{chunk-CBTXKIP6.cjs → chunk-DUSPUQJO.cjs} +2 -2
  8. package/chunk-DUSPUQJO.cjs.map +1 -0
  9. package/chunk-L2Q3MFMU.cjs +7 -0
  10. package/chunk-L2Q3MFMU.cjs.map +1 -0
  11. package/chunk-M7Y5AIYS.js +2 -0
  12. package/chunk-M7Y5AIYS.js.map +1 -0
  13. package/chunk-PAQIRP66.cjs +2 -0
  14. package/chunk-PAQIRP66.cjs.map +1 -0
  15. package/chunk-VMWFG3OE.js +7 -0
  16. package/chunk-VMWFG3OE.js.map +1 -0
  17. package/esbuild.cjs +1 -1
  18. package/esbuild.d.cts +1 -0
  19. package/esbuild.d.ts +1 -0
  20. package/esbuild.js +1 -1
  21. package/farm.cjs +1 -1
  22. package/farm.d.cts +1 -0
  23. package/farm.d.ts +1 -0
  24. package/farm.js +1 -1
  25. package/index.cjs +1 -1
  26. package/index.cjs.map +1 -1
  27. package/index.d.cts +38 -6
  28. package/index.d.ts +38 -6
  29. package/index.js +1 -1
  30. package/package.json +8 -2
  31. package/rolldown.cjs +1 -1
  32. package/rolldown.d.cts +1 -0
  33. package/rolldown.d.ts +1 -0
  34. package/rolldown.js +1 -1
  35. package/rollup.cjs +1 -1
  36. package/rollup.d.cts +1 -0
  37. package/rollup.d.ts +1 -0
  38. package/rollup.js +1 -1
  39. package/rspack.cjs +1 -1
  40. package/rspack.d.cts +1 -0
  41. package/rspack.d.ts +1 -0
  42. package/rspack.js +1 -1
  43. package/vite.cjs +1 -1
  44. package/vite.d.cts +1 -0
  45. package/vite.d.ts +1 -0
  46. package/vite.js +1 -1
  47. package/webpack.cjs +1 -1
  48. package/webpack.cjs.map +1 -1
  49. package/webpack.d.cts +1 -0
  50. package/webpack.d.ts +1 -0
  51. package/webpack.js +1 -1
  52. package/webpack.js.map +1 -1
  53. package/chunk-4PPYXBSV.js +0 -2
  54. package/chunk-4PPYXBSV.js.map +0 -1
  55. package/chunk-4RTJUILI.cjs +0 -7
  56. package/chunk-4RTJUILI.cjs.map +0 -1
  57. package/chunk-AZHQWA4E.js +0 -7
  58. package/chunk-AZHQWA4E.js.map +0 -1
  59. package/chunk-CBTXKIP6.cjs.map +0 -1
  60. package/chunk-DE4HNFJZ.js +0 -2
  61. package/chunk-DE4HNFJZ.js.map +0 -1
  62. package/chunk-LNKX7SV5.cjs +0 -2
  63. package/chunk-LNKX7SV5.cjs.map +0 -1
package/babel.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkLNKX7SV5cjs = require('./chunk-LNKX7SV5.cjs');exports.default = _chunkLNKX7SV5cjs.i;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkPAQIRP66cjs = require('./chunk-PAQIRP66.cjs');exports.default = _chunkPAQIRP66cjs.i;
2
2
  //# sourceMappingURL=babel.cjs.map
package/babel.js CHANGED
@@ -1,2 +1,2 @@
1
- import{i as a}from"./chunk-DE4HNFJZ.js";export{a as default};
1
+ import{i as a}from"./chunk-M7Y5AIYS.js";export{a as default};
2
2
  //# sourceMappingURL=babel.js.map
package/bun.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkCBTXKIP6cjs = require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');exports.default = _chunkCBTXKIP6cjs.a;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkDUSPUQJOcjs = require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');exports.default = _chunkDUSPUQJOcjs.a;
2
2
  //# sourceMappingURL=bun.cjs.map
package/bun.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a}from"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";export{a as default};
1
+ import{a}from"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";export{a as default};
2
2
  //# sourceMappingURL=bun.js.map
@@ -0,0 +1,2 @@
1
+ import{a as i,h as p,i as l}from"./chunk-M7Y5AIYS.js";import*as u from"@babel/standalone";import c from"defu";var x=s=>{let o=c(s,i),r=o.include;if(!(r instanceof RegExp))throw new Error("Unsupported 'include' options in Bun plugin. Please provide a single regular expression");if(o.exclude)throw new Error("Unsupported 'exclude' option in Bun plugin");return{name:"unplugin-typegpu",setup(a){a.onLoad({filter:r},async e=>{let n=await Bun.file(e.path).text();if(p.every(d=>!d.test(n)))return{contents:n,loader:e.loader};let t=u.transform(n,{presets:[["typescript",{allowDeclareFields:!0}]],filename:e.path,plugins:[l]}).code;return{contents:t!=null?t:n,loader:e.loader}})}}};export{x as a};
2
+ //# sourceMappingURL=chunk-AAPWVTYT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bun.ts"],"sourcesContent":["import type { BunPlugin } from 'bun';\nimport * as Babel from '@babel/standalone';\nimport defu from 'defu';\nimport { defaultOptions, earlyPruneRegex, type Options } from './common.ts';\nimport babelPlugin from './babel.ts';\n\nexport default (rawOptions: Options): BunPlugin => {\n const options = defu(rawOptions, defaultOptions);\n const include = options.include;\n if (!(include instanceof RegExp)) {\n throw new Error(\n `Unsupported 'include' options in Bun plugin. Please provide a single regular expression`,\n );\n }\n if (options.exclude) {\n throw new Error(`Unsupported 'exclude' option in Bun plugin`);\n }\n\n return {\n name: 'unplugin-typegpu',\n setup(build) {\n build.onLoad({ filter: include }, async (args) => {\n const text = await Bun.file(args.path).text();\n\n // Pruning early before more expensive operations\n if (earlyPruneRegex.every((pattern) => !pattern.test(text))) {\n return {\n contents: text,\n loader: args.loader,\n };\n }\n\n const result = Babel.transform(text, {\n presets: [['typescript', { allowDeclareFields: true }]],\n filename: args.path,\n plugins: [babelPlugin],\n }).code;\n\n return {\n contents: result ?? text,\n loader: args.loader,\n };\n });\n },\n };\n};\n"],"mappings":"sDACA,UAAYA,MAAW,oBACvB,OAAOC,MAAU,OAIjB,IAAOC,EAASC,GAAmC,CACjD,IAAMC,EAAUC,EAAKF,EAAYG,CAAc,EACzCC,EAAUH,EAAQ,QACxB,GAAI,EAAEG,aAAmB,QACvB,MAAM,IAAI,MACR,yFACF,EAEF,GAAIH,EAAQ,QACV,MAAM,IAAI,MAAM,4CAA4C,EAG9D,MAAO,CACL,KAAM,mBACN,MAAMI,EAAO,CACXA,EAAM,OAAO,CAAE,OAAQD,CAAQ,EAAG,MAAOE,GAAS,CAChD,IAAMC,EAAO,MAAM,IAAI,KAAKD,EAAK,IAAI,EAAE,KAAK,EAG5C,GAAIE,EAAgB,MAAOC,GAAY,CAACA,EAAQ,KAAKF,CAAI,CAAC,EACxD,MAAO,CACL,SAAUA,EACV,OAAQD,EAAK,MACf,EAGF,IAAMI,EAAe,YAAUH,EAAM,CACnC,QAAS,CAAC,CAAC,aAAc,CAAE,mBAAoB,EAAK,CAAC,CAAC,EACtD,SAAUD,EAAK,KACf,QAAS,CAACK,CAAW,CACvB,CAAC,EAAE,KAEH,MAAO,CACL,SAAUD,GAAA,KAAAA,EAAUH,EACpB,OAAQD,EAAK,MACf,CACF,CAAC,CACH,CACF,CACF","names":["Babel","defu","bun_default","rawOptions","options","defu","defaultOptions","include","build","args","text","earlyPruneRegex","pattern","result","babel_default"]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkLNKX7SV5cjs = require('./chunk-LNKX7SV5.cjs');var _standalone = require('@babel/standalone'); var u = _interopRequireWildcard(_standalone);var _defu = require('defu'); var _defu2 = _interopRequireDefault(_defu);var g=s=>{let o=_defu2.default.call(void 0, s,_chunkLNKX7SV5cjs.a),r=o.include;if(!(r instanceof RegExp))throw new Error("Unsupported 'include' options in Bun plugin. Please provide a single regular expression");if(o.exclude)throw new Error("Unsupported 'exclude' option in Bun plugin");return{name:"TypeGPU",setup(a){a.onLoad({filter:r},async e=>{let n=await Bun.file(e.path).text();if(_chunkLNKX7SV5cjs.h.every(d=>!d.test(n)))return{contents:n,loader:e.loader};let t=u.transform(n,{presets:[["typescript",{allowDeclareFields:!0}]],filename:e.path,plugins:[_chunkLNKX7SV5cjs.i]}).code;return{contents:t!=null?t:n,loader:e.loader}})}}};exports.a = g;
2
- //# sourceMappingURL=chunk-CBTXKIP6.cjs.map
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkPAQIRP66cjs = require('./chunk-PAQIRP66.cjs');var _standalone = require('@babel/standalone'); var u = _interopRequireWildcard(_standalone);var _defu = require('defu'); var _defu2 = _interopRequireDefault(_defu);var x=s=>{let o=_defu2.default.call(void 0, s,_chunkPAQIRP66cjs.a),r=o.include;if(!(r instanceof RegExp))throw new Error("Unsupported 'include' options in Bun plugin. Please provide a single regular expression");if(o.exclude)throw new Error("Unsupported 'exclude' option in Bun plugin");return{name:"unplugin-typegpu",setup(a){a.onLoad({filter:r},async e=>{let n=await Bun.file(e.path).text();if(_chunkPAQIRP66cjs.h.every(d=>!d.test(n)))return{contents:n,loader:e.loader};let t=u.transform(n,{presets:[["typescript",{allowDeclareFields:!0}]],filename:e.path,plugins:[_chunkPAQIRP66cjs.i]}).code;return{contents:t!=null?t:n,loader:e.loader}})}}};exports.a = x;
2
+ //# sourceMappingURL=chunk-DUSPUQJO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-DUSPUQJO.cjs","../src/bun.ts"],"names":["bun_default","rawOptions","options","defu","defaultOptions","include","build","args","text","earlyPruneRegex","pattern","result","babel_default"],"mappings":"AAAA,mfAAsD,6FCC/B,wEACN,IAIVA,CAAAA,CAASC,CAAAA,EAAmC,CACjD,IAAMC,CAAAA,CAAUC,4BAAAA,CAAKF,CAAYG,mBAAc,CAAA,CACzCC,CAAAA,CAAUH,CAAAA,CAAQ,OAAA,CACxB,EAAA,CAAI,CAAA,CAAEG,EAAAA,WAAmB,MAAA,CAAA,CACvB,MAAM,IAAI,KAAA,CACR,yFACF,CAAA,CAEF,EAAA,CAAIH,CAAAA,CAAQ,OAAA,CACV,MAAM,IAAI,KAAA,CAAM,4CAA4C,CAAA,CAG9D,MAAO,CACL,IAAA,CAAM,kBAAA,CACN,KAAA,CAAMI,CAAAA,CAAO,CACXA,CAAAA,CAAM,MAAA,CAAO,CAAE,MAAA,CAAQD,CAAQ,CAAA,CAAG,MAAOE,CAAAA,EAAS,CAChD,IAAMC,CAAAA,CAAO,MAAM,GAAA,CAAI,IAAA,CAAKD,CAAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAG5C,EAAA,CAAIE,mBAAAA,CAAgB,KAAA,CAAOC,CAAAA,EAAY,CAACA,CAAAA,CAAQ,IAAA,CAAKF,CAAI,CAAC,CAAA,CACxD,MAAO,CACL,QAAA,CAAUA,CAAAA,CACV,MAAA,CAAQD,CAAAA,CAAK,MACf,CAAA,CAGF,IAAMI,CAAAA,CAAe,CAAA,CAAA,SAAA,CAAUH,CAAAA,CAAM,CACnC,OAAA,CAAS,CAAC,CAAC,YAAA,CAAc,CAAE,kBAAA,CAAoB,CAAA,CAAK,CAAC,CAAC,CAAA,CACtD,QAAA,CAAUD,CAAAA,CAAK,IAAA,CACf,OAAA,CAAS,CAACK,mBAAW,CACvB,CAAC,CAAA,CAAE,IAAA,CAEH,MAAO,CACL,QAAA,CAAUD,CAAAA,EAAA,IAAA,CAAAA,CAAAA,CAAUH,CAAAA,CACpB,MAAA,CAAQD,CAAAA,CAAK,MACf,CACF,CAAC,CACH,CACF,CACF,CAAA,CAAA,cAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-DUSPUQJO.cjs","sourcesContent":[null,"import type { BunPlugin } from 'bun';\nimport * as Babel from '@babel/standalone';\nimport defu from 'defu';\nimport { defaultOptions, earlyPruneRegex, type Options } from './common.ts';\nimport babelPlugin from './babel.ts';\n\nexport default (rawOptions: Options): BunPlugin => {\n const options = defu(rawOptions, defaultOptions);\n const include = options.include;\n if (!(include instanceof RegExp)) {\n throw new Error(\n `Unsupported 'include' options in Bun plugin. Please provide a single regular expression`,\n );\n }\n if (options.exclude) {\n throw new Error(`Unsupported 'exclude' option in Bun plugin`);\n }\n\n return {\n name: 'unplugin-typegpu',\n setup(build) {\n build.onLoad({ filter: include }, async (args) => {\n const text = await Bun.file(args.path).text();\n\n // Pruning early before more expensive operations\n if (earlyPruneRegex.every((pattern) => !pattern.test(text))) {\n return {\n contents: text,\n loader: args.loader,\n };\n }\n\n const result = Babel.transform(text, {\n presets: [['typescript', { allowDeclareFields: true }]],\n filename: args.path,\n plugins: [babelPlugin],\n }).code;\n\n return {\n contents: result ?? text,\n loader: args.loader,\n };\n });\n },\n };\n};\n"]}
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkPAQIRP66cjs = require('./chunk-PAQIRP66.cjs');var _unplugin = require('unplugin');var _defu = require('defu'); var _defu2 = _interopRequireDefault(_defu);var _magicstringast = require('magic-string-ast');var _estreewalker = require('estree-walker');var _tinyestforwgsl = require('tinyest-for-wgsl');var _tinyest = require('tinyest');function C(o){if(o.body.type==="BlockStatement"){for(let e of o.body.body)if(e.type==="ExpressionStatement"&&e.directive===_chunkPAQIRP66cjs.g)return!0}return!1}function P(o){let e=structuredClone(o);return e.body.type==="BlockStatement"&&(e.body.body=e.body.body.filter(r=>!(r.type==="ExpressionStatement"&&r.directive===_chunkPAQIRP66cjs.g))),e}function D(o,e,r){o.prependLeft(e.start,"(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (").appendRight(e.end,`), ${r}) && $.f)({}))`)}function O(o,e,r){o.prependLeft(e.start,"((globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(").appendRight(e.end,`, "${r}"))`)}var c=o=>{let e=_defu2.default.call(void 0, o,_chunkPAQIRP66cjs.a);return{name:"unplugin-typegpu",enforce:e.enforce,transform:{filter:e.earlyPruning?{id:e,code:_chunkPAQIRP66cjs.h}:{id:e},handler(r,p){let f={tgpuAliases:new Set(e.forceTgpuAlias?[e.forceTgpuAlias]:[]),fileId:p,autoNamingEnabled:e.autoNamingEnabled},g;try{g=this.parse(r,{lang:"ts",allowReturnOutsideFunction:!0})}catch(n){console.warn(`[unplugin-typegpu] Failed to parse ${p}. Cause: ${typeof n=="object"&&n&&"message"in n?n.message:n}`);return}let m=[],l=new (0, _magicstringast.MagicStringAST)(r);_estreewalker.walk.call(void 0, g,{enter(n,i,x,y){let t=n,u=i;if(_chunkPAQIRP66cjs.f.call(void 0, f,t,(a,S)=>{O(l,a,S)}),t.type==="ImportDeclaration"&&_chunkPAQIRP66cjs.c.call(void 0, t,f),t.type==="CallExpression"&&_chunkPAQIRP66cjs.d.call(void 0, t,f)){let a=t.arguments[0];a&&(a.type==="FunctionExpression"||a.type==="ArrowFunctionExpression")&&(m.push({def:P(a)}),this.skip())}(t.type==="ArrowFunctionExpression"||t.type==="FunctionExpression"||t.type==="FunctionDeclaration")&&C(t)&&(m.push({def:P(t),name:_chunkPAQIRP66cjs.e.call(void 0, t,u)}),this.skip())}});for(let{def:n,name:i}of m){let{params:x,body:y,externalNames:t}=_tinyestforwgsl.transpileFn.call(void 0, n),u=n.type==="FunctionDeclaration";u&&i&&r.slice(0,n.start).search(new RegExp(`(?<![\\w_.])${i}(?![\\w_])`))!==-1&&console.warn(`File ${p}: function "${i}" might have been referenced before its usage. Function statements are no longer hoisted after being transformed by the plugin.`);let a=`{
2
+ v: ${_tinyest.FORMAT_VERSION},
3
+ name: ${i?`"${i}"`:"undefined"},
4
+ ast: ${_chunkPAQIRP66cjs.b.call(void 0, {params:x,body:y,externalNames:t})},
5
+ get externals() { return {${t.join(", ")}}; },
6
+ }`;D(l,n,a),u&&i&&l.prependLeft(n.start,`const ${i} = `)}return _magicstringast.generateTransform.call(void 0, l,p)}}}};var I=c;var s=_unplugin.createUnplugin.call(void 0, c),Q= exports.b =s,X= exports.c =s.vite,Z= exports.d =s.rollup,ee= exports.e =s.rolldown,te= exports.f =s.webpack,ne= exports.g =s.rspack,oe= exports.h =s.esbuild,re= exports.i =s.farm;exports.a = I; exports.b = Q; exports.c = X; exports.d = Z; exports.e = ee; exports.f = te; exports.g = ne; exports.h = oe; exports.i = re;
7
+ //# sourceMappingURL=chunk-L2Q3MFMU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-L2Q3MFMU.cjs","../src/index.ts","../src/rollup-impl.ts"],"names":["containsUseGpuDirective","node","statement","useGpuDirective","removeUseGpuDirective","cloned","assignMetadata","magicString","metadata","wrapInAutoName","name","rollUpImpl","rawOptions","options","defu","defaultOptions","earlyPruneRegex","code","id","ctx","ast","cause"],"mappings":"AAAA,iOAAyF,oCCA1D,wECCd,kDACiC,6CAclB,kDACJ,kCACG,SAQfA,CAAAA,CAAwBC,CAAAA,CAA6B,CACnE,EAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,IAAA,GAAS,gBAAA,CAAA,CACrB,GAAA,CAAA,IAAWC,EAAAA,GAAaD,CAAAA,CAAK,IAAA,CAAK,IAAA,CAChC,EAAA,CACEC,CAAAA,CAAU,IAAA,GAAS,qBAAA,EACnBA,CAAAA,CAAU,SAAA,GAAcC,mBAAAA,CAExB,MAAO,CAAA,CAAA,CAIb,MAAO,CAAA,CACT,CAEO,SAASC,CAAAA,CAAsBH,CAAAA,CAAoB,CACxD,IAAMI,CAAAA,CAAS,eAAA,CAAgBJ,CAAI,CAAA,CAEnC,OAAII,CAAAA,CAAO,IAAA,CAAK,IAAA,GAAS,gBAAA,EAAA,CACvBA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAOA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CACjCH,CAAAA,EACC,CAAA,CACEA,CAAAA,CAAU,IAAA,GAAS,qBAAA,EACnBA,CAAAA,CAAU,SAAA,GAAcC,mBAAAA,CAE9B,CAAA,CAAA,CAGKE,CACT,CAEO,SAASC,CAAAA,CACdC,CAAAA,CACAN,CAAAA,CACAO,CAAAA,CACA,CACAD,CAAAA,CAAY,WAAA,CACVN,CAAAA,CAAK,KAAA,CACL,oEACF,CAAA,CAAE,WAAA,CACAA,CAAAA,CAAK,GAAA,CACL,CAAA,GAAA,EAAMO,CAAQ,CAAA,cAAA,CAChB,CACF,CAEO,SAASC,CAAAA,CACdF,CAAAA,CACAN,CAAAA,CACAS,CAAAA,CACA,CACAH,CAAAA,CACG,WAAA,CACCN,CAAAA,CAAK,KAAA,CACL,iDACF,CAAA,CACC,WAAA,CAAYA,CAAAA,CAAK,GAAA,CAAK,CAAA,GAAA,EAAMS,CAAI,CAAA,GAAA,CAAK,CAC1C,CAEO,IAAMC,CAAAA,CAAcC,CAAAA,EAAwB,CACjD,IAAMC,CAAAA,CAAUC,4BAAAA,CAAKF,CAAYG,mBAAc,CAAA,CAE/C,MAAO,CACL,IAAA,CAAM,kBAAA,CACN,OAAA,CAASF,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAW,CACT,MAAA,CAAQA,CAAAA,CAAQ,YAAA,CACZ,CACA,EAAA,CAAIA,CAAAA,CACJ,IAAA,CAAMG,mBACR,CAAA,CACE,CACA,EAAA,CAAIH,CACN,CAAA,CACF,OAAA,CAEEI,CAAAA,CACAC,CAAAA,CACA,CACA,IAAMC,CAAAA,CAAe,CACnB,WAAA,CAAa,IAAI,GAAA,CACfN,CAAAA,CAAQ,cAAA,CAAiB,CAACA,CAAAA,CAAQ,cAAc,CAAA,CAAI,CAAC,CACvD,CAAA,CACA,MAAA,CAAQK,CAAAA,CACR,iBAAA,CAAmBL,CAAAA,CAAQ,iBAC7B,CAAA,CAEIO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAMH,CAAAA,CAAM,CACrB,IAAA,CAAM,IAAA,CACN,0BAAA,CAA4B,CAAA,CAC9B,CAAC,CACH,CAAA,KAAA,CAASI,CAAAA,CAAO,CACd,OAAA,CAAQ,IAAA,CACN,CAAA,mCAAA,EAAsCH,CAAE,CAAA,SAAA,EACtC,OAAOG,CAAAA,EAAU,QAAA,EAAYA,CAAAA,EAAS,SAAA,GAAaA,CAAAA,CAC/CA,CAAAA,CAAM,OAAA,CACNA,CACN,CAAA,CAAA;AA0EqB,iBAAA;AACqB,oBAAA;AACS,mBAAA;AACG,wCAAA;ADzLhC,aAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-L2Q3MFMU.cjs","sourcesContent":[null,"import { createUnplugin } from 'unplugin';\nimport { rollUpImpl } from './rollup-impl.ts';\n\nconst typegpu = createUnplugin(rollUpImpl);\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;\n\nexport { default as babelPlugin } from './babel.ts';\nexport { default as bunPlugin } from './bun.ts';\nexport { default as rolldownBrowserPlugin } from './rolldown-browser.ts';\n","import type * as acorn from 'acorn';\nimport defu from 'defu';\nimport { generateTransform, MagicStringAST } from 'magic-string-ast';\nimport {\n type Context,\n defaultOptions,\n earlyPruneRegex,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\nimport type { UnpluginBuildContext, UnpluginContext } from 'unplugin';\nimport { type Node, walk } from 'estree-walker';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport { FORMAT_VERSION } from 'tinyest';\n\nexport type FunctionNode =\n | acorn.FunctionDeclaration\n | acorn.AnonymousFunctionDeclaration\n | acorn.FunctionExpression\n | acorn.ArrowFunctionExpression;\n\nexport function containsUseGpuDirective(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 === useGpuDirective\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function removeUseGpuDirective(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 === useGpuDirective\n ),\n );\n }\n\n return cloned;\n}\n\nexport function 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\nexport function 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\nexport const rollUpImpl = (rawOptions: Options) => {\n const options = defu(rawOptions, defaultOptions);\n\n return {\n name: 'unplugin-typegpu' as const,\n enforce: options.enforce,\n transform: {\n filter: options.earlyPruning\n ? {\n id: options,\n code: earlyPruneRegex,\n }\n : {\n id: options,\n },\n handler(\n this: UnpluginBuildContext & UnpluginContext,\n code: string,\n id: string,\n ) {\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 let ast: Node;\n try {\n ast = this.parse(code, {\n lang: 'ts',\n allowReturnOutsideFunction: true,\n }) as Node;\n } catch (cause) {\n console.warn(\n `[unplugin-typegpu] Failed to parse ${id}. Cause: ${\n typeof cause === 'object' && cause && 'message' in cause\n ? cause.message\n : cause\n }`,\n );\n return undefined;\n }\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 const parent = _parent 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: removeUseGpuDirective(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 (containsUseGpuDirective(node)) {\n tgslFunctionDefs.push({\n def: removeUseGpuDirective(node),\n name: getFunctionName(node, parent),\n });\n this.skip();\n }\n }\n },\n });\n\n for (const { def, name } of tgslFunctionDefs) {\n const { params, body, externalNames } = transpileFn(def);\n const isFunctionStatement = def.type === 'FunctionDeclaration';\n\n if (\n isFunctionStatement &&\n name &&\n code.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 name: ${name ? `\"${name}\"` : 'undefined'},\n ast: ${embedJSON({ params, body, externalNames })},\n get externals() { return {${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"]}
@@ -0,0 +1,2 @@
1
+ import*as b from"@babel/standalone";import M from"defu";import{FORMAT_VERSION as L}from"tinyest";import{transpileFn as W}from"tinyest-for-wgsl";var E={include:/\.m?[jt]sx?(?:\?.*)?$/,autoNamingEnabled:!0,earlyPruning:!0};function F(r){return JSON.stringify(r).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function O(r,e){let t="",n=e;for(;;)if(n.type==="MemberExpression"){if((n.property.type==="Literal"||n.property.type==="StringLiteral")&&n.property.value==="~unstable"){n=n.object;continue}if(n.property.type!=="Identifier")break;t=t?`${n.property.name}.${t}`:n.property.name,n=n.object}else if(n.type==="Identifier"){t=t?`${n.name}.${t}`:n.name;break}else break;return r.tgpuAliases.has(t)}function A(r,e){if(r.source.value==="typegpu")for(let t of r.specifiers)t.type==="ImportDefaultSpecifier"||t.type==="ImportSpecifier"&&t.imported.type==="Identifier"&&t.imported.name==="tgpu"?e.tgpuAliases.add(t.local.name):t.type==="ImportNamespaceSpecifier"&&e.tgpuAliases.add(`${t.local.name}.tgpu`)}var T=["fn","vertexFn","fragmentFn","computeFn"];function m(r,e){return r.callee.type==="CallExpression"&&r.callee.callee.type==="MemberExpression"&&r.callee.callee.property.type==="Identifier"&&T.includes(r.callee.callee.property.name)&&r.arguments.length===1&&O(e,r.callee.callee.object)}function N(r,e){var t;return(e==null?void 0:e.type)==="VariableDeclarator"&&e.id.type==="Identifier"?e.id.name:r.type==="FunctionDeclaration"||r.type==="FunctionExpression"?(t=r.id)==null?void 0:t.name:void 0}var x=["bindGroupLayout","vertexLayout","slot","accessor","privateVar","workgroupVar","const",...T,"struct","unstruct","createBuffer","createMutable","createReadonly","createUniform","createQuerySet","createPipeline","createGuardedComputePipeline","createTexture","createSampler","createComparisonSampler"];function l(r,e){if(r.type==="CallExpression"){if(m(r,e)||r.callee.type==="Identifier"&&x.includes(r.callee.name))return!0;if(r.callee.type==="MemberExpression"){if(r.callee.property.type==="Identifier"){if(x.includes(r.callee.property.name))return!0;if(r.callee.property.name==="$name")return!1}return l(r.callee.object,e)}}return r.type==="TaggedTemplateExpression"?l(r.tag,e):!1}function p(r,e,t){r.autoNamingEnabled&&(e.type==="VariableDeclarator"&&e.id.type==="Identifier"&&e.init&&l(e.init,r)?t(e.init,e.id.name):e.type==="AssignmentExpression"&&e.left.type==="Identifier"&&l(e.right,r)?t(e.right,e.left.name):(e.type==="Property"||e.type==="ObjectProperty")&&e.key.type==="Identifier"&&l(e.value,r)&&t(e.value,e.key.name))}var S="use gpu",V=[/["']use gpu["']/,/t(ype)?gpu/];import{resolve as k}from"pathe";import h from"picomatch";function P(r){let e=r||[];return Array.isArray(e)?e:[e]}var j=/\\/g;function u(r){return r.replace(j,"/")}var w=/^(?:\/|(?:[A-Z]:)?[/\\|])/i;function D(r){return w.test(r)}function R(r,e){if(r.startsWith("**")||D(r))return u(r);let t=k(e,r);return u(t)}function I(r){if(r instanceof RegExp)return o=>{let s=u(o),f=r.test(s);return r.lastIndex=0,f};let e=process.cwd(),t=R(r,e),n=h(t,{dot:!0});return o=>{let s=u(o);return n(s)}}function _(r,e){if(!(!r&&!e))return t=>r!=null&&r.some(n=>n(t))?!1:e!=null&&e.some(n=>n(t))?!0:!(e&&e.length>0)}function G(r){return typeof r=="string"||r instanceof RegExp?{include:[r]}:Array.isArray(r)?{include:r}:{exclude:r.exclude?P(r.exclude):void 0,include:r.include?P(r.include):void 0}}function $(r){if(!r)return;let{exclude:e,include:t}=G(r),n=e==null?void 0:e.map(I),o=t==null?void 0:t.map(I);return _(n,o)}function v(r){let e=$(r);return e?t=>!!e(t):void 0}var C=b.packages.template,i=b.packages.types;function d(r){var e,t;return("directives"in r.body?(t=(e=r.body)==null?void 0:e.directives)!=null?t:[]:[]).map(n=>n.value.value).includes(S)}function a(r){return i.identifier(r)}function c(r,e){let{params:t,body:n,externalNames:o}=W(r),s=N(r,e),f=i.objectExpression([i.objectProperty(a("v"),i.numericLiteral(L)),i.objectProperty(a("name"),s?i.stringLiteral(s):i.buildUndefinedNode()),i.objectProperty(a("ast"),C.expression`${F({params:t,body:n,externalNames:o})}`()),i.objectMethod("get",a("externals"),[],i.blockStatement([i.returnStatement(i.objectExpression(o.map(y=>i.objectProperty(a(y),a(y),!1,!0))))]))]);return i.callExpression(i.arrowFunctionExpression([a("$")],i.logicalExpression("&&",i.callExpression(i.memberExpression(i.assignmentExpression("??=",i.memberExpression(a("globalThis"),a("__TYPEGPU_META__")),i.newExpression(a("WeakMap"),[])),a("set")),[i.assignmentExpression("=",i.memberExpression(a("$"),a("f")),r),f]),i.memberExpression(a("$"),a("f")))),[i.objectExpression([])])}function g(r,e){return i.callExpression(C.expression("globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)",{placeholderPattern:!1})(),[r,i.stringLiteral(e)])}function U(r){return{VariableDeclarator(e){p(r,e.node,(t,n)=>{e.get("init").replaceWith(g(t,n))})},AssignmentExpression(e){p(r,e.node,(t,n)=>{e.get("right").replaceWith(g(t,n))})},ObjectProperty(e){p(r,e.node,(t,n)=>{e.get("value").replaceWith(g(t,n))})},ImportDeclaration(e){A(e.node,r)},ArrowFunctionExpression(e){let t=e.node,n=e.parentPath.node;d(t)&&(e.replaceWith(c(t,n)),e.skip())},FunctionExpression(e){let t=e.node,n=e.parentPath.node;d(t)&&(e.replaceWith(c(t,n)),e.skip())},FunctionDeclaration(e){let t=e.node,n=e.parentPath.node,o=i.functionExpression(t.id,t.params,t.body);d(e.node)&&t.id&&(e.replaceWith(i.variableDeclaration("const",[i.variableDeclarator(t.id,c(o,n))])),e.skip())},CallExpression(e){let t=e.node;if(m(t,r)){let n=t.arguments[0];if(n&&(n.type==="FunctionExpression"||n.type==="ArrowFunctionExpression")){let o=c(n,null);e.replaceWith(i.callExpression(t.callee,[o])),e.skip()}}}}}function q(){return{visitor:{Program(r,e){let t=M(e.opts,E),n=e.filename,o=v(t);if(n&&o&&!(o!=null&&o(n)))return;let s={tgpuAliases:new Set(t.forceTgpuAlias?[t.forceTgpuAlias]:[]),fileId:n,autoNamingEnabled:t.autoNamingEnabled};r.traverse(U(s))}}}}export{E as a,F as b,A as c,m as d,N as e,p as f,S as g,V as h,q as i};
2
+ //# sourceMappingURL=chunk-M7Y5AIYS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/babel.ts","../src/common.ts","../src/filter.ts"],"sourcesContent":["import * as Babel from '@babel/standalone';\nimport type TemplateGenerator from '@babel/template';\nimport type { TraverseOptions } from '@babel/traverse';\nimport type * as babel from '@babel/types';\nimport defu from 'defu';\nimport { FORMAT_VERSION } from 'tinyest';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport {\n type Context,\n defaultOptions,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\nimport { createFilterForId } from './filter.ts';\n\n// NOTE: @babel/standalone does expose internal packages, as specified in the docs, but the\n// typing for @babel/standalone does not expose them.\nconst template = (\n Babel as unknown as { packages: { template: typeof TemplateGenerator } }\n).packages.template;\nconst types = (Babel as unknown as { packages: { types: typeof babel } })\n .packages.types;\n\nfunction containsUseGpuDirective(\n node:\n | babel.FunctionDeclaration\n | babel.FunctionExpression\n | babel.ArrowFunctionExpression,\n): boolean {\n return ((\n 'directives' in node.body ? (node.body?.directives ?? []) : []\n )\n .map((directive) => directive.value.value))\n .includes(useGpuDirective);\n}\n\nfunction i(identifier: string): babel.Identifier {\n return types.identifier(identifier);\n}\n\nfunction functionToTranspiled(\n node: babel.ArrowFunctionExpression | babel.FunctionExpression,\n parent: babel.Node | null,\n): babel.CallExpression {\n const { params, body, externalNames } = transpileFn(node);\n const maybeName = getFunctionName(node, parent);\n\n const metadata = types.objectExpression([\n types.objectProperty(\n i('v'),\n types.numericLiteral(FORMAT_VERSION),\n ),\n types.objectProperty(\n i('name'),\n maybeName ? types.stringLiteral(maybeName) : types.buildUndefinedNode(),\n ),\n types.objectProperty(\n i('ast'),\n template.expression`${embedJSON({ params, body, externalNames })}`(),\n ),\n types.objectMethod(\n 'get',\n i('externals'),\n [],\n types.blockStatement([\n types.returnStatement(\n types.objectExpression(\n externalNames.map((name) =>\n types.objectProperty(i(name), i(name), false, true)\n ),\n ),\n ),\n ]),\n ),\n ]);\n\n return types.callExpression(\n types.arrowFunctionExpression(\n [i('$')],\n types.logicalExpression(\n '&&',\n types.callExpression(\n types.memberExpression(\n types.assignmentExpression(\n '??=',\n types.memberExpression(i('globalThis'), i('__TYPEGPU_META__')),\n types.newExpression(i('WeakMap'), []),\n ),\n i('set'),\n ),\n [\n types.assignmentExpression(\n '=',\n types.memberExpression(i('$'), i('f')),\n node,\n ),\n metadata,\n ],\n ),\n types.memberExpression(i('$'), i('f')),\n ),\n ),\n [types.objectExpression([])],\n );\n}\n\nfunction wrapInAutoName(\n node: babel.Expression,\n name: string,\n) {\n return types.callExpression(\n template.expression('globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)', {\n placeholderPattern: false,\n })(),\n [node, types.stringLiteral(name)],\n );\n}\n\nfunction functionVisitor(ctx: Context): TraverseOptions {\n return {\n VariableDeclarator(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('init').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n AssignmentExpression(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('right').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ObjectProperty(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('value').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ImportDeclaration(path) {\n gatherTgpuAliases(path.node, ctx);\n },\n\n ArrowFunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionDeclaration(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n const expression = types.functionExpression(\n node.id,\n node.params,\n node.body,\n );\n\n if (containsUseGpuDirective(path.node) && node.id) {\n path.replaceWith(\n types.variableDeclaration('const', [\n types.variableDeclarator(\n node.id,\n functionToTranspiled(expression, parent),\n ),\n ]),\n );\n path.skip();\n }\n },\n\n CallExpression(path) {\n const node = path.node;\n\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 transpiled = functionToTranspiled(\n implementation,\n null,\n ) as babel.CallExpression;\n\n path.replaceWith(\n types.callExpression(node.callee, [\n transpiled,\n ]),\n );\n\n path.skip();\n }\n }\n },\n };\n}\n\nexport default function () {\n return {\n visitor: {\n Program(path, state) {\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const options = defu((state as any).opts as Options, defaultOptions);\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const id: string | undefined = (state as any).filename;\n\n const filter = createFilterForId(options);\n if (id && filter && !filter?.(id)) {\n return;\n }\n\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 path.traverse(functionVisitor(ctx));\n },\n } satisfies TraverseOptions,\n };\n}\n","import type * as babel from '@babel/types';\nimport type * as acorn from 'acorn';\nimport type { FilterPattern } from 'unplugin';\n\nexport type Context = {\n /**\n * How the `tgpu` object is used in code. Since it can be aliased, we\n * need to catch that and act accordingly.\n */\n tgpuAliases: Set<string>;\n fileId?: string | undefined;\n autoNamingEnabled: boolean;\n};\n\nexport interface Options {\n /** @default [/\\.m?[jt]sx?$/] */\n include?: FilterPattern;\n\n /** @default undefined */\n exclude?: FilterPattern;\n\n /** @default undefined */\n enforce?: 'post' | 'pre' | undefined;\n\n /** @default undefined */\n forceTgpuAlias?: string | undefined;\n\n /** @default true */\n autoNamingEnabled?: boolean | undefined;\n\n /**\n * Skipping files that don't contain \"typegpu\", \"tgpu\" or \"use gpu\".\n * In case this early pruning hinders transformation, you\n * can disable it.\n *\n * @default true\n */\n earlyPruning?: boolean | undefined;\n}\n\nexport const defaultOptions = {\n include: /\\.m?[jt]sx?(?:\\?.*)?$/,\n autoNamingEnabled: true,\n earlyPruning: true,\n};\n\nexport function embedJSON(jsValue: unknown) {\n return JSON.stringify(jsValue)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Checks if `node` is an alias for the 'tgpu' object, traditionally\n * available via `import tgpu from 'typegpu'`.\n */\nfunction isTgpu(ctx: Context, node: babel.Node | acorn.AnyNode): boolean {\n let path = '';\n\n let tail = node;\n while (true) {\n if (tail.type === 'MemberExpression') {\n if (\n (tail.property.type === 'Literal' ||\n tail.property.type === 'StringLiteral') &&\n tail.property.value === '~unstable'\n ) {\n // Bypassing the '~unstable' property.\n tail = tail.object;\n continue;\n }\n\n if (tail.property.type !== 'Identifier') {\n // Not handling computed expressions.\n break;\n }\n\n path = path ? `${tail.property.name}.${path}` : tail.property.name;\n tail = tail.object;\n } else if (tail.type === 'Identifier') {\n path = path ? `${tail.name}.${path}` : tail.name;\n break;\n } else {\n break;\n }\n }\n\n return ctx.tgpuAliases.has(path);\n}\n\nexport function gatherTgpuAliases(\n node: acorn.ImportDeclaration | babel.ImportDeclaration,\n ctx: Context,\n) {\n if (node.source.value === 'typegpu') {\n for (const spec of node.specifiers) {\n if (\n // The default export of 'typegpu' is the `tgpu` object.\n spec.type === 'ImportDefaultSpecifier' ||\n // Aliasing 'tgpu' while importing, e.g. import { tgpu as t } from 'typegpu';\n (spec.type === 'ImportSpecifier' &&\n spec.imported.type === 'Identifier' &&\n spec.imported.name === 'tgpu')\n ) {\n ctx.tgpuAliases.add(spec.local.name);\n } else if (spec.type === 'ImportNamespaceSpecifier') {\n // Importing everything, e.g. import * as t from 'typegpu';\n ctx.tgpuAliases.add(`${spec.local.name}.tgpu`);\n }\n }\n }\n}\n\nconst fnShellFunctionNames = ['fn', 'vertexFn', 'fragmentFn', 'computeFn'];\n\nexport function isShellImplementationCall(\n node: acorn.CallExpression | babel.CallExpression,\n ctx: Context,\n) {\n return (\n node.callee.type === 'CallExpression' &&\n node.callee.callee.type === 'MemberExpression' &&\n node.callee.callee.property.type === 'Identifier' &&\n fnShellFunctionNames.includes(node.callee.callee.property.name) &&\n node.arguments.length === 1 && isTgpu(ctx, node.callee.callee.object)\n );\n}\n\nexport function getFunctionName(\n node: acorn.AnyNode | babel.Node,\n parent: acorn.AnyNode | babel.Node | null,\n): string | undefined {\n if (\n parent?.type === 'VariableDeclarator' && parent.id.type === 'Identifier'\n ) {\n return parent.id.name;\n }\n return node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression'\n ? node.id?.name\n : undefined;\n}\n\nconst resourceConstructors: string[] = [\n // tgpu\n 'bindGroupLayout',\n 'vertexLayout',\n // tgpu['~unstable']\n 'slot',\n 'accessor',\n 'privateVar',\n 'workgroupVar',\n 'const',\n ...fnShellFunctionNames,\n // d\n 'struct',\n 'unstruct',\n // root\n 'createBuffer',\n 'createMutable',\n 'createReadonly',\n 'createUniform',\n 'createQuerySet',\n // root['~unstable']\n 'createPipeline',\n 'createGuardedComputePipeline',\n 'createTexture',\n 'createSampler',\n 'createComparisonSampler',\n];\n\n/**\n * Checks if `node` should be wrapped in an autoname function.\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n */\nfunction containsResourceConstructorCall(\n node: acorn.AnyNode | babel.Node,\n ctx: Context,\n) {\n if (node.type === 'CallExpression') {\n if (isShellImplementationCall(node, ctx)) {\n return true;\n }\n // struct({...})\n if (\n node.callee.type === 'Identifier' &&\n resourceConstructors.includes(node.callee.name)\n ) {\n return true;\n }\n if (node.callee.type === 'MemberExpression') {\n if (node.callee.property.type === 'Identifier') {\n // root.createBuffer({...})\n if (resourceConstructors.includes(node.callee.property.name)) {\n return true;\n }\n if (node.callee.property.name === '$name') {\n return false;\n }\n }\n // root.createBuffer(d.f32).$usage('storage')\n return containsResourceConstructorCall(node.callee.object, ctx);\n }\n }\n if (node.type === 'TaggedTemplateExpression') {\n return containsResourceConstructorCall(node.tag, ctx);\n }\n return false;\n}\n\ntype ExpressionFor<T extends acorn.AnyNode | babel.Node> = T extends\n acorn.AnyNode ? acorn.Expression : babel.Expression;\n\n/**\n * Checks if `node` contains a label and a tgpu expression that could be named.\n * If so, it calls the provided callback. Nodes selected for naming include:\n *\n * `let name = tgpu.bindGroupLayout({});` (VariableDeclarator)\n *\n * `name = tgpu.bindGroupLayout({});` (AssignmentExpression)\n *\n * `property: tgpu.bindGroupLayout({})` (Property/ObjectProperty)\n *\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n *\n * This function is NOT used for auto-naming shell-less functions.\n * Those are handled separately.\n *\n * @privateRemarks\n * When adding new checks, you need to call this method in the corresponding node in Babel.\n */\nexport function performExpressionNaming<T extends acorn.AnyNode | babel.Node>(\n ctx: Context,\n node: T,\n namingCallback: (node: ExpressionFor<T>, name: string) => void,\n) {\n if (!ctx.autoNamingEnabled) {\n return;\n }\n\n if (\n node.type === 'VariableDeclarator' &&\n node.id.type === 'Identifier' &&\n node.init &&\n containsResourceConstructorCall(node.init, ctx)\n ) {\n namingCallback(node.init as ExpressionFor<T>, node.id.name);\n } else if (\n node.type === 'AssignmentExpression' &&\n node.left.type === 'Identifier' &&\n containsResourceConstructorCall(node.right, ctx)\n ) {\n namingCallback(node.right as ExpressionFor<T>, node.left.name);\n } else if (\n (node.type === 'Property' || node.type === 'ObjectProperty') &&\n node.key.type === 'Identifier' &&\n containsResourceConstructorCall(node.value, ctx)\n ) {\n namingCallback(node.value as ExpressionFor<T>, node.key.name);\n }\n}\n\nexport const useGpuDirective = 'use gpu';\n\n/** Regular expressions used for early pruning (to avoid unnecessary parsing, which is expensive) */\nexport const earlyPruneRegex = [/[\"']use gpu[\"']/, /t(ype)?gpu/];\n","// Copied from https://github.com/unjs/unplugin/blob/f514bf8e2d751b48b3a5acb1077eb1292d9711b3/src/utils/filter.ts#L2\n// Used only in the babel version of the plugin, since others can rely on native unplugin functionality.\n\nimport { resolve } from 'pathe';\nimport picomatch from 'picomatch';\nimport type {\n Arrayable,\n Nullable,\n StringFilter,\n StringOrRegExp,\n} from 'unplugin';\n\nfunction toArray<T>(array?: Nullable<Arrayable<T>>): Array<T> {\n const result = array || [];\n if (Array.isArray(result)) return result;\n return [result];\n}\n\nconst BACKSLASH_REGEX = /\\\\/g;\nfunction normalize(path: string): string {\n return path.replace(BACKSLASH_REGEX, '/');\n}\n\nconst ABSOLUTE_PATH_REGEX = /^(?:\\/|(?:[A-Z]:)?[/\\\\|])/i;\nfunction isAbsolute(path: string): boolean {\n return ABSOLUTE_PATH_REGEX.test(path);\n}\n\nexport type PluginFilter = (input: string) => boolean;\nexport type TransformHookFilter = (id: string, code: string) => boolean;\n\ninterface NormalizedStringFilter {\n include?: StringOrRegExp[] | undefined;\n exclude?: StringOrRegExp[] | undefined;\n}\n\nfunction getMatcherString(glob: string, cwd: string) {\n if (glob.startsWith('**') || isAbsolute(glob)) {\n return normalize(glob);\n }\n\n const resolved = resolve(cwd, glob);\n return normalize(resolved);\n}\n\nfunction patternToIdFilter(pattern: StringOrRegExp): PluginFilter {\n if (pattern instanceof RegExp) {\n return (id: string) => {\n const normalizedId = normalize(id);\n const result = pattern.test(normalizedId);\n pattern.lastIndex = 0;\n return result;\n };\n }\n const cwd = process.cwd();\n const glob = getMatcherString(pattern, cwd);\n const matcher = picomatch(glob, { dot: true });\n return (id: string) => {\n const normalizedId = normalize(id);\n return matcher(normalizedId);\n };\n}\n\nfunction patternToCodeFilter(pattern: StringOrRegExp): PluginFilter {\n if (pattern instanceof RegExp) {\n return (code: string) => {\n const result = pattern.test(code);\n pattern.lastIndex = 0;\n return result;\n };\n }\n return (code: string) => code.includes(pattern);\n}\n\nfunction createFilter(\n exclude: PluginFilter[] | undefined,\n include: PluginFilter[] | undefined,\n): PluginFilter | undefined {\n if (!exclude && !include) {\n return;\n }\n\n return (input) => {\n if (exclude?.some((filter) => filter(input))) {\n return false;\n }\n if (include?.some((filter) => filter(input))) {\n return true;\n }\n return !(include && include.length > 0);\n };\n}\n\nfunction normalizeFilter(filter: StringFilter): NormalizedStringFilter {\n if (typeof filter === 'string' || filter instanceof RegExp) {\n return {\n include: [filter],\n };\n }\n if (Array.isArray(filter)) {\n return {\n include: filter,\n };\n }\n return {\n exclude: filter.exclude ? toArray(filter.exclude) : undefined,\n include: filter.include ? toArray(filter.include) : undefined,\n };\n}\n\nfunction createIdFilter(\n filter: StringFilter | undefined,\n): PluginFilter | undefined {\n if (!filter) return;\n const { exclude, include } = normalizeFilter(filter);\n const excludeFilter = exclude?.map(patternToIdFilter);\n const includeFilter = include?.map(patternToIdFilter);\n return createFilter(excludeFilter, includeFilter);\n}\n\nfunction createCodeFilter(\n filter: StringFilter | undefined,\n): PluginFilter | undefined {\n if (!filter) return;\n const { exclude, include } = normalizeFilter(filter);\n const excludeFilter = exclude?.map(patternToCodeFilter);\n const includeFilter = include?.map(patternToCodeFilter);\n return createFilter(excludeFilter, includeFilter);\n}\n\nexport function createFilterForId(\n filter: StringFilter | undefined,\n): PluginFilter | undefined {\n const filterFunction = createIdFilter(filter);\n return filterFunction ? (id) => !!filterFunction(id) : undefined;\n}\n\nfunction createFilterForTransform(\n idFilter: StringFilter | undefined,\n codeFilter: StringFilter | undefined,\n): TransformHookFilter | undefined {\n if (!idFilter && !codeFilter) return;\n const idFilterFunction = createIdFilter(idFilter);\n const codeFilterFunction = createCodeFilter(codeFilter);\n return (id, code) => {\n let fallback = true;\n if (idFilterFunction) {\n fallback &&= idFilterFunction(id);\n }\n if (!fallback) {\n return false;\n }\n\n if (codeFilterFunction) {\n fallback &&= codeFilterFunction(code);\n }\n return fallback;\n };\n}\n"],"mappings":"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","names":["Babel","defu","FORMAT_VERSION","transpileFn","defaultOptions","embedJSON","jsValue","isTgpu","ctx","node","path","tail","gatherTgpuAliases","spec","fnShellFunctionNames","isShellImplementationCall","getFunctionName","parent","_a","resourceConstructors","containsResourceConstructorCall","performExpressionNaming","namingCallback","useGpuDirective","earlyPruneRegex","resolve","picomatch","toArray","array","result","BACKSLASH_REGEX","normalize","path","ABSOLUTE_PATH_REGEX","isAbsolute","getMatcherString","glob","cwd","resolved","patternToIdFilter","pattern","id","normalizedId","matcher","createFilter","exclude","include","input","filter","normalizeFilter","toArray","createIdFilter","excludeFilter","patternToIdFilter","includeFilter","createFilterForId","filter","filterFunction","createIdFilter","id","template","types","containsUseGpuDirective","node","_a","_b","directive","useGpuDirective","i","identifier","functionToTranspiled","parent","params","body","externalNames","transpileFn","maybeName","getFunctionName","metadata","FORMAT_VERSION","embedJSON","name","wrapInAutoName","functionVisitor","ctx","path","performExpressionNaming","gatherTgpuAliases","expression","isShellImplementationCall","implementation","transpiled","babel_default","state","options","defu","defaultOptions","id","filter","createFilterForId"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _standalone = require('@babel/standalone'); var b = _interopRequireWildcard(_standalone);var _defu = require('defu'); var _defu2 = _interopRequireDefault(_defu);var _tinyest = require('tinyest');var _tinyestforwgsl = require('tinyest-for-wgsl');var E={include:/\.m?[jt]sx?(?:\?.*)?$/,autoNamingEnabled:!0,earlyPruning:!0};function F(r){return JSON.stringify(r).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function O(r,e){let t="",n=e;for(;;)if(n.type==="MemberExpression"){if((n.property.type==="Literal"||n.property.type==="StringLiteral")&&n.property.value==="~unstable"){n=n.object;continue}if(n.property.type!=="Identifier")break;t=t?`${n.property.name}.${t}`:n.property.name,n=n.object}else if(n.type==="Identifier"){t=t?`${n.name}.${t}`:n.name;break}else break;return r.tgpuAliases.has(t)}function A(r,e){if(r.source.value==="typegpu")for(let t of r.specifiers)t.type==="ImportDefaultSpecifier"||t.type==="ImportSpecifier"&&t.imported.type==="Identifier"&&t.imported.name==="tgpu"?e.tgpuAliases.add(t.local.name):t.type==="ImportNamespaceSpecifier"&&e.tgpuAliases.add(`${t.local.name}.tgpu`)}var T=["fn","vertexFn","fragmentFn","computeFn"];function m(r,e){return r.callee.type==="CallExpression"&&r.callee.callee.type==="MemberExpression"&&r.callee.callee.property.type==="Identifier"&&T.includes(r.callee.callee.property.name)&&r.arguments.length===1&&O(e,r.callee.callee.object)}function N(r,e){var t;return(e==null?void 0:e.type)==="VariableDeclarator"&&e.id.type==="Identifier"?e.id.name:r.type==="FunctionDeclaration"||r.type==="FunctionExpression"?(t=r.id)==null?void 0:t.name:void 0}var x=["bindGroupLayout","vertexLayout","slot","accessor","privateVar","workgroupVar","const",...T,"struct","unstruct","createBuffer","createMutable","createReadonly","createUniform","createQuerySet","createPipeline","createGuardedComputePipeline","createTexture","createSampler","createComparisonSampler"];function l(r,e){if(r.type==="CallExpression"){if(m(r,e)||r.callee.type==="Identifier"&&x.includes(r.callee.name))return!0;if(r.callee.type==="MemberExpression"){if(r.callee.property.type==="Identifier"){if(x.includes(r.callee.property.name))return!0;if(r.callee.property.name==="$name")return!1}return l(r.callee.object,e)}}return r.type==="TaggedTemplateExpression"?l(r.tag,e):!1}function p(r,e,t){r.autoNamingEnabled&&(e.type==="VariableDeclarator"&&e.id.type==="Identifier"&&e.init&&l(e.init,r)?t(e.init,e.id.name):e.type==="AssignmentExpression"&&e.left.type==="Identifier"&&l(e.right,r)?t(e.right,e.left.name):(e.type==="Property"||e.type==="ObjectProperty")&&e.key.type==="Identifier"&&l(e.value,r)&&t(e.value,e.key.name))}var S="use gpu",V= exports.h =[/["']use gpu["']/,/t(ype)?gpu/];var _pathe = require('pathe');var _picomatch = require('picomatch'); var _picomatch2 = _interopRequireDefault(_picomatch);function P(r){let e=r||[];return Array.isArray(e)?e:[e]}var j=/\\/g;function u(r){return r.replace(j,"/")}var w=/^(?:\/|(?:[A-Z]:)?[/\\|])/i;function D(r){return w.test(r)}function R(r,e){if(r.startsWith("**")||D(r))return u(r);let t=_pathe.resolve.call(void 0, e,r);return u(t)}function I(r){if(r instanceof RegExp)return o=>{let s=u(o),f=r.test(s);return r.lastIndex=0,f};let e=process.cwd(),t=R(r,e),n=_picomatch2.default.call(void 0, t,{dot:!0});return o=>{let s=u(o);return n(s)}}function _(r,e){if(!(!r&&!e))return t=>r!=null&&r.some(n=>n(t))?!1:e!=null&&e.some(n=>n(t))?!0:!(e&&e.length>0)}function G(r){return typeof r=="string"||r instanceof RegExp?{include:[r]}:Array.isArray(r)?{include:r}:{exclude:r.exclude?P(r.exclude):void 0,include:r.include?P(r.include):void 0}}function $(r){if(!r)return;let{exclude:e,include:t}=G(r),n=e==null?void 0:e.map(I),o=t==null?void 0:t.map(I);return _(n,o)}function v(r){let e=$(r);return e?t=>!!e(t):void 0}var C=b.packages.template,i=b.packages.types;function d(r){var e,t;return("directives"in r.body?(t=(e=r.body)==null?void 0:e.directives)!=null?t:[]:[]).map(n=>n.value.value).includes(S)}function a(r){return i.identifier(r)}function c(r,e){let{params:t,body:n,externalNames:o}=_tinyestforwgsl.transpileFn.call(void 0, r),s=N(r,e),f=i.objectExpression([i.objectProperty(a("v"),i.numericLiteral(_tinyest.FORMAT_VERSION)),i.objectProperty(a("name"),s?i.stringLiteral(s):i.buildUndefinedNode()),i.objectProperty(a("ast"),C.expression`${F({params:t,body:n,externalNames:o})}`()),i.objectMethod("get",a("externals"),[],i.blockStatement([i.returnStatement(i.objectExpression(o.map(y=>i.objectProperty(a(y),a(y),!1,!0))))]))]);return i.callExpression(i.arrowFunctionExpression([a("$")],i.logicalExpression("&&",i.callExpression(i.memberExpression(i.assignmentExpression("??=",i.memberExpression(a("globalThis"),a("__TYPEGPU_META__")),i.newExpression(a("WeakMap"),[])),a("set")),[i.assignmentExpression("=",i.memberExpression(a("$"),a("f")),r),f]),i.memberExpression(a("$"),a("f")))),[i.objectExpression([])])}function g(r,e){return i.callExpression(C.expression("globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)",{placeholderPattern:!1})(),[r,i.stringLiteral(e)])}function U(r){return{VariableDeclarator(e){p(r,e.node,(t,n)=>{e.get("init").replaceWith(g(t,n))})},AssignmentExpression(e){p(r,e.node,(t,n)=>{e.get("right").replaceWith(g(t,n))})},ObjectProperty(e){p(r,e.node,(t,n)=>{e.get("value").replaceWith(g(t,n))})},ImportDeclaration(e){A(e.node,r)},ArrowFunctionExpression(e){let t=e.node,n=e.parentPath.node;d(t)&&(e.replaceWith(c(t,n)),e.skip())},FunctionExpression(e){let t=e.node,n=e.parentPath.node;d(t)&&(e.replaceWith(c(t,n)),e.skip())},FunctionDeclaration(e){let t=e.node,n=e.parentPath.node,o=i.functionExpression(t.id,t.params,t.body);d(e.node)&&t.id&&(e.replaceWith(i.variableDeclaration("const",[i.variableDeclarator(t.id,c(o,n))])),e.skip())},CallExpression(e){let t=e.node;if(m(t,r)){let n=t.arguments[0];if(n&&(n.type==="FunctionExpression"||n.type==="ArrowFunctionExpression")){let o=c(n,null);e.replaceWith(i.callExpression(t.callee,[o])),e.skip()}}}}}function q(){return{visitor:{Program(r,e){let t=_defu2.default.call(void 0, e.opts,E),n=e.filename,o=v(t);if(n&&o&&!(o!=null&&o(n)))return;let s={tgpuAliases:new Set(t.forceTgpuAlias?[t.forceTgpuAlias]:[]),fileId:n,autoNamingEnabled:t.autoNamingEnabled};r.traverse(U(s))}}}}exports.a = E; exports.b = F; exports.c = A; exports.d = m; exports.e = N; exports.f = p; exports.g = S; exports.h = V; exports.i = q;
2
+ //# sourceMappingURL=chunk-PAQIRP66.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/babel.ts","../src/common.ts"],"names":["defaultOptions","embedJSON","jsValue","isTgpu","ctx","node","path","tail"],"mappings":"AAAA,whBAAuB,wEAIN,kCACc,kDACH,ICkCfA,CAAAA,CAAiB,CAC5B,OAAA,CAAS,uBAAA,CACT,iBAAA,CAAmB,CAAA,CAAA,CACnB,YAAA,CAAc,CAAA,CAChB,CAAA,CAEO,SAASC,CAAAA,CAAUC,CAAAA,CAAkB,CAC1C,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAO,CAAA,CAC1B,OAAA,CAAQ,SAAA,CAAW,SAAS,CAAA,CAC5B,OAAA,CAAQ,SAAA,CAAW,SAAS,CACjC,CAMA,SAASC,CAAAA,CAAOC,CAAAA,CAAcC,CAAAA,CAA2C,CACvE,IAAIC,CAAAA,CAAO,EAAA,CAEPC,CAAAA,CAAOF,CAAAA,CACX,GAAA,CAAA,CAAA,CAAA,CACE,EAAA,CAAIE,CAAAA,CAAK,IAAA,GAAS,kBAAA,CAAoB,CACpC,EAAA,CAAA,CACGA,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,SAAA,EACtBA,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,eAAA,CAAA,EACzBA,CAAAA,CAAK,QAAA,CAAS,KAAA,GAAU,WAAA,CACxB,CAEAA,CAAAA,CAAOA,CAAAA,CAAK,MAAA,CACZ,QACF,CAEA,EAAA,CAAIA,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,YAAA,CAEzB,KAAA,CAGFD,CAAAA,CAAOA,CAAAA,CAAO,CAAA,EAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-PAQIRP66.cjs","sourcesContent":["import * as Babel from '@babel/standalone';\nimport type TemplateGenerator from '@babel/template';\nimport type { TraverseOptions } from '@babel/traverse';\nimport type * as babel from '@babel/types';\nimport defu from 'defu';\nimport { FORMAT_VERSION } from 'tinyest';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport {\n type Context,\n defaultOptions,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\nimport { createFilterForId } from './filter.ts';\n\n// NOTE: @babel/standalone does expose internal packages, as specified in the docs, but the\n// typing for @babel/standalone does not expose them.\nconst template = (\n Babel as unknown as { packages: { template: typeof TemplateGenerator } }\n).packages.template;\nconst types = (Babel as unknown as { packages: { types: typeof babel } })\n .packages.types;\n\nfunction containsUseGpuDirective(\n node:\n | babel.FunctionDeclaration\n | babel.FunctionExpression\n | babel.ArrowFunctionExpression,\n): boolean {\n return ((\n 'directives' in node.body ? (node.body?.directives ?? []) : []\n )\n .map((directive) => directive.value.value))\n .includes(useGpuDirective);\n}\n\nfunction i(identifier: string): babel.Identifier {\n return types.identifier(identifier);\n}\n\nfunction functionToTranspiled(\n node: babel.ArrowFunctionExpression | babel.FunctionExpression,\n parent: babel.Node | null,\n): babel.CallExpression {\n const { params, body, externalNames } = transpileFn(node);\n const maybeName = getFunctionName(node, parent);\n\n const metadata = types.objectExpression([\n types.objectProperty(\n i('v'),\n types.numericLiteral(FORMAT_VERSION),\n ),\n types.objectProperty(\n i('name'),\n maybeName ? types.stringLiteral(maybeName) : types.buildUndefinedNode(),\n ),\n types.objectProperty(\n i('ast'),\n template.expression`${embedJSON({ params, body, externalNames })}`(),\n ),\n types.objectMethod(\n 'get',\n i('externals'),\n [],\n types.blockStatement([\n types.returnStatement(\n types.objectExpression(\n externalNames.map((name) =>\n types.objectProperty(i(name), i(name), false, true)\n ),\n ),\n ),\n ]),\n ),\n ]);\n\n return types.callExpression(\n types.arrowFunctionExpression(\n [i('$')],\n types.logicalExpression(\n '&&',\n types.callExpression(\n types.memberExpression(\n types.assignmentExpression(\n '??=',\n types.memberExpression(i('globalThis'), i('__TYPEGPU_META__')),\n types.newExpression(i('WeakMap'), []),\n ),\n i('set'),\n ),\n [\n types.assignmentExpression(\n '=',\n types.memberExpression(i('$'), i('f')),\n node,\n ),\n metadata,\n ],\n ),\n types.memberExpression(i('$'), i('f')),\n ),\n ),\n [types.objectExpression([])],\n );\n}\n\nfunction wrapInAutoName(\n node: babel.Expression,\n name: string,\n) {\n return types.callExpression(\n template.expression('globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)', {\n placeholderPattern: false,\n })(),\n [node, types.stringLiteral(name)],\n );\n}\n\nfunction functionVisitor(ctx: Context): TraverseOptions {\n return {\n VariableDeclarator(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('init').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n AssignmentExpression(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('right').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ObjectProperty(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('value').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ImportDeclaration(path) {\n gatherTgpuAliases(path.node, ctx);\n },\n\n ArrowFunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionDeclaration(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n const expression = types.functionExpression(\n node.id,\n node.params,\n node.body,\n );\n\n if (containsUseGpuDirective(path.node) && node.id) {\n path.replaceWith(\n types.variableDeclaration('const', [\n types.variableDeclarator(\n node.id,\n functionToTranspiled(expression, parent),\n ),\n ]),\n );\n path.skip();\n }\n },\n\n CallExpression(path) {\n const node = path.node;\n\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 transpiled = functionToTranspiled(\n implementation,\n null,\n ) as babel.CallExpression;\n\n path.replaceWith(\n types.callExpression(node.callee, [\n transpiled,\n ]),\n );\n\n path.skip();\n }\n }\n },\n };\n}\n\nexport default function () {\n return {\n visitor: {\n Program(path, state) {\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const options = defu((state as any).opts as Options, defaultOptions);\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const id: string | undefined = (state as any).filename;\n\n const filter = createFilterForId(options);\n if (id && filter && !filter?.(id)) {\n return;\n }\n\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 path.traverse(functionVisitor(ctx));\n },\n } satisfies TraverseOptions,\n };\n}\n","import type * as babel from '@babel/types';\nimport type * as acorn from 'acorn';\nimport type { FilterPattern } from 'unplugin';\n\nexport type Context = {\n /**\n * How the `tgpu` object is used in code. Since it can be aliased, we\n * need to catch that and act accordingly.\n */\n tgpuAliases: Set<string>;\n fileId?: string | undefined;\n autoNamingEnabled: boolean;\n};\n\nexport interface Options {\n /** @default [/\\.m?[jt]sx?$/] */\n include?: FilterPattern;\n\n /** @default undefined */\n exclude?: FilterPattern;\n\n /** @default undefined */\n enforce?: 'post' | 'pre' | undefined;\n\n /** @default undefined */\n forceTgpuAlias?: string | undefined;\n\n /** @default true */\n autoNamingEnabled?: boolean | undefined;\n\n /**\n * Skipping files that don't contain \"typegpu\", \"tgpu\" or \"use gpu\".\n * In case this early pruning hinders transformation, you\n * can disable it.\n *\n * @default true\n */\n earlyPruning?: boolean | undefined;\n}\n\nexport const defaultOptions = {\n include: /\\.m?[jt]sx?(?:\\?.*)?$/,\n autoNamingEnabled: true,\n earlyPruning: true,\n};\n\nexport function embedJSON(jsValue: unknown) {\n return JSON.stringify(jsValue)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Checks if `node` is an alias for the 'tgpu' object, traditionally\n * available via `import tgpu from 'typegpu'`.\n */\nfunction isTgpu(ctx: Context, node: babel.Node | acorn.AnyNode): boolean {\n let path = '';\n\n let tail = node;\n while (true) {\n if (tail.type === 'MemberExpression') {\n if (\n (tail.property.type === 'Literal' ||\n tail.property.type === 'StringLiteral') &&\n tail.property.value === '~unstable'\n ) {\n // Bypassing the '~unstable' property.\n tail = tail.object;\n continue;\n }\n\n if (tail.property.type !== 'Identifier') {\n // Not handling computed expressions.\n break;\n }\n\n path = path ? `${tail.property.name}.${path}` : tail.property.name;\n tail = tail.object;\n } else if (tail.type === 'Identifier') {\n path = path ? `${tail.name}.${path}` : tail.name;\n break;\n } else {\n break;\n }\n }\n\n return ctx.tgpuAliases.has(path);\n}\n\nexport function gatherTgpuAliases(\n node: acorn.ImportDeclaration | babel.ImportDeclaration,\n ctx: Context,\n) {\n if (node.source.value === 'typegpu') {\n for (const spec of node.specifiers) {\n if (\n // The default export of 'typegpu' is the `tgpu` object.\n spec.type === 'ImportDefaultSpecifier' ||\n // Aliasing 'tgpu' while importing, e.g. import { tgpu as t } from 'typegpu';\n (spec.type === 'ImportSpecifier' &&\n spec.imported.type === 'Identifier' &&\n spec.imported.name === 'tgpu')\n ) {\n ctx.tgpuAliases.add(spec.local.name);\n } else if (spec.type === 'ImportNamespaceSpecifier') {\n // Importing everything, e.g. import * as t from 'typegpu';\n ctx.tgpuAliases.add(`${spec.local.name}.tgpu`);\n }\n }\n }\n}\n\nconst fnShellFunctionNames = ['fn', 'vertexFn', 'fragmentFn', 'computeFn'];\n\nexport function isShellImplementationCall(\n node: acorn.CallExpression | babel.CallExpression,\n ctx: Context,\n) {\n return (\n node.callee.type === 'CallExpression' &&\n node.callee.callee.type === 'MemberExpression' &&\n node.callee.callee.property.type === 'Identifier' &&\n fnShellFunctionNames.includes(node.callee.callee.property.name) &&\n node.arguments.length === 1 && isTgpu(ctx, node.callee.callee.object)\n );\n}\n\nexport function getFunctionName(\n node: acorn.AnyNode | babel.Node,\n parent: acorn.AnyNode | babel.Node | null,\n): string | undefined {\n if (\n parent?.type === 'VariableDeclarator' && parent.id.type === 'Identifier'\n ) {\n return parent.id.name;\n }\n return node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression'\n ? node.id?.name\n : undefined;\n}\n\nconst resourceConstructors: string[] = [\n // tgpu\n 'bindGroupLayout',\n 'vertexLayout',\n // tgpu['~unstable']\n 'slot',\n 'accessor',\n 'privateVar',\n 'workgroupVar',\n 'const',\n ...fnShellFunctionNames,\n // d\n 'struct',\n 'unstruct',\n // root\n 'createBuffer',\n 'createMutable',\n 'createReadonly',\n 'createUniform',\n 'createQuerySet',\n // root['~unstable']\n 'createPipeline',\n 'createGuardedComputePipeline',\n 'createTexture',\n 'createSampler',\n 'createComparisonSampler',\n];\n\n/**\n * Checks if `node` should be wrapped in an autoname function.\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n */\nfunction containsResourceConstructorCall(\n node: acorn.AnyNode | babel.Node,\n ctx: Context,\n) {\n if (node.type === 'CallExpression') {\n if (isShellImplementationCall(node, ctx)) {\n return true;\n }\n // struct({...})\n if (\n node.callee.type === 'Identifier' &&\n resourceConstructors.includes(node.callee.name)\n ) {\n return true;\n }\n if (node.callee.type === 'MemberExpression') {\n if (node.callee.property.type === 'Identifier') {\n // root.createBuffer({...})\n if (resourceConstructors.includes(node.callee.property.name)) {\n return true;\n }\n if (node.callee.property.name === '$name') {\n return false;\n }\n }\n // root.createBuffer(d.f32).$usage('storage')\n return containsResourceConstructorCall(node.callee.object, ctx);\n }\n }\n if (node.type === 'TaggedTemplateExpression') {\n return containsResourceConstructorCall(node.tag, ctx);\n }\n return false;\n}\n\ntype ExpressionFor<T extends acorn.AnyNode | babel.Node> = T extends\n acorn.AnyNode ? acorn.Expression : babel.Expression;\n\n/**\n * Checks if `node` contains a label and a tgpu expression that could be named.\n * If so, it calls the provided callback. Nodes selected for naming include:\n *\n * `let name = tgpu.bindGroupLayout({});` (VariableDeclarator)\n *\n * `name = tgpu.bindGroupLayout({});` (AssignmentExpression)\n *\n * `property: tgpu.bindGroupLayout({})` (Property/ObjectProperty)\n *\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n *\n * This function is NOT used for auto-naming shell-less functions.\n * Those are handled separately.\n *\n * @privateRemarks\n * When adding new checks, you need to call this method in the corresponding node in Babel.\n */\nexport function performExpressionNaming<T extends acorn.AnyNode | babel.Node>(\n ctx: Context,\n node: T,\n namingCallback: (node: ExpressionFor<T>, name: string) => void,\n) {\n if (!ctx.autoNamingEnabled) {\n return;\n }\n\n if (\n node.type === 'VariableDeclarator' &&\n node.id.type === 'Identifier' &&\n node.init &&\n containsResourceConstructorCall(node.init, ctx)\n ) {\n namingCallback(node.init as ExpressionFor<T>, node.id.name);\n } else if (\n node.type === 'AssignmentExpression' &&\n node.left.type === 'Identifier' &&\n containsResourceConstructorCall(node.right, ctx)\n ) {\n namingCallback(node.right as ExpressionFor<T>, node.left.name);\n } else if (\n (node.type === 'Property' || node.type === 'ObjectProperty') &&\n node.key.type === 'Identifier' &&\n containsResourceConstructorCall(node.value, ctx)\n ) {\n namingCallback(node.value as ExpressionFor<T>, node.key.name);\n }\n}\n\nexport const useGpuDirective = 'use gpu';\n\n/** Regular expressions used for early pruning (to avoid unnecessary parsing, which is expensive) */\nexport const earlyPruneRegex = [/[\"']use gpu[\"']/, /t(ype)?gpu/];\n"]}
@@ -0,0 +1,7 @@
1
+ import{a as b,b as F,c as w,d as N,e as h,f as A,g as d,h as E}from"./chunk-M7Y5AIYS.js";import{createUnplugin as M}from"unplugin";import $ from"defu";import{generateTransform as T,MagicStringAST as U}from"magic-string-ast";import{walk as _}from"estree-walker";import{transpileFn as k}from"tinyest-for-wgsl";import{FORMAT_VERSION as v}from"tinyest";function C(o){if(o.body.type==="BlockStatement"){for(let e of o.body.body)if(e.type==="ExpressionStatement"&&e.directive===d)return!0}return!1}function P(o){let e=structuredClone(o);return e.body.type==="BlockStatement"&&(e.body.body=e.body.body.filter(r=>!(r.type==="ExpressionStatement"&&r.directive===d))),e}function D(o,e,r){o.prependLeft(e.start,"(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (").appendRight(e.end,`), ${r}) && $.f)({}))`)}function O(o,e,r){o.prependLeft(e.start,"((globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(").appendRight(e.end,`, "${r}"))`)}var c=o=>{let e=$(o,b);return{name:"unplugin-typegpu",enforce:e.enforce,transform:{filter:e.earlyPruning?{id:e,code:E}:{id:e},handler(r,p){let f={tgpuAliases:new Set(e.forceTgpuAlias?[e.forceTgpuAlias]:[]),fileId:p,autoNamingEnabled:e.autoNamingEnabled},g;try{g=this.parse(r,{lang:"ts",allowReturnOutsideFunction:!0})}catch(n){console.warn(`[unplugin-typegpu] Failed to parse ${p}. Cause: ${typeof n=="object"&&n&&"message"in n?n.message:n}`);return}let m=[],l=new U(r);_(g,{enter(n,i,x,y){let t=n,u=i;if(A(f,t,(a,S)=>{O(l,a,S)}),t.type==="ImportDeclaration"&&w(t,f),t.type==="CallExpression"&&N(t,f)){let a=t.arguments[0];a&&(a.type==="FunctionExpression"||a.type==="ArrowFunctionExpression")&&(m.push({def:P(a)}),this.skip())}(t.type==="ArrowFunctionExpression"||t.type==="FunctionExpression"||t.type==="FunctionDeclaration")&&C(t)&&(m.push({def:P(t),name:h(t,u)}),this.skip())}});for(let{def:n,name:i}of m){let{params:x,body:y,externalNames:t}=k(n),u=n.type==="FunctionDeclaration";u&&i&&r.slice(0,n.start).search(new RegExp(`(?<![\\w_.])${i}(?![\\w_])`))!==-1&&console.warn(`File ${p}: function "${i}" might have been referenced before its usage. Function statements are no longer hoisted after being transformed by the plugin.`);let a=`{
2
+ v: ${v},
3
+ name: ${i?`"${i}"`:"undefined"},
4
+ ast: ${F({params:x,body:y,externalNames:t})},
5
+ get externals() { return {${t.join(", ")}}; },
6
+ }`;D(l,n,a),u&&i&&l.prependLeft(n.start,`const ${i} = `)}return T(l,p)}}}};var I=c;var s=M(c),Q=s,X=s.vite,Z=s.rollup,ee=s.rolldown,te=s.webpack,ne=s.rspack,oe=s.esbuild,re=s.farm;export{I as a,Q as b,X as c,Z as d,ee as e,te as f,ne as g,oe as h,re as i};
7
+ //# sourceMappingURL=chunk-VMWFG3OE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/rollup-impl.ts","../src/rolldown-browser.ts"],"sourcesContent":["import { createUnplugin } from 'unplugin';\nimport { rollUpImpl } from './rollup-impl.ts';\n\nconst typegpu = createUnplugin(rollUpImpl);\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;\n\nexport { default as babelPlugin } from './babel.ts';\nexport { default as bunPlugin } from './bun.ts';\nexport { default as rolldownBrowserPlugin } from './rolldown-browser.ts';\n","import type * as acorn from 'acorn';\nimport defu from 'defu';\nimport { generateTransform, MagicStringAST } from 'magic-string-ast';\nimport {\n type Context,\n defaultOptions,\n earlyPruneRegex,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\nimport type { UnpluginBuildContext, UnpluginContext } from 'unplugin';\nimport { type Node, walk } from 'estree-walker';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport { FORMAT_VERSION } from 'tinyest';\n\nexport type FunctionNode =\n | acorn.FunctionDeclaration\n | acorn.AnonymousFunctionDeclaration\n | acorn.FunctionExpression\n | acorn.ArrowFunctionExpression;\n\nexport function containsUseGpuDirective(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 === useGpuDirective\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function removeUseGpuDirective(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 === useGpuDirective\n ),\n );\n }\n\n return cloned;\n}\n\nexport function 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\nexport function 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\nexport const rollUpImpl = (rawOptions: Options) => {\n const options = defu(rawOptions, defaultOptions);\n\n return {\n name: 'unplugin-typegpu' as const,\n enforce: options.enforce,\n transform: {\n filter: options.earlyPruning\n ? {\n id: options,\n code: earlyPruneRegex,\n }\n : {\n id: options,\n },\n handler(\n this: UnpluginBuildContext & UnpluginContext,\n code: string,\n id: string,\n ) {\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 let ast: Node;\n try {\n ast = this.parse(code, {\n lang: 'ts',\n allowReturnOutsideFunction: true,\n }) as Node;\n } catch (cause) {\n console.warn(\n `[unplugin-typegpu] Failed to parse ${id}. Cause: ${\n typeof cause === 'object' && cause && 'message' in cause\n ? cause.message\n : cause\n }`,\n );\n return undefined;\n }\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 const parent = _parent 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: removeUseGpuDirective(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 (containsUseGpuDirective(node)) {\n tgslFunctionDefs.push({\n def: removeUseGpuDirective(node),\n name: getFunctionName(node, parent),\n });\n this.skip();\n }\n }\n },\n });\n\n for (const { def, name } of tgslFunctionDefs) {\n const { params, body, externalNames } = transpileFn(def);\n const isFunctionStatement = def.type === 'FunctionDeclaration';\n\n if (\n isFunctionStatement &&\n name &&\n code.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 name: ${name ? `\"${name}\"` : 'undefined'},\n ast: ${embedJSON({ params, body, externalNames })},\n get externals() { return {${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","import { rollUpImpl } from './rollup-impl.ts';\n\n// The unplugin API is based on the rollup/rolldown APIs, so it\n// should just be a compatible rolldown plugin.\nexport default rollUpImpl;\n"],"mappings":"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","names":["createUnplugin","defu","generateTransform","MagicStringAST","walk","transpileFn","FORMAT_VERSION","containsUseGpuDirective","node","statement","useGpuDirective","removeUseGpuDirective","cloned","assignMetadata","magicString","metadata","wrapInAutoName","name","rollUpImpl","rawOptions","options","defu","defaultOptions","earlyPruneRegex","code","id","ctx","ast","cause","tgslFunctionDefs","MagicStringAST","_node","_parent","prop","index","parent","performExpressionNaming","gatherTgpuAliases","isShellImplementationCall","implementation","getFunctionName","def","params","body","externalNames","isFunctionStatement","embedJSON","generateTransform","rolldown_browser_default","rollUpImpl","typegpu","createUnplugin","rollUpImpl","index_default","vitePlugin","rollupPlugin","rolldownPlugin","webpackPlugin","rspackPlugin","esbuildPlugin","farmPlugin"]}
package/esbuild.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var l=_chunk4RTJUILIcjs.g;exports.default = l;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var l=_chunkL2Q3MFMUcjs.h;exports.default = l;
2
2
  //# sourceMappingURL=esbuild.cjs.map
package/esbuild.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/esbuild.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/esbuild.js CHANGED
@@ -1,2 +1,2 @@
1
- import{g as e}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var l=e;export{l as default};
1
+ import{h as e}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var l=e;export{l as default};
2
2
  //# sourceMappingURL=esbuild.js.map
package/farm.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var m=_chunk4RTJUILIcjs.h;exports.default = m;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var m=_chunkL2Q3MFMUcjs.i;exports.default = m;
2
2
  //# sourceMappingURL=farm.cjs.map
package/farm.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/farm.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/farm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{h as r}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var m=r;export{m as default};
1
+ import{i as r}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var m=r;export{m as default};
2
2
  //# sourceMappingURL=farm.js.map
package/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');var _chunkCBTXKIP6cjs = require('./chunk-CBTXKIP6.cjs');var _chunkLNKX7SV5cjs = require('./chunk-LNKX7SV5.cjs');exports.babelPlugin = _chunkLNKX7SV5cjs.i; exports.bunPlugin = _chunkCBTXKIP6cjs.a; exports.default = _chunk4RTJUILIcjs.a; exports.esbuildPlugin = _chunk4RTJUILIcjs.g; exports.farmPlugin = _chunk4RTJUILIcjs.h; exports.rolldownPlugin = _chunk4RTJUILIcjs.d; exports.rollupPlugin = _chunk4RTJUILIcjs.c; exports.rspackPlugin = _chunk4RTJUILIcjs.f; exports.vitePlugin = _chunk4RTJUILIcjs.b; exports.webpackPlugin = _chunk4RTJUILIcjs.e;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');var _chunkDUSPUQJOcjs = require('./chunk-DUSPUQJO.cjs');var _chunkPAQIRP66cjs = require('./chunk-PAQIRP66.cjs');exports.babelPlugin = _chunkPAQIRP66cjs.i; exports.bunPlugin = _chunkDUSPUQJOcjs.a; exports.default = _chunkL2Q3MFMUcjs.b; exports.esbuildPlugin = _chunkL2Q3MFMUcjs.h; exports.farmPlugin = _chunkL2Q3MFMUcjs.i; exports.rolldownBrowserPlugin = _chunkL2Q3MFMUcjs.a; exports.rolldownPlugin = _chunkL2Q3MFMUcjs.e; exports.rollupPlugin = _chunkL2Q3MFMUcjs.d; exports.rspackPlugin = _chunkL2Q3MFMUcjs.g; exports.vitePlugin = _chunkL2Q3MFMUcjs.c; exports.webpackPlugin = _chunkL2Q3MFMUcjs.f;
2
2
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/index.cjs"],"names":[],"mappings":"AAAA,iIAAyF,wDAAyC,wDAAyC,8aAAmL","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/index.cjs"}
1
+ {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/index.cjs"],"names":[],"mappings":"AAAA,iIAAgG,wDAAyC,wDAAyC,meAA8M","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/index.cjs"}
package/index.d.cts CHANGED
@@ -1,21 +1,53 @@
1
1
  import * as rollup from 'rollup';
2
2
  import * as unplugin from 'unplugin';
3
- import { UnpluginInstance } from 'unplugin';
3
+ import { UnpluginBuildContext, UnpluginContext } from 'unplugin';
4
4
  import { O as Options } from './bun-Dq3TUCfa.cjs';
5
5
  export { _ as bunPlugin } from './bun-Dq3TUCfa.cjs';
6
6
  export { default as babelPlugin } from './babel.cjs';
7
+ import * as magic_string_ast from 'magic-string-ast';
7
8
  import 'bun';
8
9
  import '@babel/traverse';
9
10
  import '@babel/types';
10
11
 
11
- declare const typegpu: UnpluginInstance<Options, false>;
12
+ declare const rollUpImpl: (rawOptions: Options) => {
13
+ name: "unplugin-typegpu";
14
+ enforce: "post" | "pre" | undefined;
15
+ transform: {
16
+ filter: {
17
+ id: Omit<Options, "include" | "autoNamingEnabled" | "earlyPruning"> & Omit<{
18
+ include: RegExp;
19
+ autoNamingEnabled: boolean;
20
+ earlyPruning: boolean;
21
+ }, "include" | "autoNamingEnabled" | "earlyPruning"> & {
22
+ include: string | RegExp | unplugin.StringOrRegExp[];
23
+ autoNamingEnabled: boolean;
24
+ earlyPruning: boolean;
25
+ };
26
+ code: RegExp[];
27
+ } | {
28
+ id: Omit<Options, "include" | "autoNamingEnabled" | "earlyPruning"> & Omit<{
29
+ include: RegExp;
30
+ autoNamingEnabled: boolean;
31
+ earlyPruning: boolean;
32
+ }, "include" | "autoNamingEnabled" | "earlyPruning"> & {
33
+ include: string | RegExp | unplugin.StringOrRegExp[];
34
+ autoNamingEnabled: boolean;
35
+ earlyPruning: boolean;
36
+ };
37
+ code?: never;
38
+ };
39
+ handler(this: UnpluginBuildContext & UnpluginContext, code: string, id: string): magic_string_ast.CodeTransform | undefined;
40
+ };
41
+ };
12
42
 
13
- declare const vitePlugin: (options: Options) => unplugin.VitePlugin<any>;
14
- declare const rollupPlugin: (options: Options) => rollup.Plugin<any>;
15
- declare const rolldownPlugin: (options: Options) => RolldownPlugin;
43
+ declare const typegpu: unplugin.UnpluginInstance<Options, boolean>;
44
+
45
+ declare const vitePlugin: (options: Options) => unplugin.VitePlugin<any> | unplugin.VitePlugin<any>[];
46
+ declare const rollupPlugin: (options: Options) => rollup.Plugin<any> | rollup.Plugin<any>[];
47
+ declare const rolldownPlugin: (options: Options) => unplugin.RolldownPlugin<any> | unplugin.RolldownPlugin<any>[];
16
48
  declare const webpackPlugin: (options: Options) => WebpackPluginInstance;
17
49
  declare const rspackPlugin: (options: Options) => RspackPluginInstance;
18
50
  declare const esbuildPlugin: (options: Options) => unplugin.EsbuildPlugin;
19
51
  declare const farmPlugin: (options: Options) => JsPlugin;
20
52
 
21
- export { Options, typegpu as default, esbuildPlugin, farmPlugin, rolldownPlugin, rollupPlugin, rspackPlugin, vitePlugin, webpackPlugin };
53
+ export { Options, typegpu as default, esbuildPlugin, farmPlugin, rollUpImpl as rolldownBrowserPlugin, rolldownPlugin, rollupPlugin, rspackPlugin, vitePlugin, webpackPlugin };
package/index.d.ts CHANGED
@@ -1,21 +1,53 @@
1
1
  import * as rollup from 'rollup';
2
2
  import * as unplugin from 'unplugin';
3
- import { UnpluginInstance } from 'unplugin';
3
+ import { UnpluginBuildContext, UnpluginContext } from 'unplugin';
4
4
  import { O as Options } from './bun-Dq3TUCfa.js';
5
5
  export { _ as bunPlugin } from './bun-Dq3TUCfa.js';
6
6
  export { default as babelPlugin } from './babel.js';
7
+ import * as magic_string_ast from 'magic-string-ast';
7
8
  import 'bun';
8
9
  import '@babel/traverse';
9
10
  import '@babel/types';
10
11
 
11
- declare const typegpu: UnpluginInstance<Options, false>;
12
+ declare const rollUpImpl: (rawOptions: Options) => {
13
+ name: "unplugin-typegpu";
14
+ enforce: "post" | "pre" | undefined;
15
+ transform: {
16
+ filter: {
17
+ id: Omit<Options, "include" | "autoNamingEnabled" | "earlyPruning"> & Omit<{
18
+ include: RegExp;
19
+ autoNamingEnabled: boolean;
20
+ earlyPruning: boolean;
21
+ }, "include" | "autoNamingEnabled" | "earlyPruning"> & {
22
+ include: string | RegExp | unplugin.StringOrRegExp[];
23
+ autoNamingEnabled: boolean;
24
+ earlyPruning: boolean;
25
+ };
26
+ code: RegExp[];
27
+ } | {
28
+ id: Omit<Options, "include" | "autoNamingEnabled" | "earlyPruning"> & Omit<{
29
+ include: RegExp;
30
+ autoNamingEnabled: boolean;
31
+ earlyPruning: boolean;
32
+ }, "include" | "autoNamingEnabled" | "earlyPruning"> & {
33
+ include: string | RegExp | unplugin.StringOrRegExp[];
34
+ autoNamingEnabled: boolean;
35
+ earlyPruning: boolean;
36
+ };
37
+ code?: never;
38
+ };
39
+ handler(this: UnpluginBuildContext & UnpluginContext, code: string, id: string): magic_string_ast.CodeTransform | undefined;
40
+ };
41
+ };
12
42
 
13
- declare const vitePlugin: (options: Options) => unplugin.VitePlugin<any>;
14
- declare const rollupPlugin: (options: Options) => rollup.Plugin<any>;
15
- declare const rolldownPlugin: (options: Options) => RolldownPlugin;
43
+ declare const typegpu: unplugin.UnpluginInstance<Options, boolean>;
44
+
45
+ declare const vitePlugin: (options: Options) => unplugin.VitePlugin<any> | unplugin.VitePlugin<any>[];
46
+ declare const rollupPlugin: (options: Options) => rollup.Plugin<any> | rollup.Plugin<any>[];
47
+ declare const rolldownPlugin: (options: Options) => unplugin.RolldownPlugin<any> | unplugin.RolldownPlugin<any>[];
16
48
  declare const webpackPlugin: (options: Options) => WebpackPluginInstance;
17
49
  declare const rspackPlugin: (options: Options) => RspackPluginInstance;
18
50
  declare const esbuildPlugin: (options: Options) => unplugin.EsbuildPlugin;
19
51
  declare const farmPlugin: (options: Options) => JsPlugin;
20
52
 
21
- export { Options, typegpu as default, esbuildPlugin, farmPlugin, rolldownPlugin, rollupPlugin, rspackPlugin, vitePlugin, webpackPlugin };
53
+ export { Options, typegpu as default, esbuildPlugin, farmPlugin, rollUpImpl as rolldownBrowserPlugin, rolldownPlugin, rollupPlugin, rspackPlugin, vitePlugin, webpackPlugin };
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as c,b as d,c as e,d as f,e as g,f as h,g as i,h as j}from"./chunk-AZHQWA4E.js";import{a as b}from"./chunk-4PPYXBSV.js";import{i as a}from"./chunk-DE4HNFJZ.js";export{a as babelPlugin,b as bunPlugin,c as default,i as esbuildPlugin,j as farmPlugin,f as rolldownPlugin,e as rollupPlugin,h as rspackPlugin,d as vitePlugin,g as webpackPlugin};
1
+ import{a as c,b as d,c as e,d as f,e as g,f as h,g as i,h as j,i as k}from"./chunk-VMWFG3OE.js";import{a as b}from"./chunk-AAPWVTYT.js";import{i as a}from"./chunk-M7Y5AIYS.js";export{a as babelPlugin,b as bunPlugin,d as default,j as esbuildPlugin,k as farmPlugin,c as rolldownBrowserPlugin,g as rolldownPlugin,f as rollupPlugin,i as rspackPlugin,e as vitePlugin,h as webpackPlugin};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unplugin-typegpu",
3
- "version": "0.8.0-alpha.1",
3
+ "version": "0.8.0-alpha.2",
4
4
  "description": "Build plugins for TypeGPU, enabling seamless JavaScript -> WGSL transpilation and improved debugging.",
5
5
  "keywords": [
6
6
  "rollup-plugin",
@@ -61,6 +61,12 @@
61
61
  "import": "./rolldown.js",
62
62
  "default": "./rolldown.cjs"
63
63
  },
64
+ "./rolldown-browser": {
65
+ "types": "./rolldown-browser.d.ts",
66
+ "module": "./rolldown-browser.js",
67
+ "import": "./rolldown-browser.js",
68
+ "default": "./rolldown-browser.cjs"
69
+ },
64
70
  "./rspack": {
65
71
  "types": "./rspack.d.ts",
66
72
  "module": "./rspack.js",
@@ -97,7 +103,7 @@
97
103
  "pathe": "^2.0.3",
98
104
  "picomatch": "^4.0.3",
99
105
  "tinyest": "~0.1.1",
100
- "tinyest-for-wgsl": "~0.1.2",
106
+ "tinyest-for-wgsl": "~0.1.3",
101
107
  "unplugin": "^2.3.5"
102
108
  },
103
109
  "peerDependencies": {
package/rolldown.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var r=_chunk4RTJUILIcjs.d;exports.default = r;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var r=_chunkL2Q3MFMUcjs.e;exports.default = r;
2
2
  //# sourceMappingURL=rolldown.cjs.map
package/rolldown.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/rolldown.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/rolldown.js CHANGED
@@ -1,2 +1,2 @@
1
- import{d as o}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var r=o;export{r as default};
1
+ import{e as o}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var r=o;export{r as default};
2
2
  //# sourceMappingURL=rolldown.js.map
package/rollup.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var r=_chunk4RTJUILIcjs.c;exports.default = r;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var r=_chunkL2Q3MFMUcjs.d;exports.default = r;
2
2
  //# sourceMappingURL=rollup.cjs.map
package/rollup.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/rollup.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/rollup.js CHANGED
@@ -1,2 +1,2 @@
1
- import{c as l}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var r=l;export{r as default};
1
+ import{d as l}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var r=l;export{r as default};
2
2
  //# sourceMappingURL=rollup.js.map
package/rspack.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var p=_chunk4RTJUILIcjs.f;exports.default = p;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var p=_chunkL2Q3MFMUcjs.g;exports.default = p;
2
2
  //# sourceMappingURL=rspack.cjs.map
package/rspack.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/rspack.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/rspack.js CHANGED
@@ -1,2 +1,2 @@
1
- import{f as r}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var p=r;export{p as default};
1
+ import{g as r}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var p=r;export{p as default};
2
2
  //# sourceMappingURL=rspack.js.map
package/vite.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var i=_chunk4RTJUILIcjs.b;exports.default = i;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var i=_chunkL2Q3MFMUcjs.c;exports.default = i;
2
2
  //# sourceMappingURL=vite.cjs.map
package/vite.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/vite.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/vite.js CHANGED
@@ -1,2 +1,2 @@
1
- import{b as t}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var i=t;export{i as default};
1
+ import{c as t}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var i=t;export{i as default};
2
2
  //# sourceMappingURL=vite.js.map
package/webpack.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk4RTJUILIcjs = require('./chunk-4RTJUILI.cjs');require('./chunk-CBTXKIP6.cjs');require('./chunk-LNKX7SV5.cjs');var p=_chunk4RTJUILIcjs.e;exports.default = p;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkL2Q3MFMUcjs = require('./chunk-L2Q3MFMU.cjs');require('./chunk-DUSPUQJO.cjs');require('./chunk-PAQIRP66.cjs');var p=_chunkL2Q3MFMUcjs.f;exports.default = p;
2
2
  //# sourceMappingURL=webpack.cjs.map
package/webpack.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/webpack.cjs","../src/webpack.ts"],"names":["webpack_default","webpackPlugin"],"mappings":"AAAA,iIAAmC,gCAA6B,gCAA6B,ICEtFA,CAAAA,CAAQC,mBAAAA,CAAAA,oBAAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/webpack.cjs","sourcesContent":[null,"import { webpackPlugin } from './index.ts';\n\nexport default webpackPlugin;\n"]}
1
+ {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/webpack.cjs","../src/webpack.ts"],"names":["webpack_default","webpackPlugin"],"mappings":"AAAA,iIAAwC,gCAA6B,gCAA6B,ICE3FA,CAAAA,CAAQC,mBAAAA,CAAAA,oBAAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/webpack.cjs","sourcesContent":[null,"import { webpackPlugin } from './index.ts';\n\nexport default webpackPlugin;\n"]}
package/webpack.d.cts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.cjs';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/webpack.d.ts CHANGED
@@ -6,6 +6,7 @@ import 'bun';
6
6
  import './babel.js';
7
7
  import '@babel/traverse';
8
8
  import '@babel/types';
9
+ import 'magic-string-ast';
9
10
 
10
11
 
11
12
 
package/webpack.js CHANGED
@@ -1,2 +1,2 @@
1
- import{e}from"./chunk-AZHQWA4E.js";import"./chunk-4PPYXBSV.js";import"./chunk-DE4HNFJZ.js";var p=e;export{p as default};
1
+ import{f as e}from"./chunk-VMWFG3OE.js";import"./chunk-AAPWVTYT.js";import"./chunk-M7Y5AIYS.js";var p=e;export{p as default};
2
2
  //# sourceMappingURL=webpack.js.map
package/webpack.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/webpack.ts"],"sourcesContent":["import { webpackPlugin } from './index.ts';\n\nexport default webpackPlugin;\n"],"mappings":"2FAEA,IAAOA,EAAQC","names":["webpack_default","webpackPlugin"]}
1
+ {"version":3,"sources":["../src/webpack.ts"],"sourcesContent":["import { webpackPlugin } from './index.ts';\n\nexport default webpackPlugin;\n"],"mappings":"gGAEA,IAAOA,EAAQC","names":["webpack_default","webpackPlugin"]}
package/chunk-4PPYXBSV.js DELETED
@@ -1,2 +0,0 @@
1
- import{a as i,h as p,i as l}from"./chunk-DE4HNFJZ.js";import*as u from"@babel/standalone";import c from"defu";var g=s=>{let o=c(s,i),r=o.include;if(!(r instanceof RegExp))throw new Error("Unsupported 'include' options in Bun plugin. Please provide a single regular expression");if(o.exclude)throw new Error("Unsupported 'exclude' option in Bun plugin");return{name:"TypeGPU",setup(a){a.onLoad({filter:r},async e=>{let n=await Bun.file(e.path).text();if(p.every(d=>!d.test(n)))return{contents:n,loader:e.loader};let t=u.transform(n,{presets:[["typescript",{allowDeclareFields:!0}]],filename:e.path,plugins:[l]}).code;return{contents:t!=null?t:n,loader:e.loader}})}}};export{g as a};
2
- //# sourceMappingURL=chunk-4PPYXBSV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/bun.ts"],"sourcesContent":["import type { BunPlugin } from 'bun';\nimport * as Babel from '@babel/standalone';\nimport defu from 'defu';\nimport { defaultOptions, earlyPruneRegex, type Options } from './common.ts';\nimport babelPlugin from './babel.ts';\n\nexport default (rawOptions: Options): BunPlugin => {\n const options = defu(rawOptions, defaultOptions);\n const include = options.include;\n if (!(include instanceof RegExp)) {\n throw new Error(\n `Unsupported 'include' options in Bun plugin. Please provide a single regular expression`,\n );\n }\n if (options.exclude) {\n throw new Error(`Unsupported 'exclude' option in Bun plugin`);\n }\n\n return {\n name: 'TypeGPU',\n setup(build) {\n build.onLoad({ filter: include }, async (args) => {\n const text = await Bun.file(args.path).text();\n\n // Pruning early before more expensive operations\n if (earlyPruneRegex.every((pattern) => !pattern.test(text))) {\n return {\n contents: text,\n loader: args.loader,\n };\n }\n\n const result = Babel.transform(text, {\n presets: [['typescript', { allowDeclareFields: true }]],\n filename: args.path,\n plugins: [babelPlugin],\n }).code;\n\n return {\n contents: result ?? text,\n loader: args.loader,\n };\n });\n },\n };\n};\n"],"mappings":"sDACA,UAAYA,MAAW,oBACvB,OAAOC,MAAU,OAIjB,IAAOC,EAASC,GAAmC,CACjD,IAAMC,EAAUC,EAAKF,EAAYG,CAAc,EACzCC,EAAUH,EAAQ,QACxB,GAAI,EAAEG,aAAmB,QACvB,MAAM,IAAI,MACR,yFACF,EAEF,GAAIH,EAAQ,QACV,MAAM,IAAI,MAAM,4CAA4C,EAG9D,MAAO,CACL,KAAM,UACN,MAAMI,EAAO,CACXA,EAAM,OAAO,CAAE,OAAQD,CAAQ,EAAG,MAAOE,GAAS,CAChD,IAAMC,EAAO,MAAM,IAAI,KAAKD,EAAK,IAAI,EAAE,KAAK,EAG5C,GAAIE,EAAgB,MAAOC,GAAY,CAACA,EAAQ,KAAKF,CAAI,CAAC,EACxD,MAAO,CACL,SAAUA,EACV,OAAQD,EAAK,MACf,EAGF,IAAMI,EAAe,YAAUH,EAAM,CACnC,QAAS,CAAC,CAAC,aAAc,CAAE,mBAAoB,EAAK,CAAC,CAAC,EACtD,SAAUD,EAAK,KACf,QAAS,CAACK,CAAW,CACvB,CAAC,EAAE,KAEH,MAAO,CACL,SAAUD,GAAA,KAAAA,EAAUH,EACpB,OAAQD,EAAK,MACf,CACF,CAAC,CACH,CACF,CACF","names":["Babel","defu","bun_default","rawOptions","options","defu","defaultOptions","include","build","args","text","earlyPruneRegex","pattern","result","babel_default"]}
@@ -1,7 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkLNKX7SV5cjs = require('./chunk-LNKX7SV5.cjs');var _defu = require('defu'); var _defu2 = _interopRequireDefault(_defu);var _estreewalker = require('estree-walker');var _magicstringast = require('magic-string-ast');var _tinyest = require('tinyest');var _tinyestforwgsl = require('tinyest-for-wgsl');var _unplugin = require('unplugin');function O(o){if(o.body.type==="BlockStatement"){for(let e of o.body.body)if(e.type==="ExpressionStatement"&&e.directive===_chunkLNKX7SV5cjs.g)return!0}return!1}function E(o){let e=structuredClone(o);return e.body.type==="BlockStatement"&&(e.body.body=e.body.body.filter(r=>!(r.type==="ExpressionStatement"&&r.directive===_chunkLNKX7SV5cjs.g))),e}function M(o,e,r){o.prependLeft(e.start,"(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (").appendRight(e.end,`), ${r}) && $.f)({}))`)}function U(o,e,r){o.prependLeft(e.start,"((globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(").appendRight(e.end,`, "${r}"))`)}var s=_unplugin.createUnplugin.call(void 0, o=>{let e=_defu2.default.call(void 0, o,_chunkLNKX7SV5cjs.a);return{name:"unplugin-typegpu",enforce:e.enforce,transform:{filter:e.earlyPruning?{id:e,code:_chunkLNKX7SV5cjs.h}:{id:e},handler(r,p){let l={tgpuAliases:new Set(e.forceTgpuAlias?[e.forceTgpuAlias]:[]),fileId:p,autoNamingEnabled:e.autoNamingEnabled},m;try{m=this.parse(r,{lang:"ts",allowReturnOutsideFunction:!0})}catch(t){console.warn(`[unplugin-typegpu] Failed to parse ${p}. Cause: ${typeof t=="object"&&t&&"message"in t?t.message:t}`);return}let f=[],c=new (0, _magicstringast.MagicStringAST)(r);_estreewalker.walk.call(void 0, m,{enter(t,i,g,y){let n=t,u=i;if(_chunkLNKX7SV5cjs.f.call(void 0, l,n,(a,S)=>{U(c,a,S)}),n.type==="ImportDeclaration"&&_chunkLNKX7SV5cjs.c.call(void 0, n,l),n.type==="CallExpression"&&_chunkLNKX7SV5cjs.d.call(void 0, n,l)){let a=n.arguments[0];a&&(a.type==="FunctionExpression"||a.type==="ArrowFunctionExpression")&&(f.push({def:E(a)}),this.skip())}(n.type==="ArrowFunctionExpression"||n.type==="FunctionExpression"||n.type==="FunctionDeclaration")&&O(n)&&(f.push({def:E(n),name:_chunkLNKX7SV5cjs.e.call(void 0, n,u)}),this.skip())}});for(let{def:t,name:i}of f){let{params:g,body:y,externalNames:n}=_tinyestforwgsl.transpileFn.call(void 0, t),u=t.type==="FunctionDeclaration";u&&i&&r.slice(0,t.start).search(new RegExp(`(?<![\\w_.])${i}(?![\\w_])`))!==-1&&console.warn(`File ${p}: function "${i}" might have been referenced before its usage. Function statements are no longer hoisted after being transformed by the plugin.`);let a=`{
2
- v: ${_tinyest.FORMAT_VERSION},
3
- name: ${i?`"${i}"`:"undefined"},
4
- ast: ${_chunkLNKX7SV5cjs.b.call(void 0, {params:g,body:y,externalNames:n})},
5
- get externals() { return {${n.join(", ")}}; },
6
- }`;M(c,t,a),u&&i&&c.prependLeft(t.start,`const ${i} = `)}return _magicstringast.generateTransform.call(void 0, c,p)}}}}),V= exports.a =s,W= exports.b =s.vite,q= exports.c =s.rollup,z= exports.d =s.rolldown,H= exports.e =s.webpack,K= exports.f =s.rspack,Q= exports.g =s.esbuild,X= exports.h =s.farm;exports.a = V; exports.b = W; exports.c = q; exports.d = z; exports.e = H; exports.f = K; exports.g = Q; exports.h = X;
7
- //# sourceMappingURL=chunk-4RTJUILI.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-4RTJUILI.cjs","../src/index.ts"],"names":["containsUseGpuDirective","node","statement","useGpuDirective","removeUseGpuDirective","cloned","assignMetadata","magicString","metadata","wrapInAutoName","name","typegpu","createUnplugin","rawOptions","options","defu","defaultOptions","earlyPruneRegex","code","id","ctx","ast","cause"],"mappings":"AAAA,iOAAoF,wECCnE,6CACe,kDACkB,kCACnB,kDACH,oCAC0B,SAoB7CA,CAAAA,CAAwBC,CAAAA,CAA6B,CAC5D,EAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,IAAA,GAAS,gBAAA,CAAA,CACrB,GAAA,CAAA,IAAWC,EAAAA,GAAaD,CAAAA,CAAK,IAAA,CAAK,IAAA,CAChC,EAAA,CACEC,CAAAA,CAAU,IAAA,GAAS,qBAAA,EACnBA,CAAAA,CAAU,SAAA,GAAcC,mBAAAA,CAExB,MAAO,CAAA,CAAA,CAIb,MAAO,CAAA,CACT,CAEA,SAASC,CAAAA,CAAsBH,CAAAA,CAAoB,CACjD,IAAMI,CAAAA,CAAS,eAAA,CAAgBJ,CAAI,CAAA,CAEnC,OAAII,CAAAA,CAAO,IAAA,CAAK,IAAA,GAAS,gBAAA,EAAA,CACvBA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAOA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CACjCH,CAAAA,EACC,CAAA,CACEA,CAAAA,CAAU,IAAA,GAAS,qBAAA,EACnBA,CAAAA,CAAU,SAAA,GAAcC,mBAAAA,CAE9B,CAAA,CAAA,CAGKE,CACT,CAEA,SAASC,CAAAA,CACPC,CAAAA,CACAN,CAAAA,CACAO,CAAAA,CACA,CACAD,CAAAA,CAAY,WAAA,CACVN,CAAAA,CAAK,KAAA,CACL,oEACF,CAAA,CAAE,WAAA,CACAA,CAAAA,CAAK,GAAA,CACL,CAAA,GAAA,EAAMO,CAAQ,CAAA,cAAA,CAChB,CACF,CAEA,SAASC,CAAAA,CACPF,CAAAA,CACAN,CAAAA,CACAS,CAAAA,CACA,CACAH,CAAAA,CACG,WAAA,CACCN,CAAAA,CAAK,KAAA,CACL,iDACF,CAAA,CACC,WAAA,CAAYA,CAAAA,CAAK,GAAA,CAAK,CAAA,GAAA,EAAMS,CAAI,CAAA,GAAA,CAAK,CAC1C,CAEA,IAAMC,CAAAA,CAA4CC,sCAAAA,CAC/CC,EAAe,CACd,IAAMC,CAAAA,CAAUC,4BAAAA,CAAKF,CAAYG,mBAAc,CAAA,CAE/C,MAAO,CACL,IAAA,CAAM,kBAAA,CACN,OAAA,CAASF,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAW,CACT,MAAA,CAAQA,CAAAA,CAAQ,YAAA,CACZ,CACA,EAAA,CAAIA,CAAAA,CACJ,IAAA,CAAMG,mBACR,CAAA,CACE,CACA,EAAA,CAAIH,CACN,CAAA,CACF,OAAA,CAAQI,CAAAA,CAAMC,CAAAA,CAAI,CAChB,IAAMC,CAAAA,CAAe,CACnB,WAAA,CAAa,IAAI,GAAA,CACfN,CAAAA,CAAQ,cAAA,CAAiB,CAACA,CAAAA,CAAQ,cAAc,CAAA,CAAI,CAAC,CACvD,CAAA,CACA,MAAA,CAAQK,CAAAA,CACR,iBAAA,CAAmBL,CAAAA,CAAQ,iBAC7B,CAAA,CAEIO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAMH,CAAAA,CAAM,CACrB,IAAA,CAAM,IAAA,CACN,0BAAA,CAA4B,CAAA,CAC9B,CAAC,CACH,CAAA,KAAA,CAASI,CAAAA,CAAO,CACd,OAAA,CAAQ,IAAA,CACN,CAAA,mCAAA,EAAsCH,CAAE,CAAA,SAAA,EACtC,OAAOG,CAAAA,EAAU,QAAA,EAAYA,CAAAA,EAAS,SAAA,GAAaA,CAAAA,CAC/CA,CAAAA,CAAM,OAAA,CACNA,CACN,CAAA,CAAA;AA0EmB,iBAAA;AACqB,oBAAA;AACS,mBAAA;AACG,wCAAA;AA2BhC,aAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-4RTJUILI.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 {\n type Context,\n defaultOptions,\n earlyPruneRegex,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\n\ntype FunctionNode =\n | acorn.FunctionDeclaration\n | acorn.AnonymousFunctionDeclaration\n | acorn.FunctionExpression\n | acorn.ArrowFunctionExpression;\n\nfunction containsUseGpuDirective(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 === useGpuDirective\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction removeUseGpuDirective(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 === useGpuDirective\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: options.earlyPruning\n ? {\n id: options,\n code: earlyPruneRegex,\n }\n : {\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 let ast: Node;\n try {\n ast = this.parse(code, {\n lang: 'ts',\n allowReturnOutsideFunction: true,\n }) as Node;\n } catch (cause) {\n console.warn(\n `[unplugin-typegpu] Failed to parse ${id}. Cause: ${\n typeof cause === 'object' && cause && 'message' in cause\n ? cause.message\n : cause\n }`,\n );\n return undefined;\n }\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 const parent = _parent 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: removeUseGpuDirective(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 (containsUseGpuDirective(node)) {\n tgslFunctionDefs.push({\n def: removeUseGpuDirective(node),\n name: getFunctionName(node, parent),\n });\n this.skip();\n }\n }\n },\n });\n\n for (const { def, name } of tgslFunctionDefs) {\n const { params, body, externalNames } = transpileFn(def);\n const isFunctionStatement = def.type === 'FunctionDeclaration';\n\n if (\n isFunctionStatement &&\n name &&\n code.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 name: ${name ? `\"${name}\"` : 'undefined'},\n ast: ${embedJSON({ params, body, externalNames })},\n get externals() { return {${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;\n\nexport { default as babelPlugin } from './babel.ts';\nexport { default as bunPlugin } from './bun.ts';\n"]}
package/chunk-AZHQWA4E.js DELETED
@@ -1,7 +0,0 @@
1
- import{a as x,b,c as F,d as N,e as A,f as h,g as d,h as w}from"./chunk-DE4HNFJZ.js";import $ from"defu";import{walk as P}from"estree-walker";import{generateTransform as T,MagicStringAST as _}from"magic-string-ast";import{FORMAT_VERSION as k}from"tinyest";import{transpileFn as v}from"tinyest-for-wgsl";import{createUnplugin as D}from"unplugin";function O(o){if(o.body.type==="BlockStatement"){for(let e of o.body.body)if(e.type==="ExpressionStatement"&&e.directive===d)return!0}return!1}function E(o){let e=structuredClone(o);return e.body.type==="BlockStatement"&&(e.body.body=e.body.body.filter(r=>!(r.type==="ExpressionStatement"&&r.directive===d))),e}function M(o,e,r){o.prependLeft(e.start,"(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (").appendRight(e.end,`), ${r}) && $.f)({}))`)}function U(o,e,r){o.prependLeft(e.start,"((globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(").appendRight(e.end,`, "${r}"))`)}var s=D(o=>{let e=$(o,x);return{name:"unplugin-typegpu",enforce:e.enforce,transform:{filter:e.earlyPruning?{id:e,code:w}:{id:e},handler(r,p){let l={tgpuAliases:new Set(e.forceTgpuAlias?[e.forceTgpuAlias]:[]),fileId:p,autoNamingEnabled:e.autoNamingEnabled},m;try{m=this.parse(r,{lang:"ts",allowReturnOutsideFunction:!0})}catch(t){console.warn(`[unplugin-typegpu] Failed to parse ${p}. Cause: ${typeof t=="object"&&t&&"message"in t?t.message:t}`);return}let f=[],c=new _(r);P(m,{enter(t,i,g,y){let n=t,u=i;if(h(l,n,(a,S)=>{U(c,a,S)}),n.type==="ImportDeclaration"&&F(n,l),n.type==="CallExpression"&&N(n,l)){let a=n.arguments[0];a&&(a.type==="FunctionExpression"||a.type==="ArrowFunctionExpression")&&(f.push({def:E(a)}),this.skip())}(n.type==="ArrowFunctionExpression"||n.type==="FunctionExpression"||n.type==="FunctionDeclaration")&&O(n)&&(f.push({def:E(n),name:A(n,u)}),this.skip())}});for(let{def:t,name:i}of f){let{params:g,body:y,externalNames:n}=v(t),u=t.type==="FunctionDeclaration";u&&i&&r.slice(0,t.start).search(new RegExp(`(?<![\\w_.])${i}(?![\\w_])`))!==-1&&console.warn(`File ${p}: function "${i}" might have been referenced before its usage. Function statements are no longer hoisted after being transformed by the plugin.`);let a=`{
2
- v: ${k},
3
- name: ${i?`"${i}"`:"undefined"},
4
- ast: ${b({params:g,body:y,externalNames:n})},
5
- get externals() { return {${n.join(", ")}}; },
6
- }`;M(c,t,a),u&&i&&c.prependLeft(t.start,`const ${i} = `)}return T(c,p)}}}}),V=s,W=s.vite,q=s.rollup,z=s.rolldown,H=s.webpack,K=s.rspack,Q=s.esbuild,X=s.farm;export{V as a,W as b,q as c,z as d,H as e,K as f,Q as g,X as h};
7
- //# sourceMappingURL=chunk-AZHQWA4E.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["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 {\n type Context,\n defaultOptions,\n earlyPruneRegex,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\n\ntype FunctionNode =\n | acorn.FunctionDeclaration\n | acorn.AnonymousFunctionDeclaration\n | acorn.FunctionExpression\n | acorn.ArrowFunctionExpression;\n\nfunction containsUseGpuDirective(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 === useGpuDirective\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction removeUseGpuDirective(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 === useGpuDirective\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: options.earlyPruning\n ? {\n id: options,\n code: earlyPruneRegex,\n }\n : {\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 let ast: Node;\n try {\n ast = this.parse(code, {\n lang: 'ts',\n allowReturnOutsideFunction: true,\n }) as Node;\n } catch (cause) {\n console.warn(\n `[unplugin-typegpu] Failed to parse ${id}. Cause: ${\n typeof cause === 'object' && cause && 'message' in cause\n ? cause.message\n : cause\n }`,\n );\n return undefined;\n }\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 const parent = _parent 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: removeUseGpuDirective(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 (containsUseGpuDirective(node)) {\n tgslFunctionDefs.push({\n def: removeUseGpuDirective(node),\n name: getFunctionName(node, parent),\n });\n this.skip();\n }\n }\n },\n });\n\n for (const { def, name } of tgslFunctionDefs) {\n const { params, body, externalNames } = transpileFn(def);\n const isFunctionStatement = def.type === 'FunctionDeclaration';\n\n if (\n isFunctionStatement &&\n name &&\n code.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 name: ${name ? `\"${name}\"` : 'undefined'},\n ast: ${embedJSON({ params, body, externalNames })},\n get externals() { return {${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;\n\nexport { default as babelPlugin } from './babel.ts';\nexport { default as bunPlugin } from './bun.ts';\n"],"mappings":"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","names":["defu","walk","generateTransform","MagicStringAST","FORMAT_VERSION","transpileFn","createUnplugin","containsUseGpuDirective","node","statement","useGpuDirective","removeUseGpuDirective","cloned","assignMetadata","magicString","metadata","wrapInAutoName","name","typegpu","createUnplugin","rawOptions","options","defu","defaultOptions","earlyPruneRegex","code","id","ctx","ast","cause","tgslFunctionDefs","MagicStringAST","walk","_node","_parent","prop","index","parent","performExpressionNaming","gatherTgpuAliases","isShellImplementationCall","implementation","getFunctionName","def","params","body","externalNames","transpileFn","isFunctionStatement","FORMAT_VERSION","embedJSON","generateTransform","index_default","vitePlugin","rollupPlugin","rolldownPlugin","webpackPlugin","rspackPlugin","esbuildPlugin","farmPlugin"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-CBTXKIP6.cjs","../src/bun.ts"],"names":["bun_default","rawOptions","options","defu","defaultOptions","include","build","args","text","earlyPruneRegex","pattern","result","babel_default"],"mappings":"AAAA,mfAAsD,6FCC/B,wEACN,IAIVA,CAAAA,CAASC,CAAAA,EAAmC,CACjD,IAAMC,CAAAA,CAAUC,4BAAAA,CAAKF,CAAYG,mBAAc,CAAA,CACzCC,CAAAA,CAAUH,CAAAA,CAAQ,OAAA,CACxB,EAAA,CAAI,CAAA,CAAEG,EAAAA,WAAmB,MAAA,CAAA,CACvB,MAAM,IAAI,KAAA,CACR,yFACF,CAAA,CAEF,EAAA,CAAIH,CAAAA,CAAQ,OAAA,CACV,MAAM,IAAI,KAAA,CAAM,4CAA4C,CAAA,CAG9D,MAAO,CACL,IAAA,CAAM,SAAA,CACN,KAAA,CAAMI,CAAAA,CAAO,CACXA,CAAAA,CAAM,MAAA,CAAO,CAAE,MAAA,CAAQD,CAAQ,CAAA,CAAG,MAAOE,CAAAA,EAAS,CAChD,IAAMC,CAAAA,CAAO,MAAM,GAAA,CAAI,IAAA,CAAKD,CAAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAG5C,EAAA,CAAIE,mBAAAA,CAAgB,KAAA,CAAOC,CAAAA,EAAY,CAACA,CAAAA,CAAQ,IAAA,CAAKF,CAAI,CAAC,CAAA,CACxD,MAAO,CACL,QAAA,CAAUA,CAAAA,CACV,MAAA,CAAQD,CAAAA,CAAK,MACf,CAAA,CAGF,IAAMI,CAAAA,CAAe,CAAA,CAAA,SAAA,CAAUH,CAAAA,CAAM,CACnC,OAAA,CAAS,CAAC,CAAC,YAAA,CAAc,CAAE,kBAAA,CAAoB,CAAA,CAAK,CAAC,CAAC,CAAA,CACtD,QAAA,CAAUD,CAAAA,CAAK,IAAA,CACf,OAAA,CAAS,CAACK,mBAAW,CACvB,CAAC,CAAA,CAAE,IAAA,CAEH,MAAO,CACL,QAAA,CAAUD,CAAAA,EAAA,IAAA,CAAAA,CAAAA,CAAUH,CAAAA,CACpB,MAAA,CAAQD,CAAAA,CAAK,MACf,CACF,CAAC,CACH,CACF,CACF,CAAA,CAAA,cAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-CBTXKIP6.cjs","sourcesContent":[null,"import type { BunPlugin } from 'bun';\nimport * as Babel from '@babel/standalone';\nimport defu from 'defu';\nimport { defaultOptions, earlyPruneRegex, type Options } from './common.ts';\nimport babelPlugin from './babel.ts';\n\nexport default (rawOptions: Options): BunPlugin => {\n const options = defu(rawOptions, defaultOptions);\n const include = options.include;\n if (!(include instanceof RegExp)) {\n throw new Error(\n `Unsupported 'include' options in Bun plugin. Please provide a single regular expression`,\n );\n }\n if (options.exclude) {\n throw new Error(`Unsupported 'exclude' option in Bun plugin`);\n }\n\n return {\n name: 'TypeGPU',\n setup(build) {\n build.onLoad({ filter: include }, async (args) => {\n const text = await Bun.file(args.path).text();\n\n // Pruning early before more expensive operations\n if (earlyPruneRegex.every((pattern) => !pattern.test(text))) {\n return {\n contents: text,\n loader: args.loader,\n };\n }\n\n const result = Babel.transform(text, {\n presets: [['typescript', { allowDeclareFields: true }]],\n filename: args.path,\n plugins: [babelPlugin],\n }).code;\n\n return {\n contents: result ?? text,\n loader: args.loader,\n };\n });\n },\n };\n};\n"]}
package/chunk-DE4HNFJZ.js DELETED
@@ -1,2 +0,0 @@
1
- import*as y from"@babel/standalone";import M from"defu";import{FORMAT_VERSION as L}from"tinyest";import{transpileFn as W}from"tinyest-for-wgsl";var E={include:/\.m?[jt]sx?(?:\?.*)?$/,autoNamingEnabled:!0,earlyPruning:!0};function F(r){return JSON.stringify(r).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function O(r,e){let t="",n=e;for(;;)if(n.type==="MemberExpression"){if((n.property.type==="Literal"||n.property.type==="StringLiteral")&&n.property.value==="~unstable"){n=n.object;continue}if(n.property.type!=="Identifier")break;t=t?`${n.property.name}.${t}`:n.property.name,n=n.object}else if(n.type==="Identifier"){t=t?`${n.name}.${t}`:n.name;break}else break;return r.tgpuAliases.has(t)}function A(r,e){if(r.source.value==="typegpu")for(let t of r.specifiers)t.type==="ImportDefaultSpecifier"||t.type==="ImportSpecifier"&&t.imported.type==="Identifier"&&t.imported.name==="tgpu"?e.tgpuAliases.add(t.local.name):t.type==="ImportNamespaceSpecifier"&&e.tgpuAliases.add(`${t.local.name}.tgpu`)}var T=["fn","vertexFn","fragmentFn","computeFn"];function d(r,e){return r.callee.type==="CallExpression"&&r.callee.callee.type==="MemberExpression"&&r.callee.callee.property.type==="Identifier"&&T.includes(r.callee.callee.property.name)&&r.arguments.length===1&&O(e,r.callee.callee.object)}function N(r,e){var t;return(e==null?void 0:e.type)==="VariableDeclarator"&&e.id.type==="Identifier"?e.id.name:r.type==="FunctionDeclaration"||r.type==="FunctionExpression"?(t=r.id)==null?void 0:t.name:void 0}var x=["bindGroupLayout","vertexLayout","slot","accessor","privateVar","workgroupVar","const",...T,"struct","unstruct","createBuffer","createMutable","createReadonly","createUniform","createQuerySet","createPipeline","createTexture","createSampler","createComparisonSampler"];function u(r,e){if(r.type==="CallExpression"){if(d(r,e)||r.callee.type==="Identifier"&&x.includes(r.callee.name))return!0;if(r.callee.type==="MemberExpression"){if(r.callee.property.type==="Identifier"){if(x.includes(r.callee.property.name))return!0;if(r.callee.property.name==="$name")return!1}return u(r.callee.object,e)}}return r.type==="TaggedTemplateExpression"?u(r.tag,e):!1}function c(r,e,t){r.autoNamingEnabled&&(e.type==="VariableDeclarator"&&e.id.type==="Identifier"&&e.init&&u(e.init,r)?t(e.init,e.id.name):e.type==="AssignmentExpression"&&e.left.type==="Identifier"&&u(e.right,r)?t(e.right,e.left.name):(e.type==="Property"||e.type==="ObjectProperty")&&e.key.type==="Identifier"&&u(e.value,r)&&t(e.value,e.key.name))}var S="use gpu",V=[/["']use gpu["']/,/t(ype)?gpu/];import{resolve as k}from"pathe";import h from"picomatch";function P(r){let e=r||[];return Array.isArray(e)?e:[e]}var j=/\\/g;function f(r){return r.replace(j,"/")}var w=/^(?:\/|(?:[A-Z]:)?[/\\|])/i;function D(r){return w.test(r)}function R(r,e){if(r.startsWith("**")||D(r))return f(r);let t=k(e,r);return f(t)}function I(r){if(r instanceof RegExp)return o=>{let s=f(o),l=r.test(s);return r.lastIndex=0,l};let e=process.cwd(),t=R(r,e),n=h(t,{dot:!0});return o=>{let s=f(o);return n(s)}}function _(r,e){if(!(!r&&!e))return t=>r!=null&&r.some(n=>n(t))?!1:e!=null&&e.some(n=>n(t))?!0:!(e&&e.length>0)}function $(r){return typeof r=="string"||r instanceof RegExp?{include:[r]}:Array.isArray(r)?{include:r}:{exclude:r.exclude?P(r.exclude):void 0,include:r.include?P(r.include):void 0}}function G(r){if(!r)return;let{exclude:e,include:t}=$(r),n=e==null?void 0:e.map(I),o=t==null?void 0:t.map(I);return _(n,o)}function v(r){let e=G(r);return e?t=>!!e(t):void 0}var C=y.packages.template,i=y.packages.types;function g(r){var e,t;return("directives"in r.body?(t=(e=r.body)==null?void 0:e.directives)!=null?t:[]:[]).map(n=>n.value.value).includes(S)}function a(r){return i.identifier(r)}function m(r,e){let{params:t,body:n,externalNames:o}=W(r),s=N(r,e),l=i.objectExpression([i.objectProperty(a("v"),i.numericLiteral(L)),i.objectProperty(a("name"),s?i.stringLiteral(s):i.buildUndefinedNode()),i.objectProperty(a("ast"),C.expression`${F({params:t,body:n,externalNames:o})}`()),i.objectMethod("get",a("externals"),[],i.blockStatement([i.returnStatement(i.objectExpression(o.map(p=>i.objectProperty(a(p),a(p),!1,!0))))]))]);return i.callExpression(i.arrowFunctionExpression([a("$")],i.logicalExpression("&&",i.callExpression(i.memberExpression(i.assignmentExpression("??=",i.memberExpression(a("globalThis"),a("__TYPEGPU_META__")),i.newExpression(a("WeakMap"),[])),a("set")),[i.assignmentExpression("=",i.memberExpression(a("$"),a("f")),r),l]),i.memberExpression(a("$"),a("f")))),[i.objectExpression([])])}function b(r,e){return i.callExpression(C.expression("globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)",{placeholderPattern:!1})(),[r,i.stringLiteral(e)])}function U(r){return{VariableDeclarator(e){c(r,e.node,(t,n)=>{e.get("init").replaceWith(b(t,n))})},AssignmentExpression(e){c(r,e.node,(t,n)=>{e.get("right").replaceWith(b(t,n))})},ObjectProperty(e){c(r,e.node,(t,n)=>{e.get("value").replaceWith(b(t,n))})},ImportDeclaration(e){A(e.node,r)},ArrowFunctionExpression(e){let t=e.node,n=e.parentPath.node;g(t)&&(e.replaceWith(m(t,n)),e.skip())},FunctionExpression(e){let t=e.node,n=e.parentPath.node;g(t)&&(e.replaceWith(m(t,n)),e.skip())},FunctionDeclaration(e){let t=e.node,n=e.parentPath.node,o=i.functionExpression(t.id,t.params,t.body);g(e.node)&&t.id&&(e.replaceWith(i.variableDeclaration("const",[i.variableDeclarator(t.id,m(o,n))])),e.skip())},CallExpression(e){let t=e.node;if(d(t,r)){let n=t.arguments[0];if(n&&(n.type==="FunctionExpression"||n.type==="ArrowFunctionExpression")){let o=m(n,null);e.replaceWith(i.callExpression(t.callee,[o])),e.skip()}}}}}function q(){return{visitor:{Program(r,e){var p;let t=(p=e.file)==null?void 0:p.code,n=M(e.opts,E),o=e.filename,s=v(n);if(o&&s&&!(s!=null&&s(o)))return;let l={tgpuAliases:new Set(n.forceTgpuAlias?[n.forceTgpuAlias]:[]),fileId:o,autoNamingEnabled:n.autoNamingEnabled};r.traverse(U(l))}}}}export{E as a,F as b,A as c,d,N as e,c as f,S as g,V as h,q as i};
2
- //# sourceMappingURL=chunk-DE4HNFJZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/babel.ts","../src/common.ts","../src/filter.ts"],"sourcesContent":["import * as Babel from '@babel/standalone';\nimport type TemplateGenerator from '@babel/template';\nimport type { TraverseOptions } from '@babel/traverse';\nimport type * as babel from '@babel/types';\nimport defu from 'defu';\nimport { FORMAT_VERSION } from 'tinyest';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport {\n type Context,\n defaultOptions,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\nimport { createFilterForId } from './filter.ts';\n\n// NOTE: @babel/standalone does expose internal packages, as specified in the docs, but the\n// typing for @babel/standalone does not expose them.\nconst template = (\n Babel as unknown as { packages: { template: typeof TemplateGenerator } }\n).packages.template;\nconst types = (Babel as unknown as { packages: { types: typeof babel } })\n .packages.types;\n\nfunction containsUseGpuDirective(\n node:\n | babel.FunctionDeclaration\n | babel.FunctionExpression\n | babel.ArrowFunctionExpression,\n): boolean {\n return ((\n 'directives' in node.body ? (node.body?.directives ?? []) : []\n )\n .map((directive) => directive.value.value))\n .includes(useGpuDirective);\n}\n\nfunction i(identifier: string): babel.Identifier {\n return types.identifier(identifier);\n}\n\nfunction functionToTranspiled(\n node: babel.ArrowFunctionExpression | babel.FunctionExpression,\n parent: babel.Node | null,\n): babel.CallExpression {\n const { params, body, externalNames } = transpileFn(node);\n const maybeName = getFunctionName(node, parent);\n\n const metadata = types.objectExpression([\n types.objectProperty(\n i('v'),\n types.numericLiteral(FORMAT_VERSION),\n ),\n types.objectProperty(\n i('name'),\n maybeName ? types.stringLiteral(maybeName) : types.buildUndefinedNode(),\n ),\n types.objectProperty(\n i('ast'),\n template.expression`${embedJSON({ params, body, externalNames })}`(),\n ),\n types.objectMethod(\n 'get',\n i('externals'),\n [],\n types.blockStatement([\n types.returnStatement(\n types.objectExpression(\n externalNames.map((name) =>\n types.objectProperty(i(name), i(name), false, true)\n ),\n ),\n ),\n ]),\n ),\n ]);\n\n return types.callExpression(\n types.arrowFunctionExpression(\n [i('$')],\n types.logicalExpression(\n '&&',\n types.callExpression(\n types.memberExpression(\n types.assignmentExpression(\n '??=',\n types.memberExpression(i('globalThis'), i('__TYPEGPU_META__')),\n types.newExpression(i('WeakMap'), []),\n ),\n i('set'),\n ),\n [\n types.assignmentExpression(\n '=',\n types.memberExpression(i('$'), i('f')),\n node,\n ),\n metadata,\n ],\n ),\n types.memberExpression(i('$'), i('f')),\n ),\n ),\n [types.objectExpression([])],\n );\n}\n\nfunction wrapInAutoName(\n node: babel.Expression,\n name: string,\n) {\n return types.callExpression(\n template.expression('globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)', {\n placeholderPattern: false,\n })(),\n [node, types.stringLiteral(name)],\n );\n}\n\nfunction functionVisitor(ctx: Context): TraverseOptions {\n return {\n VariableDeclarator(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('init').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n AssignmentExpression(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('right').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ObjectProperty(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('value').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ImportDeclaration(path) {\n gatherTgpuAliases(path.node, ctx);\n },\n\n ArrowFunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionDeclaration(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n const expression = types.functionExpression(\n node.id,\n node.params,\n node.body,\n );\n\n if (containsUseGpuDirective(path.node) && node.id) {\n path.replaceWith(\n types.variableDeclaration('const', [\n types.variableDeclarator(\n node.id,\n functionToTranspiled(expression, parent),\n ),\n ]),\n );\n path.skip();\n }\n },\n\n CallExpression(path) {\n const node = path.node;\n\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 transpiled = functionToTranspiled(\n implementation,\n null,\n ) as babel.CallExpression;\n\n path.replaceWith(\n types.callExpression(node.callee, [\n transpiled,\n ]),\n );\n\n path.skip();\n }\n }\n },\n };\n}\n\nexport default function () {\n return {\n visitor: {\n Program(path, state) {\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const code: string | undefined = (state as any).file?.code;\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const options = defu((state as any).opts as Options, defaultOptions);\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const id: string | undefined = (state as any).filename;\n\n const filter = createFilterForId(options);\n if (id && filter && !filter?.(id)) {\n return;\n }\n\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 path.traverse(functionVisitor(ctx));\n },\n } satisfies TraverseOptions,\n };\n}\n","import type * as babel from '@babel/types';\nimport type * as acorn from 'acorn';\nimport type { FilterPattern } from 'unplugin';\n\nexport type Context = {\n /**\n * How the `tgpu` object is used in code. Since it can be aliased, we\n * need to catch that and act accordingly.\n */\n tgpuAliases: Set<string>;\n fileId?: string | undefined;\n autoNamingEnabled: boolean;\n};\n\nexport interface Options {\n /** @default [/\\.m?[jt]sx?$/] */\n include?: FilterPattern;\n\n /** @default undefined */\n exclude?: FilterPattern;\n\n /** @default undefined */\n enforce?: 'post' | 'pre' | undefined;\n\n /** @default undefined */\n forceTgpuAlias?: string | undefined;\n\n /** @default true */\n autoNamingEnabled?: boolean | undefined;\n\n /**\n * Skipping files that don't contain \"typegpu\", \"tgpu\" or \"use gpu\".\n * In case this early pruning hinders transformation, you\n * can disable it.\n *\n * @default true\n */\n earlyPruning?: boolean | undefined;\n}\n\nexport const defaultOptions = {\n include: /\\.m?[jt]sx?(?:\\?.*)?$/,\n autoNamingEnabled: true,\n earlyPruning: true,\n};\n\nexport function embedJSON(jsValue: unknown) {\n return JSON.stringify(jsValue)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Checks if `node` is an alias for the 'tgpu' object, traditionally\n * available via `import tgpu from 'typegpu'`.\n */\nfunction isTgpu(ctx: Context, node: babel.Node | acorn.AnyNode): boolean {\n let path = '';\n\n let tail = node;\n while (true) {\n if (tail.type === 'MemberExpression') {\n if (\n (tail.property.type === 'Literal' ||\n tail.property.type === 'StringLiteral') &&\n tail.property.value === '~unstable'\n ) {\n // Bypassing the '~unstable' property.\n tail = tail.object;\n continue;\n }\n\n if (tail.property.type !== 'Identifier') {\n // Not handling computed expressions.\n break;\n }\n\n path = path ? `${tail.property.name}.${path}` : tail.property.name;\n tail = tail.object;\n } else if (tail.type === 'Identifier') {\n path = path ? `${tail.name}.${path}` : tail.name;\n break;\n } else {\n break;\n }\n }\n\n return ctx.tgpuAliases.has(path);\n}\n\nexport function gatherTgpuAliases(\n node: acorn.ImportDeclaration | babel.ImportDeclaration,\n ctx: Context,\n) {\n if (node.source.value === 'typegpu') {\n for (const spec of node.specifiers) {\n if (\n // The default export of 'typegpu' is the `tgpu` object.\n spec.type === 'ImportDefaultSpecifier' ||\n // Aliasing 'tgpu' while importing, e.g. import { tgpu as t } from 'typegpu';\n (spec.type === 'ImportSpecifier' &&\n spec.imported.type === 'Identifier' &&\n spec.imported.name === 'tgpu')\n ) {\n ctx.tgpuAliases.add(spec.local.name);\n } else if (spec.type === 'ImportNamespaceSpecifier') {\n // Importing everything, e.g. import * as t from 'typegpu';\n ctx.tgpuAliases.add(`${spec.local.name}.tgpu`);\n }\n }\n }\n}\n\nconst fnShellFunctionNames = ['fn', 'vertexFn', 'fragmentFn', 'computeFn'];\n\nexport function isShellImplementationCall(\n node: acorn.CallExpression | babel.CallExpression,\n ctx: Context,\n) {\n return (\n node.callee.type === 'CallExpression' &&\n node.callee.callee.type === 'MemberExpression' &&\n node.callee.callee.property.type === 'Identifier' &&\n fnShellFunctionNames.includes(node.callee.callee.property.name) &&\n node.arguments.length === 1 && isTgpu(ctx, node.callee.callee.object)\n );\n}\n\nexport function getFunctionName(\n node: acorn.AnyNode | babel.Node,\n parent: acorn.AnyNode | babel.Node | null,\n): string | undefined {\n if (\n parent?.type === 'VariableDeclarator' && parent.id.type === 'Identifier'\n ) {\n return parent.id.name;\n }\n return node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression'\n ? node.id?.name\n : undefined;\n}\n\nconst resourceConstructors: string[] = [\n // tgpu\n 'bindGroupLayout',\n 'vertexLayout',\n // tgpu['~unstable']\n 'slot',\n 'accessor',\n 'privateVar',\n 'workgroupVar',\n 'const',\n ...fnShellFunctionNames,\n // d\n 'struct',\n 'unstruct',\n // root\n 'createBuffer',\n 'createMutable',\n 'createReadonly',\n 'createUniform',\n 'createQuerySet',\n // root['~unstable']\n 'createPipeline',\n 'createTexture',\n 'createSampler',\n 'createComparisonSampler',\n];\n\n/**\n * Checks if `node` should be wrapped in an autoname function.\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n */\nfunction containsResourceConstructorCall(\n node: acorn.AnyNode | babel.Node,\n ctx: Context,\n) {\n if (node.type === 'CallExpression') {\n if (isShellImplementationCall(node, ctx)) {\n return true;\n }\n // struct({...})\n if (\n node.callee.type === 'Identifier' &&\n resourceConstructors.includes(node.callee.name)\n ) {\n return true;\n }\n if (node.callee.type === 'MemberExpression') {\n if (node.callee.property.type === 'Identifier') {\n // root.createBuffer({...})\n if (resourceConstructors.includes(node.callee.property.name)) {\n return true;\n }\n if (node.callee.property.name === '$name') {\n return false;\n }\n }\n // root.createBuffer(d.f32).$usage('storage')\n return containsResourceConstructorCall(node.callee.object, ctx);\n }\n }\n if (node.type === 'TaggedTemplateExpression') {\n return containsResourceConstructorCall(node.tag, ctx);\n }\n return false;\n}\n\ntype ExpressionFor<T extends acorn.AnyNode | babel.Node> = T extends\n acorn.AnyNode ? acorn.Expression : babel.Expression;\n\n/**\n * Checks if `node` contains a label and a tgpu expression that could be named.\n * If so, it calls the provided callback. Nodes selected for naming include:\n *\n * `let name = tgpu.bindGroupLayout({});` (VariableDeclarator)\n *\n * `name = tgpu.bindGroupLayout({});` (AssignmentExpression)\n *\n * `property: tgpu.bindGroupLayout({})` (Property/ObjectProperty)\n *\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n *\n * This function is NOT used for auto-naming shell-less functions.\n * Those are handled separately.\n *\n * @privateRemarks\n * When adding new checks, you need to call this method in the corresponding node in Babel.\n */\nexport function performExpressionNaming<T extends acorn.AnyNode | babel.Node>(\n ctx: Context,\n node: T,\n namingCallback: (node: ExpressionFor<T>, name: string) => void,\n) {\n if (!ctx.autoNamingEnabled) {\n return;\n }\n\n if (\n node.type === 'VariableDeclarator' &&\n node.id.type === 'Identifier' &&\n node.init &&\n containsResourceConstructorCall(node.init, ctx)\n ) {\n namingCallback(node.init as ExpressionFor<T>, node.id.name);\n } else if (\n node.type === 'AssignmentExpression' &&\n node.left.type === 'Identifier' &&\n containsResourceConstructorCall(node.right, ctx)\n ) {\n namingCallback(node.right as ExpressionFor<T>, node.left.name);\n } else if (\n (node.type === 'Property' || node.type === 'ObjectProperty') &&\n node.key.type === 'Identifier' &&\n containsResourceConstructorCall(node.value, ctx)\n ) {\n namingCallback(node.value as ExpressionFor<T>, node.key.name);\n }\n}\n\nexport const useGpuDirective = 'use gpu';\n\n/** Regular expressions used for early pruning (to avoid unnecessary parsing, which is expensive) */\nexport const earlyPruneRegex = [/[\"']use gpu[\"']/, /t(ype)?gpu/];\n","// Copied from https://github.com/unjs/unplugin/blob/f514bf8e2d751b48b3a5acb1077eb1292d9711b3/src/utils/filter.ts#L2\n// Used only in the babel version of the plugin, since others can rely on native unplugin functionality.\n\nimport { resolve } from 'pathe';\nimport picomatch from 'picomatch';\nimport type {\n Arrayable,\n Nullable,\n StringFilter,\n StringOrRegExp,\n} from 'unplugin';\n\nfunction toArray<T>(array?: Nullable<Arrayable<T>>): Array<T> {\n const result = array || [];\n if (Array.isArray(result)) return result;\n return [result];\n}\n\nconst BACKSLASH_REGEX = /\\\\/g;\nfunction normalize(path: string): string {\n return path.replace(BACKSLASH_REGEX, '/');\n}\n\nconst ABSOLUTE_PATH_REGEX = /^(?:\\/|(?:[A-Z]:)?[/\\\\|])/i;\nfunction isAbsolute(path: string): boolean {\n return ABSOLUTE_PATH_REGEX.test(path);\n}\n\nexport type PluginFilter = (input: string) => boolean;\nexport type TransformHookFilter = (id: string, code: string) => boolean;\n\ninterface NormalizedStringFilter {\n include?: StringOrRegExp[] | undefined;\n exclude?: StringOrRegExp[] | undefined;\n}\n\nfunction getMatcherString(glob: string, cwd: string) {\n if (glob.startsWith('**') || isAbsolute(glob)) {\n return normalize(glob);\n }\n\n const resolved = resolve(cwd, glob);\n return normalize(resolved);\n}\n\nfunction patternToIdFilter(pattern: StringOrRegExp): PluginFilter {\n if (pattern instanceof RegExp) {\n return (id: string) => {\n const normalizedId = normalize(id);\n const result = pattern.test(normalizedId);\n pattern.lastIndex = 0;\n return result;\n };\n }\n const cwd = process.cwd();\n const glob = getMatcherString(pattern, cwd);\n const matcher = picomatch(glob, { dot: true });\n return (id: string) => {\n const normalizedId = normalize(id);\n return matcher(normalizedId);\n };\n}\n\nfunction patternToCodeFilter(pattern: StringOrRegExp): PluginFilter {\n if (pattern instanceof RegExp) {\n return (code: string) => {\n const result = pattern.test(code);\n pattern.lastIndex = 0;\n return result;\n };\n }\n return (code: string) => code.includes(pattern);\n}\n\nfunction createFilter(\n exclude: PluginFilter[] | undefined,\n include: PluginFilter[] | undefined,\n): PluginFilter | undefined {\n if (!exclude && !include) {\n return;\n }\n\n return (input) => {\n if (exclude?.some((filter) => filter(input))) {\n return false;\n }\n if (include?.some((filter) => filter(input))) {\n return true;\n }\n return !(include && include.length > 0);\n };\n}\n\nfunction normalizeFilter(filter: StringFilter): NormalizedStringFilter {\n if (typeof filter === 'string' || filter instanceof RegExp) {\n return {\n include: [filter],\n };\n }\n if (Array.isArray(filter)) {\n return {\n include: filter,\n };\n }\n return {\n exclude: filter.exclude ? toArray(filter.exclude) : undefined,\n include: filter.include ? toArray(filter.include) : undefined,\n };\n}\n\nfunction createIdFilter(\n filter: StringFilter | undefined,\n): PluginFilter | undefined {\n if (!filter) return;\n const { exclude, include } = normalizeFilter(filter);\n const excludeFilter = exclude?.map(patternToIdFilter);\n const includeFilter = include?.map(patternToIdFilter);\n return createFilter(excludeFilter, includeFilter);\n}\n\nfunction createCodeFilter(\n filter: StringFilter | undefined,\n): PluginFilter | undefined {\n if (!filter) return;\n const { exclude, include } = normalizeFilter(filter);\n const excludeFilter = exclude?.map(patternToCodeFilter);\n const includeFilter = include?.map(patternToCodeFilter);\n return createFilter(excludeFilter, includeFilter);\n}\n\nexport function createFilterForId(\n filter: StringFilter | undefined,\n): PluginFilter | undefined {\n const filterFunction = createIdFilter(filter);\n return filterFunction ? (id) => !!filterFunction(id) : undefined;\n}\n\nfunction createFilterForTransform(\n idFilter: StringFilter | undefined,\n codeFilter: StringFilter | undefined,\n): TransformHookFilter | undefined {\n if (!idFilter && !codeFilter) return;\n const idFilterFunction = createIdFilter(idFilter);\n const codeFilterFunction = createCodeFilter(codeFilter);\n return (id, code) => {\n let fallback = true;\n if (idFilterFunction) {\n fallback &&= idFilterFunction(id);\n }\n if (!fallback) {\n return false;\n }\n\n if (codeFilterFunction) {\n fallback &&= codeFilterFunction(code);\n }\n return fallback;\n };\n}\n"],"mappings":"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","names":["Babel","defu","FORMAT_VERSION","transpileFn","defaultOptions","embedJSON","jsValue","isTgpu","ctx","node","path","tail","gatherTgpuAliases","spec","fnShellFunctionNames","isShellImplementationCall","getFunctionName","parent","_a","resourceConstructors","containsResourceConstructorCall","performExpressionNaming","namingCallback","useGpuDirective","earlyPruneRegex","resolve","picomatch","toArray","array","result","BACKSLASH_REGEX","normalize","path","ABSOLUTE_PATH_REGEX","isAbsolute","getMatcherString","glob","cwd","resolved","patternToIdFilter","pattern","id","normalizedId","matcher","createFilter","exclude","include","input","filter","normalizeFilter","toArray","createIdFilter","excludeFilter","patternToIdFilter","includeFilter","createFilterForId","filter","filterFunction","createIdFilter","id","template","types","containsUseGpuDirective","node","_a","_b","directive","useGpuDirective","i","identifier","functionToTranspiled","parent","params","body","externalNames","transpileFn","maybeName","getFunctionName","metadata","FORMAT_VERSION","embedJSON","name","wrapInAutoName","functionVisitor","ctx","path","performExpressionNaming","gatherTgpuAliases","expression","isShellImplementationCall","implementation","transpiled","babel_default","state","code","options","defu","defaultOptions","id","filter","createFilterForId"]}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _standalone = require('@babel/standalone'); var y = _interopRequireWildcard(_standalone);var _defu = require('defu'); var _defu2 = _interopRequireDefault(_defu);var _tinyest = require('tinyest');var _tinyestforwgsl = require('tinyest-for-wgsl');var E={include:/\.m?[jt]sx?(?:\?.*)?$/,autoNamingEnabled:!0,earlyPruning:!0};function F(r){return JSON.stringify(r).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function O(r,e){let t="",n=e;for(;;)if(n.type==="MemberExpression"){if((n.property.type==="Literal"||n.property.type==="StringLiteral")&&n.property.value==="~unstable"){n=n.object;continue}if(n.property.type!=="Identifier")break;t=t?`${n.property.name}.${t}`:n.property.name,n=n.object}else if(n.type==="Identifier"){t=t?`${n.name}.${t}`:n.name;break}else break;return r.tgpuAliases.has(t)}function A(r,e){if(r.source.value==="typegpu")for(let t of r.specifiers)t.type==="ImportDefaultSpecifier"||t.type==="ImportSpecifier"&&t.imported.type==="Identifier"&&t.imported.name==="tgpu"?e.tgpuAliases.add(t.local.name):t.type==="ImportNamespaceSpecifier"&&e.tgpuAliases.add(`${t.local.name}.tgpu`)}var T=["fn","vertexFn","fragmentFn","computeFn"];function d(r,e){return r.callee.type==="CallExpression"&&r.callee.callee.type==="MemberExpression"&&r.callee.callee.property.type==="Identifier"&&T.includes(r.callee.callee.property.name)&&r.arguments.length===1&&O(e,r.callee.callee.object)}function N(r,e){var t;return(e==null?void 0:e.type)==="VariableDeclarator"&&e.id.type==="Identifier"?e.id.name:r.type==="FunctionDeclaration"||r.type==="FunctionExpression"?(t=r.id)==null?void 0:t.name:void 0}var x=["bindGroupLayout","vertexLayout","slot","accessor","privateVar","workgroupVar","const",...T,"struct","unstruct","createBuffer","createMutable","createReadonly","createUniform","createQuerySet","createPipeline","createTexture","createSampler","createComparisonSampler"];function u(r,e){if(r.type==="CallExpression"){if(d(r,e)||r.callee.type==="Identifier"&&x.includes(r.callee.name))return!0;if(r.callee.type==="MemberExpression"){if(r.callee.property.type==="Identifier"){if(x.includes(r.callee.property.name))return!0;if(r.callee.property.name==="$name")return!1}return u(r.callee.object,e)}}return r.type==="TaggedTemplateExpression"?u(r.tag,e):!1}function c(r,e,t){r.autoNamingEnabled&&(e.type==="VariableDeclarator"&&e.id.type==="Identifier"&&e.init&&u(e.init,r)?t(e.init,e.id.name):e.type==="AssignmentExpression"&&e.left.type==="Identifier"&&u(e.right,r)?t(e.right,e.left.name):(e.type==="Property"||e.type==="ObjectProperty")&&e.key.type==="Identifier"&&u(e.value,r)&&t(e.value,e.key.name))}var S="use gpu",V= exports.h =[/["']use gpu["']/,/t(ype)?gpu/];var _pathe = require('pathe');var _picomatch = require('picomatch'); var _picomatch2 = _interopRequireDefault(_picomatch);function P(r){let e=r||[];return Array.isArray(e)?e:[e]}var j=/\\/g;function f(r){return r.replace(j,"/")}var w=/^(?:\/|(?:[A-Z]:)?[/\\|])/i;function D(r){return w.test(r)}function R(r,e){if(r.startsWith("**")||D(r))return f(r);let t=_pathe.resolve.call(void 0, e,r);return f(t)}function I(r){if(r instanceof RegExp)return o=>{let s=f(o),l=r.test(s);return r.lastIndex=0,l};let e=process.cwd(),t=R(r,e),n=_picomatch2.default.call(void 0, t,{dot:!0});return o=>{let s=f(o);return n(s)}}function _(r,e){if(!(!r&&!e))return t=>r!=null&&r.some(n=>n(t))?!1:e!=null&&e.some(n=>n(t))?!0:!(e&&e.length>0)}function $(r){return typeof r=="string"||r instanceof RegExp?{include:[r]}:Array.isArray(r)?{include:r}:{exclude:r.exclude?P(r.exclude):void 0,include:r.include?P(r.include):void 0}}function G(r){if(!r)return;let{exclude:e,include:t}=$(r),n=e==null?void 0:e.map(I),o=t==null?void 0:t.map(I);return _(n,o)}function v(r){let e=G(r);return e?t=>!!e(t):void 0}var C=y.packages.template,i=y.packages.types;function g(r){var e,t;return("directives"in r.body?(t=(e=r.body)==null?void 0:e.directives)!=null?t:[]:[]).map(n=>n.value.value).includes(S)}function a(r){return i.identifier(r)}function m(r,e){let{params:t,body:n,externalNames:o}=_tinyestforwgsl.transpileFn.call(void 0, r),s=N(r,e),l=i.objectExpression([i.objectProperty(a("v"),i.numericLiteral(_tinyest.FORMAT_VERSION)),i.objectProperty(a("name"),s?i.stringLiteral(s):i.buildUndefinedNode()),i.objectProperty(a("ast"),C.expression`${F({params:t,body:n,externalNames:o})}`()),i.objectMethod("get",a("externals"),[],i.blockStatement([i.returnStatement(i.objectExpression(o.map(p=>i.objectProperty(a(p),a(p),!1,!0))))]))]);return i.callExpression(i.arrowFunctionExpression([a("$")],i.logicalExpression("&&",i.callExpression(i.memberExpression(i.assignmentExpression("??=",i.memberExpression(a("globalThis"),a("__TYPEGPU_META__")),i.newExpression(a("WeakMap"),[])),a("set")),[i.assignmentExpression("=",i.memberExpression(a("$"),a("f")),r),l]),i.memberExpression(a("$"),a("f")))),[i.objectExpression([])])}function b(r,e){return i.callExpression(C.expression("globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)",{placeholderPattern:!1})(),[r,i.stringLiteral(e)])}function U(r){return{VariableDeclarator(e){c(r,e.node,(t,n)=>{e.get("init").replaceWith(b(t,n))})},AssignmentExpression(e){c(r,e.node,(t,n)=>{e.get("right").replaceWith(b(t,n))})},ObjectProperty(e){c(r,e.node,(t,n)=>{e.get("value").replaceWith(b(t,n))})},ImportDeclaration(e){A(e.node,r)},ArrowFunctionExpression(e){let t=e.node,n=e.parentPath.node;g(t)&&(e.replaceWith(m(t,n)),e.skip())},FunctionExpression(e){let t=e.node,n=e.parentPath.node;g(t)&&(e.replaceWith(m(t,n)),e.skip())},FunctionDeclaration(e){let t=e.node,n=e.parentPath.node,o=i.functionExpression(t.id,t.params,t.body);g(e.node)&&t.id&&(e.replaceWith(i.variableDeclaration("const",[i.variableDeclarator(t.id,m(o,n))])),e.skip())},CallExpression(e){let t=e.node;if(d(t,r)){let n=t.arguments[0];if(n&&(n.type==="FunctionExpression"||n.type==="ArrowFunctionExpression")){let o=m(n,null);e.replaceWith(i.callExpression(t.callee,[o])),e.skip()}}}}}function q(){return{visitor:{Program(r,e){var p;let t=(p=e.file)==null?void 0:p.code,n=_defu2.default.call(void 0, e.opts,E),o=e.filename,s=v(n);if(o&&s&&!(s!=null&&s(o)))return;let l={tgpuAliases:new Set(n.forceTgpuAlias?[n.forceTgpuAlias]:[]),fileId:o,autoNamingEnabled:n.autoNamingEnabled};r.traverse(U(l))}}}}exports.a = E; exports.b = F; exports.c = A; exports.d = d; exports.e = N; exports.f = c; exports.g = S; exports.h = V; exports.i = q;
2
- //# sourceMappingURL=chunk-LNKX7SV5.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/babel.ts","../src/common.ts"],"names":["defaultOptions","embedJSON","jsValue","isTgpu","ctx","node","path","tail"],"mappings":"AAAA,whBAAuB,wEAIN,kCACc,kDACH,ICkCfA,CAAAA,CAAiB,CAC5B,OAAA,CAAS,uBAAA,CACT,iBAAA,CAAmB,CAAA,CAAA,CACnB,YAAA,CAAc,CAAA,CAChB,CAAA,CAEO,SAASC,CAAAA,CAAUC,CAAAA,CAAkB,CAC1C,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAO,CAAA,CAC1B,OAAA,CAAQ,SAAA,CAAW,SAAS,CAAA,CAC5B,OAAA,CAAQ,SAAA,CAAW,SAAS,CACjC,CAMA,SAASC,CAAAA,CAAOC,CAAAA,CAAcC,CAAAA,CAA2C,CACvE,IAAIC,CAAAA,CAAO,EAAA,CAEPC,CAAAA,CAAOF,CAAAA,CACX,GAAA,CAAA,CAAA,CAAA,CACE,EAAA,CAAIE,CAAAA,CAAK,IAAA,GAAS,kBAAA,CAAoB,CACpC,EAAA,CAAA,CACGA,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,SAAA,EACtBA,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,eAAA,CAAA,EACzBA,CAAAA,CAAK,QAAA,CAAS,KAAA,GAAU,WAAA,CACxB,CAEAA,CAAAA,CAAOA,CAAAA,CAAK,MAAA,CACZ,QACF,CAEA,EAAA,CAAIA,CAAAA,CAAK,QAAA,CAAS,IAAA,GAAS,YAAA,CAEzB,KAAA,CAGFD,CAAAA,CAAOA,CAAAA,CAAO,CAAA,EAAA","file":"/Users/iwo/Projects/wigsill/packages/unplugin-typegpu/dist/chunk-LNKX7SV5.cjs","sourcesContent":["import * as Babel from '@babel/standalone';\nimport type TemplateGenerator from '@babel/template';\nimport type { TraverseOptions } from '@babel/traverse';\nimport type * as babel from '@babel/types';\nimport defu from 'defu';\nimport { FORMAT_VERSION } from 'tinyest';\nimport { transpileFn } from 'tinyest-for-wgsl';\nimport {\n type Context,\n defaultOptions,\n embedJSON,\n gatherTgpuAliases,\n getFunctionName,\n isShellImplementationCall,\n type Options,\n performExpressionNaming,\n useGpuDirective,\n} from './common.ts';\nimport { createFilterForId } from './filter.ts';\n\n// NOTE: @babel/standalone does expose internal packages, as specified in the docs, but the\n// typing for @babel/standalone does not expose them.\nconst template = (\n Babel as unknown as { packages: { template: typeof TemplateGenerator } }\n).packages.template;\nconst types = (Babel as unknown as { packages: { types: typeof babel } })\n .packages.types;\n\nfunction containsUseGpuDirective(\n node:\n | babel.FunctionDeclaration\n | babel.FunctionExpression\n | babel.ArrowFunctionExpression,\n): boolean {\n return ((\n 'directives' in node.body ? (node.body?.directives ?? []) : []\n )\n .map((directive) => directive.value.value))\n .includes(useGpuDirective);\n}\n\nfunction i(identifier: string): babel.Identifier {\n return types.identifier(identifier);\n}\n\nfunction functionToTranspiled(\n node: babel.ArrowFunctionExpression | babel.FunctionExpression,\n parent: babel.Node | null,\n): babel.CallExpression {\n const { params, body, externalNames } = transpileFn(node);\n const maybeName = getFunctionName(node, parent);\n\n const metadata = types.objectExpression([\n types.objectProperty(\n i('v'),\n types.numericLiteral(FORMAT_VERSION),\n ),\n types.objectProperty(\n i('name'),\n maybeName ? types.stringLiteral(maybeName) : types.buildUndefinedNode(),\n ),\n types.objectProperty(\n i('ast'),\n template.expression`${embedJSON({ params, body, externalNames })}`(),\n ),\n types.objectMethod(\n 'get',\n i('externals'),\n [],\n types.blockStatement([\n types.returnStatement(\n types.objectExpression(\n externalNames.map((name) =>\n types.objectProperty(i(name), i(name), false, true)\n ),\n ),\n ),\n ]),\n ),\n ]);\n\n return types.callExpression(\n types.arrowFunctionExpression(\n [i('$')],\n types.logicalExpression(\n '&&',\n types.callExpression(\n types.memberExpression(\n types.assignmentExpression(\n '??=',\n types.memberExpression(i('globalThis'), i('__TYPEGPU_META__')),\n types.newExpression(i('WeakMap'), []),\n ),\n i('set'),\n ),\n [\n types.assignmentExpression(\n '=',\n types.memberExpression(i('$'), i('f')),\n node,\n ),\n metadata,\n ],\n ),\n types.memberExpression(i('$'), i('f')),\n ),\n ),\n [types.objectExpression([])],\n );\n}\n\nfunction wrapInAutoName(\n node: babel.Expression,\n name: string,\n) {\n return types.callExpression(\n template.expression('globalThis.__TYPEGPU_AUTONAME__ ?? (a => a)', {\n placeholderPattern: false,\n })(),\n [node, types.stringLiteral(name)],\n );\n}\n\nfunction functionVisitor(ctx: Context): TraverseOptions {\n return {\n VariableDeclarator(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('init').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n AssignmentExpression(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('right').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ObjectProperty(path) {\n performExpressionNaming(ctx, path.node, (node, name) => {\n path.get('value').replaceWith(wrapInAutoName(node, name));\n });\n },\n\n ImportDeclaration(path) {\n gatherTgpuAliases(path.node, ctx);\n },\n\n ArrowFunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionExpression(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n if (containsUseGpuDirective(node)) {\n path.replaceWith(functionToTranspiled(node, parent));\n path.skip();\n }\n },\n\n FunctionDeclaration(path) {\n const node = path.node;\n const parent = path.parentPath.node;\n const expression = types.functionExpression(\n node.id,\n node.params,\n node.body,\n );\n\n if (containsUseGpuDirective(path.node) && node.id) {\n path.replaceWith(\n types.variableDeclaration('const', [\n types.variableDeclarator(\n node.id,\n functionToTranspiled(expression, parent),\n ),\n ]),\n );\n path.skip();\n }\n },\n\n CallExpression(path) {\n const node = path.node;\n\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 transpiled = functionToTranspiled(\n implementation,\n null,\n ) as babel.CallExpression;\n\n path.replaceWith(\n types.callExpression(node.callee, [\n transpiled,\n ]),\n );\n\n path.skip();\n }\n }\n },\n };\n}\n\nexport default function () {\n return {\n visitor: {\n Program(path, state) {\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const code: string | undefined = (state as any).file?.code;\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const options = defu((state as any).opts as Options, defaultOptions);\n // biome-ignore lint/suspicious/noExplicitAny: <oh babel babel...>\n const id: string | undefined = (state as any).filename;\n\n const filter = createFilterForId(options);\n if (id && filter && !filter?.(id)) {\n return;\n }\n\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 path.traverse(functionVisitor(ctx));\n },\n } satisfies TraverseOptions,\n };\n}\n","import type * as babel from '@babel/types';\nimport type * as acorn from 'acorn';\nimport type { FilterPattern } from 'unplugin';\n\nexport type Context = {\n /**\n * How the `tgpu` object is used in code. Since it can be aliased, we\n * need to catch that and act accordingly.\n */\n tgpuAliases: Set<string>;\n fileId?: string | undefined;\n autoNamingEnabled: boolean;\n};\n\nexport interface Options {\n /** @default [/\\.m?[jt]sx?$/] */\n include?: FilterPattern;\n\n /** @default undefined */\n exclude?: FilterPattern;\n\n /** @default undefined */\n enforce?: 'post' | 'pre' | undefined;\n\n /** @default undefined */\n forceTgpuAlias?: string | undefined;\n\n /** @default true */\n autoNamingEnabled?: boolean | undefined;\n\n /**\n * Skipping files that don't contain \"typegpu\", \"tgpu\" or \"use gpu\".\n * In case this early pruning hinders transformation, you\n * can disable it.\n *\n * @default true\n */\n earlyPruning?: boolean | undefined;\n}\n\nexport const defaultOptions = {\n include: /\\.m?[jt]sx?(?:\\?.*)?$/,\n autoNamingEnabled: true,\n earlyPruning: true,\n};\n\nexport function embedJSON(jsValue: unknown) {\n return JSON.stringify(jsValue)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Checks if `node` is an alias for the 'tgpu' object, traditionally\n * available via `import tgpu from 'typegpu'`.\n */\nfunction isTgpu(ctx: Context, node: babel.Node | acorn.AnyNode): boolean {\n let path = '';\n\n let tail = node;\n while (true) {\n if (tail.type === 'MemberExpression') {\n if (\n (tail.property.type === 'Literal' ||\n tail.property.type === 'StringLiteral') &&\n tail.property.value === '~unstable'\n ) {\n // Bypassing the '~unstable' property.\n tail = tail.object;\n continue;\n }\n\n if (tail.property.type !== 'Identifier') {\n // Not handling computed expressions.\n break;\n }\n\n path = path ? `${tail.property.name}.${path}` : tail.property.name;\n tail = tail.object;\n } else if (tail.type === 'Identifier') {\n path = path ? `${tail.name}.${path}` : tail.name;\n break;\n } else {\n break;\n }\n }\n\n return ctx.tgpuAliases.has(path);\n}\n\nexport function gatherTgpuAliases(\n node: acorn.ImportDeclaration | babel.ImportDeclaration,\n ctx: Context,\n) {\n if (node.source.value === 'typegpu') {\n for (const spec of node.specifiers) {\n if (\n // The default export of 'typegpu' is the `tgpu` object.\n spec.type === 'ImportDefaultSpecifier' ||\n // Aliasing 'tgpu' while importing, e.g. import { tgpu as t } from 'typegpu';\n (spec.type === 'ImportSpecifier' &&\n spec.imported.type === 'Identifier' &&\n spec.imported.name === 'tgpu')\n ) {\n ctx.tgpuAliases.add(spec.local.name);\n } else if (spec.type === 'ImportNamespaceSpecifier') {\n // Importing everything, e.g. import * as t from 'typegpu';\n ctx.tgpuAliases.add(`${spec.local.name}.tgpu`);\n }\n }\n }\n}\n\nconst fnShellFunctionNames = ['fn', 'vertexFn', 'fragmentFn', 'computeFn'];\n\nexport function isShellImplementationCall(\n node: acorn.CallExpression | babel.CallExpression,\n ctx: Context,\n) {\n return (\n node.callee.type === 'CallExpression' &&\n node.callee.callee.type === 'MemberExpression' &&\n node.callee.callee.property.type === 'Identifier' &&\n fnShellFunctionNames.includes(node.callee.callee.property.name) &&\n node.arguments.length === 1 && isTgpu(ctx, node.callee.callee.object)\n );\n}\n\nexport function getFunctionName(\n node: acorn.AnyNode | babel.Node,\n parent: acorn.AnyNode | babel.Node | null,\n): string | undefined {\n if (\n parent?.type === 'VariableDeclarator' && parent.id.type === 'Identifier'\n ) {\n return parent.id.name;\n }\n return node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression'\n ? node.id?.name\n : undefined;\n}\n\nconst resourceConstructors: string[] = [\n // tgpu\n 'bindGroupLayout',\n 'vertexLayout',\n // tgpu['~unstable']\n 'slot',\n 'accessor',\n 'privateVar',\n 'workgroupVar',\n 'const',\n ...fnShellFunctionNames,\n // d\n 'struct',\n 'unstruct',\n // root\n 'createBuffer',\n 'createMutable',\n 'createReadonly',\n 'createUniform',\n 'createQuerySet',\n // root['~unstable']\n 'createPipeline',\n 'createTexture',\n 'createSampler',\n 'createComparisonSampler',\n];\n\n/**\n * Checks if `node` should be wrapped in an autoname function.\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n */\nfunction containsResourceConstructorCall(\n node: acorn.AnyNode | babel.Node,\n ctx: Context,\n) {\n if (node.type === 'CallExpression') {\n if (isShellImplementationCall(node, ctx)) {\n return true;\n }\n // struct({...})\n if (\n node.callee.type === 'Identifier' &&\n resourceConstructors.includes(node.callee.name)\n ) {\n return true;\n }\n if (node.callee.type === 'MemberExpression') {\n if (node.callee.property.type === 'Identifier') {\n // root.createBuffer({...})\n if (resourceConstructors.includes(node.callee.property.name)) {\n return true;\n }\n if (node.callee.property.name === '$name') {\n return false;\n }\n }\n // root.createBuffer(d.f32).$usage('storage')\n return containsResourceConstructorCall(node.callee.object, ctx);\n }\n }\n if (node.type === 'TaggedTemplateExpression') {\n return containsResourceConstructorCall(node.tag, ctx);\n }\n return false;\n}\n\ntype ExpressionFor<T extends acorn.AnyNode | babel.Node> = T extends\n acorn.AnyNode ? acorn.Expression : babel.Expression;\n\n/**\n * Checks if `node` contains a label and a tgpu expression that could be named.\n * If so, it calls the provided callback. Nodes selected for naming include:\n *\n * `let name = tgpu.bindGroupLayout({});` (VariableDeclarator)\n *\n * `name = tgpu.bindGroupLayout({});` (AssignmentExpression)\n *\n * `property: tgpu.bindGroupLayout({})` (Property/ObjectProperty)\n *\n * Since it is mostly for debugging and clean WGSL generation,\n * some false positives and false negatives are admissible.\n *\n * This function is NOT used for auto-naming shell-less functions.\n * Those are handled separately.\n *\n * @privateRemarks\n * When adding new checks, you need to call this method in the corresponding node in Babel.\n */\nexport function performExpressionNaming<T extends acorn.AnyNode | babel.Node>(\n ctx: Context,\n node: T,\n namingCallback: (node: ExpressionFor<T>, name: string) => void,\n) {\n if (!ctx.autoNamingEnabled) {\n return;\n }\n\n if (\n node.type === 'VariableDeclarator' &&\n node.id.type === 'Identifier' &&\n node.init &&\n containsResourceConstructorCall(node.init, ctx)\n ) {\n namingCallback(node.init as ExpressionFor<T>, node.id.name);\n } else if (\n node.type === 'AssignmentExpression' &&\n node.left.type === 'Identifier' &&\n containsResourceConstructorCall(node.right, ctx)\n ) {\n namingCallback(node.right as ExpressionFor<T>, node.left.name);\n } else if (\n (node.type === 'Property' || node.type === 'ObjectProperty') &&\n node.key.type === 'Identifier' &&\n containsResourceConstructorCall(node.value, ctx)\n ) {\n namingCallback(node.value as ExpressionFor<T>, node.key.name);\n }\n}\n\nexport const useGpuDirective = 'use gpu';\n\n/** Regular expressions used for early pruning (to avoid unnecessary parsing, which is expensive) */\nexport const earlyPruneRegex = [/[\"']use gpu[\"']/, /t(ype)?gpu/];\n"]}