@codexo/exojs 0.8.4 → 0.9.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 (317) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +26 -5
  3. package/dist/esm/animation/Tween.d.ts +20 -3
  4. package/dist/esm/animation/Tween.js +16 -8
  5. package/dist/esm/animation/Tween.js.map +1 -1
  6. package/dist/esm/animation/TweenManager.d.ts +16 -1
  7. package/dist/esm/animation/TweenManager.js +27 -2
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
  10. package/dist/esm/audio/AudioAnalyser.js +24 -9
  11. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  12. package/dist/esm/audio/AudioBus.d.ts +1 -0
  13. package/dist/esm/audio/AudioBus.js +8 -4
  14. package/dist/esm/audio/AudioBus.js.map +1 -1
  15. package/dist/esm/audio/AudioListener.d.ts +1 -0
  16. package/dist/esm/audio/AudioListener.js +7 -5
  17. package/dist/esm/audio/AudioListener.js.map +1 -1
  18. package/dist/esm/audio/AudioManager.d.ts +8 -2
  19. package/dist/esm/audio/AudioManager.js +14 -1
  20. package/dist/esm/audio/AudioManager.js.map +1 -1
  21. package/dist/esm/audio/BeatDetector.d.ts +2 -0
  22. package/dist/esm/audio/BeatDetector.js +27 -661
  23. package/dist/esm/audio/BeatDetector.js.map +1 -1
  24. package/dist/esm/audio/Music.d.ts +1 -0
  25. package/dist/esm/audio/Music.js +7 -3
  26. package/dist/esm/audio/Music.js.map +1 -1
  27. package/dist/esm/audio/OscillatorSound.d.ts +1 -0
  28. package/dist/esm/audio/OscillatorSound.js +7 -3
  29. package/dist/esm/audio/OscillatorSound.js.map +1 -1
  30. package/dist/esm/audio/Sound.d.ts +1 -0
  31. package/dist/esm/audio/Sound.js +7 -3
  32. package/dist/esm/audio/Sound.js.map +1 -1
  33. package/dist/esm/audio/audio-context.d.ts +2 -2
  34. package/dist/esm/audio/audio-context.js +4 -4
  35. package/dist/esm/audio/audio-context.js.map +1 -1
  36. package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
  37. package/dist/esm/audio/filters/ChorusFilter.js +7 -3
  38. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
  39. package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
  40. package/dist/esm/audio/filters/CompressorFilter.js +7 -3
  41. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
  42. package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
  43. package/dist/esm/audio/filters/DelayFilter.js +7 -3
  44. package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
  45. package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
  46. package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
  47. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
  48. package/dist/esm/audio/filters/GranularFilter.js +1 -86
  49. package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
  50. package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
  51. package/dist/esm/audio/filters/HighpassFilter.js +7 -3
  52. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
  53. package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
  54. package/dist/esm/audio/filters/LowpassFilter.js +7 -3
  55. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
  56. package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
  57. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
  58. package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
  59. package/dist/esm/audio/filters/ReverbFilter.js +7 -3
  60. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
  61. package/dist/esm/audio/filters/VocoderFilter.js +1 -89
  62. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
  63. package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
  64. package/dist/esm/audio/filters/WorkletFilter.js +10 -5
  65. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
  66. package/dist/esm/audio/index.d.ts +15 -10
  67. package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
  68. package/dist/esm/audio/worklet/registerWorklet.js +2 -2
  69. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
  70. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
  71. package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
  72. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
  73. package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
  74. package/dist/esm/audio/worklets/granular.worklet.js +89 -0
  75. package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
  76. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
  77. package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
  78. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
  79. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
  80. package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
  81. package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +62 -24
  83. package/dist/esm/core/Application.js +116 -40
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/Color.d.ts +0 -8
  86. package/dist/esm/core/Color.js +0 -24
  87. package/dist/esm/core/Color.js.map +1 -1
  88. package/dist/esm/core/Scene.d.ts +32 -72
  89. package/dist/esm/core/Scene.js +56 -36
  90. package/dist/esm/core/Scene.js.map +1 -1
  91. package/dist/esm/core/SceneManager.d.ts +11 -25
  92. package/dist/esm/core/SceneManager.js +37 -100
  93. package/dist/esm/core/SceneManager.js.map +1 -1
  94. package/dist/esm/core/SceneNode.d.ts +28 -14
  95. package/dist/esm/core/SceneNode.js +66 -33
  96. package/dist/esm/core/SceneNode.js.map +1 -1
  97. package/dist/esm/core/Signal.d.ts +24 -28
  98. package/dist/esm/core/Signal.js +64 -50
  99. package/dist/esm/core/Signal.js.map +1 -1
  100. package/dist/esm/core/Timer.d.ts +1 -0
  101. package/dist/esm/core/Timer.js +3 -0
  102. package/dist/esm/core/Timer.js.map +1 -1
  103. package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
  104. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
  105. package/dist/esm/debug/HitTestLayer.js +1 -1
  106. package/dist/esm/debug/HitTestLayer.js.map +1 -1
  107. package/dist/esm/debug/PerformanceLayer.js +1 -2
  108. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  109. package/dist/esm/debug/PointerStackLayer.js +1 -2
  110. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  111. package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
  112. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  113. package/dist/esm/index.js +23 -7
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/esm/input/InputManager.d.ts +1 -0
  116. package/dist/esm/input/InputManager.js +30 -3
  117. package/dist/esm/input/InputManager.js.map +1 -1
  118. package/dist/esm/input/InteractionManager.d.ts +5 -2
  119. package/dist/esm/input/InteractionManager.js +29 -18
  120. package/dist/esm/input/InteractionManager.js.map +1 -1
  121. package/dist/esm/input/Pointer.js +3 -2
  122. package/dist/esm/input/Pointer.js.map +1 -1
  123. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
  124. package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
  125. package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
  126. package/dist/esm/math/AbstractVector.d.ts +1 -7
  127. package/dist/esm/math/AbstractVector.js +6 -20
  128. package/dist/esm/math/AbstractVector.js.map +1 -1
  129. package/dist/esm/math/Circle.js +0 -2
  130. package/dist/esm/math/Circle.js.map +1 -1
  131. package/dist/esm/math/Collision.d.ts +9 -3
  132. package/dist/esm/math/Ellipse.d.ts +2 -5
  133. package/dist/esm/math/Ellipse.js +10 -7
  134. package/dist/esm/math/Ellipse.js.map +1 -1
  135. package/dist/esm/math/ObservableVector.d.ts +1 -1
  136. package/dist/esm/math/ObservableVector.js +3 -3
  137. package/dist/esm/math/ObservableVector.js.map +1 -1
  138. package/dist/esm/math/Polygon.d.ts +0 -2
  139. package/dist/esm/math/Polygon.js +1 -9
  140. package/dist/esm/math/Polygon.js.map +1 -1
  141. package/dist/esm/math/Rectangle.js +0 -2
  142. package/dist/esm/math/Rectangle.js.map +1 -1
  143. package/dist/esm/math/collision-detection.d.ts +19 -4
  144. package/dist/esm/math/collision-detection.js +61 -4
  145. package/dist/esm/math/collision-detection.js.map +1 -1
  146. package/dist/esm/math/swept-collision.d.ts +16 -12
  147. package/dist/esm/math/swept-collision.js +109 -19
  148. package/dist/esm/math/swept-collision.js.map +1 -1
  149. package/dist/esm/particles/ParticleSystem.js +1 -1
  150. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  151. package/dist/esm/particles/index.d.ts +1 -0
  152. package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
  153. package/dist/esm/rendering/CallbackRenderPass.js +1 -0
  154. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  155. package/dist/esm/rendering/Container.d.ts +2 -1
  156. package/dist/esm/rendering/Container.js +17 -16
  157. package/dist/esm/rendering/Container.js.map +1 -1
  158. package/dist/esm/rendering/RenderBackend.d.ts +1 -0
  159. package/dist/esm/rendering/RenderNode.d.ts +1 -3
  160. package/dist/esm/rendering/RenderNode.js +12 -19
  161. package/dist/esm/rendering/RenderNode.js.map +1 -1
  162. package/dist/esm/rendering/RenderPass.d.ts +1 -0
  163. package/dist/esm/rendering/RenderStats.d.ts +9 -0
  164. package/dist/esm/rendering/RenderStats.js +2 -0
  165. package/dist/esm/rendering/RenderStats.js.map +1 -1
  166. package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
  167. package/dist/esm/rendering/RendererRegistry.js +1 -0
  168. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  169. package/dist/esm/rendering/View.d.ts +23 -0
  170. package/dist/esm/rendering/View.js +42 -0
  171. package/dist/esm/rendering/View.js.map +1 -1
  172. package/dist/esm/rendering/index.d.ts +89 -59
  173. package/dist/esm/rendering/mesh/Mesh.js +1 -1
  174. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  175. package/dist/esm/rendering/mesh/MeshShader.d.ts +1 -0
  176. package/dist/esm/rendering/mesh/MeshShader.js +1 -0
  177. package/dist/esm/rendering/mesh/MeshShader.js.map +1 -1
  178. package/dist/esm/rendering/shader/Shader.d.ts +1 -0
  179. package/dist/esm/rendering/shader/Shader.js +1 -0
  180. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  181. package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
  182. package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
  183. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  184. package/dist/esm/rendering/sprite/Sprite.d.ts +3 -2
  185. package/dist/esm/rendering/sprite/Sprite.js +15 -13
  186. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  187. package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
  188. package/dist/esm/rendering/text/AbstractText.js +49 -0
  189. package/dist/esm/rendering/text/AbstractText.js.map +1 -0
  190. package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
  191. package/dist/esm/rendering/text/BitmapText.js +220 -0
  192. package/dist/esm/rendering/text/BitmapText.js.map +1 -0
  193. package/dist/esm/rendering/text/BmFont.d.ts +50 -0
  194. package/dist/esm/rendering/text/BmFont.js +24 -0
  195. package/dist/esm/rendering/text/BmFont.js.map +1 -0
  196. package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
  197. package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
  198. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
  199. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
  200. package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
  201. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
  202. package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
  203. package/dist/esm/rendering/text/GlyphSdf.js +220 -0
  204. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
  205. package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
  206. package/dist/esm/rendering/text/HTMLText.js +284 -0
  207. package/dist/esm/rendering/text/HTMLText.js.map +1 -0
  208. package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
  209. package/dist/esm/rendering/text/Text.d.ts +89 -20
  210. package/dist/esm/rendering/text/Text.js +176 -101
  211. package/dist/esm/rendering/text/Text.js.map +1 -1
  212. package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
  213. package/dist/esm/rendering/text/TextLayout.js +234 -25
  214. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  215. package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
  216. package/dist/esm/rendering/text/TextStyle.js +257 -203
  217. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  218. package/dist/esm/rendering/text/types.d.ts +73 -13
  219. package/dist/esm/rendering/texture/Texture.d.ts +1 -0
  220. package/dist/esm/rendering/texture/Texture.js +1 -0
  221. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  222. package/dist/esm/rendering/types.d.ts +3 -1
  223. package/dist/esm/rendering/types.js +2 -0
  224. package/dist/esm/rendering/types.js.map +1 -1
  225. package/dist/esm/rendering/video/Video.d.ts +2 -1
  226. package/dist/esm/rendering/video/Video.js +9 -5
  227. package/dist/esm/rendering/video/Video.js.map +1 -1
  228. package/dist/esm/rendering/webgl2/WebGl2Backend.js +41 -5
  229. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  230. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +4 -4
  231. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  232. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
  233. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +482 -0
  234. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
  235. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
  236. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
  237. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
  238. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
  239. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
  240. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
  241. package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
  242. package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
  243. package/dist/esm/rendering/webgpu/WebGpuBackend.js +16 -8
  244. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  245. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
  246. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  247. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +2 -2
  248. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +23 -15
  249. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  250. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +9 -1
  251. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  252. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
  253. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +773 -0
  254. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
  255. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
  256. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
  257. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
  258. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
  259. package/dist/esm/resources/Asset.d.ts +23 -0
  260. package/dist/esm/resources/Asset.js +23 -0
  261. package/dist/esm/resources/Asset.js.map +1 -0
  262. package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
  263. package/dist/esm/resources/Assets.d.ts +35 -0
  264. package/dist/esm/resources/Assets.js +32 -0
  265. package/dist/esm/resources/Assets.js.map +1 -0
  266. package/dist/esm/resources/IndexedDbDatabase.js +17 -1
  267. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  268. package/dist/esm/resources/IndexedDbStore.js +17 -1
  269. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  270. package/dist/esm/resources/Loader.d.ts +244 -18
  271. package/dist/esm/resources/Loader.js +456 -50
  272. package/dist/esm/resources/Loader.js.map +1 -1
  273. package/dist/esm/resources/LoadingQueue.d.ts +28 -0
  274. package/dist/esm/resources/LoadingQueue.js +59 -0
  275. package/dist/esm/resources/LoadingQueue.js.map +1 -0
  276. package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
  277. package/dist/esm/resources/factories/BmFontFactory.js +96 -0
  278. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
  279. package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
  280. package/dist/esm/resources/factories/CsvFactory.js +87 -0
  281. package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
  282. package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
  283. package/dist/esm/resources/factories/MusicFactory.js +25 -14
  284. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  285. package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
  286. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  287. package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
  288. package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
  289. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
  290. package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
  291. package/dist/esm/resources/factories/SvgFactory.js +21 -2
  292. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  293. package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
  294. package/dist/esm/resources/factories/VideoFactory.js +27 -20
  295. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  296. package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
  297. package/dist/esm/resources/factories/XmlFactory.js +37 -0
  298. package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
  299. package/dist/esm/resources/index.d.ts +8 -1
  300. package/dist/esm/resources/tokens.d.ts +49 -3
  301. package/dist/esm/resources/tokens.js +50 -4
  302. package/dist/esm/resources/tokens.js.map +1 -1
  303. package/dist/exo.esm.js +6635 -2550
  304. package/dist/exo.esm.js.map +1 -1
  305. package/package.json +16 -4
  306. package/dist/esm/input/interaction-hooks.d.ts +0 -34
  307. package/dist/esm/input/interaction-hooks.js +0 -35
  308. package/dist/esm/input/interaction-hooks.js.map +0 -1
  309. package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
  310. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
  311. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
  312. package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
  313. package/dist/esm/rendering/text/atlas-singleton.js +0 -17
  314. package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
  315. package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
  316. package/dist/esm/resources/factories/VttFactory.js +0 -158
  317. package/dist/esm/resources/factories/VttFactory.js.map +0 -1
