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
@@ -1,102 +1,157 @@
1
- import { $getNameForward } from "../../shared/symbols.js";
2
- import { Void, isWgslData, isWgslStruct } from "../../data/wgslTypes.js";
3
- import { getFunctionMetadata, getName } from "../../shared/meta.js";
1
+ import { getAttributesString } from "../../data/attributes.js";
4
2
  import { undecorate } from "../../data/dataTypes.js";
5
3
  import { snip } from "../../data/snippet.js";
6
- import { getAttributesString } from "../../data/attributes.js";
4
+ import { isWgslData, isWgslStruct, Void } from "../../data/wgslTypes.js";
7
5
  import { validateIdentifier } from "../../nameUtils.js";
8
- import { mergeFunctionExternals, replaceExternalsInWgsl } from "../resolve/externals.js";
6
+ import { getFunctionMetadata, getName } from "../../shared/meta.js";
7
+ import { $getNameForward } from "../../shared/symbols.js";
8
+ import { replaceExternalsInWgsl, mergeFunctionExternals, } from "../resolve/externals.js";
9
+ import { ResolvableString } from "../resolve/resolvableString.js";
9
10
  import { extractArgs } from "./extractArgs.js";
10
-
11
- //#region src/core/function/fnCore.ts
12
- function createFnCore(implementation, functionType, workgroupSize) {
13
- /**
14
- * External application has to be deferred until resolution because
15
- * some externals can reference the owner function which has not been
16
- * initialized yet (like when accessing the Output struct of a vertex
17
- * entry fn).
18
- */
19
- const externals = {};
20
- return {
21
- [$getNameForward]: typeof implementation === "function" ? implementation : void 0,
22
- setExternals(key, newExternal) {
23
- if (key === "userProvided" && "userProvided" in externals) throw new Error("Cannot call '$uses' multiple times. If you wish to override dependencies, use slots or accessors instead.");
24
- externals[key] = newExternal;
25
- if (externals.userProvided && externals.pluginProvided) throw new Error("Cannot call '$uses' on functions whose metadata was provided by unplugin-typegpu.");
26
- },
27
- resolve(ctx, argTypes, returnType, entryInput) {
28
- let attributes = "";
29
- if (functionType === "compute") attributes = `@compute @workgroup_size(${workgroupSize?.join(", ")}) `;
30
- else if (functionType === "vertex") attributes = `@vertex `;
31
- else if (functionType === "fragment") attributes = `@fragment `;
32
- const id = ctx.makeUniqueIdentifier(getName(this), "global");
33
- if (typeof implementation === "string") {
34
- if (!returnType) throw new Error("Explicit return type is required for string implementation");
35
- if (entryInput) {
36
- for (const arg of entryInput.positionalArgs) {
37
- const result = /* @__PURE__ */ validateIdentifier(arg.schemaKey);
38
- if (!result.success) throw new Error(`Invalid argument name "${arg.schemaKey}"${result.error ? `: ${result.error}` : ""}`);
39
- if (ctx.isIdentifierBanned(arg.schemaKey)) throw new Error(`Invalid argument name "${arg.schemaKey}", the identifier is a reserved keyword.`);
40
- }
41
- this.setExternals("args", { in: Object.fromEntries(entryInput.positionalArgs.map((a) => [a.schemaKey, a.schemaKey])) });
42
- }
43
- const replacedImpl = replaceExternalsInWgsl(ctx, mergeFunctionExternals(externals), implementation);
44
- let header = "";
45
- let body = "";
46
- if (functionType !== "normal" && entryInput) {
47
- const { dataSchema, positionalArgs } = entryInput;
48
- const parts = [];
49
- if (dataSchema && isArgUsedInBody("in", replacedImpl)) parts.push(`in: ${ctx.resolve(dataSchema).value}`);
50
- for (const a of positionalArgs) {
51
- const argName = a.schemaKey;
52
- if (isArgUsedInBody(argName, replacedImpl)) parts.push(`${getAttributesString(a.type)}${argName}: ${ctx.resolve(a.type).value}`);
53
- }
54
- const input = `(${parts.join(", ")})`;
55
- const attributes$1 = isWgslData(returnType) ? getAttributesString(returnType) : "";
56
- header = `${input}${returnType !== Void ? isWgslStruct(returnType) ? ` -> ${ctx.resolve(returnType).value} ` : ` -> ${attributes$1 !== "" ? attributes$1 : "@location(0)"} ${ctx.resolve(returnType).value} ` : " "}`;
57
- body = replacedImpl;
58
- } else {
59
- const providedArgs = extractArgs(replacedImpl);
60
- if (providedArgs.args.length !== argTypes.length) throw new Error(`WGSL implementation has ${providedArgs.args.length} arguments, while the shell has ${argTypes.length} arguments.`);
61
- header = `(${providedArgs.args.map((argInfo, i) => `${argInfo.identifier}: ${checkAndReturnType(ctx, `parameter ${argInfo.identifier}`, argInfo.type, argTypes[i])}`).join(", ")})${returnType === Void ? " " : ` -> ${checkAndReturnType(ctx, "return type", providedArgs.ret?.type, returnType)} `}`;
62
- body = replacedImpl.slice(providedArgs.range.end);
63
- }
64
- ctx.addDeclaration(`${attributes}fn ${id}${header}${body}`);
65
- return snip(id, returnType, "runtime");
66
- }
67
- const pluginData = getFunctionMetadata(implementation);
68
- const pluginExternals = pluginData?.externals();
69
- if (pluginExternals) this.setExternals("pluginProvided", pluginExternals);
70
- const ast = pluginData?.ast;
71
- if (!ast) throw new Error("Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)");
72
- const maybeSecondArg = ast.params[1];
73
- if (maybeSecondArg && maybeSecondArg.type === "i" && functionType !== "normal") this.setExternals("out", { [maybeSecondArg.name]: undecorate(returnType) });
74
- const { code, returnType: actualReturnType } = ctx.resolveFunction({
75
- functionType,
76
- name: id,
77
- workgroupSize,
78
- argTypes,
79
- entryInput,
80
- params: ast.params,
81
- returnType,
82
- body: ast.body,
83
- externalMap: mergeFunctionExternals(externals)
84
- });
85
- ctx.addDeclaration(code);
86
- return snip(id, actualReturnType, "runtime");
87
- }
88
- };
11
+ export function createFnCore(implementation, functionType, workgroupSize) {
12
+ /**
13
+ * External application has to be deferred until resolution because
14
+ * some externals can reference the owner function which has not been
15
+ * initialized yet (like when accessing the Output struct of a vertex
16
+ * entry fn).
17
+ */
18
+ const externals = {};
19
+ const core = {
20
+ // Making the implementation the holder of the name, as long as it's
21
+ // a function (and not a string implementation)
22
+ [$getNameForward]: typeof implementation === 'function' ? implementation : undefined,
23
+ setExternals(key, newExternal) {
24
+ if (key === 'userProvided' && 'userProvided' in externals) {
25
+ throw new Error("Cannot call '$uses' multiple times. If you wish to override dependencies, use slots or accessors instead.");
26
+ }
27
+ externals[key] = newExternal;
28
+ if (externals.userProvided && externals.pluginProvided) {
29
+ throw new Error("Cannot call '$uses' on functions whose metadata was provided by unplugin-typegpu.");
30
+ }
31
+ },
32
+ resolve(ctx, argTypes, returnType, entryInput) {
33
+ let attributes = '';
34
+ if (functionType === 'compute') {
35
+ attributes = `@compute @workgroup_size(${workgroupSize?.join(', ')}) `;
36
+ }
37
+ else if (functionType === 'vertex') {
38
+ attributes = `@vertex `;
39
+ }
40
+ else if (functionType === 'fragment') {
41
+ attributes = `@fragment `;
42
+ }
43
+ const id = ctx.makeUniqueIdentifier(getName(this), 'global');
44
+ if (typeof implementation === 'string') {
45
+ if (!returnType) {
46
+ throw new Error('Explicit return type is required for string implementation');
47
+ }
48
+ if (entryInput) {
49
+ for (const arg of entryInput.positionalArgs) {
50
+ const result = validateIdentifier(arg.schemaKey);
51
+ if (!result.success) {
52
+ throw new Error(`Invalid argument name "${arg.schemaKey}"${result.error ? `: ${result.error}` : ''}`);
53
+ }
54
+ if (ctx.isIdentifierBanned(arg.schemaKey)) {
55
+ throw new Error(`Invalid argument name "${arg.schemaKey}", the identifier is a reserved keyword.`);
56
+ }
57
+ }
58
+ this.setExternals('args', {
59
+ in: Object.fromEntries(entryInput.positionalArgs.map((a) => [
60
+ a.schemaKey,
61
+ new ResolvableString(a.schemaKey),
62
+ ])),
63
+ });
64
+ }
65
+ const replacedImpl = replaceExternalsInWgsl(ctx, mergeFunctionExternals(externals), implementation);
66
+ let header = '';
67
+ let body = '';
68
+ if (functionType !== 'normal' && entryInput) {
69
+ const { dataSchema, positionalArgs } = entryInput;
70
+ const parts = [];
71
+ if (dataSchema && isArgUsedInBody('in', replacedImpl)) {
72
+ parts.push(`in: ${ctx.resolve(dataSchema).value}`);
73
+ }
74
+ for (const a of positionalArgs) {
75
+ const argName = a.schemaKey;
76
+ if (isArgUsedInBody(argName, replacedImpl)) {
77
+ parts.push(`${getAttributesString(a.type)}${argName}: ${ctx.resolve(a.type).value}`);
78
+ }
79
+ }
80
+ const input = `(${parts.join(', ')})`;
81
+ const attributes = isWgslData(returnType) ? getAttributesString(returnType) : '';
82
+ const output = returnType !== Void
83
+ ? isWgslStruct(returnType)
84
+ ? ` -> ${ctx.resolve(returnType).value} `
85
+ : ` -> ${attributes !== '' ? attributes : '@location(0)'} ${ctx.resolve(returnType).value} `
86
+ : ' ';
87
+ header = `${input}${output}`;
88
+ body = replacedImpl;
89
+ }
90
+ else {
91
+ const providedArgs = extractArgs(replacedImpl);
92
+ if (providedArgs.args.length !== argTypes.length) {
93
+ throw new Error(`WGSL implementation has ${providedArgs.args.length} arguments, while the shell has ${argTypes.length} arguments.`);
94
+ }
95
+ const input = providedArgs.args
96
+ .map((argInfo, i) => `${argInfo.identifier}: ${checkAndReturnType(ctx, `parameter ${argInfo.identifier}`, argInfo.type, argTypes[i])}`)
97
+ .join(', ');
98
+ const output = returnType === Void
99
+ ? ' '
100
+ : ` -> ${checkAndReturnType(ctx, 'return type', providedArgs.ret?.type, returnType)} `;
101
+ header = `(${input})${output}`;
102
+ body = replacedImpl.slice(providedArgs.range.end);
103
+ }
104
+ ctx.addDeclaration(`${attributes}fn ${id}${header}${body}`, id);
105
+ return snip(id, returnType, /* origin */ 'runtime');
106
+ }
107
+ // get data generated by the plugin
108
+ const pluginData = getFunctionMetadata(implementation);
109
+ const pluginExternals = pluginData?.externals();
110
+ if (pluginExternals) {
111
+ this.setExternals('pluginProvided', pluginExternals);
112
+ }
113
+ const ast = pluginData?.ast;
114
+ if (!ast) {
115
+ throw new Error("Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)");
116
+ }
117
+ // If an entrypoint implementation has a second argument, it represents the output schema.
118
+ // We look at the identifier chosen by the user and add it to externals.
119
+ const maybeSecondArg = ast.params[1];
120
+ if (maybeSecondArg && maybeSecondArg.type === 'i' && functionType !== 'normal') {
121
+ this.setExternals('out', {
122
+ // oxlint-disable-next-line typescript/no-non-null-assertion -- entry functions cannot be shellless
123
+ [maybeSecondArg.name]: undecorate(returnType),
124
+ });
125
+ }
126
+ // generate wgsl string
127
+ const { code, returnType: actualReturnType } = ctx.resolveFunction({
128
+ functionType,
129
+ name: id,
130
+ workgroupSize,
131
+ argTypes,
132
+ entryInput,
133
+ params: ast.params,
134
+ returnType,
135
+ body: ast.body,
136
+ externalMap: mergeFunctionExternals(externals),
137
+ });
138
+ ctx.addDeclaration(code, id);
139
+ return snip(id, actualReturnType, /* origin */ 'runtime');
140
+ },
141
+ };
142
+ return core;
89
143
  }
90
144
  function isArgUsedInBody(argName, body) {
91
- return (/* @__PURE__ */ new RegExp(`\\b${argName}\\b`)).test(body);
145
+ return new RegExp(`\\b${argName}\\b`).test(body);
92
146
  }
93
147
  function checkAndReturnType(ctx, name, wgslType, jsType) {
94
- const resolvedJsType = ctx.resolve(jsType).value.replace(/\s/g, "");
95
- if (!wgslType) return resolvedJsType;
96
- const resolvedWgslType = wgslType.replace(/\s/g, "");
97
- if (resolvedWgslType !== resolvedJsType) throw new Error(`Type mismatch between TGPU shell and WGSL code string: ${name}, JS type "${resolvedJsType}", WGSL type "${resolvedWgslType}".`);
98
- return wgslType;
148
+ const resolvedJsType = ctx.resolve(jsType).value.replace(/\s/g, '');
149
+ if (!wgslType) {
150
+ return resolvedJsType;
151
+ }
152
+ const resolvedWgslType = wgslType.replace(/\s/g, '');
153
+ if (resolvedWgslType !== resolvedJsType) {
154
+ throw new Error(`Type mismatch between TGPU shell and WGSL code string: ${name}, JS type "${resolvedJsType}", WGSL type "${resolvedWgslType}".`);
155
+ }
156
+ return wgslType;
99
157
  }
100
-
101
- //#endregion
102
- export { createFnCore };
@@ -1,13 +1,14 @@
1
- import { BuiltinClipDistances } from "../../builtin.js";
2
- import { AnyAttribute } from "../../data/attributes.js";
3
- import { BaseData, Bool, Decorated, F16, F32, I32, U32, Vec2f, Vec2h, Vec2i, Vec2u, Vec3f, Vec3h, Vec3i, Vec3u, Vec4f, Vec4h, Vec4i, Vec4u, Void } from "../../data/wgslTypes.js";
4
- import { InferGPU } from "../../shared/repr.js";
5
- import "tinyest";
6
-
7
- //#region src/core/function/fnTypes.d.ts
8
- type AnyFn = (...args: never[]) => unknown;
9
- type InferArgs<T extends unknown[]> = { [Idx in keyof T]: InferGPU<T[Idx]> };
10
- type InheritTupleValues<T, From> = { [K in keyof T]: K extends keyof From ? From[K] : never };
1
+ import type { BuiltinClipDistances } from '../../builtin.ts';
2
+ import type { AnyAttribute } from '../../data/attributes.ts';
3
+ import type { BaseData, Bool, Decorated, F16, F32, I32, U32, Vec2f, Vec2h, Vec2i, Vec2u, Vec3f, Vec3h, Vec3i, Vec3u, Vec4f, Vec4h, Vec4i, Vec4u, Void } from '../../data/wgslTypes.ts';
4
+ import type { InferGPU } from '../../shared/repr.ts';
5
+ export type AnyFn = (...args: never[]) => unknown;
6
+ export type InferArgs<T extends unknown[]> = {
7
+ [Idx in keyof T]: InferGPU<T[Idx]>;
8
+ };
9
+ type InheritTupleValues<T, From> = {
10
+ [K in keyof T]: K extends keyof From ? From[K] : never;
11
+ };
11
12
  /**
12
13
  * Returns a type that has arg and return types of `T`, but argument
13
14
  * names of `From`
@@ -15,28 +16,29 @@ type InheritTupleValues<T, From> = { [K in keyof T]: K extends keyof From ? From
15
16
  * Wrapped in an object type with `result` prop just so that it's easier
16
17
  * to remove InheritArgNames<...> from Intellisense with Prettify<T>['result']
17
18
  */
18
- type InheritArgNames<T extends AnyFn, From extends AnyFn> = {
19
- result: (...args: Parameters<((...args: InheritTupleValues<Parameters<From>, Parameters<T>>) => ReturnType<T>) & T>) => ReturnType<T>;
19
+ export type InheritArgNames<T extends AnyFn, From extends AnyFn> = {
20
+ result: (...args: Parameters<((...args: InheritTupleValues<Parameters<From>, Parameters<T>>) => ReturnType<T>) & T>) => ReturnType<T>;
20
21
  };
21
- type InferImplSchema<ImplSchema extends AnyFn> = (...args: InferArgs<Parameters<ImplSchema>>) => InferGPU<ReturnType<ImplSchema>>;
22
- type Implementation<ImplSchema extends AnyFn = AnyFn> = string | InferImplSchema<ImplSchema>;
23
- type BaseIOData = Bool | F32 | F16 | I32 | U32 | Vec2f | Vec3f | Vec4f | Vec2h | Vec3h | Vec4h | Vec2i | Vec3i | Vec4i | Vec2u | Vec3u | Vec4u;
24
- type IOData = BaseIOData | Decorated<BaseIOData, AnyAttribute[]> | BuiltinClipDistances;
25
- type IORecord<TElementType extends IOData = IOData> = Record<string, TElementType>;
22
+ export type InferImplSchema<ImplSchema extends AnyFn> = (...args: InferArgs<Parameters<ImplSchema>>) => InferGPU<ReturnType<ImplSchema>>;
23
+ export type Implementation<ImplSchema extends AnyFn = AnyFn> = string | InferImplSchema<ImplSchema>;
24
+ export type BaseIOData = Bool | F32 | F16 | I32 | U32 | Vec2f | Vec3f | Vec4f | Vec2h | Vec3h | Vec4h | Vec2i | Vec3i | Vec4i | Vec2u | Vec3u | Vec4u;
25
+ export type IOData = BaseIOData | Decorated<BaseIOData, AnyAttribute[]> | BuiltinClipDistances;
26
+ export type IORecord<TElementType extends IOData = IOData> = Record<string, TElementType>;
26
27
  /**
27
28
  * Used for I/O definitions of entry functions.
28
29
  */
29
- type IOLayout<TElementType extends IOData = IOData> = TElementType | IORecord<TElementType> | Void;
30
- type InferIO<T> = T extends {
31
- type: string;
32
- } ? InferGPU<T> : T extends Record<string, unknown> ? { [K in keyof T]: InferGPU<T[K]> } : T;
33
- interface PositionalArgInfo {
34
- schemaKey: string;
35
- type: BaseData;
30
+ export type IOLayout<TElementType extends IOData = IOData> = TElementType | IORecord<TElementType> | Void;
31
+ export type InferIO<T> = T extends {
32
+ type: string;
33
+ } ? InferGPU<T> : T extends Record<string, unknown> ? {
34
+ [K in keyof T]: InferGPU<T[K]>;
35
+ } : T;
36
+ export interface PositionalArgInfo {
37
+ schemaKey: string;
38
+ type: BaseData;
36
39
  }
37
- interface SeparatedEntryArgs {
38
- dataSchema: BaseData | undefined;
39
- positionalArgs: PositionalArgInfo[];
40
+ export interface SeparatedEntryArgs {
41
+ dataSchema: BaseData | undefined;
42
+ positionalArgs: PositionalArgInfo[];
40
43
  }
41
- //#endregion
42
- export { AnyFn, BaseIOData, IOLayout, IORecord, Implementation, InferArgs, InferIO, InferImplSchema, InheritArgNames, SeparatedEntryArgs };
44
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,13 @@
1
- import { Decorate, HasCustomLocation, IsBuiltin } from "../../data/attributes.js";
2
- import "./fnTypes.js";
3
- import { BaseData, Location, WgslStruct } from "../../data/wgslTypes.js";
4
-
5
- //#region src/core/function/ioSchema.d.ts
6
- type WithLocations<T extends Record<string, BaseData>> = { [Key in keyof T]: IsBuiltin<T[Key]> extends true ? T[Key] : HasCustomLocation<T[Key]> extends true ? T[Key] : Decorate<T[Key], Location> };
7
- type IOLayoutToSchema<T> = T extends BaseData ? HasCustomLocation<T> extends true ? T : Decorate<T, Location<0>> : T extends Record<string, BaseData> ? WgslStruct<WithLocations<T>> : T extends {
8
- type: 'void';
1
+ import { type Decorate, type HasCustomLocation, type IsBuiltin } from '../../data/attributes.ts';
2
+ import { type BaseData, type Location, type WgslStruct } from '../../data/wgslTypes.ts';
3
+ import type { SeparatedEntryArgs } from './fnTypes.ts';
4
+ export type WithLocations<T extends Record<string, BaseData>> = {
5
+ [Key in keyof T]: IsBuiltin<T[Key]> extends true ? T[Key] : HasCustomLocation<T[Key]> extends true ? T[Key] : Decorate<T[Key], Location>;
6
+ };
7
+ export type IOLayoutToSchema<T> = T extends BaseData ? HasCustomLocation<T> extends true ? T : Decorate<T, Location<0>> : T extends Record<string, BaseData> ? WgslStruct<WithLocations<T>> : T extends {
8
+ type: 'void';
9
9
  } ? void : never;
10
- //#endregion
11
- export { IOLayoutToSchema };
10
+ export declare function withLocations<T extends BaseData>(members: Record<string, T> | undefined, locations?: Record<string, number>): Record<string, BaseData>;
11
+ export declare function separateBuiltins(schema: Record<string, BaseData>, locations?: Record<string, number>): SeparatedEntryArgs;
12
+ export declare function separateAllAsPositional(schema: Record<string, BaseData>): SeparatedEntryArgs;
13
+ export declare function createIoSchema<T extends BaseData | Record<string, BaseData>>(layout: T, locations?: Record<string, number>): IOLayoutToSchema<T>;
@@ -1,53 +1,71 @@
1
- import { isVoid } from "../../data/wgslTypes.js";
1
+ import { location, } from "../../data/attributes.js";
2
+ import { isBuiltin } from "../../data/attributes.js";
2
3
  import { getCustomLocation, isData } from "../../data/dataTypes.js";
3
- import { isBuiltin, location } from "../../data/attributes.js";
4
4
  import { INTERNAL_createStruct } from "../../data/struct.js";
5
-
6
- //#region src/core/function/ioSchema.ts
7
- function withLocations(members, locations = {}) {
8
- let nextLocation = 0;
9
- const usedCustomLocations = /* @__PURE__ */ new Set();
10
- return Object.fromEntries(Object.entries(members ?? {}).map(([key, member]) => {
11
- const customLocation = getCustomLocation(member);
12
- if (customLocation !== void 0) {
13
- if (usedCustomLocations.has(customLocation)) throw new Error("Duplicate custom location attributes found");
14
- usedCustomLocations.add(customLocation);
15
- }
16
- return [key, member];
17
- }).map(([key, member]) => {
18
- if (isBuiltin(member)) return [key, member];
19
- if (getCustomLocation(member) !== void 0) return [key, member];
20
- if (locations[key]) return [key, location(locations[key], member)];
21
- while (usedCustomLocations.has(nextLocation)) nextLocation++;
22
- return [key, location(nextLocation++, member)];
23
- }));
5
+ import { isVoid } from "../../data/wgslTypes.js";
6
+ export function withLocations(members, locations = {}) {
7
+ let nextLocation = 0;
8
+ const usedCustomLocations = new Set();
9
+ return Object.fromEntries(Object.entries(members ?? {})
10
+ .map(([key, member]) => {
11
+ const customLocation = getCustomLocation(member);
12
+ if (customLocation !== undefined) {
13
+ if (usedCustomLocations.has(customLocation)) {
14
+ throw new Error('Duplicate custom location attributes found');
15
+ }
16
+ usedCustomLocations.add(customLocation);
17
+ }
18
+ return [key, member];
19
+ })
20
+ .map(([key, member]) => {
21
+ if (isBuiltin(member)) {
22
+ // skipping builtins
23
+ return [key, member];
24
+ }
25
+ if (getCustomLocation(member) !== undefined) {
26
+ // this member is already marked
27
+ return [key, member];
28
+ }
29
+ if (locations[key]) {
30
+ // location has been determined by a previous procedure
31
+ return [key, location(locations[key], member)];
32
+ }
33
+ while (usedCustomLocations.has(nextLocation)) {
34
+ nextLocation++;
35
+ }
36
+ return [key, location(nextLocation++, member)];
37
+ }));
24
38
  }
25
- function separateBuiltins(schema, locations = {}) {
26
- const positionalArgs = [];
27
- const dataFields = {};
28
- for (const [key, type] of Object.entries(schema)) if (isBuiltin(type)) positionalArgs.push({
29
- schemaKey: key,
30
- type
31
- });
32
- else dataFields[key] = type;
33
- return {
34
- dataSchema: Object.keys(dataFields).length > 0 ? INTERNAL_createStruct(withLocations(dataFields, locations), false) : void 0,
35
- positionalArgs
36
- };
39
+ export function separateBuiltins(schema, locations = {}) {
40
+ const positionalArgs = [];
41
+ const dataFields = {};
42
+ for (const [key, type] of Object.entries(schema)) {
43
+ if (isBuiltin(type)) {
44
+ positionalArgs.push({ schemaKey: key, type });
45
+ }
46
+ else {
47
+ dataFields[key] = type;
48
+ }
49
+ }
50
+ const dataSchema = Object.keys(dataFields).length > 0
51
+ ? INTERNAL_createStruct(withLocations(dataFields, locations), /* isAbstruct */ false)
52
+ : undefined;
53
+ return { dataSchema, positionalArgs };
37
54
  }
38
- function separateAllAsPositional(schema) {
39
- const withLocs = withLocations(schema);
40
- return {
41
- dataSchema: void 0,
42
- positionalArgs: Object.entries(withLocs).map(([key, type]) => ({
43
- schemaKey: key,
44
- type
45
- }))
46
- };
55
+ export function separateAllAsPositional(schema) {
56
+ const withLocs = withLocations(schema);
57
+ const positionalArgs = Object.entries(withLocs).map(([key, type]) => ({ schemaKey: key, type }));
58
+ return { dataSchema: undefined, positionalArgs };
47
59
  }
48
- function createIoSchema(layout, locations = {}) {
49
- return isData(layout) ? isVoid(layout) ? layout : isBuiltin(layout) ? layout : getCustomLocation(layout) !== void 0 ? layout : location(0, layout) : INTERNAL_createStruct(withLocations(layout, locations), false);
60
+ export function createIoSchema(layout, locations = {}) {
61
+ return (isData(layout)
62
+ ? isVoid(layout)
63
+ ? layout
64
+ : isBuiltin(layout)
65
+ ? layout
66
+ : getCustomLocation(layout) !== undefined
67
+ ? layout
68
+ : location(0, layout)
69
+ : INTERNAL_createStruct(withLocations(layout, locations),
70
+ /* isAbstruct */ false));
50
71
  }
51
-
52
- //#endregion
53
- export { createIoSchema, separateAllAsPositional, separateBuiltins };
@@ -1,9 +1,6 @@
1
- import { $getNameForward } from "../../shared/symbols.js";
2
- import { SelfResolvable } from "../../types.js";
3
- import { BaseData } from "../../data/wgslTypes.js";
4
-
5
- //#region src/core/function/shelllessImpl.d.ts
6
-
1
+ import type { BaseData } from '../../data/wgslTypes.ts';
2
+ import { $getNameForward } from '../../shared/symbols.ts';
3
+ import type { SelfResolvable } from '../../types.ts';
7
4
  /**
8
5
  * Shell-less functions are possible because we can infer the signature based solely on the context
9
6
  * around the function.
@@ -20,10 +17,10 @@ import { BaseData } from "../../data/wgslTypes.js";
20
17
  *
21
18
  * TODO: This behavior can be refined by considering the "expected type" of the function call expression.
22
19
  */
23
- interface ShelllessImpl extends SelfResolvable {
24
- readonly resourceType: 'shellless-impl';
25
- readonly argTypes: BaseData[];
26
- readonly [$getNameForward]: unknown;
20
+ export interface ShelllessImpl extends SelfResolvable {
21
+ readonly resourceType: 'shellless-impl';
22
+ readonly argTypes: BaseData[];
23
+ readonly [$getNameForward]: unknown;
27
24
  }
28
- //#endregion
29
- export { ShelllessImpl };
25
+ export declare function isShelllessImpl(value: unknown): value is ShelllessImpl;
26
+ export declare function createShelllessImpl(argTypes: BaseData[], implementation: (...args: never[]) => unknown): ShelllessImpl;
@@ -1,26 +1,21 @@
1
- import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
2
1
  import { getName } from "../../shared/meta.js";
2
+ import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
3
3
  import { createFnCore } from "./fnCore.js";
4
-
5
- //#region src/core/function/shelllessImpl.ts
6
- function isShelllessImpl(value) {
7
- return value?.resourceType === "shellless-impl";
4
+ export function isShelllessImpl(value) {
5
+ return value?.resourceType === 'shellless-impl';
8
6
  }
9
- function createShelllessImpl(argTypes, implementation) {
10
- const core = createFnCore(implementation, "normal");
11
- return {
12
- [$internal]: true,
13
- [$getNameForward]: core,
14
- resourceType: "shellless-impl",
15
- argTypes,
16
- [$resolve](ctx) {
17
- return core.resolve(ctx, argTypes, void 0);
18
- },
19
- toString() {
20
- return `fn*:${getName(core) ?? "<unnamed>"}(${argTypes.map((t) => t.toString()).join(", ")})`;
21
- }
22
- };
7
+ export function createShelllessImpl(argTypes, implementation) {
8
+ const core = createFnCore(implementation, 'normal');
9
+ return {
10
+ [$internal]: true,
11
+ [$getNameForward]: core,
12
+ resourceType: 'shellless-impl',
13
+ argTypes,
14
+ [$resolve](ctx) {
15
+ return core.resolve(ctx, argTypes, undefined);
16
+ },
17
+ toString() {
18
+ return `fn*:${getName(core) ?? '<unnamed>'}(${argTypes.map((t) => t.toString()).join(', ')})`;
19
+ },
20
+ };
23
21
  }
24
-
25
- //#endregion
26
- export { createShelllessImpl, isShelllessImpl };
@@ -0,0 +1,2 @@
1
+ import type { Implementation } from './fnTypes.ts';
2
+ export declare function stripTemplate(arg: Implementation | TemplateStringsArray, ...values: unknown[]): Implementation;
@@ -1,13 +1,14 @@
1
- //#region src/core/function/templateUtils.ts
2
- function stripTemplate(arg, ...values) {
3
- return isTemplateStringsArray(arg) ? templateLiteralIdentity(arg, ...values) : arg;
1
+ export function stripTemplate(arg, ...values) {
2
+ return isTemplateStringsArray(arg) ? templateLiteralIdentity(arg, ...values) : arg;
4
3
  }
5
4
  function isTemplateStringsArray(value) {
6
- return Array.isArray(value) && "raw" in value && Array.isArray(value.raw) && value.raw.every((item) => typeof item === "string");
5
+ return (Array.isArray(value) &&
6
+ 'raw' in value &&
7
+ Array.isArray(value.raw) &&
8
+ value.raw.every((item) => typeof item === 'string'));
7
9
  }
8
10
  function templateLiteralIdentity(strings, ...values) {
9
- return strings.slice(1).reduce((acc, elem, index) => `${acc}${values[index]}${elem}`, strings[0]);
11
+ return strings
12
+ .slice(1)
13
+ .reduce((acc, elem, index) => `${acc}${values[index]}${elem}`, strings[0]);
10
14
  }
11
-
12
- //#endregion
13
- export { stripTemplate };