@caperjs/core 0.1.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 (600) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +62 -0
  3. package/cli/add.mjs +197 -0
  4. package/cli/audio/cc.mjs +128 -0
  5. package/cli/audio/index.mjs +42 -0
  6. package/cli/audio/utils.mjs +56 -0
  7. package/cli/create-caper.mjs +8 -0
  8. package/cli/create.mjs +351 -0
  9. package/cli/install-peerdeps.mjs +57 -0
  10. package/cli/update.mjs +9 -0
  11. package/cli/utils.mjs +81 -0
  12. package/cli/vite.mjs +55 -0
  13. package/cli/voiceover/generateVoiceoverCSV.mjs +158 -0
  14. package/cli/voiceover/index.mjs +1 -0
  15. package/cli.mjs +157 -0
  16. package/client.d.ts +7 -0
  17. package/config/assetpack.mjs +212 -0
  18. package/config/tsconfig.base.json +28 -0
  19. package/config/vite.mjs +2464 -0
  20. package/extras/css/accessibility.css +9 -0
  21. package/extras/css/fullscreen.css +28 -0
  22. package/extras/css/loader.css +67 -0
  23. package/extras/llms.txt +1602 -0
  24. package/lib/CaptionsPlugin-Dc8fIrjy.js +277 -0
  25. package/lib/CaptionsPlugin-Dc8fIrjy.js.map +1 -0
  26. package/lib/DataAdapter-BY2114sp.js +84 -0
  27. package/lib/DataAdapter-BY2114sp.js.map +1 -0
  28. package/lib/DebugRenderer-BJMLILqI.js +1385 -0
  29. package/lib/DebugRenderer-BJMLILqI.js.map +1 -0
  30. package/lib/DevToolsPlugin-wQ5rOkn0.js +31 -0
  31. package/lib/DevToolsPlugin-wQ5rOkn0.js.map +1 -0
  32. package/lib/GSAPPlugin-DHhSZKv8.js +350 -0
  33. package/lib/GSAPPlugin-DHhSZKv8.js.map +1 -0
  34. package/lib/LayoutPlugin-B-DF9SYM.js +1271 -0
  35. package/lib/LayoutPlugin-B-DF9SYM.js.map +1 -0
  36. package/lib/SpinePlugin-Dz_3dljz.js +6077 -0
  37. package/lib/SpinePlugin-Dz_3dljz.js.map +1 -0
  38. package/lib/StatsPlugin-Cg82JMBD.js +70 -0
  39. package/lib/StatsPlugin-Cg82JMBD.js.map +1 -0
  40. package/lib/VoiceOverPlugin-BR3ImT8C.js +114 -0
  41. package/lib/VoiceOverPlugin-BR3ImT8C.js.map +1 -0
  42. package/lib/caper.mjs +1233 -0
  43. package/lib/caper.mjs.map +1 -0
  44. package/lib/core/Application.d.ts +268 -0
  45. package/lib/core/Application.d.ts.map +1 -0
  46. package/lib/core/config.d.ts +39 -0
  47. package/lib/core/config.d.ts.map +1 -0
  48. package/lib/core/create.d.ts +41 -0
  49. package/lib/core/create.d.ts.map +1 -0
  50. package/lib/core/globals.d.ts +51 -0
  51. package/lib/core/globals.d.ts.map +1 -0
  52. package/lib/core/index.d.ts +7 -0
  53. package/lib/core/index.d.ts.map +1 -0
  54. package/lib/core/interfaces/IApplication.d.ts +566 -0
  55. package/lib/core/interfaces/IApplication.d.ts.map +1 -0
  56. package/lib/core/interfaces/IApplicationOptions.d.ts +65 -0
  57. package/lib/core/interfaces/IApplicationOptions.d.ts.map +1 -0
  58. package/lib/core/interfaces/ICoreFunctions.d.ts +49 -0
  59. package/lib/core/interfaces/ICoreFunctions.d.ts.map +1 -0
  60. package/lib/core/interfaces/ICoreSignals.d.ts +57 -0
  61. package/lib/core/interfaces/ICoreSignals.d.ts.map +1 -0
  62. package/lib/core/interfaces/IStorageCapability.d.ts +20 -0
  63. package/lib/core/interfaces/IStorageCapability.d.ts.map +1 -0
  64. package/lib/core/interfaces/IStorageCapability.test.d.ts +2 -0
  65. package/lib/core/interfaces/IStorageCapability.test.d.ts.map +1 -0
  66. package/lib/core/interfaces/index.d.ts +7 -0
  67. package/lib/core/interfaces/index.d.ts.map +1 -0
  68. package/lib/core/registries.d.ts +8 -0
  69. package/lib/core/registries.d.ts.map +1 -0
  70. package/lib/core/types.d.ts +12 -0
  71. package/lib/core/types.d.ts.map +1 -0
  72. package/lib/display/AnimatedSprite.d.ts +40 -0
  73. package/lib/display/AnimatedSprite.d.ts.map +1 -0
  74. package/lib/display/Camera.d.ts +102 -0
  75. package/lib/display/Camera.d.ts.map +1 -0
  76. package/lib/display/Container.d.ts +115 -0
  77. package/lib/display/Container.d.ts.map +1 -0
  78. package/lib/display/Entity.d.ts +46 -0
  79. package/lib/display/Entity.d.ts.map +1 -0
  80. package/lib/display/ParticleContainer.d.ts +58 -0
  81. package/lib/display/ParticleContainer.d.ts.map +1 -0
  82. package/lib/display/Scene.d.ts +250 -0
  83. package/lib/display/Scene.d.ts.map +1 -0
  84. package/lib/display/SceneTransition.d.ts +41 -0
  85. package/lib/display/SceneTransition.d.ts.map +1 -0
  86. package/lib/display/SpineAnimation.d.ts +76 -0
  87. package/lib/display/SpineAnimation.d.ts.map +1 -0
  88. package/lib/display/Svg.d.ts +5 -0
  89. package/lib/display/Svg.d.ts.map +1 -0
  90. package/lib/display/index.d.ts +10 -0
  91. package/lib/display/index.d.ts.map +1 -0
  92. package/lib/env.d.ts +6 -0
  93. package/lib/hello.d.ts +2 -0
  94. package/lib/hello.d.ts.map +1 -0
  95. package/lib/index.d.ts +15 -0
  96. package/lib/index.d.ts.map +1 -0
  97. package/lib/mixins/animated.d.ts +53 -0
  98. package/lib/mixins/animated.d.ts.map +1 -0
  99. package/lib/mixins/factory/Factory.d.ts +8 -0
  100. package/lib/mixins/factory/Factory.d.ts.map +1 -0
  101. package/lib/mixins/factory/const.d.ts +67 -0
  102. package/lib/mixins/factory/const.d.ts.map +1 -0
  103. package/lib/mixins/factory/index.d.ts +8 -0
  104. package/lib/mixins/factory/index.d.ts.map +1 -0
  105. package/lib/mixins/factory/methods.d.ts +3 -0
  106. package/lib/mixins/factory/methods.d.ts.map +1 -0
  107. package/lib/mixins/factory/props.d.ts +160 -0
  108. package/lib/mixins/factory/props.d.ts.map +1 -0
  109. package/lib/mixins/factory/registry.d.ts +27 -0
  110. package/lib/mixins/factory/registry.d.ts.map +1 -0
  111. package/lib/mixins/factory/registry.test.d.ts +2 -0
  112. package/lib/mixins/factory/registry.test.d.ts.map +1 -0
  113. package/lib/mixins/factory/schema.d.ts +71 -0
  114. package/lib/mixins/factory/schema.d.ts.map +1 -0
  115. package/lib/mixins/factory/ui-registry.d.ts +20 -0
  116. package/lib/mixins/factory/ui-registry.d.ts.map +1 -0
  117. package/lib/mixins/factory/utils.d.ts +11 -0
  118. package/lib/mixins/factory/utils.d.ts.map +1 -0
  119. package/lib/mixins/focus.d.ts +15 -0
  120. package/lib/mixins/focus.d.ts.map +1 -0
  121. package/lib/mixins/index.d.ts +6 -0
  122. package/lib/mixins/index.d.ts.map +1 -0
  123. package/lib/mixins/interaction.d.ts +20 -0
  124. package/lib/mixins/interaction.d.ts.map +1 -0
  125. package/lib/mixins/signals.d.ts +15 -0
  126. package/lib/mixins/signals.d.ts.map +1 -0
  127. package/lib/plugins/AssetsPlugin.d.ts +79 -0
  128. package/lib/plugins/AssetsPlugin.d.ts.map +1 -0
  129. package/lib/plugins/DataAdapter.d.ts +95 -0
  130. package/lib/plugins/DataAdapter.d.ts.map +1 -0
  131. package/lib/plugins/DevToolsPlugin.d.ts +97 -0
  132. package/lib/plugins/DevToolsPlugin.d.ts.map +1 -0
  133. package/lib/plugins/FullScreenPlugin.d.ts +240 -0
  134. package/lib/plugins/FullScreenPlugin.d.ts.map +1 -0
  135. package/lib/plugins/GSAPPlugin.d.ts +634 -0
  136. package/lib/plugins/GSAPPlugin.d.ts.map +1 -0
  137. package/lib/plugins/KeyboardPlugin.d.ts +53 -0
  138. package/lib/plugins/KeyboardPlugin.d.ts.map +1 -0
  139. package/lib/plugins/LayoutPlugin.d.ts +100 -0
  140. package/lib/plugins/LayoutPlugin.d.ts.map +1 -0
  141. package/lib/plugins/LookupPlugin.d.ts +223 -0
  142. package/lib/plugins/LookupPlugin.d.ts.map +1 -0
  143. package/lib/plugins/Plugin.d.ts +132 -0
  144. package/lib/plugins/Plugin.d.ts.map +1 -0
  145. package/lib/plugins/Plugin.test.d.ts +2 -0
  146. package/lib/plugins/Plugin.test.d.ts.map +1 -0
  147. package/lib/plugins/PopupManagerPlugin.d.ts +108 -0
  148. package/lib/plugins/PopupManagerPlugin.d.ts.map +1 -0
  149. package/lib/plugins/ResizerPlugin.d.ts +62 -0
  150. package/lib/plugins/ResizerPlugin.d.ts.map +1 -0
  151. package/lib/plugins/SceneManagerPlugin.d.ts +122 -0
  152. package/lib/plugins/SceneManagerPlugin.d.ts.map +1 -0
  153. package/lib/plugins/StatsPlugin.d.ts +8 -0
  154. package/lib/plugins/StatsPlugin.d.ts.map +1 -0
  155. package/lib/plugins/TimerPlugin.d.ts +401 -0
  156. package/lib/plugins/TimerPlugin.d.ts.map +1 -0
  157. package/lib/plugins/WebEventsPlugin.d.ts +60 -0
  158. package/lib/plugins/WebEventsPlugin.d.ts.map +1 -0
  159. package/lib/plugins/actions/ActionsPlugin.d.ts +39 -0
  160. package/lib/plugins/actions/ActionsPlugin.d.ts.map +1 -0
  161. package/lib/plugins/actions/constants.d.ts +52 -0
  162. package/lib/plugins/actions/constants.d.ts.map +1 -0
  163. package/lib/plugins/actions/index.d.ts +5 -0
  164. package/lib/plugins/actions/index.d.ts.map +1 -0
  165. package/lib/plugins/actions/methods.d.ts +11 -0
  166. package/lib/plugins/actions/methods.d.ts.map +1 -0
  167. package/lib/plugins/actions/types.d.ts +25 -0
  168. package/lib/plugins/actions/types.d.ts.map +1 -0
  169. package/lib/plugins/audio/AudioChannel.d.ts +46 -0
  170. package/lib/plugins/audio/AudioChannel.d.ts.map +1 -0
  171. package/lib/plugins/audio/AudioChannel.test.d.ts +2 -0
  172. package/lib/plugins/audio/AudioChannel.test.d.ts.map +1 -0
  173. package/lib/plugins/audio/AudioInstance.d.ts +79 -0
  174. package/lib/plugins/audio/AudioInstance.d.ts.map +1 -0
  175. package/lib/plugins/audio/AudioManagerPlugin.d.ts +323 -0
  176. package/lib/plugins/audio/AudioManagerPlugin.d.ts.map +1 -0
  177. package/lib/plugins/audio/VoiceOverPlugin.d.ts +69 -0
  178. package/lib/plugins/audio/VoiceOverPlugin.d.ts.map +1 -0
  179. package/lib/plugins/audio/index.d.ts +4 -0
  180. package/lib/plugins/audio/index.d.ts.map +1 -0
  181. package/lib/plugins/breakpoints/BreakpointPlugin.d.ts +109 -0
  182. package/lib/plugins/breakpoints/BreakpointPlugin.d.ts.map +1 -0
  183. package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts +2 -0
  184. package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts.map +1 -0
  185. package/lib/plugins/breakpoints/evaluate.d.ts +53 -0
  186. package/lib/plugins/breakpoints/evaluate.d.ts.map +1 -0
  187. package/lib/plugins/breakpoints/evaluate.test.d.ts +2 -0
  188. package/lib/plugins/breakpoints/evaluate.test.d.ts.map +1 -0
  189. package/lib/plugins/breakpoints/index.d.ts +4 -0
  190. package/lib/plugins/breakpoints/index.d.ts.map +1 -0
  191. package/lib/plugins/breakpoints/methods.d.ts +23 -0
  192. package/lib/plugins/breakpoints/methods.d.ts.map +1 -0
  193. package/lib/plugins/breakpoints/types.d.ts +70 -0
  194. package/lib/plugins/breakpoints/types.d.ts.map +1 -0
  195. package/lib/plugins/captions/CaptionsPlugin.d.ts +150 -0
  196. package/lib/plugins/captions/CaptionsPlugin.d.ts.map +1 -0
  197. package/lib/plugins/captions/CaptionsRenderer.d.ts +37 -0
  198. package/lib/plugins/captions/CaptionsRenderer.d.ts.map +1 -0
  199. package/lib/plugins/captions/index.d.ts +3 -0
  200. package/lib/plugins/captions/index.d.ts.map +1 -0
  201. package/lib/plugins/defaults.d.ts +4 -0
  202. package/lib/plugins/defaults.d.ts.map +1 -0
  203. package/lib/plugins/focus/FocusManagerPlugin.d.ts +148 -0
  204. package/lib/plugins/focus/FocusManagerPlugin.d.ts.map +1 -0
  205. package/lib/plugins/focus/FocusOutliner.d.ts +32 -0
  206. package/lib/plugins/focus/FocusOutliner.d.ts.map +1 -0
  207. package/lib/plugins/focus/index.d.ts +3 -0
  208. package/lib/plugins/focus/index.d.ts.map +1 -0
  209. package/lib/plugins/i18nPlugin.d.ts +128 -0
  210. package/lib/plugins/i18nPlugin.d.ts.map +1 -0
  211. package/lib/plugins/index.d.ts +18 -0
  212. package/lib/plugins/index.d.ts.map +1 -0
  213. package/lib/plugins/input/AbstractControls.d.ts +8 -0
  214. package/lib/plugins/input/AbstractControls.d.ts.map +1 -0
  215. package/lib/plugins/input/Controls.d.ts +16 -0
  216. package/lib/plugins/input/Controls.d.ts.map +1 -0
  217. package/lib/plugins/input/InputPlugin.d.ts +52 -0
  218. package/lib/plugins/input/InputPlugin.d.ts.map +1 -0
  219. package/lib/plugins/input/constants.d.ts +8 -0
  220. package/lib/plugins/input/constants.d.ts.map +1 -0
  221. package/lib/plugins/input/index.d.ts +10 -0
  222. package/lib/plugins/input/index.d.ts.map +1 -0
  223. package/lib/plugins/input/interfaces.d.ts +30 -0
  224. package/lib/plugins/input/interfaces.d.ts.map +1 -0
  225. package/lib/plugins/input/keyboard/KeyboardContols.d.ts +28 -0
  226. package/lib/plugins/input/keyboard/KeyboardContols.d.ts.map +1 -0
  227. package/lib/plugins/input/keyboard/index.d.ts +3 -0
  228. package/lib/plugins/input/keyboard/index.d.ts.map +1 -0
  229. package/lib/plugins/input/keyboard/interfaces.d.ts +18 -0
  230. package/lib/plugins/input/keyboard/interfaces.d.ts.map +1 -0
  231. package/lib/plugins/input/methods.d.ts +4 -0
  232. package/lib/plugins/input/methods.d.ts.map +1 -0
  233. package/lib/plugins/input/touch/TouchControls.d.ts +35 -0
  234. package/lib/plugins/input/touch/TouchControls.d.ts.map +1 -0
  235. package/lib/plugins/input/touch/constants.d.ts +14 -0
  236. package/lib/plugins/input/touch/constants.d.ts.map +1 -0
  237. package/lib/plugins/input/touch/index.d.ts +4 -0
  238. package/lib/plugins/input/touch/index.d.ts.map +1 -0
  239. package/lib/plugins/input/touch/interfaces.d.ts +15 -0
  240. package/lib/plugins/input/touch/interfaces.d.ts.map +1 -0
  241. package/lib/plugins/input/types.d.ts +32 -0
  242. package/lib/plugins/input/types.d.ts.map +1 -0
  243. package/lib/plugins/input/utils.d.ts +23 -0
  244. package/lib/plugins/input/utils.d.ts.map +1 -0
  245. package/lib/plugins/spine/SpinePlugin.d.ts +6 -0
  246. package/lib/plugins/spine/SpinePlugin.d.ts.map +1 -0
  247. package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts +31 -0
  248. package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts.map +1 -0
  249. package/lib/plugins/spine/pixi-spine/Spine.d.ts +211 -0
  250. package/lib/plugins/spine/pixi-spine/Spine.d.ts.map +1 -0
  251. package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts +81 -0
  252. package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts.map +1 -0
  253. package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts +21 -0
  254. package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts.map +1 -0
  255. package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts +16 -0
  256. package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts.map +1 -0
  257. package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts +10 -0
  258. package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts.map +1 -0
  259. package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts +6 -0
  260. package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts.map +1 -0
  261. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts +5 -0
  262. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts.map +1 -0
  263. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts +22 -0
  264. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts.map +1 -0
  265. package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts +5 -0
  266. package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts.map +1 -0
  267. package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts +51 -0
  268. package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts.map +1 -0
  269. package/lib/plugins/spine/pixi-spine/index.d.ts +9 -0
  270. package/lib/plugins/spine/pixi-spine/index.d.ts.map +1 -0
  271. package/lib/plugins/spine/pixi-spine/require-shim.d.ts +34 -0
  272. package/lib/plugins/spine/pixi-spine/require-shim.d.ts.map +1 -0
  273. package/lib/registries-CYCaYKZI.js +6885 -0
  274. package/lib/registries-CYCaYKZI.js.map +1 -0
  275. package/lib/signals/Signal.d.ts +16 -0
  276. package/lib/signals/Signal.d.ts.map +1 -0
  277. package/lib/signals/Signal.test.d.ts +2 -0
  278. package/lib/signals/Signal.test.d.ts.map +1 -0
  279. package/lib/signals/index.d.ts +3 -0
  280. package/lib/signals/index.d.ts.map +1 -0
  281. package/lib/store/Store.d.ts +56 -0
  282. package/lib/store/Store.d.ts.map +1 -0
  283. package/lib/store/Store.test.d.ts +2 -0
  284. package/lib/store/Store.test.d.ts.map +1 -0
  285. package/lib/store/index.d.ts +2 -0
  286. package/lib/store/index.d.ts.map +1 -0
  287. package/lib/types/framework.d.ts +46 -0
  288. package/lib/types/gsap.d.ts +23 -0
  289. package/lib/ui/Button.d.ts +162 -0
  290. package/lib/ui/Button.d.ts.map +1 -0
  291. package/lib/ui/FlexContainer.d.ts +109 -0
  292. package/lib/ui/FlexContainer.d.ts.map +1 -0
  293. package/lib/ui/Input.d.ts +384 -0
  294. package/lib/ui/Input.d.ts.map +1 -0
  295. package/lib/ui/Joystick.d.ts +61 -0
  296. package/lib/ui/Joystick.d.ts.map +1 -0
  297. package/lib/ui/Popup.d.ts +109 -0
  298. package/lib/ui/Popup.d.ts.map +1 -0
  299. package/lib/ui/Toast.d.ts +131 -0
  300. package/lib/ui/Toast.d.ts.map +1 -0
  301. package/lib/ui/Toaster.d.ts +188 -0
  302. package/lib/ui/Toaster.d.ts.map +1 -0
  303. package/lib/ui/UICanvas.d.ts +155 -0
  304. package/lib/ui/UICanvas.d.ts.map +1 -0
  305. package/lib/ui/index.d.ts +9 -0
  306. package/lib/ui/index.d.ts.map +1 -0
  307. package/lib/utils/array.d.ts +11 -0
  308. package/lib/utils/array.d.ts.map +1 -0
  309. package/lib/utils/bind.d.ts +21 -0
  310. package/lib/utils/bind.d.ts.map +1 -0
  311. package/lib/utils/canvas.d.ts +2 -0
  312. package/lib/utils/canvas.d.ts.map +1 -0
  313. package/lib/utils/color.d.ts +66 -0
  314. package/lib/utils/color.d.ts.map +1 -0
  315. package/lib/utils/console/Logger.d.ts +15 -0
  316. package/lib/utils/console/Logger.d.ts.map +1 -0
  317. package/lib/utils/console/index.d.ts +2 -0
  318. package/lib/utils/console/index.d.ts.map +1 -0
  319. package/lib/utils/debug.d.ts +34 -0
  320. package/lib/utils/debug.d.ts.map +1 -0
  321. package/lib/utils/define.d.ts +100 -0
  322. package/lib/utils/define.d.ts.map +1 -0
  323. package/lib/utils/env.d.ts +4 -0
  324. package/lib/utils/env.d.ts.map +1 -0
  325. package/lib/utils/events.d.ts +12 -0
  326. package/lib/utils/events.d.ts.map +1 -0
  327. package/lib/utils/framework.d.ts +12 -0
  328. package/lib/utils/framework.d.ts.map +1 -0
  329. package/lib/utils/index.d.ts +28 -0
  330. package/lib/utils/index.d.ts.map +1 -0
  331. package/lib/utils/map.d.ts +31 -0
  332. package/lib/utils/map.d.ts.map +1 -0
  333. package/lib/utils/math.d.ts +15 -0
  334. package/lib/utils/math.d.ts.map +1 -0
  335. package/lib/utils/misc.d.ts +13 -0
  336. package/lib/utils/misc.d.ts.map +1 -0
  337. package/lib/utils/number.d.ts +2 -0
  338. package/lib/utils/number.d.ts.map +1 -0
  339. package/lib/utils/object.d.ts +21 -0
  340. package/lib/utils/object.d.ts.map +1 -0
  341. package/lib/utils/padding.d.ts +4 -0
  342. package/lib/utils/padding.d.ts.map +1 -0
  343. package/lib/utils/pixi.d.ts +42 -0
  344. package/lib/utils/pixi.d.ts.map +1 -0
  345. package/lib/utils/platform.d.ts +20 -0
  346. package/lib/utils/platform.d.ts.map +1 -0
  347. package/lib/utils/point.d.ts +66 -0
  348. package/lib/utils/point.d.ts.map +1 -0
  349. package/lib/utils/promise/Queue.d.ts +60 -0
  350. package/lib/utils/promise/Queue.d.ts.map +1 -0
  351. package/lib/utils/promise/functions.d.ts +14 -0
  352. package/lib/utils/promise/functions.d.ts.map +1 -0
  353. package/lib/utils/promise/index.d.ts +3 -0
  354. package/lib/utils/promise/index.d.ts.map +1 -0
  355. package/lib/utils/random.d.ts +42 -0
  356. package/lib/utils/random.d.ts.map +1 -0
  357. package/lib/utils/rect.d.ts +26 -0
  358. package/lib/utils/rect.d.ts.map +1 -0
  359. package/lib/utils/set.d.ts +15 -0
  360. package/lib/utils/set.d.ts.map +1 -0
  361. package/lib/utils/string.d.ts +3 -0
  362. package/lib/utils/string.d.ts.map +1 -0
  363. package/lib/utils/text.d.ts +3 -0
  364. package/lib/utils/text.d.ts.map +1 -0
  365. package/lib/utils/typefilters.d.ts +4 -0
  366. package/lib/utils/typefilters.d.ts.map +1 -0
  367. package/lib/utils/types.d.ts +209 -0
  368. package/lib/utils/types.d.ts.map +1 -0
  369. package/lib/utils/vite.d.ts +25 -0
  370. package/lib/utils/vite.d.ts.map +1 -0
  371. package/lib/utils/web.d.ts +3 -0
  372. package/lib/utils/web.d.ts.map +1 -0
  373. package/lib/version.d.ts +3 -0
  374. package/lib/version.d.ts.map +1 -0
  375. package/lib/webgl-check.d.ts +2 -0
  376. package/lib/webgl-check.d.ts.map +1 -0
  377. package/package.json +138 -0
  378. package/src/core/Application.ts +1091 -0
  379. package/src/core/config.ts +168 -0
  380. package/src/core/create.ts +186 -0
  381. package/src/core/globals.ts +299 -0
  382. package/src/core/index.ts +6 -0
  383. package/src/core/interfaces/IApplication.ts +628 -0
  384. package/src/core/interfaces/IApplicationOptions.ts +81 -0
  385. package/src/core/interfaces/ICoreFunctions.ts +86 -0
  386. package/src/core/interfaces/ICoreSignals.ts +77 -0
  387. package/src/core/interfaces/IStorageCapability.test.ts +27 -0
  388. package/src/core/interfaces/IStorageCapability.ts +26 -0
  389. package/src/core/interfaces/index.ts +6 -0
  390. package/src/core/registries.ts +7 -0
  391. package/src/core/types.ts +13 -0
  392. package/src/display/AnimatedSprite.ts +227 -0
  393. package/src/display/Camera.ts +371 -0
  394. package/src/display/Container.ts +240 -0
  395. package/src/display/Entity.ts +50 -0
  396. package/src/display/ParticleContainer.ts +107 -0
  397. package/src/display/Scene.ts +305 -0
  398. package/src/display/SceneTransition.ts +108 -0
  399. package/src/display/SpineAnimation.ts +170 -0
  400. package/src/display/Svg.ts +9 -0
  401. package/src/display/index.ts +11 -0
  402. package/src/env.d.ts +6 -0
  403. package/src/hello.ts +20 -0
  404. package/src/index.ts +17 -0
  405. package/src/mixins/animated.ts +340 -0
  406. package/src/mixins/factory/Factory.ts +24 -0
  407. package/src/mixins/factory/const.ts +363 -0
  408. package/src/mixins/factory/index.ts +7 -0
  409. package/src/mixins/factory/methods.ts +21 -0
  410. package/src/mixins/factory/props.ts +207 -0
  411. package/src/mixins/factory/registry.test.ts +83 -0
  412. package/src/mixins/factory/registry.ts +61 -0
  413. package/src/mixins/factory/schema.ts +153 -0
  414. package/src/mixins/factory/ui-registry.ts +54 -0
  415. package/src/mixins/factory/utils.ts +130 -0
  416. package/src/mixins/focus.ts +124 -0
  417. package/src/mixins/index.ts +5 -0
  418. package/src/mixins/interaction.ts +74 -0
  419. package/src/mixins/signals.ts +49 -0
  420. package/src/plugins/AssetsPlugin.ts +407 -0
  421. package/src/plugins/DataAdapter.ts +259 -0
  422. package/src/plugins/DevToolsPlugin.ts +103 -0
  423. package/src/plugins/FullScreenPlugin.ts +359 -0
  424. package/src/plugins/GSAPPlugin.ts +811 -0
  425. package/src/plugins/KeyboardPlugin.ts +160 -0
  426. package/src/plugins/LayoutPlugin.ts +127 -0
  427. package/src/plugins/LookupPlugin.ts +308 -0
  428. package/src/plugins/Plugin.test.ts +73 -0
  429. package/src/plugins/Plugin.ts +200 -0
  430. package/src/plugins/PopupManagerPlugin.ts +263 -0
  431. package/src/plugins/ResizerPlugin.ts +220 -0
  432. package/src/plugins/SceneManagerPlugin.ts +669 -0
  433. package/src/plugins/StatsPlugin.ts +24 -0
  434. package/src/plugins/TimerPlugin.ts +841 -0
  435. package/src/plugins/WebEventsPlugin.ts +132 -0
  436. package/src/plugins/actions/ActionsPlugin.ts +113 -0
  437. package/src/plugins/actions/constants.ts +45 -0
  438. package/src/plugins/actions/index.ts +4 -0
  439. package/src/plugins/actions/methods.ts +28 -0
  440. package/src/plugins/actions/types.ts +47 -0
  441. package/src/plugins/audio/AudioChannel.test.ts +101 -0
  442. package/src/plugins/audio/AudioChannel.ts +164 -0
  443. package/src/plugins/audio/AudioInstance.ts +228 -0
  444. package/src/plugins/audio/AudioManagerPlugin.ts +903 -0
  445. package/src/plugins/audio/VoiceOverPlugin.ts +354 -0
  446. package/src/plugins/audio/index.ts +3 -0
  447. package/src/plugins/breakpoints/BreakpointPlugin.test.ts +228 -0
  448. package/src/plugins/breakpoints/BreakpointPlugin.ts +293 -0
  449. package/src/plugins/breakpoints/evaluate.test.ts +239 -0
  450. package/src/plugins/breakpoints/evaluate.ts +201 -0
  451. package/src/plugins/breakpoints/index.ts +3 -0
  452. package/src/plugins/breakpoints/methods.ts +22 -0
  453. package/src/plugins/breakpoints/types.ts +86 -0
  454. package/src/plugins/captions/CaptionsPlugin.ts +468 -0
  455. package/src/plugins/captions/CaptionsRenderer.ts +184 -0
  456. package/src/plugins/captions/font/Sans.fnt +116 -0
  457. package/src/plugins/captions/font/Sans.png +0 -0
  458. package/src/plugins/captions/index.ts +2 -0
  459. package/src/plugins/defaults.ts +95 -0
  460. package/src/plugins/focus/FocusManagerPlugin.ts +773 -0
  461. package/src/plugins/focus/FocusOutliner.ts +111 -0
  462. package/src/plugins/focus/index.ts +2 -0
  463. package/src/plugins/i18nPlugin.ts +284 -0
  464. package/src/plugins/index.ts +17 -0
  465. package/src/plugins/input/AbstractControls.ts +15 -0
  466. package/src/plugins/input/Controls.ts +55 -0
  467. package/src/plugins/input/InputPlugin.ts +168 -0
  468. package/src/plugins/input/constants.ts +12 -0
  469. package/src/plugins/input/index.ts +9 -0
  470. package/src/plugins/input/interfaces.ts +37 -0
  471. package/src/plugins/input/keyboard/KeyboardContols.ts +182 -0
  472. package/src/plugins/input/keyboard/index.ts +2 -0
  473. package/src/plugins/input/keyboard/interfaces.ts +21 -0
  474. package/src/plugins/input/methods.ts +9 -0
  475. package/src/plugins/input/touch/TouchControls.ts +237 -0
  476. package/src/plugins/input/touch/constants.ts +34 -0
  477. package/src/plugins/input/touch/index.ts +3 -0
  478. package/src/plugins/input/touch/interfaces.ts +15 -0
  479. package/src/plugins/input/types.ts +41 -0
  480. package/src/plugins/input/utils.ts +10 -0
  481. package/src/plugins/spine/SpinePlugin.ts +14 -0
  482. package/src/plugins/spine/pixi-spine/BatchableSpineSlot.ts +138 -0
  483. package/src/plugins/spine/pixi-spine/Spine.ts +897 -0
  484. package/src/plugins/spine/pixi-spine/SpineDebugRenderer.ts +615 -0
  485. package/src/plugins/spine/pixi-spine/SpinePipe.ts +197 -0
  486. package/src/plugins/spine/pixi-spine/SpineTexture.ts +143 -0
  487. package/src/plugins/spine/pixi-spine/assets/atlasLoader.ts +156 -0
  488. package/src/plugins/spine/pixi-spine/assets/skeletonLoader.ts +80 -0
  489. package/src/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.ts +92 -0
  490. package/src/plugins/spine/pixi-spine/darktint/DarkTintBatcher.ts +186 -0
  491. package/src/plugins/spine/pixi-spine/darktint/DarkTintShader.ts +74 -0
  492. package/src/plugins/spine/pixi-spine/darktint/darkTintBit.ts +77 -0
  493. package/src/plugins/spine/pixi-spine/index.ts +43 -0
  494. package/src/plugins/spine/pixi-spine/require-shim.ts +43 -0
  495. package/src/signals/Signal.test.ts +54 -0
  496. package/src/signals/Signal.ts +68 -0
  497. package/src/signals/index.ts +10 -0
  498. package/src/store/Store.test.ts +146 -0
  499. package/src/store/Store.ts +192 -0
  500. package/src/store/index.ts +1 -0
  501. package/src/types/framework.d.ts +47 -0
  502. package/src/types/gsap.d.ts +26 -0
  503. package/src/ui/Button.ts +454 -0
  504. package/src/ui/FlexContainer.ts +526 -0
  505. package/src/ui/Input.ts +1274 -0
  506. package/src/ui/Joystick.ts +288 -0
  507. package/src/ui/Popup.ts +242 -0
  508. package/src/ui/Toast.ts +399 -0
  509. package/src/ui/Toaster.ts +409 -0
  510. package/src/ui/UICanvas.ts +812 -0
  511. package/src/ui/index.ts +8 -0
  512. package/src/utils/array.ts +24 -0
  513. package/src/utils/bind.ts +79 -0
  514. package/src/utils/canvas.ts +26 -0
  515. package/src/utils/color.ts +126 -0
  516. package/src/utils/console/Logger.ts +86 -0
  517. package/src/utils/console/index.ts +1 -0
  518. package/src/utils/debug.ts +69 -0
  519. package/src/utils/define.ts +120 -0
  520. package/src/utils/env.ts +3 -0
  521. package/src/utils/events.ts +10 -0
  522. package/src/utils/framework.ts +45 -0
  523. package/src/utils/index.ts +27 -0
  524. package/src/utils/map.ts +59 -0
  525. package/src/utils/math.ts +19 -0
  526. package/src/utils/misc.ts +45 -0
  527. package/src/utils/number.ts +3 -0
  528. package/src/utils/object.ts +43 -0
  529. package/src/utils/padding.ts +43 -0
  530. package/src/utils/pixi.ts +116 -0
  531. package/src/utils/platform.ts +33 -0
  532. package/src/utils/point.ts +123 -0
  533. package/src/utils/promise/Queue.ts +125 -0
  534. package/src/utils/promise/functions.ts +16 -0
  535. package/src/utils/promise/index.ts +2 -0
  536. package/src/utils/random.ts +69 -0
  537. package/src/utils/rect.ts +50 -0
  538. package/src/utils/set.ts +32 -0
  539. package/src/utils/string.ts +9 -0
  540. package/src/utils/text.ts +30 -0
  541. package/src/utils/typefilters.ts +29 -0
  542. package/src/utils/types.ts +426 -0
  543. package/src/utils/vite.ts +41 -0
  544. package/src/utils/web.ts +7 -0
  545. package/src/version.ts +3 -0
  546. package/src/webgl-check.ts +12 -0
  547. package/templates/app/default/.eslintrc.json +21 -0
  548. package/templates/app/default/.meta.json +4 -0
  549. package/templates/app/default/.nvmrc +1 -0
  550. package/templates/app/default/.prettierrc.json +7 -0
  551. package/templates/app/default/README.md +8 -0
  552. package/templates/app/default/assets/audio{m}/music/Cheerful Annoyance.ogg +0 -0
  553. package/templates/app/default/assets/audio{m}/music/Drumming Sticks.ogg +0 -0
  554. package/templates/app/default/assets/audio{m}/music/Game Over.ogg +0 -0
  555. package/templates/app/default/assets/audio{m}/music/Mishief Stroll.ogg +0 -0
  556. package/templates/app/default/assets/audio{m}/music/Night at the Beach.ogg +0 -0
  557. package/templates/app/default/assets/audio{m}/sfx/click.ogg +0 -0
  558. package/templates/app/default/assets/audio{m}/sfx/hover.ogg +0 -0
  559. package/templates/app/default/assets/required{m}/caper.png +0 -0
  560. package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Bold{family=Space Grotesk}{wf}.ttf +0 -0
  561. package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Medium{family=Space Grotesk}{wf}.ttf +0 -0
  562. package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Regular{family=Space Grotesk}{wf}.ttf +0 -0
  563. package/templates/app/default/assets/required{m}/fonts{fix}/Syncopate-Bold{family=Syncopate}{wf}.ttf +0 -0
  564. package/templates/app/default/assets/required{m}/ui{tps}/btn/blue.png +0 -0
  565. package/templates/app/default/assets/required{m}/ui{tps}/btn/green.png +0 -0
  566. package/templates/app/default/assets/required{m}/ui{tps}/btn/grey.png +0 -0
  567. package/templates/app/default/assets/required{m}/ui{tps}/btn/orange.png +0 -0
  568. package/templates/app/default/assets/required{m}/ui{tps}/btn/purple.png +0 -0
  569. package/templates/app/default/assets/required{m}/ui{tps}/btn/red.png +0 -0
  570. package/templates/app/default/assets/required{m}/ui{tps}/btn/yellow.png +0 -0
  571. package/templates/app/default/assets/required{m}/ui{tps}/btn_a/down.png +0 -0
  572. package/templates/app/default/assets/required{m}/ui{tps}/btn_a/over.png +0 -0
  573. package/templates/app/default/assets/required{m}/ui{tps}/btn_a/up.png +0 -0
  574. package/templates/app/default/assets/required{m}/ui{tps}/btn_b/down.png +0 -0
  575. package/templates/app/default/assets/required{m}/ui{tps}/btn_b/over.png +0 -0
  576. package/templates/app/default/assets/required{m}/ui{tps}/btn_b/up.png +0 -0
  577. package/templates/app/default/assets/required{m}/ui{tps}/joystick/base.png +0 -0
  578. package/templates/app/default/assets/required{m}/ui{tps}/joystick/handle.png +0 -0
  579. package/templates/app/default/assets/required{m}/wordmark.svg +1 -0
  580. package/templates/app/default/assets/spine{m}/spineboy-pro.png +0 -0
  581. package/templates/app/default/assets/spine{m}/spineboy-pro.skel +0 -0
  582. package/templates/app/default/assets/spine{m}/spineboy-pro{fix}.atlas +94 -0
  583. package/templates/app/default/caper.config.ts +60 -0
  584. package/templates/app/default/index.html +23 -0
  585. package/templates/app/default/package.template.json +17 -0
  586. package/templates/app/default/public/favicon.ico +0 -0
  587. package/templates/app/default/src/__APPLICATION_NAME__.ts +3 -0
  588. package/templates/app/default/src/main.ts +9 -0
  589. package/templates/app/default/src/scenes/Base.ts +39 -0
  590. package/templates/app/default/src/scenes/Game.ts +34 -0
  591. package/templates/app/default/src/scenes/Splash.ts +70 -0
  592. package/templates/app/default/src/scenes/Start.ts +90 -0
  593. package/templates/app/default/src/utils/Constants.ts +3 -0
  594. package/templates/app/default/tsconfig.json +1 -0
  595. package/templates/plugin/package.template.json +33 -0
  596. package/templates/plugin/src/Plugin.template.ts +24 -0
  597. package/templates/plugin/src/index.template.ts +3 -0
  598. package/templates/plugin/tsconfig.template.json +43 -0
  599. package/templates/plugin/vite-env.template.d.ts +16 -0
  600. package/templates/plugin/vite.config.template.ts +19 -0