@@ -1,15 +1,24 @@
1
1
  import { Signal } from '@/core/Signal';
2
+ import { BmFont } from '@/rendering/text/BmFont';
3
+ import { Asset } from './Asset';
4
+ import type { AssetDefinitions, AssetInput, InferAssetResource } from './AssetDefinitions';
2
5
  import type { AssetFactory } from './AssetFactory';
3
6
  import type { AssetManifest, LoadBundleOptions } from './AssetManifest';
7
+ import { type Assets } from './Assets';
4
8
  import type { CacheStore } from './CacheStore';
5
9
  import type { CacheStrategy } from './CacheStrategy';
6
10
  import type { AssetConstructor } from './FactoryRegistry';
7
- import { Json, SvgAsset, TextAsset, VttAsset } from './tokens';
11
+ import { LoadingQueue } from './LoadingQueue';
12
+ import { BinaryAsset, CsvAsset, FontAsset, ImageAsset, Json, SubtitleAsset, SvgAsset, TextAsset, WasmAsset, XmlAsset } from './tokens';
8
13
  /**
9
14
  * Any abstract or concrete constructor that can be used as an asset type token
10
15
  * with {@link Loader.load} and related methods.
11
16
  */
12
17
  export type Loadable = abstract new (...args: any[]) => any;
