typegpu 0.11.9 → 0.12.1

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 (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
package/shared/meta.js CHANGED
@@ -1,70 +1,86 @@
1
- import { version } from "../package.js";
1
+ const version = "0.12.1";
2
2
  import { DEV, TEST } from "./env.js";
3
- import { $getNameForward, isMarkedInternal } from "./symbols.js";
3
+ import { $getNameForward, $soul, isMarkedInternal } from "./symbols.js";
4
4
  import { normalizeMetadata } from "./normalizeMetadata.js";
5
-
6
- //#region src/shared/meta.ts
7
5
  const globalExt = globalThis;
8
- if (globalExt.__TYPEGPU_VERSION__ !== void 0) console.warn(`Found duplicate TypeGPU version. First was ${globalExt.__TYPEGPU_VERSION__}, this one is ${version}. This may cause unexpected behavior.`);
6
+ if (globalExt.__TYPEGPU_VERSION__ !== undefined) {
7
+ console.warn(`Found duplicate TypeGPU version. First was ${globalExt.__TYPEGPU_VERSION__}, this one is ${version}. This may cause unexpected behavior.`);
8
+ }
9
9
  globalExt.__TYPEGPU_VERSION__ = version;
10
10
  globalExt.__TYPEGPU_AUTONAME__ = (exp, label) => isNamable(exp) && isMarkedInternal(exp) && !getName(exp) ? exp.$name(label) : exp;
11
- const nameMap = /* @__PURE__ */ new WeakMap();
12
- function isNamable(value) {
13
- return !!value?.$name;
11
+ // --- NAMING ---
12
+ const nameMap = new WeakMap();
13
+ export function isNamable(value) {
14
+ return !!value?.$name;
14
15
  }
15
16
  function isForwarded(value) {
16
- return !!value?.[$getNameForward];
17
+ return !!value?.[$getNameForward];
18
+ }
19
+ function soulOf(value) {
20
+ return value?.[$soul];
17
21
  }
18
- function getName(definition) {
19
- if (isForwarded(definition)) return getName(definition[$getNameForward]);
20
- return nameMap.get(definition) ?? globalExt.__TYPEGPU_META__?.get(definition)?.name;
22
+ export function getName(definition) {
23
+ if (isForwarded(definition)) {
24
+ return getName(definition[$getNameForward]);
25
+ }
26
+ return (nameMap.get(definition) ??
27
+ // nameMap is runtime-local, soul labels travel with the resource between runtimes
28
+ soulOf(definition)?.label ??
29
+ globalExt.__TYPEGPU_META__?.get(definition)?.name);
21
30
  }
22
- function setName(definition, name) {
23
- if (isForwarded(definition)) {
24
- setName(definition[$getNameForward], name);
25
- return;
26
- }
27
- nameMap.set(definition, name);
31
+ export function setName(definition, name) {
32
+ if (isForwarded(definition)) {
33
+ setName(definition[$getNameForward], name);
34
+ return;
35
+ }
36
+ nameMap.set(definition, name);
37
+ const soul = soulOf(definition);
38
+ if (soul) {
39
+ soul.label = name;
40
+ }
28
41
  }
29
- const metadataMap = /* @__PURE__ */ new WeakMap();
42
+ // --- METADATA ---
43
+ const metadataMap = new WeakMap();
30
44
  /**
31
- * Retrieves normalized (non-raw) function metadata.
32
- * If `globalExt.__TYPEGPU_META__` contains raw metadata for the function,
33
- * it is normalized, and then deleted to avoid unnecessary re-normalization.
34
- */
35
- function getFunctionMetadata(definition) {
36
- const maybeRawMeta = globalExt.__TYPEGPU_META__?.get(definition);
37
- if (maybeRawMeta) {
38
- globalExt.__TYPEGPU_META__?.delete(definition);
39
- const normalized = normalizeMetadata(maybeRawMeta);
40
- metadataMap.set(definition, normalized);
41
- if (maybeRawMeta.name && nameMap.get(definition) === void 0) nameMap.set(definition, maybeRawMeta.name);
42
- }
43
- return metadataMap.get(definition);
45
+ * Retrieves normalized (non-raw) function metadata.
46
+ * If `globalExt.__TYPEGPU_META__` contains raw metadata for the function,
47
+ * it is normalized, and then deleted to avoid unnecessary re-normalization.
48
+ */
49
+ export function getFunctionMetadata(definition) {
50
+ // it's fine, if it's not an object, the get will return undefined
51
+ const maybeRawMeta = globalExt.__TYPEGPU_META__?.get(definition);
52
+ if (maybeRawMeta) {
53
+ globalExt.__TYPEGPU_META__?.delete(definition);
54
+ const normalized = normalizeMetadata(maybeRawMeta);
55
+ metadataMap.set(definition, normalized);
56
+ if (maybeRawMeta.name && nameMap.get(definition) === undefined) {
57
+ nameMap.set(definition, maybeRawMeta.name);
58
+ }
59
+ }
60
+ return metadataMap.get(definition);
44
61
  }
45
62
  /**
46
- * AST's are given to functions with a 'use gpu' directive, which this function checks for.
47
- */
48
- function hasTinyestMetadata(value) {
49
- return typeof value === "function" && !!getFunctionMetadata(value);
63
+ * AST's are given to functions with a 'use gpu' directive, which this function checks for.
64
+ */
65
+ export function hasTinyestMetadata(value) {
66
+ return typeof value === 'function' && !!getFunctionMetadata(value);
50
67
  }
68
+ // --- PERF ---
51
69
  /**
52
- * Performance measurements are only enabled in dev & test environments for now
53
- */
54
- const PERF = (DEV || TEST) && {
55
- get enabled() {
56
- return !!globalExt.__TYPEGPU_MEASURE_PERF__;
57
- },
58
- record(name, data) {
59
- const records = globalExt.__TYPEGPU_PERF_RECORDS__ ??= /* @__PURE__ */ new Map();
60
- let entries = records.get(name);
61
- if (!entries) {
62
- entries = [];
63
- records.set(name, entries);
64
- }
65
- entries.push(data);
66
- }
67
- } || void 0;
68
-
69
- //#endregion
70
- export { PERF, getFunctionMetadata, getName, hasTinyestMetadata, isNamable, setName };
70
+ * Performance measurements are only enabled in dev & test environments for now
71
+ */
72
+ export const PERF = ((DEV || TEST) && {
73
+ get enabled() {
74
+ return !!globalExt.__TYPEGPU_MEASURE_PERF__;
75
+ },
76
+ record(name, data) {
77
+ const records = (globalExt.__TYPEGPU_PERF_RECORDS__ ??= new Map());
78
+ let entries = records.get(name);
79
+ if (!entries) {
80
+ entries = [];
81
+ records.set(name, entries);
82
+ }
83
+ entries.push(data);
84
+ },
85
+ }) ||
86
+ undefined;
@@ -1,32 +1,37 @@
1
- import { Block, FuncParameter } from "tinyest";
2
-
3
- //#region src/shared/normalizeMetadata.d.ts
4
- interface RawMetadataV1 {
5
- v: 1;
6
- name: string;
7
- ast: {
8
- params: FuncParameter[];
9
- body: Block;
10
- externalNames: string[];
11
- };
12
- externals: Record<string, unknown> | (() => Record<string, unknown>);
1
+ import type { Block, FuncParameter } from 'tinyest';
2
+ export interface RawMetadataV1 {
3
+ v: 1;
4
+ name: string;
5
+ ast: {
6
+ params: FuncParameter[];
7
+ body: Block;
8
+ externalNames: string[];
9
+ };
10
+ externals: Record<string, unknown> | (() => Record<string, unknown>);
13
11
  }
14
- interface ExternalsV2 {
15
- [key: string]: ExternalsV2 | (() => unknown);
16
- }
17
- interface RawMetadataV2 {
18
- v: 2;
19
- name: string;
20
- ast: {
21
- params: FuncParameter[];
22
- body: Block;
23
- externalNames: string[];
24
- };
25
- externals: ExternalsV2;
12
+ export interface RawMetadataV2 {
13
+ v: 2;
14
+ name: string;
15
+ ast: {
16
+ params: FuncParameter[];
17
+ body: Block;
18
+ };
19
+ externals: {
20
+ [key: string]: () => unknown;
21
+ };
26
22
  }
27
23
  /**
28
24
  * Holds all function info collected by typegpu-unplugin
29
25
  */
30
- type RawMetadata = RawMetadataV1 | RawMetadataV2;
31
- //#endregion
32
- export { RawMetadata };
26
+ export type RawMetadata = RawMetadataV1 | RawMetadataV2;
27
+ /**
28
+ * Holds normalized function metadata required for WGSL generation
29
+ */
30
+ export interface Metadata {
31
+ ast: {
32
+ params: FuncParameter[];
33
+ body: Block;
34
+ };
35
+ externals: () => Record<string, unknown>;
36
+ }
37
+ export declare function normalizeMetadata(meta: RawMetadata): Metadata;
@@ -1,41 +1,28 @@
1
1
  import { safeStringify } from "./stringify.js";
2
-
3
- //#region src/shared/normalizeMetadata.ts
4
2
  /**
5
- * The values of ExternalsV2 are zero-argument functions for accessing the value.
6
- * Since they would be recognized by the wgslGenerator as regular, non 'use gpu' functions,
7
- * we turn them into getters.
8
- *
9
- * @example
10
- * normalizeExternalsV2({ ext: { prop: () => ext.prop; }}); // { ext: { prop: [Getter] } }
11
- */
3
+ * The values of ExternalsV2 are zero-argument functions for accessing the value.
4
+ * Since they would be recognized by the WgslGenerator as regular, non 'use gpu' functions,
5
+ * we turn them into getters.
6
+ *
7
+ * @example
8
+ * normalizeExternalsV2({ "ext.prop": () => ext.prop; }); // { get "ext.prop"() => ext.prop; }
9
+ */
12
10
  function normalizeExternalsV2(externals) {
13
- const result = {};
14
- for (const [key, value] of Object.entries(externals)) if (typeof value === "function") Object.defineProperty(result, key, {
15
- get: value,
16
- enumerable: true
17
- });
18
- else result[key] = normalizeExternalsV2(value);
19
- return result;
11
+ const result = {};
12
+ for (const [key, value] of Object.entries(externals)) {
13
+ Object.defineProperty(result, key, { get: value, enumerable: true });
14
+ }
15
+ return result;
20
16
  }
21
- function normalizeMetadata(meta) {
22
- if (meta.v === 1) {
23
- const rawExternals = meta.externals;
24
- const externals = typeof rawExternals === "function" ? rawExternals : () => rawExternals;
25
- return {
26
- ...meta,
27
- externals
28
- };
29
- }
30
- if (meta.v === 2) {
31
- const externals = normalizeExternalsV2(meta?.externals);
32
- return {
33
- ...meta,
34
- externals: () => externals
35
- };
36
- }
37
- throw new Error(`Unrecognized TypeGPU metadata format: ${safeStringify(meta)}`);
17
+ export function normalizeMetadata(meta) {
18
+ if (meta.v === 1) {
19
+ const rawExternals = meta.externals;
20
+ const externals = typeof rawExternals === 'function' ? rawExternals : () => rawExternals;
21
+ return { ...meta, externals };
22
+ }
23
+ if (meta.v === 2) {
24
+ const externals = normalizeExternalsV2(meta?.externals);
25
+ return { ...meta, externals: () => externals };
26
+ }
27
+ throw new Error(`Unrecognized TypeGPU metadata format: ${safeStringify(meta)}`);
38
28
  }
39
-
40
- //#endregion
41
- export { normalizeMetadata };
package/shared/repr.d.ts CHANGED
@@ -1,13 +1,10 @@
1
- import { $gpuRepr, $gpuValueOf, $inRepr, $invalidSchemaReason, $memIdent, $repr, $reprPartial, $reprPatch, $validStorageSchema, $validUniformSchema, $validVertexSchema } from "./symbols.js";
2
- import { Default } from "./utilityTypes.js";
3
- import { U16, U32, WgslArray } from "../data/wgslTypes.js";
4
- import { ViewDimensionToDimension } from "../core/texture/textureFormats.js";
5
- import { WgslStorageTexture, WgslTexture } from "../data/texture.js";
6
- import { TgpuTexture } from "../core/texture/texture.js";
7
- import { Disarray, Undecorate } from "../data/dataTypes.js";
8
-
9
- //#region src/shared/repr.d.ts
10
-
1
+ import type { TgpuTexture } from '../core/texture/texture.ts';
2
+ import type { Disarray, Undecorate } from '../data/dataTypes.ts';
3
+ import type { WgslStorageTexture, WgslTexture } from '../data/texture.ts';
4
+ import type { U16, U32, WgslArray } from '../data/wgslTypes.ts';
5
+ import type { $gpuRepr, $gpuValueOf, $inRepr, $invalidSchemaReason, $memIdent, $repr, $reprPartial, $reprPatch, $validStorageSchema, $validUniformSchema, $validVertexSchema } from './symbols.ts';
6
+ import type { ViewDimensionToDimension } from '../core/texture/textureFormats.ts';
7
+ import type { Default } from './utilityTypes.ts';
11
8
  /**
12
9
  * Extracts the inferred representation of a resource.
13
10
  * For inferring types as seen by the GPU, see {@link InferGPU}
@@ -17,8 +14,8 @@ import { Disarray, Undecorate } from "../data/dataTypes.js";
17
14
  * type B = Infer<WgslArray<F32>> // => number[]
18
15
  * type C = Infer<Atomic<U32>> // => number
19
16
  */
20
- type Infer<T> = T extends {
21
- readonly [$repr]: infer TRepr;
17
+ export type Infer<T> = T extends {
18
+ readonly [$repr]: infer TRepr;
22
19
  } ? TRepr : T;
23
20
  /**
24
21
  * Extracts the inferred input (write-side) representation of a resource.
@@ -30,8 +27,8 @@ type Infer<T> = T extends {
30
27
  * const arrayOfStructs = d.arrayOf(d.struct({ pos: d.vec3f, id: d.f32 }), 4);
31
28
  * type D = d.InferInput<typeof arrayOfStructs>; // { pos: d.v3f | Float32Array<ArrayBufferLike> | [number, number, number]; id: number; }[]
32
29
  */
33
- type InferInput<T> = Infer<T> | (T extends {
34
- readonly [$inRepr]: infer TRepr;
30
+ export type InferInput<T> = Infer<T> | (T extends {
31
+ readonly [$inRepr]: infer TRepr;
35
32
  } ? TRepr : never);
36
33
  /**
37
34
  * Extracts a sparse/partial inferred representation of a resource.
@@ -44,10 +41,10 @@ type InferInput<T> = Infer<T> | (T extends {
44
41
  * type B = InferPartial<WgslStruct<{ a: F32 }>> // => { a?: number | undefined }
45
42
  * type C = InferPartial<WgslArray<F32>> // => { idx: number; value: number | undefined }[] | undefined
46
43
  */
47
- type InferPartial<T> = T extends {
48
- readonly [$reprPartial]: infer TRepr;
44
+ export type InferPartial<T> = T extends {
45
+ readonly [$reprPartial]: infer TRepr;
49
46
  } ? TRepr : T extends {
50
- readonly [$repr]: infer TRepr;
47
+ readonly [$repr]: infer TRepr;
51
48
  } ? TRepr | undefined : T;
52
49
  /**
53
50
  * Extracts the inferred representation of a resource (as seen by the GPU).
@@ -57,13 +54,19 @@ type InferPartial<T> = T extends {
57
54
  * type B = InferGPU<WgslArray<F32>> // => number[]
58
55
  * type C = InferGPU<Atomic<U32>> // => atomicU32
59
56
  */
60
- type InferGPU<T> = T extends {
61
- readonly [$gpuRepr]: infer TRepr;
57
+ export type InferGPU<T> = T extends {
58
+ readonly [$gpuRepr]: infer TRepr;
62
59
  } ? TRepr : Infer<T>;
63
- type InferRecord<T extends Record<string | number | symbol, unknown>> = { [Key in keyof T]: Infer<T[Key]> };
64
- type InferInputRecord<T extends Record<string | number | symbol, unknown>> = { [Key in keyof T]: InferInput<T[Key]> };
60
+ export type InferRecord<T extends Record<string | number | symbol, unknown>> = {
61
+ [Key in keyof T]: Infer<T[Key]>;
62
+ };
63
+ export type InferInputRecord<T extends Record<string | number | symbol, unknown>> = {
64
+ [Key in keyof T]: InferInput<T[Key]>;
65
+ };
65
66
  /** @deprecated */
66
- type InferPartialRecord<T extends Record<string | number | symbol, unknown>> = { [Key in keyof T]?: InferPartial<T[Key]> };
67
+ export type InferPartialRecord<T extends Record<string | number | symbol, unknown>> = {
68
+ [Key in keyof T]?: InferPartial<T[Key]>;
69
+ };
67
70
  /**
68
71
  * Extracts the patch representation of a resource.
69
72
  * Used by the `buffer.patch` API.
@@ -73,67 +76,82 @@ type InferPartialRecord<T extends Record<string | number | symbol, unknown>> = {
73
76
  * type B = InferPatch<WgslStruct<{ a: F32 }>> // => { a?: number | undefined }
74
77
  * type C = InferPatch<WgslArray<F32>> // => Record<number, number | undefined> | number[] | undefined
75
78
  */
76
- type InferPatch<T> = T extends {
77
- readonly [$reprPatch]: infer TRepr;
79
+ export type InferPatch<T> = T extends {
80
+ readonly [$reprPatch]: infer TRepr;
78
81
  } ? TRepr : InferInput<T> | undefined;
79
- type InferPatchRecord<T extends Record<string | number | symbol, unknown>> = { [Key in keyof T]?: InferPatch<T[Key]> };
80
- type InferGPURecord<T extends Record<string | number | symbol, unknown>> = { [Key in keyof T]: InferGPU<T[Key]> };
81
- type GPUValueOf<T> = T extends {
82
- readonly [$gpuValueOf]: infer TValue;
82
+ export type InferPatchRecord<T extends Record<string | number | symbol, unknown>> = {
83
+ [Key in keyof T]?: InferPatch<T[Key]>;
84
+ };
85
+ export type InferGPURecord<T extends Record<string | number | symbol, unknown>> = {
86
+ [Key in keyof T]: InferGPU<T[Key]>;
87
+ };
88
+ export type GPUValueOf<T> = T extends {
89
+ readonly [$gpuValueOf]: infer TValue;
83
90
  } ? TValue : T;
84
- type MemIdentity<T> = T extends {
85
- readonly [$memIdent]: infer TMemIdent;
91
+ /**
92
+ * Expands a schema to a union of other schemas that have the same binary representation.
93
+ *
94
+ * @example
95
+ * type A = MemIdentity<F32> // => F32
96
+ * type B = MemIdentity<I32> // => I32 | Atomic<I32> | Decorated<I32, Location[]>
97
+ * type C = MemIdentity<WgslArray<I32>> // => WgslArray<I32 | Atomic<I32> | Decorated<I32, Location[]>>
98
+ */
99
+ export type MemIdentity<T> = T extends {
100
+ readonly [$memIdent]: infer TMemIdent;
86
101
  } ? TMemIdent : T;
87
- type MemIdentityRecord<T extends Record<string | number | symbol, unknown>> = { [Key in keyof T]: MemIdentity<T[Key]> };
88
- type IsValidStorageSchema<T> = (T extends {
89
- readonly [$validStorageSchema]: true;
102
+ export type MemIdentityRecord<T extends Record<string | number | symbol, unknown>> = {
103
+ [Key in keyof T]: MemIdentity<T[Key]>;
104
+ };
105
+ export type IsValidStorageSchema<T> = (T extends {
106
+ readonly [$validStorageSchema]: true;
90
107
  } ? true : false) extends false ? false : true;
91
- type IsValidUniformSchema<T> = (T extends {
92
- readonly [$validUniformSchema]: true;
108
+ export type IsValidUniformSchema<T> = (T extends {
109
+ readonly [$validUniformSchema]: true;
93
110
  } ? true : false) extends false ? false : true;
94
- type IsValidVertexSchema<T> = (T extends {
95
- readonly [$validVertexSchema]: true;
111
+ export type IsValidVertexSchema<T> = (T extends {
112
+ readonly [$validVertexSchema]: true;
96
113
  } ? true : false) extends false ? false : true;
97
114
  /**
98
115
  * Accepts only arrays (or disarrays) of u32 or u16.
99
116
  */
100
- type IsValidIndexSchema<T> = Undecorate<T> extends WgslArray | Disarray ? Undecorate<Undecorate<T>['elementType']> extends U32 | U16 ? true : false : false;
117
+ export type IsValidIndexSchema<T> = Undecorate<T> extends WgslArray | Disarray ? Undecorate<Undecorate<T>['elementType']> extends U32 | U16 ? true : false : false;
101
118
  /**
102
119
  * Checks if a schema can be used in a buffer at all
103
120
  */
104
- type IsValidBufferSchema<T> = IsValidStorageSchema<T> | IsValidUniformSchema<T> | IsValidVertexSchema<T> | IsValidIndexSchema<T> extends false ? false : true;
121
+ export type IsValidBufferSchema<T> = IsValidStorageSchema<T> | IsValidUniformSchema<T> | IsValidVertexSchema<T> | IsValidIndexSchema<T> extends false ? false : true;
105
122
  /**
106
123
  * Validates if a texture can be used as sampled texture
107
124
  */
108
- type IsValidSampledTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsSampled'] extends true ? true : {
109
- readonly invalidSampled: "Texture not usable as sampled, call $usage('sampled') first";
125
+ export type IsValidSampledTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsSampled'] extends true ? true : {
126
+ readonly invalidSampled: "Texture not usable as sampled, call $usage('sampled') first";
110
127
  };
111
128
  /**
112
129
  * Validates if a texture can be used as storage texture
113
130
  */
114
- type IsValidStorageTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsStorage'] extends true ? true : {
115
- readonly invalidStorage: "Texture not usable as storage, call $usage('storage') first";
131
+ export type IsValidStorageTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsStorage'] extends true ? true : {
132
+ readonly invalidStorage: "Texture not usable as storage, call $usage('storage') first";
116
133
  };
117
134
  /**
118
135
  * Validates if a texture view dimension is compatible with the texture dimension
119
136
  */
120
- type IsValidSubdimension<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = ViewDimensionToDimension[TSchema['dimension']] extends infer TVDim ? TVDim extends Default<TTexture['props']['dimension'], '2d'> ? true : {
121
- readonly invalidViewDim: `Texture dimension '${Default<TTexture['props']['dimension'], '2d'>}' incompatible with view dimension '${TSchema['dimension']}'`;
137
+ export type IsValidSubdimension<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = ViewDimensionToDimension[TSchema['dimension']] extends infer TVDim ? TVDim extends Default<TTexture['props']['dimension'], '2d'> ? true : {
138
+ readonly invalidViewDim: `Texture dimension '${Default<TTexture['props']['dimension'], '2d'>}' incompatible with view dimension '${TSchema['dimension']}'`;
122
139
  } : never;
123
- type IsValidStorageFormat<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = TSchema['format'] extends TTexture['props']['format'] ? true : TTexture['props']['viewFormats'] extends readonly unknown[] ? TSchema['format'] extends TTexture['props']['viewFormats'][number] ? true : FormatError<TSchema, TTexture> : FormatError<TSchema, TTexture>;
140
+ export type IsValidStorageFormat<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = TSchema['format'] extends TTexture['props']['format'] ? true : TTexture['props']['viewFormats'] extends readonly unknown[] ? TSchema['format'] extends TTexture['props']['viewFormats'][number] ? true : FormatError<TSchema, TTexture> : FormatError<TSchema, TTexture>;
124
141
  type FormatError<TSchema extends WgslStorageTexture, TTexture extends TgpuTexture> = {
125
- readonly invalidFormat: `Storage texture format '${TSchema['format']}' incompatible with texture format '${TTexture['props']['format']}'`;
142
+ readonly invalidFormat: `Storage texture format '${TSchema['format']}' incompatible with texture format '${TTexture['props']['format']}'`;
126
143
  };
127
144
  type IsExactly<T, U> = [T] extends [U] ? ([U] extends [T] ? true : false) : false;
128
145
  type SelfOrErrors<TSelf, T> = IsExactly<T, true> extends true ? TSelf : `(Error) ${T[Extract<keyof T, `invalid${string}`>] & string}`;
129
- type ValidStorageUsage<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = IsValidStorageTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema> & IsValidStorageFormat<TTexture, TSchema>;
130
- type ValidSampledUsage<TTexture extends TgpuTexture, TSchema extends WgslTexture> = IsValidSampledTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema>;
146
+ export type ValidStorageUsage<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = IsValidStorageTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema> & IsValidStorageFormat<TTexture, TSchema>;
147
+ export type ValidSampledUsage<TTexture extends TgpuTexture, TSchema extends WgslTexture> = IsValidSampledTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema>;
131
148
  /**
132
149
  * Validates texture view schema against texture usage
133
150
  */
134
- type ValidateTextureViewSchema<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = TSchema extends WgslStorageTexture ? SelfOrErrors<TSchema, ValidStorageUsage<TTexture, TSchema>> : TSchema extends WgslTexture ? SelfOrErrors<TSchema, ValidSampledUsage<TTexture, TSchema>> : never;
135
- type ExtractInvalidSchemaError<T, TPrefix extends string = ''> = [T] extends [{
136
- readonly [$invalidSchemaReason]: string;
137
- }] ? `${TPrefix}${T[typeof $invalidSchemaReason]}` : never;
138
- //#endregion
139
- export { ExtractInvalidSchemaError, GPUValueOf, Infer, InferGPU, InferGPURecord, InferInput, InferInputRecord, InferPartial, InferPartialRecord, InferPatch, InferPatchRecord, InferRecord, IsValidBufferSchema, IsValidIndexSchema, IsValidStorageSchema, IsValidUniformSchema, IsValidVertexSchema, MemIdentity, MemIdentityRecord, ValidateTextureViewSchema };
151
+ export type ValidateTextureViewSchema<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = TSchema extends WgslStorageTexture ? SelfOrErrors<TSchema, ValidStorageUsage<TTexture, TSchema>> : TSchema extends WgslTexture ? SelfOrErrors<TSchema, ValidSampledUsage<TTexture, TSchema>> : never;
152
+ export type ExtractInvalidSchemaError<T, TPrefix extends string = ''> = [T] extends [
153
+ {
154
+ readonly [$invalidSchemaReason]: string;
155
+ }
156
+ ] ? `${TPrefix}${T[typeof $invalidSchemaReason]}` : never;
157
+ export {};
package/shared/repr.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The base shape of a soul: a plain record of all definitional state of a resource,
3
+ * holding everything that survives transfer between runtimes. Souls carry own data
4
+ * properties only, no methods, no prototype and no symbol keys. Raw GPU objects
5
+ * belong here too, they cross runtimes as shareable host objects pointing to the
6
+ * same underlying resource
7
+ */
8
+ export interface TgpuSoul<TType extends string = string> {
9
+ readonly type: TType;
10
+ /** Only set/read through `setName` and `getName` - do not change manually */
11
+ label?: string | undefined;
12
+ }
13
+ /** A soul of a resource that owns a device object, filled in by `[$internal].materialize()` */
14
+ export interface TgpuDeviceOwningSoul<TType extends string = string, TRaw = unknown> extends TgpuSoul<TType> {
15
+ readonly device: GPUDevice;
16
+ raw?: TRaw | undefined;
17
+ }
package/shared/soul.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function safeStringify(item: unknown): string;
2
+ export declare function niceStringify(item: unknown): string;
@@ -1,23 +1,32 @@
1
1
  import { isMatInstance, isVecInstance } from "../data/wgslTypes.js";
2
-
3
- //#region src/shared/stringify.ts
4
- function safeStringify(item) {
5
- if (Array.isArray(item)) return `[${item.map(safeStringify).join(", ")}]`;
6
- const asString = String(item);
7
- if (asString !== "[object Object]") return asString;
8
- try {
9
- return JSON.stringify(item);
10
- } catch (error) {
11
- console.error("Error parsing JSON:", error);
12
- return "<invalid json>";
13
- }
2
+ import { logger } from "../tgpuLogger.js";
3
+ export function safeStringify(item) {
4
+ if (Array.isArray(item)) {
5
+ return `[${item.map(safeStringify).join(', ')}]`;
6
+ }
7
+ const asString = String(item);
8
+ if (asString !== '[object Object]') {
9
+ return asString;
10
+ }
11
+ try {
12
+ return JSON.stringify(item);
13
+ }
14
+ catch (error) {
15
+ logger.warn('suspicious', 'Error parsing JSON:', error);
16
+ return '<invalid json>';
17
+ }
14
18
  }
15
- function niceStringify(item) {
16
- if (isVecInstance(item) || isMatInstance(item)) return item.toString();
17
- if (Array.isArray(item)) return `[${item.map(niceStringify).join(", ")}]`;
18
- if (item && typeof item === "object") return `{ ${Object.entries(item).map(([key, value]) => `${key}: ${niceStringify(value)}`).join(", ")} }`;
19
- return String(item);
19
+ export function niceStringify(item) {
20
+ if (isVecInstance(item) || isMatInstance(item)) {
21
+ return item.toString();
22
+ }
23
+ if (Array.isArray(item)) {
24
+ return `[${item.map(niceStringify).join(', ')}]`;
25
+ }
26
+ if (item && typeof item === 'object') {
27
+ return `{ ${Object.entries(item)
28
+ .map(([key, value]) => `${key}: ${niceStringify(value)}`)
29
+ .join(', ')} }`;
30
+ }
31
+ return String(item);
20
32
  }
21
-
22
- //#endregion
23
- export { niceStringify, safeStringify };