@@ -0,0 +1,168 @@
1
+ import { IPlugin, PluginListItem } from '../plugins/Plugin';
2
+ import { type AppTypeOverrides, ImportList, Logger } from '../utils';
3
+ import { AppConfig } from './types';
4
+
5
+ type PluginId = AppTypeOverrides['Plugins'];
6
+
7
+ export type PluginConfig = PluginId | [PluginId, { autoLoad?: boolean; options?: any }];
8
+
9
+ /**
10
+ * Resolves the config's plugin list (which may be a mix of IDs and `[id, opts]`
11
+ * tuples) against the discovered plugin registry injected by the Vite runtime
12
+ * plugin. Plugin discovery now includes everything formerly registered as a
13
+ * "storage adapter" — unified into a single list.
14
+ */
15
+ export async function generatePluginList<T extends IPlugin = IPlugin>(plugins: PluginConfig[]): Promise<ImportList<T>> {
16
+ const pluginsList: PluginListItem[] = Caper.get('pluginsList') || [];
17
+
18
+ return plugins
19
+ .map((plugin) => {
20
+ const p = pluginsList.find((p) => p.id === plugin || p.id === plugin[0]);
21
+ if (!p) {
22
+ Logger.warn(`Plugin ${plugin} not found`);
23
+ return null;
24
+ }
25
+ const pluginAsArray = plugin as [string, { autoLoad?: boolean; options?: any }];
26
+ return {
27
+ id: p.id,
28
+ path: p.path,
29
+ module: p.module,
30
+ requires: p.requires ?? [],
31
+ options: pluginAsArray[1]?.options,
32
+ autoLoad: pluginAsArray[1]?.autoLoad === false ? false : true,
33
+ };
34
+ })
35
+ .filter(Boolean) as ImportList<T>;
36
+ }
37
+
38
+ export function defineConfig(config: Partial<AppConfig>) {
39
+ return config;
40
+ }
41
+
42
+ /**
43
+ * Topologically sort the active plugin list by each item's `requires` field
44
+ * so dependencies initialize before dependents. Throws on missing required
45
+ * plugin or on cycle. Used by `Application.registerPlugins()` at bootstrap.
46
+ *
47
+ * Behavior:
48
+ * - If `B.requires = ['A']`, A is initialized before B regardless of the
49
+ * order they appear in `caper.config.ts plugins[]`.
50
+ * - If `B.requires = ['A']` but A is not in the active plugin list, this
51
+ * throws with an error message that names B, names A, and tells the
52
+ * user to add A to `caper.config.ts plugins[]`. We deliberately do NOT
53
+ * auto-register the missing dep — the config file is the single source
54
+ * of truth for what plugins run, and silently inserting transitive
55
+ * deps would make it stop being trustworthy.
56
+ * - If a cycle exists (A→B→A), throws with the cycle path printed.
57
+ *
58
+ * Stable order: items with no dependencies preserve their original
59
+ * relative order from `caper.config.ts`. Only items participating in a
60
+ * `requires` chain get reordered.
61
+ */
62
+ export function sortPluginsByRequires<T extends ImportList<IPlugin>[number]>(items: T[]): T[] {
63
+ if (items.length < 2) return items.slice();
64
+
65
+ const byId = new Map<string, T>();
66
+ for (const it of items) byId.set(it.id, it);
67
+
68
+ // Verify every required id is present in the active set. Collect ALL
69
+ // missing deps before throwing so the user can fix them in one pass
70
+ // rather than play whack-a-mole.
71
+ const missing: Array<{ from: string; required: string }> = [];
72
+ for (const it of items) {
73
+ for (const req of it.requires ?? []) {
74
+ if (!byId.has(req)) missing.push({ from: it.id, required: req });
75
+ }
76
+ }
77
+ if (missing.length > 0) {
78
+ const lines = missing.map(
79
+ (m) => ` - Plugin '${m.from}' requires '${m.required}' which is not registered.`,
80
+ );
81
+ const fix =
82
+ `\nAdd the missing plugin id(s) to plugins[] in caper.config.ts:\n ` +
83
+ [...new Set(missing.map((m) => `'${m.required}'`))].join(', ');
84
+ throw new Error(`Caper bootstrap failed:\n${lines.join('\n')}${fix}`);
85
+ }
86
+
87
+ // Kahn's algorithm with deterministic tie-breaking by original index.
88
+ const indexOf = new Map<string, number>();
89
+ items.forEach((it, i) => indexOf.set(it.id, i));
90
+
91
+ const inDegree = new Map<string, number>();
92
+ const dependents = new Map<string, string[]>(); // id → [ids that require it]
93
+ for (const it of items) {
94
+ inDegree.set(it.id, (it.requires ?? []).length);
95
+ for (const req of it.requires ?? []) {
96
+ if (!dependents.has(req)) dependents.set(req, []);
97
+ dependents.get(req)!.push(it.id);
98
+ }
99
+ }
100
+
101
+ // Ready queue, ordered by original index for stability.
102
+ const ready: string[] = [];
103
+ for (const it of items) {
104
+ if (inDegree.get(it.id) === 0) ready.push(it.id);
105
+ }
106
+ ready.sort((a, b) => indexOf.get(a)! - indexOf.get(b)!);
107
+
108
+ const result: T[] = [];
109
+ while (ready.length > 0) {
110
+ const id = ready.shift()!;
111
+ result.push(byId.get(id)!);
112
+ for (const dep of dependents.get(id) ?? []) {
113
+ inDegree.set(dep, inDegree.get(dep)! - 1);
114
+ if (inDegree.get(dep) === 0) {
115
+ // Insert in original-index order to keep stable.
116
+ const idx = indexOf.get(dep)!;
117
+ let i = 0;
118
+ while (i < ready.length && indexOf.get(ready[i])! < idx) i++;
119
+ ready.splice(i, 0, dep);
120
+ }
121
+ }
122
+ }
123
+
124
+ if (result.length !== items.length) {
125
+ // Cycle: find one and report it.
126
+ const remaining = items.filter((it) => !result.includes(it)).map((it) => it.id);
127
+ const cyclePath = findCyclePath(remaining, byId);
128
+ throw new Error(
129
+ `Caper bootstrap failed: plugin dependency cycle detected: ${cyclePath.join(' → ')}\n` +
130
+ `Plugins involved: ${remaining.join(', ')}`,
131
+ );
132
+ }
133
+
134
+ return result;
135
+ }
136
+
137
+ function findCyclePath<T extends { id: string; requires?: string[] }>(
138
+ remainingIds: string[],
139
+ byId: Map<string, T>,
140
+ ): string[] {
141
+ // DFS from each remaining node until we revisit a node on the current path.
142
+ const onStack = new Set<string>();
143
+ const path: string[] = [];
144
+ const remaining = new Set(remainingIds);
145
+
146
+ function dfs(id: string): string[] | null {
147
+ if (onStack.has(id)) {
148
+ const startIdx = path.indexOf(id);
149
+ return [...path.slice(startIdx), id];
150
+ }
151
+ if (!remaining.has(id)) return null;
152
+ onStack.add(id);
153
+ path.push(id);
154
+ for (const req of byId.get(id)?.requires ?? []) {
155
+ const found = dfs(req);
156
+ if (found) return found;
157
+ }
158
+ path.pop();
159
+ onStack.delete(id);
160
+ return null;
161
+ }
162
+
163
+ for (const id of remainingIds) {
164
+ const found = dfs(id);
165
+ if (found) return found;
166
+ }
167
+ return remainingIds;
168
+ }
@@ -0,0 +1,186 @@
1
+ import { type RegisterSWOptions } from 'vite-plugin-pwa/types';
2
+ import { sayHello } from '../hello';
3
+ import type { PluginListItem } from '../plugins';
4
+ import type { AppTypeOverrides, SceneImportListItem } from '../utils';
5
+ import { triggerViteError } from '../utils/vite';
6
+ import { checkWebGL } from '../webgl-check';
7
+ import { Application } from './Application';
8
+ import { registerCaperApp, signalCaperReady, type ICaperAutomation } from './globals';
9
+ import type { IApplication } from './interfaces';
10
+ import { AppConfig } from './types';
11
+
12
+ type App = AppTypeOverrides['App'];
13
+
14
+ interface CaperPWA {
15
+ readonly info: any;
16
+ register: () => void;
17
+ onRegisteredSW: (swScriptUrl: string) => void;
18
+ offlineReady: () => void;
19
+ onNeedRefresh?: () => void;
20
+ onRegisterError?: (error: any) => void;
21
+ }
22
+ interface CaperGlobal {
23
+ APP_NAME: string;
24
+ APP_VERSION: string | number;
25
+
26
+ readonly sceneList: SceneImportListItem<any>[];
27
+ readonly pluginsList: PluginListItem[];
28
+
29
+ get: (key?: string) => any;
30
+ // pwa
31
+ pwa: CaperPWA;
32
+
33
+ // app discovery + automation
34
+ apps: Map<string, IApplication>;
35
+ app?: IApplication;
36
+ ready(id?: string): Promise<IApplication>;
37
+ automation: Record<string, ICaperAutomation>;
38
+ __runtimeManaged?: boolean;
39
+ }
40
+
41
+ declare global {
42
+ const Caper: CaperGlobal;
43
+ const registerSW: (options: RegisterSWOptions) => void;
44
+ interface Window {
45
+ Caper: CaperGlobal;
46
+ }
47
+ }
48
+
49
+ export const DEFAULT_GAME_CONTAINER_ID = 'caper-game-container';
50
+
51
+ export function createContainer(id: string) {
52
+ const container = document.createElement('div');
53
+ container.setAttribute('id', id);
54
+ document.body.appendChild(container);
55
+ return container;
56
+ }
57
+
58
+ export async function documentReady() {
59
+ return new Promise((resolve) => {
60
+ if (document.readyState === 'complete' || document.readyState === 'interactive') {
61
+ resolve(true);
62
+ } else {
63
+ document.addEventListener('DOMContentLoaded', () => {
64
+ resolve(true);
65
+ });
66
+ }
67
+ });
68
+ }
69
+
70
+ function addErrorHandler() {
71
+ // This guard ensures these listeners only run during development
72
+ if (import.meta.env.DEV) {
73
+ /**
74
+ * Listen for standard runtime errors that are not caught.
75
+ */
76
+ window.addEventListener('error', (event) => {
77
+ // Prevent the default browser console error log
78
+ event.preventDefault();
79
+
80
+ triggerViteError({
81
+ message: event.message,
82
+ // The error object might contain a more detailed stack trace
83
+ stack: event.error?.stack,
84
+ id: event.filename,
85
+ line: event.lineno,
86
+ column: event.colno,
87
+ });
88
+ });
89
+
90
+ /**
91
+ * Listen for unhandled promise rejections (e.g., from async functions).
92
+ */
93
+ window.addEventListener('unhandledrejection', (event) => {
94
+ // Prevent the default browser console error log
95
+ event.preventDefault();
96
+
97
+ const error = event.reason;
98
+
99
+ // The 'reason' can be any value, so we handle Error objects specifically
100
+ if (error instanceof Error) {
101
+ triggerViteError({
102
+ message: error.message,
103
+ stack: error.stack,
104
+ // Note: stack parsing would be needed to get file/line for promise rejections
105
+ });
106
+ } else {
107
+ // Handle cases where a non-error value is rejected
108
+ triggerViteError({
109
+ message: `Unhandled promise rejection: ${String(event.reason)}`,
110
+ });
111
+ }
112
+ });
113
+ }
114
+ }
115
+
116
+ export async function create(
117
+ config: Partial<AppConfig> = { id: 'CaperApplication' },
118
+ domElement: string | Window | HTMLElement = DEFAULT_GAME_CONTAINER_ID,
119
+ speak: boolean = true,
120
+ ): Promise<App> {
121
+ await documentReady();
122
+ checkWebGL();
123
+ if (speak) {
124
+ sayHello();
125
+ }
126
+ addErrorHandler();
127
+ let el: HTMLElement | null = null;
128
+ if (typeof domElement === 'string') {
129
+ el = document.getElementById(domElement);
130
+ if (!el) {
131
+ el = createContainer(domElement);
132
+ }
133
+ } else if (domElement instanceof HTMLElement) {
134
+ el = domElement;
135
+ } else if (domElement === window) {
136
+ el = document.body;
137
+ }
138
+ if (!el) {
139
+ // no element to use
140
+ throw new Error(
141
+ 'You passed in a DOM Element, but none was found. If you instead pass in a string, a container will be created for you, using the string for its id.',
142
+ );
143
+ }
144
+ if (config.resizeToContainer) {
145
+ config.resizeTo = el;
146
+ }
147
+
148
+ if (config.useLayout) {
149
+ config.layout = {
150
+ // @ts-expect-error some config stuff isn't typed right in @pixi/layout
151
+ autoUpdate: false,
152
+ enableDebug: false,
153
+ debugModificationCount: 0,
154
+ throttle: 100,
155
+ };
156
+ }
157
+
158
+ config.container = el;
159
+ const ApplicationClass = config.application || Application;
160
+ const instance = new ApplicationClass();
161
+ await instance.initialize(config, el);
162
+
163
+ if (config.useLayout) {
164
+ instance.stage.layout = {
165
+ position: 'absolute',
166
+ width: '100%',
167
+ height: '100%',
168
+ };
169
+ }
170
+
171
+ // ensure all plugins are initialized
172
+ // run framework post-init: the plugin loop + core wiring, then the user hook
173
+ await instance._postInitialize();
174
+
175
+ // register with the global Caper discovery/automation surface
176
+ registerCaperApp(instance as unknown as IApplication);
177
+ // when not driven by the vite runtime (which signals readiness itself after
178
+ // main.ts), signal readiness here so direct create() usage still resolves
179
+ // Caper.ready()
180
+ if (!(globalThis as any).Caper?.__runtimeManaged) {
181
+ signalCaperReady(instance as unknown as IApplication);
182
+ }
183
+
184
+ // return the app instance
185
+ return instance as App;
186
+ }
@@ -0,0 +1,299 @@
1
+ import type { IActionsPlugin } from '../plugins/actions';
2
+ import type { Application } from './Application';
3
+ import type { IApplication } from './interfaces';
4
+
5
+ /**
6
+ * A single entry in an app's automation log ring buffer.
7
+ */
8
+ export interface AutomationLogEntry {
9
+ t: number;
10
+ kind: 'action' | 'state' | 'context';
11
+ name?: string;
12
+ data?: unknown;
13
+ }
14
+
15
+ /**
16
+ * The automation facade exposed on `window.Caper.automation[appId]` for
17
+ * Playwright / agent drivers. Only present when automation is enabled (see the
18
+ * gating rules in {@link registerCaperApp}).
19
+ */
20
+ export interface ICaperAutomation {
21
+ readonly appId: string;
22
+ readonly log: readonly AutomationLogEntry[];
23
+ action(name: string, data?: unknown): void;
24
+ getContext(): string;
25
+ getState(): unknown;
26
+ registerStateGetter(fn: () => unknown): void;
27
+ notifyStateChanged(state: unknown): void;
28
+ waitFor(predicate: (state: unknown) => boolean, opts?: { timeoutMs?: number }): Promise<unknown>;
29
+ }
30
+
31
+ const LOG_CAP = 200;
32
+ const FALLBACK_APP_ID = 'CaperApplication';
33
+
34
+ interface CaperReadyResolver {
35
+ resolve: (app: IApplication) => void;
36
+ promise: Promise<IApplication>;
37
+ }
38
+
39
+ interface CaperGlobalInternal {
40
+ apps: Map<string, IApplication>;
41
+ app?: IApplication;
42
+ automation: Record<string, ICaperAutomation>;
43
+ ready: (id?: string) => Promise<IApplication>;
44
+ __runtimeManaged?: boolean;
45
+ /** set by the caper-runtime virtual module from the app's import.meta.env.DEV */
46
+ __dev?: boolean;
47
+ /** internal: keyed ready resolvers */
48
+ __readyResolvers?: Map<string, CaperReadyResolver>;
49
+ /** internal: ids of apps that have fully finished booting (signalCaperReady) */
50
+ __readyApps?: Set<string>;
51
+ [key: string]: unknown;
52
+ }
53
+
54
+ /**
55
+ * Guarded dev-env check. The caper-runtime virtual module sets `Caper.__dev`
56
+ * from the consumer app's `import.meta.env.DEV` (the reliable signal — inside
57
+ * this pre-built lib, import.meta.env has been compiled away at build time).
58
+ * The direct import.meta check remains as a fallback for source-linked
59
+ * consumers. Access to browser/env globals must stay inside a function (never
60
+ * at module top level) so the built entry can be evaluated in plain Node
61
+ * during SSR config loading.
62
+ */
63
+ function isDevEnv(): boolean {
64
+ try {
65
+ if ((globalThis as any).Caper?.__dev === true) {
66
+ return true;
67
+ }
68
+ return typeof import.meta !== 'undefined' && (import.meta as any).env?.DEV === true;
69
+ } catch {
70
+ return false;
71
+ }
72
+ }
73
+
74
+ function automationEnvFlag(): boolean {
75
+ try {
76
+ return typeof import.meta !== 'undefined' && (import.meta as any).env?.VITE_CAPER_AUTOMATION === 'true';
77
+ } catch {
78
+ return false;
79
+ }
80
+ }
81
+
82
+ const FIRST_APP_KEY = '__first__';
83
+
84
+ /**
85
+ * Lazily create/return the `globalThis.Caper` object with the automation +
86
+ * discovery surface installed. No browser globals are touched at module load
87
+ * time — everything happens inside this function.
88
+ */
89
+ function ensureCaperGlobal(): CaperGlobalInternal {
90
+ const g = globalThis as any;
91
+ const caper: CaperGlobalInternal = (g.Caper ||= {} as CaperGlobalInternal);
92
+
93
+ if (!(caper.apps instanceof Map)) {
94
+ caper.apps = new Map<string, IApplication>();
95
+ }
96
+ if (typeof caper.automation !== 'object' || caper.automation === null) {
97
+ caper.automation = {};
98
+ }
99
+ if (!(caper.__readyResolvers instanceof Map)) {
100
+ caper.__readyResolvers = new Map<string, CaperReadyResolver>();
101
+ }
102
+ if (!(caper.__readyApps instanceof Set)) {
103
+ caper.__readyApps = new Set<string>();
104
+ }
105
+
106
+ if (typeof caper.ready !== 'function') {
107
+ caper.ready = (id?: string): Promise<IApplication> => {
108
+ const resolvers = caper.__readyResolvers as Map<string, CaperReadyResolver>;
109
+ const readyApps = caper.__readyApps as Set<string>;
110
+ // Only resolve immediately for apps that have FINISHED booting
111
+ // (signalCaperReady) — registration alone happens earlier, in create(),
112
+ // before main.ts has run.
113
+ if (id && readyApps.has(id)) {
114
+ return Promise.resolve(caper.apps.get(id)!);
115
+ }
116
+ // No id: resolve with the first fully-booted app if one exists.
117
+ if (!id && readyApps.size > 0) {
118
+ const firstReadyId = readyApps.values().next().value as string;
119
+ return Promise.resolve(caper.apps.get(firstReadyId)!);
120
+ }
121
+ const key = id ?? FIRST_APP_KEY;
122
+ let entry = resolvers.get(key);
123
+ if (!entry) {
124
+ let resolve!: (app: IApplication) => void;
125
+ const promise = new Promise<IApplication>((res) => {
126
+ resolve = res;
127
+ });
128
+ entry = { resolve, promise };
129
+ resolvers.set(key, entry);
130
+ }
131
+ return entry.promise;
132
+ };
133
+ }
134
+
135
+ return caper;
136
+ }
137
+
138
+ /**
139
+ * Install the `Caper` discovery surface (`apps`, `automation`, `ready()`) on
140
+ * `globalThis` immediately. The caper-runtime virtual module calls this before
141
+ * bootstrap so automation drivers (Playwright etc.) can `await Caper.ready()`
142
+ * from the very first moment the page scripts run, instead of polling for the
143
+ * function to appear at the end of boot.
144
+ */
145
+ export function installCaperGlobal(): void {
146
+ ensureCaperGlobal();
147
+ }
148
+
149
+ function appIdOf(app: IApplication): string {
150
+ return (app.config?.id as string) || FALLBACK_APP_ID;
151
+ }
152
+
153
+ function buildAutomation(app: IApplication): ICaperAutomation {
154
+ const appId = appIdOf(app);
155
+ const log: AutomationLogEntry[] = [];
156
+ let stateGetter: (() => unknown) | undefined;
157
+ const pending: Array<{ predicate: (state: unknown) => boolean; resolve: (v: unknown) => void }> = [];
158
+
159
+ const push = (entry: AutomationLogEntry) => {
160
+ log.push(entry);
161
+ if (log.length > LOG_CAP) {
162
+ log.splice(0, log.length - LOG_CAP);
163
+ }
164
+ };
165
+
166
+ const getState = (): unknown => (stateGetter ? stateGetter() : undefined);
167
+
168
+ const checkPending = (state: unknown) => {
169
+ if (pending.length === 0) {
170
+ return;
171
+ }
172
+ for (let i = pending.length - 1; i >= 0; i--) {
173
+ let matched = false;
174
+ try {
175
+ matched = pending[i].predicate(state);
176
+ } catch {
177
+ matched = false;
178
+ }
179
+ if (matched) {
180
+ const [entry] = pending.splice(i, 1);
181
+ entry.resolve(state);
182
+ }
183
+ }
184
+ };
185
+
186
+ const facade: ICaperAutomation = {
187
+ appId,
188
+ get log() {
189
+ return log as readonly AutomationLogEntry[];
190
+ },
191
+ action(name: string, data?: unknown) {
192
+ app.sendAction(name as any, data);
193
+ },
194
+ getContext() {
195
+ return String(app.actionContext);
196
+ },
197
+ getState,
198
+ registerStateGetter(fn: () => unknown) {
199
+ stateGetter = fn;
200
+ },
201
+ notifyStateChanged(state: unknown) {
202
+ push({ t: Date.now(), kind: 'state', data: state });
203
+ checkPending(state);
204
+ },
205
+ waitFor(predicate: (state: unknown) => boolean, opts?: { timeoutMs?: number }) {
206
+ // Check immediately against current state.
207
+ const current = getState();
208
+ try {
209
+ if (predicate(current)) {
210
+ return Promise.resolve(current);
211
+ }
212
+ } catch {
213
+ // ignore predicate errors on the immediate check
214
+ }
215
+ return new Promise<unknown>((resolve, reject) => {
216
+ let timer: ReturnType<typeof setTimeout> | undefined;
217
+ const entry = {
218
+ predicate,
219
+ resolve: (v: unknown) => {
220
+ if (timer) {
221
+ clearTimeout(timer);
222
+ }
223
+ resolve(v);
224
+ },
225
+ };
226
+ pending.push(entry);
227
+ if (opts?.timeoutMs != null) {
228
+ timer = setTimeout(() => {
229
+ const idx = pending.indexOf(entry);
230
+ if (idx >= 0) {
231
+ pending.splice(idx, 1);
232
+ }
233
+ reject(new Error(`waitFor timed out after ${opts.timeoutMs}ms`));
234
+ }, opts.timeoutMs);
235
+ }
236
+ });
237
+ },
238
+ };
239
+
240
+ // Subscribe to action dispatches + context changes for the log, and re-check
241
+ // pending waitFor predicates after each dispatched action.
242
+ const actions = app.getPlugin<IActionsPlugin>('actions');
243
+ if (actions) {
244
+ actions.onActionDispatched?.connect((detail) => {
245
+ push({ t: Date.now(), kind: 'action', name: String(detail.id), data: detail.data });
246
+ checkPending(getState());
247
+ });
248
+ actions.onActionContextChanged.connect((context) => {
249
+ push({ t: Date.now(), kind: 'context', name: String(context) });
250
+ });
251
+ }
252
+
253
+ return facade;
254
+ }
255
+
256
+ /**
257
+ * Register an app with the global `Caper` discovery surface. Adds it to
258
+ * `Caper.apps` under its config id, sets `Caper.app` to the most-recently
259
+ * created app, and — when automation is enabled — builds the automation facade
260
+ * and stores it at `Caper.automation[id]` (and on the app instance).
261
+ *
262
+ * Automation is enabled when any of: dev env, `config.automation === true`, or
263
+ * `VITE_CAPER_AUTOMATION === 'true'`.
264
+ */
265
+ export function registerCaperApp(app: IApplication): void {
266
+ const caper = ensureCaperGlobal();
267
+ const id = appIdOf(app);
268
+ caper.apps.set(id, app);
269
+ caper.app = app;
270
+
271
+ const automationEnabled = isDevEnv() || app.config?.automation === true || automationEnvFlag();
272
+ if (automationEnabled) {
273
+ const facade = buildAutomation(app);
274
+ caper.automation[id] = facade;
275
+ (app as Application).automation = facade;
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Resolve any pending `Caper.ready()` promises for this app — both the
281
+ * id-keyed resolver and the first-app resolver.
282
+ */
283
+ export function signalCaperReady(app: IApplication): void {
284
+ const caper = ensureCaperGlobal();
285
+ const id = appIdOf(app);
286
+ (caper.__readyApps as Set<string>).add(id);
287
+ const resolvers = caper.__readyResolvers as Map<string, CaperReadyResolver>;
288
+
289
+ const idEntry = resolvers.get(id);
290
+ if (idEntry) {
291
+ idEntry.resolve(app);
292
+ resolvers.delete(id);
293
+ }
294
+ const firstEntry = resolvers.get(FIRST_APP_KEY);
295
+ if (firstEntry) {
296
+ firstEntry.resolve(app);
297
+ resolvers.delete(FIRST_APP_KEY);
298
+ }
299
+ }
@@ -0,0 +1,6 @@
1
+ export * from './config';
2
+ export { create, createContainer } from './create';
3
+ export * from './globals';
4
+ export * from './interfaces';
5
+ export * from './registries';
6
+ export * from './types';