18
+ /** Maps each key of an `AssetInput` map to its resolved runtime resource type. */
19
+ export type InferLoadedMap<M extends Record<string, AssetInput>> = {
20
+ [K in keyof M]: InferAssetResource<M[K]>;
21
+ };
13
22
  /**
14
23
  * Maps a {@link Loadable} constructor to the concrete type returned by
15
24
  * {@link Loader.load}.
@@ -19,11 +28,89 @@ export type Loadable = abstract new (...args: any[]) => any;
19
28
  * their constructor type. All other loadables return the instance type inferred
20
29
  * from the constructor.
21
30
  */
22
- export type LoadReturn<T> = T extends typeof Json ? unknown : T extends typeof TextAsset ? string : T extends typeof SvgAsset ? HTMLImageElement : T extends typeof VttAsset ? VTTCue[] : T extends abstract new (...args: any[]) => infer R ? R : never;
31
+ export type LoadReturn<T> = T extends typeof Json ? unknown : T extends typeof TextAsset ? string : T extends typeof SvgAsset ? HTMLImageElement : T extends typeof SubtitleAsset ? VTTCue[] : T extends typeof XmlAsset ? Document : T extends typeof CsvAsset ? string[][] : T extends typeof ImageAsset ? HTMLImageElement : T extends typeof FontAsset ? FontFace : T extends typeof BinaryAsset ? ArrayBuffer : T extends typeof WasmAsset ? WebAssembly.Module : T extends abstract new (...args: any[]) => infer R ? R : never;
32
+ /**
33
+ * Maps file extensions (without leading dot, lower-case) to the asset type
34
+ * returned by {@link Loader.load} when called with a plain path string.
35
+ *
36
+ * Extend via declaration merging to register custom extension → type mappings:
37
+ * ```ts
38
+ * declare module 'exojs' {
39
+ * interface ExtensionTypeMap { tmj: TiledMap; }
40
+ * }
41
+ * ```
42
+ */
43
+ export interface ExtensionTypeMap {
44
+ fnt: BmFont;
45
+ woff: FontFace;
46
+ woff2: FontFace;
47
+ ttf: FontFace;
48
+ otf: FontFace;
49
+ }
50
+ type PathExtension<S extends string> = S extends `${string}.${infer E}?${string}` ? Lowercase<E> : S extends `${string}.${infer E}` ? Lowercase<E> : never;
51
+ /**
52
+ * Resolves the return type for {@link Loader.load} when called with a plain
53
+ * path string. Returns `unknown` when the extension is not in
54
+ * {@link ExtensionTypeMap} — the string-path overload rejects such paths at
55
+ * compile time; use the token form (`load(MyType, path)`) instead.
56
+ */
57
+ export type LoadByPath<S extends string> = PathExtension<S> extends keyof ExtensionTypeMap ? ExtensionTypeMap[PathExtension<S>] : unknown;
58
+ /**
59
+ * Constrains a {@link Loadable} token against the types registered for a
60
+ * given path's extension. When the extension is in {@link ExtensionTypeMap},
61
+ * `T` must produce a value assignable to the registered union — otherwise
62
+ * resolves to `never`, triggering a compile-time error.
63
+ *
64
+ * For paths with an unregistered extension the constraint is skipped and any
65
+ * `T` is accepted (runtime behaviour is unchanged).
66
+ *
67
+ * ```ts
68
+ * // ExtensionTypeMap: { ogg: Sound | Video }
69
+ * loader.load(Sound, 'effect.ogg') // ✓ Sound ∈ Sound | Video
70
+ * loader.load(BitmapText, 'effect.ogg') // ✗ BitmapText ∉ Sound | Video
71
+ * loader.load(Sound, 'theme.custom') // ✓ .custom not in map → unconstrained
72
+ * ```
73
+ */
74
+ export type ConstrainedLoadable<T extends abstract new (...args: any[]) => any, S extends string> = PathExtension<S> extends keyof ExtensionTypeMap ? (LoadReturn<T> extends ExtensionTypeMap[PathExtension<S>] ? T : never) : T;
75
+ /**
76
+ * Context object passed to custom asset-type load handlers registered via
77
+ * {@link Loader.registerAssetType}.
78
+ *
79
+ * The `fetch*` helpers route through the loader's configured cache strategy
80
+ * and IDB stores, giving custom handlers the same caching behaviour as
81
+ * built-in asset types.
82
+ */
83
+ export interface AssetLoaderContext {
84
+ /** The owning {@link Loader} instance. */
85
+ readonly loader: Loader;
86
+ /**
87
+ * The identity key for this load — `id:<typeId>:<discriminator>`.
88
+ * Useful for diagnostics; also equals the key used for in-flight dedup.
89
+ */
90
+ readonly identityKey: string;
91
+ /** Fetches `source` as UTF-8 text, routing through the loader's cache/IDB. */
92
+ fetchText(source: string): Promise<string>;
93
+ /** Fetches `source` as an `ArrayBuffer`, routing through the loader's cache/IDB. */
94
+ fetchArrayBuffer(source: string): Promise<ArrayBuffer>;
95
+ /**
96
+ * Fetches `source` as parsed JSON, routing through the loader's cache/IDB.
97
+ * Supply `T` to narrow the return type at the call site.
98
+ */
99
+ fetchJson<T = unknown>(source: string): Promise<T>;
100
+ }
101
+ /**
102
+ * Accepted value types in the homogeneous batch load API.
103
+ *
104
+ * Either a raw source string or a flat config object containing at least
105
+ * `source` plus any type-specific extra fields.
106
+ */
107
+ export type BatchValue = string | ({
108
+ source: string;
109
+ } & Record<string, unknown>);
23
110
  /**
24
111
  * Construction options for {@link Loader}.
25
112
  *
26
- * `resourcePath` is prepended to relative asset paths at fetch time.
113
+ * `basePath` is prepended to relative asset paths at fetch time.
27
114
  * `cache` accepts one or more {@link CacheStore} instances. `cacheStrategy`
28
115
  * picks the policy used to consult them — defaults to
29
116
  * {@link CacheFirstStrategy} (check stores → network → write back).
@@ -31,8 +118,8 @@ export type LoadReturn<T> = T extends typeof Json ? unknown : T extends typeof T
31
118
  * (default `6`).
32
119
  */
