typegpu 0.11.8 → 0.12.0

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 (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +37 -38
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -0
  42. package/core/function/fnCore.js +148 -92
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +18 -20
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +90 -93
  85. package/core/resolve/externals.d.ts +25 -7
  86. package/core/resolve/externals.js +79 -62
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -55
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -454
  101. package/core/root/rootTypes.d.ts +461 -627
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -214
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -192
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -120
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +428 -398
  239. package/package.json +9 -3
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -624
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -100
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +18 -0
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +272 -193
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -747
  350. package/types.d.ts +287 -221
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,101 +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 { mergeExternals, 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 externalsToApply = [];
20
- return {
21
- [$getNameForward]: typeof implementation === "function" ? implementation : void 0,
22
- applyExternals(newExternals) {
23
- externalsToApply.push(newExternals);
24
- },
25
- resolve(ctx, argTypes, returnType, entryInput) {
26
- const externalMap = {};
27
- let attributes = "";
28
- if (functionType === "compute") attributes = `@compute @workgroup_size(${workgroupSize?.join(", ")}) `;
29
- else if (functionType === "vertex") attributes = `@vertex `;
30
- else if (functionType === "fragment") attributes = `@fragment `;
31
- for (const externals of externalsToApply) mergeExternals(externalMap, externals);
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
- }
40
- mergeExternals(externalMap, { in: Object.fromEntries(entryInput.positionalArgs.map((a) => [a.schemaKey, a.schemaKey])) });
41
- }
42
- const replacedImpl = replaceExternalsInWgsl(ctx, externalMap, implementation);
43
- let header = "";
44
- let body = "";
45
- if (functionType !== "normal" && entryInput) {
46
- const { dataSchema, positionalArgs } = entryInput;
47
- const parts = [];
48
- if (dataSchema && isArgUsedInBody("in", replacedImpl)) parts.push(`in: ${ctx.resolve(dataSchema).value}`);
49
- for (const a of positionalArgs) {
50
- const argName = a.schemaKey;
51
- if (isArgUsedInBody(argName, replacedImpl)) parts.push(`${getAttributesString(a.type)}${argName}: ${ctx.resolve(a.type).value}`);
52
- }
53
- const input = `(${parts.join(", ")})`;
54
- const attributes$1 = isWgslData(returnType) ? getAttributesString(returnType) : "";
55
- header = `${input}${returnType !== Void ? isWgslStruct(returnType) ? ` -> ${ctx.resolve(returnType).value} ` : ` -> ${attributes$1 !== "" ? attributes$1 : "@location(0)"} ${ctx.resolve(returnType).value} ` : " "}`;
56
- body = replacedImpl;
57
- } else {
58
- const providedArgs = extractArgs(replacedImpl);
59
- if (providedArgs.args.length !== argTypes.length) throw new Error(`WGSL implementation has ${providedArgs.args.length} arguments, while the shell has ${argTypes.length} arguments.`);
60
- 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)} `}`;
61
- body = replacedImpl.slice(providedArgs.range.end);
62
- }
63
- ctx.addDeclaration(`${attributes}fn ${id}${header}${body}`);
64
- return snip(id, returnType, "runtime");
65
- }
66
- const pluginData = getFunctionMetadata(implementation);
67
- const pluginExternals = pluginData?.externals();
68
- if (pluginExternals) mergeExternals(externalMap, Object.fromEntries(Object.entries(pluginExternals).filter(([name]) => !(name in externalMap))));
69
- const ast = pluginData?.ast;
70
- if (!ast) throw new Error("Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)");
71
- const maybeSecondArg = ast.params[1];
72
- if (maybeSecondArg && maybeSecondArg.type === "i" && functionType !== "normal") mergeExternals(externalMap, { [maybeSecondArg.name]: undecorate(returnType) });
73
- const { code, returnType: actualReturnType } = ctx.resolveFunction({
74
- functionType,
75
- name: id,
76
- workgroupSize,
77
- argTypes,
78
- entryInput,
79
- params: ast.params,
80
- returnType,
81
- body: ast.body,
82
- externalMap
83
- });
84
- ctx.addDeclaration(code);
85
- return snip(id, actualReturnType, "runtime");
86
- }
87
- };
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;
88
143
  }
89
144
  function isArgUsedInBody(argName, body) {
90
- return (/* @__PURE__ */ new RegExp(`\\b${argName}\\b`)).test(body);
145
+ return new RegExp(`\\b${argName}\\b`).test(body);
91
146
  }
92
147
  function checkAndReturnType(ctx, name, wgslType, jsType) {
93
- const resolvedJsType = ctx.resolve(jsType).value.replace(/\s/g, "");
94
- if (!wgslType) return resolvedJsType;
95
- const resolvedWgslType = wgslType.replace(/\s/g, "");
96
- if (resolvedWgslType !== resolvedJsType) throw new Error(`Type mismatch between TGPU shell and WGSL code string: ${name}, JS type "${resolvedJsType}", WGSL type "${resolvedWgslType}".`);
97
- 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;
98
157
  }
99
-
100
- //#endregion
101
- 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,23 +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 createShelllessImpl(argTypes, implementation) {
7
- const core = createFnCore(implementation, "normal");
8
- return {
9
- [$internal]: true,
10
- [$getNameForward]: core,
11
- resourceType: "shellless-impl",
12
- argTypes,
13
- [$resolve](ctx) {
14
- return core.resolve(ctx, argTypes, void 0);
15
- },
16
- toString() {
17
- return `fn*:${getName(core) ?? "<unnamed>"}(${argTypes.map((t) => t.toString()).join(", ")})`;
18
- }
19
- };
4
+ export function isShelllessImpl(value) {
5
+ return value?.resourceType === 'shellless-impl';
6
+ }
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
+ };
20
21
  }
21
-
22
- //#endregion
23
- export { createShelllessImpl };
@@ -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 };