33
120
  export interface LoaderOptions {
34
- resourcePath?: string;
35
- requestOptions?: RequestInit;
121
+ basePath?: string;
122
+ fetchOptions?: RequestInit;
36
123
  cache?: CacheStore | readonly CacheStore[];
37
124
  cacheStrategy?: CacheStrategy;
38
125
  concurrency?: number;
@@ -59,12 +146,13 @@ export interface LoaderOptions {
59
146
  *
60
147
  * @example
61
148
  * ```ts
62
- * const loader = new Loader({ resourcePath: '/assets/', cache: new IndexedDbStore('game') });
149
+ * const loader = new Loader({ basePath: '/assets/', cache: new IndexedDbStore('game') });
63
150
  * const texture = await loader.load(Texture, 'hero.png');
64
151
  * ```
65
152
  */
66
153
  export declare class Loader {
67
154
  private readonly _registry;
155
+ private readonly _assetTypeMap;
68
156
  private readonly _resources;
69
157
  private readonly _manifest;
70
158
  private readonly _bundles;
@@ -73,8 +161,13 @@ export declare class Loader {
73
161
  private readonly _preventStoreKeys;
74
162
  private readonly _stores;
75
163
  private readonly _cacheStrategy;
76
- private _resourcePath;
77
- private _requestOptions;
164
+ private readonly _aliasKeyToIdentityKey;
165
+ private readonly _identityKeyToAliases;
166
+ private readonly _inFlightByIdentity;
167
+ private readonly _handlerFunctions;
168
+ private readonly _extensionMap;
169
+ private _basePath;
170
+ private _fetchOptions;
78
171
  private _concurrency;
79
172
  private _nextTypeId;
80
173
  private _backgroundQueue;
@@ -100,6 +193,62 @@ export declare class Loader {
100
193
  * for the same constructor.
101
194
  */
102
195
  register<T>(type: AssetConstructor<T>, factory: AssetFactory<T>): this;
196
+ /**
197
+ * Associates a string type name with a simple load handler.
198
+ *
199
+ * The handler's `load` method receives the full config object (including
200
+ * `source` and every extra field declared via `AssetDefinitions` augmentation)
201
+ * plus a {@link AssetLoaderContext} containing the loader instance.
202
+ *
203
+ * This form is intended for custom asset types that manage their own
204
+ * network access; the persistent cache layer is bypassed.
205
+ *
206
+ * @example
207
+ * ```ts
208
+ * loader.registerAssetType('tileMap', {
209
+ * load(config, { loader }) {
210
+ * return loadTileMap({ source: config.source, format: config.format, loader });
211
+ * },
212
+ * });
213
+ * ```
214
+ */
215
+ registerAssetType<K extends keyof AssetDefinitions>(typeName: K, handler: {
216
+ /**
217
+ * Optional discriminator for in-flight dedup and identity tracking.
218
+ *
219
+ * Return a string that uniquely identifies the conceptual asset given its
220
+ * full config. The default (when omitted) is `config.source`, which is
221
+ * correct for assets where the source URL alone determines the result.
222
+ * Supply this when extra config fields affect the loaded output — e.g.
223
+ * `\`${config.source}:${config.format}\`` — so that two assets with the
224
+ * same source but different format are kept separate in the in-flight map.
225
+ */
226
+ getIdentityKey?(config: AssetDefinitions[K]['config']): string;
227
+ load(config: AssetDefinitions[K]['config'], context: AssetLoaderContext): Promise<AssetDefinitions[K]['resource']>;
228
+ }): this;
229
+ /**
230
+ * Associates a string type name (e.g. `'tileMap'`) with the constructor
231
+ * used as the asset token and, optionally, registers a factory for it.
232
+ *
233
+ * Required for declaration-merge extensions of {@link AssetDefinitions}
234
+ * so that `loader.load({ map: { type: 'tileMap', source: '…' } })` works.
235
+ */
236
+ registerAssetType(typeName: string, ctor: AssetConstructor, factory?: AssetFactory): this;
237
+ /**
238
+ * Associates a file extension with an asset type so that
239
+ * `loader.load('path.ext')` (the single-string overload) can infer the
240
+ * type automatically.
241
+ *
242
+ * `ext` is matched case-insensitively and the leading dot is optional.
243
+ * The type must already have a registered factory (via {@link register} or
244
+ * {@link registerAssetType}).
245
+ *
246
+ * ```ts
247
+ * loader.registerExtension('tmj', TiledMap);
248
+ * const map = await loader.load('world.tmj'); // TiledMap
249
+ * ```
250
+ */
251
+ registerExtension(ext: string, type: AssetConstructor): this;
103
252
  /**
104
253
  * Registers one or more asset aliases in the manifest without immediately
105
254
  * loading them.
@@ -146,6 +295,9 @@ export declare class Loader {
146
295
  * - **Single path** — resolves with the finished asset.
147
296
  * - **Array of paths** — resolves with an ordered array of assets.
148
297
  * - **Record** — resolves with a record whose keys match the input keys.
298
+ * - **Asset<T>** — single typed asset reference.
299
+ * - **Assets<M>** — typed asset container; keys become aliases.
300
+ * - **Config map** — inline `{ alias: { type, source, … } }` definition.
149
301
  *
150
302
  * In-flight and already-loaded assets are de-duplicated: calling `load`
151
303
  * for the same (type, alias) pair while a fetch is in progress attaches
@@ -154,12 +306,37 @@ export declare class Loader {
154
306
  * Supply a custom `options` object to pass factory-specific configuration
155
307
  * (e.g. audio decoding hints or image format overrides).
156
308
  */
157
- load<T = unknown>(type: typeof Json, path: string, options?: unknown): Promise<T>;
158
- load<T = unknown>(type: typeof Json, paths: readonly string[], options?: unknown): Promise<T[]>;
159
- load<T = unknown, K extends string = string>(type: typeof Json, items: Readonly<Record<K, string>>, options?: unknown): Promise<Record<K, T>>;
160
- load<T extends Loadable>(type: T, path: string, options?: unknown): Promise<LoadReturn<T>>;
161
- load<T extends Loadable>(type: T, paths: readonly string[], options?: unknown): Promise<Array<LoadReturn<T>>>;
162
- load<T extends Loadable, K extends string>(type: T, items: Readonly<Record<K, string>>, options?: unknown): Promise<Record<K, LoadReturn<T>>>;
309
+ load<T = unknown>(type: typeof Json, path: string, options?: unknown): LoadingQueue<T>;
310
+ load<T = unknown>(type: typeof Json, paths: readonly string[], options?: unknown): LoadingQueue<T[]>;
311
+ load<T = unknown, K extends string = string>(type: typeof Json, items: Readonly<Record<K, string>>, options?: unknown): LoadingQueue<Record<K, T>>;
312
+ load<T>(asset: Asset<T>): LoadingQueue<T>;
313
+ load<M extends Record<string, AssetInput>>(assets: Assets<M>): LoadingQueue<InferLoadedMap<M>>;
314
+ load<M extends Record<string, AssetInput>>(config: M): LoadingQueue<InferLoadedMap<M>>;
315
+ /**
316
+ * Fetches an asset by path, inferring the type from the file extension.
317
+ *
318
+ * Built-in extension mappings:
319
+ * - `.fnt` → {@link BmFont}
320
+ * - `.woff`, `.woff2`, `.ttf`, `.otf` → `FontFace` (family inferred from filename)
321
+ *
322
+ * Register additional mappings via {@link registerExtension}.
323
+ * Extend the return type by augmenting {@link ExtensionTypeMap}.
324
+ *
325
+ * Paths whose extension is **not** in {@link ExtensionTypeMap} are rejected at
326
+ * compile time — use the token form (`load(MyType, path)`) for unregistered
327
+ * extensions.
328
+ *
329
+ * ```ts
330
+ * const font = await loader.load('fonts/ui.fnt'); // BmFont
331
+ * const face = await loader.load('fonts/Roboto.woff2'); // FontFace, family='Roboto'
332
+ * const bm = await loader.load<BmFont>('fonts/ui.fnt'); // validated cast
333
+ * ```
334
+ */
335
+ load<R, S extends string>(path: PathExtension<S> extends keyof ExtensionTypeMap ? S : never): LoadingQueue<R>;
336
+ load<S extends string>(path: PathExtension<S> extends keyof ExtensionTypeMap ? S : never): LoadingQueue<LoadByPath<S>>;
337
+ load<T extends Loadable, S extends string>(type: ConstrainedLoadable<T, S>, path: S, options?: unknown): LoadingQueue<LoadReturn<T>>;
338
+ load<T extends Loadable>(type: T, paths: readonly string[], options?: unknown): LoadingQueue<Array<LoadReturn<T>>>;
339
+ load<T extends Loadable, K extends string>(type: T, items: Readonly<Record<K, BatchValue>>, options?: unknown): LoadingQueue<Record<K, LoadReturn<T>>>;
163
340
  /**
164
341
  * Enqueues all manifest-registered assets that have not yet been loaded
165
342
  * into the background fetch queue and begins draining the queue up to
@@ -206,7 +383,10 @@ export declare class Loader {
206
383
  * discarded once it arrives rather than written to the store, preventing
207
384
  * a stale value from being committed after an explicit unload.
208
385
  */
386
+ unload<T>(asset: Asset<T>): this;
387
+ unload<M extends Record<string, AssetInput>>(assets: Assets<M>): this;
209
388
  unload(type: Loadable, alias: string): this;
389
+ private _unloadOne;
210
390
  /**
211
391
  * Removes all loaded assets from the in-memory store.
212
392
  *
@@ -219,14 +399,14 @@ export declare class Loader {
219
399
  * Absolute URLs (starting with `http://`, `https://`, or `//`) are
220
400
  * passed through unchanged.
221
401
  */
222
- get resourcePath(): string;
223
- set resourcePath(value: string);
402
+ get basePath(): string;
403
+ set basePath(value: string);
224
404
  /**
225
405
  * Default `RequestInit` options merged into every `fetch` call.
226
406
  * Override per-load with the `options` argument of {@link load}.
227
407
  */
228
- get requestOptions(): RequestInit;
229
- set requestOptions(value: RequestInit);
408
+ get fetchOptions(): RequestInit;
409
+ set fetchOptions(value: RequestInit);
230
410
  /**
231
411
  * Tears down the loader and all resources it owns.
232
412
  *
@@ -237,6 +417,41 @@ export declare class Loader {
237
417
  destroy(): void;
238
418
  private _loadSingle;
239
419
  private _loadSingleBackground;
420
+ private _createLoadingQueue;
421
+ /**
422
+ * Loads a single asset from an `Asset<T>` reference using identity-based
423
+ * in-flight deduplication.
424
+ *
425
+ * Multiple aliases that point to the same source share a single network
426
+ * fetch. Each alias is stored independently in `_resources` so that
427
+ * `get(type, alias)` works for all of them.
428
+ */
429
+ private _loadSingleAsset;
430
+ /**
431
+ * Calls a handler-based custom asset loader and stores the result.
432
+ *
433
+ * Unlike `_fetch`, this does NOT automatically bypass caching — the handler
434
+ * controls caching by calling `context.fetchText` / `context.fetchArrayBuffer`
435
+ * / `context.fetchJson`, which route through the loader's cache strategy.
436
+ */
437
+ private _fetchWithHandler;
438
+ /**
439
+ * Builds an {@link AssetLoaderContext} for a handler invocation.
440
+ *
441
+ * The `fetch*` helpers on the returned context route through the loader's
442
+ * configured cache strategy and IDB stores, using `source` as the IDB key
443
+ * (so the same URL is never fetched twice regardless of the asset alias).
444
+ */
445
+ private _buildHandlerContext;
446
+ /**
447
+ * Fetches `source` through the loader's cache strategy with an inline
448
+ * pass-through factory, using `source` as the IDB key.
449
+ *
450
+ * `process` converts the raw `Response` to the storable intermediate form
451
+ * (e.g. `r.text()`, `r.arrayBuffer()`, `r.json()`). `create` is always the
452
+ * identity function — the cached value is returned unchanged.
453
+ */
454
+ private _contextFetch;
240
455
  private _fetch;
241
456
  private _drainBackground;
242
457
  private _boostFromQueue;
@@ -254,7 +469,18 @@ export declare class Loader {
254
469
  private _describeType;
255
470
  private _hasResource;
256
471
  private _storeResource;
472
+ private _getTypeId;
257
473
  private _key;
474
+ private _identityKey;
475
+ /**
476
+ * Resolves the effective identity key for an `Asset<T>` reference, mirroring
477
+ * the logic used in `_loadSingleAsset`.
478
+ *
479
+ * For handler types with `getIdentityKey`, the config-sensitive discriminator
480
+ * is used; otherwise source is the discriminator (same as `_identityKey`).
481
+ */
482
+ private _resolveAssetIdentityKey;
258
483
  private _resolveUrl;
259
484
  private _registerBuiltinFactories;
260
485
  }
486
+ export {};