@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
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) Relish Interactive
4
+ Copyright (c) 2026 Anthony Sapp
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # @caperjs/core
2
+
3
+ > An opinionated HTML game framework built on [PixiJS v8](https://pixijs.com).
4
+
5
+ `@caperjs/core` is the framework package of [Caper](https://github.com/anthonysapp/caper), a personal fork of [dill-pixel](https://github.com/relishinc/dill-pixel) by Relish Studios that narrows scope, modernizes the dependency stack, and ships fewer half-finished things.
6
+
7
+ It sits on top of PixiJS — a renderer, not a game engine — and adds the parts you'd otherwise rebuild for every project: scenes, plugins, asset pipeline, build config, type-safe IDs, signals, and a project layout that scales from a 48-hour jam to something you ship.
8
+
9
+ ## Status
10
+
11
+ This package is **not yet published to npm**. The recommended way to use it is to clone the [Caper monorepo](https://github.com/anthonysapp/caper), run the kitchen-sink, and either fork it as a starter or vendor `packages/core` into your own project. First publish lands in Phase 7.
12
+
13
+ ## Highlights
14
+
15
+ - **Pixi v8 native**, pinned to the latest 8.x
16
+ - **Auto-discovered scenes / plugins / popups / entities** via the bundled Vite plugin — drop a file in the right directory, the build picks it up
17
+ - **Type-safe IDs** for scenes, plugins, popups, entities, locale keys (string-literal unions on every API that takes one)
18
+ - **Per-bundle asset types** generated from your AssetPack manifest
19
+ - **Plugin `requires: [...]`** declarations + topological sort at bootstrap
20
+ - **Build-time validation** for asset bundles, plugin IDs, dependency cycles, duplicate IDs
21
+ - **Exported Vite + AssetPack config** (`@caperjs/core/config/vite`, `@caperjs/core/config/assetpack`)
22
+ - **`caper add` CLI** for scaffolding scenes, plugins, entities, popups
23
+ - **Signals** via `typed-signals`
24
+ - **Tested** — Vitest covers `Plugin`, `Store`, `Scene`, `SignalRegistry`
25
+
26
+ ## Minimal example
27
+
28
+ ```ts
29
+ // src/scenes/MenuScene.ts
30
+ import { defineScene, Scene } from '@caperjs/core';
31
+
32
+ export const scene = defineScene({
33
+ id: 'menu',
34
+ assets: { preload: { bundles: ['ui'] } },
35
+ });
36
+
37
+ export default class MenuScene extends Scene {
38
+ initialize() {
39
+ this.add.text({
40
+ text: 'Caper',
41
+ anchor: 0.5,
42
+ style: { fontFamily: 'system-ui', fontSize: 64, fill: 0xffffff },
43
+ });
44
+ }
45
+ }
46
+ ```
47
+
48
+ The Vite plugin discovers this file on next reload. The id `'menu'` flows into the generated `AppScenes` union, so `app.scenes.load('menu')` is fully typed.
49
+
50
+ ## Documentation
51
+
52
+ There's no docs site yet — the upstream `apps/docs/` was deleted in Phase 6 because it almost entirely described pre-fork state. A new docs surface will land when there's enough audience to justify it. Until then, the [`plan/`](https://github.com/anthonysapp/caper/tree/main/plan) directory + JSDoc on `Scene` and `IPlugin` are the documentation:
53
+
54
+ - `plan/fork-plan.md` — long-form architectural rationale
55
+ - `plan/tasks.md` — execution log of what's shipped and why
56
+ - `CLAUDE.md` — repo conventions and common commands
57
+
58
+ The kitchen-sink ([`apps/kitchen-sink/`](https://github.com/anthonysapp/caper/tree/main/apps/kitchen-sink)) is the canonical reference implementation — every plugin, every UI primitive, scenes, popups, entities, signals, storage all exercised end-to-end.
59
+
60
+ ## License
61
+
62
+ MIT. Original dill-pixel framework architecture credit to Relish Studios.
package/cli/add.mjs ADDED
@@ -0,0 +1,197 @@
1
+ import { bold, cyan, green, red, yellow } from 'kleur/colors';
2
+
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+
6
+ /**
7
+ * `caper add <kind> <Name>` — scaffolds a single file under `src/<kind>s/`
8
+ * for a scene, plugin, entity, or popup, using the project's discovery
9
+ * conventions (default-exported class, optional `defineX({...})` wrapper
10
+ * with an `id`). The file is intentionally minimal — just enough that the
11
+ * Vite plugin's discovery picks it up immediately on next dev reload.
12
+ */
13
+
14
+ const KINDS = ['scene', 'plugin', 'entity', 'popup'];
15
+
16
+ // Convert a user-supplied name into a PascalCase class name and a
17
+ // kebab-case id, regardless of input casing. "my cool scene" → MyCoolScene
18
+ // + my-cool-scene; "MyCoolScene" → MyCoolScene + my-cool-scene.
19
+ function normalizeName(raw) {
20
+ const cleaned = raw
21
+ .replace(/[^a-zA-Z0-9]+/g, ' ')
22
+ .trim()
23
+ .split(/\s+/);
24
+ if (cleaned.length === 0 || !cleaned[0]) {
25
+ throw new Error(`Invalid name: ${JSON.stringify(raw)}`);
26
+ }
27
+ const className = cleaned
28
+ .map((word) => {
29
+ // Split on lowercase→uppercase boundary so "MyCoolScene" stays MyCoolScene
30
+ // rather than getting collapsed.
31
+ return word
32
+ .split(/(?=[A-Z])/)
33
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
34
+ .join('');
35
+ })
36
+ .join('');
37
+ const id = className
38
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
39
+ .toLowerCase();
40
+ return { className, id };
41
+ }
42
+
43
+ const TEMPLATES = {
44
+ scene: ({ className, id }) => `import { defineScene, Scene } from '@caperjs/core';
45
+
46
+ export const scene = defineScene({
47
+ id: '${id}',
48
+ active: true,
49
+ // assets: { preload: { bundles: ['default'] } },
50
+ });
51
+
52
+ export default class ${className} extends Scene {
53
+ initialize() {
54
+ // build the scene's display tree here
55
+ }
56
+
57
+ start() {
58
+ // start jobs / timelines here
59
+ }
60
+
61
+ resize() {
62
+ // re-layout on viewport changes
63
+ }
64
+
65
+ update() {
66
+ // per-frame loop
67
+ }
68
+
69
+ destroy() {
70
+ super.destroy();
71
+ // clean up listeners / timers
72
+ }
73
+ }
74
+ `,
75
+
76
+ plugin: ({ className, id }) => `import { definePlugin, IApplication, Logger, Plugin } from '@caperjs/core';
77
+
78
+ export const plugin = definePlugin({
79
+ id: '${id}',
80
+ // requires: ['firebase'], // other plugin IDs that must initialize before this one
81
+ });
82
+
83
+ export type ${className}PluginOptions = {
84
+ // TODO: add plugin options here
85
+ };
86
+
87
+ const defaultOptions: ${className}PluginOptions = {};
88
+
89
+ export default class ${className}Plugin extends Plugin<${className}PluginOptions> {
90
+ public readonly id = '${id}';
91
+
92
+ protected _options: ${className}PluginOptions = defaultOptions;
93
+
94
+ async initialize(options: Partial<${className}PluginOptions> = {}, _app: IApplication): Promise<void> {
95
+ this._options = { ...defaultOptions, ...options };
96
+ Logger.log('${className} plugin initialized');
97
+ }
98
+ }
99
+ `,
100
+
101
+ entity: ({ className, id }) => `import { Container, defineEntity } from '@caperjs/core';
102
+
103
+ export const entity = defineEntity({
104
+ id: '${id}',
105
+ });
106
+
107
+ export default class ${className} extends Container {
108
+ constructor() {
109
+ super();
110
+ this.init();
111
+ }
112
+
113
+ init() {
114
+ // build the entity's display tree here
115
+ }
116
+ }
117
+ `,
118
+
119
+ popup: ({ className, id }) => `import { Container, definePopup, IPopup, Popup } from '@caperjs/core';
120
+
121
+ export const popup = definePopup({
122
+ id: '${id}',
123
+ });
124
+
125
+ export default class ${className}Popup extends Popup implements IPopup {
126
+ window: Container;
127
+
128
+ initialize() {
129
+ this.window = this.view.add.container();
130
+ // build the popup contents on this.window
131
+ }
132
+
133
+ async show() {
134
+ // entry animation
135
+ }
136
+
137
+ async hide() {
138
+ // exit animation
139
+ }
140
+ }
141
+ `,
142
+ };
143
+
144
+ const DIRS = {
145
+ scene: 'src/scenes',
146
+ plugin: 'src/plugins',
147
+ entity: 'src/entities',
148
+ popup: 'src/popups',
149
+ };
150
+
151
+ const SUFFIXES = {
152
+ scene: '',
153
+ plugin: 'Plugin',
154
+ entity: '',
155
+ popup: 'Popup',
156
+ };
157
+
158
+ export async function add(args) {
159
+ const [kind, rawName, ...rest] = args;
160
+
161
+ if (!kind || !KINDS.includes(kind)) {
162
+ console.error(red(`caper add: missing or unknown kind. Expected one of: ${KINDS.join(', ')}`));
163
+ console.error(`Usage: caper add <${KINDS.join('|')}> <Name> [--dir path]`);
164
+ process.exit(1);
165
+ }
166
+ if (!rawName) {
167
+ console.error(red(`caper add ${kind}: missing name. Usage: caper add ${kind} <Name>`));
168
+ process.exit(1);
169
+ }
170
+
171
+ // Optional --dir override; defaults to the conventional discovery dir
172
+ let targetDir = DIRS[kind];
173
+ for (let i = 0; i < rest.length; i++) {
174
+ if (rest[i] === '--dir' && rest[i + 1]) {
175
+ targetDir = rest[i + 1];
176
+ i++;
177
+ }
178
+ }
179
+
180
+ const { className, id } = normalizeName(rawName);
181
+ const fileName = `${className}${SUFFIXES[kind]}.ts`;
182
+ const fullDir = path.resolve(process.cwd(), targetDir);
183
+ const fullPath = path.join(fullDir, fileName);
184
+
185
+ if (fs.existsSync(fullPath)) {
186
+ console.error(red(`caper add ${kind}: ${path.relative(process.cwd(), fullPath)} already exists. Aborting.`));
187
+ process.exit(1);
188
+ }
189
+
190
+ fs.mkdirSync(fullDir, { recursive: true });
191
+ fs.writeFileSync(fullPath, TEMPLATES[kind]({ className, id }), 'utf-8');
192
+
193
+ console.log(green(bold(`✓ Created ${kind}`)) + ` ${cyan(path.relative(process.cwd(), fullPath))}`);
194
+ console.log(` ${yellow('id:')} ${id}`);
195
+ console.log(` ${yellow('class:')} ${className}${SUFFIXES[kind]}`);
196
+ console.log(`\n Discovery will pick this up on the next dev-server reload.`);
197
+ }
@@ -0,0 +1,128 @@
1
+ import { parse } from 'csv-parse/sync';
2
+ import { bgGreen, bold, green, white } from 'kleur/colors';
3
+ import { exec } from 'node:child_process';
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { walkDir } from './utils.mjs';
7
+
8
+
9
+ const durations = {};
10
+ const captions = {};
11
+
12
+ async function readDurations(dir) {
13
+ console.log('readDurations', dir);
14
+ const files = [];
15
+ const outputDir = path.join(dir, '');
16
+ if (!fs.existsSync(outputDir)) {
17
+ return Promise.reject(`Output directory not found at "${outputDir}". Please run \`caper audio compress\` first.`);
18
+ }
19
+ walkDir(outputDir, file => {
20
+ if (/\.(wav|mp3)$/i.test(file)) {
21
+ files.push(file);
22
+ }
23
+ });
24
+ await Promise.all(files.map(file => new Promise((resolve, reject) => {
25
+ exec(`ffprobe -v quiet -print_format compact=print_section=0:nokey=1:escape=csv -show_entries format=duration "${file}"`, (e, duration) => {
26
+ duration = parseInt((parseFloat(duration) * 1000).toFixed(0));
27
+ const name = path.basename(file).replace(/\.(wav|mp3)$/, '');
28
+ durations[name] = duration;
29
+ console.log(bold(bgGreen(white('[Get Duration]'))), green(name), white(duration));
30
+ resolve();
31
+ });
32
+ })));
33
+ }
34
+
35
+ async function readCaptions(dir) {
36
+ const captionsDir = path.join(dir, 'captions');
37
+
38
+ if (!fs.existsSync(captionsDir)) {
39
+ return Promise.reject(`Captions directory not found. Please create a captions directory at "${captionsDir}", and add your captions CSV files.`);
40
+ }
41
+
42
+ for (const csvFileName of fs.readdirSync(captionsDir)) {
43
+ if (path.extname(csvFileName) !== '.csv') {
44
+ continue;
45
+ }
46
+ const csvFile = path.join(captionsDir, csvFileName);
47
+ console.log(bold(bgGreen(white('[Read CSV]'))), green(csvFile));
48
+ const csv = parse(fs.readFileSync(csvFile, { encoding: 'utf-8' }), {
49
+ comment: '#',
50
+ });
51
+ const sectionColumn = csv[0].reduce((a, t, i) => t === 'Section' ? i : a, -1);
52
+ const fileColumn = csv[0].reduce((a, t, i) => t === 'FILENAME' || t === 'File Name' ? i : a, -1);
53
+ const textColumn = csv[0].reduce((a, t, i) => t === 'LINE' || t === 'VO Line' ? i : a, -1);
54
+ const startOffsetColumn = csv[0].indexOf('START_OFFSET');
55
+ const endOffsetColumn = csv[0].indexOf('END_OFFSET');
56
+
57
+ function processRow(file, row) {
58
+ const duration = durations[file];
59
+ const text = normalizeText(row[textColumn]);
60
+ if (file && text && duration && !captions[file]) {
61
+ const lines = text.split('--').map(it => normalizeText(it)).filter(it => !!it);
62
+ fixSpecialCases(file, lines);
63
+ if (lines.length > 0) {
64
+ let start = 0;
65
+ const length = lines.reduce((a, t) => a + t.length, 0);
66
+ captions[file] = [];
67
+ for (const line of lines) {
68
+ const end = start + line.length;
69
+ const startOffset = parseInt(row[startOffsetColumn] || 0);
70
+ const endOffset = parseInt(row[endOffsetColumn] || 0);
71
+ captions[file].push({
72
+ content: `<p>${line}</p>`,
73
+ start: Math.round(duration * start / length) + startOffset,
74
+ end: Math.round(duration * end / length) + endOffset,
75
+ });
76
+ start = end;
77
+ }
78
+ } else {
79
+ captions[file] = [{ content: `<p>${text}</p>`, start: 0, end: duration }];
80
+ }
81
+ console.log(bold(bgGreen(white(`[Generate CC]`))), green(file));
82
+ for (const cc of captions[file]) {
83
+ console.log('\t\t', cc.start, cc.end, cc.content);
84
+ }
85
+ }
86
+ }
87
+
88
+ for (let i = 1; i < csv.length; i++) {
89
+ const row = csv[i];
90
+ let file = (row[fileColumn] || '').replace(/\.(wav|mp3)$/, '');
91
+ processRow(file, row);
92
+ }
93
+ }
94
+ }
95
+
96
+ function normalizeText(text) {
97
+ text = text ?? '';
98
+ text = text.replace(/^\s+/, '');
99
+ text = text.replace(/\s+$/, '');
100
+ text = text.replace(/(\s*)–(\s*)/ig, '$1-$2');
101
+ text = text.replace(/’/ig, '\'');
102
+ text = text.replace(/“/ig, '"');
103
+ text = text.replace(/”/ig, '"');
104
+ text = text.replace(/…/ig, '...');
105
+ text = text.replace(/^--/ig, '');
106
+ text = text.replace(/--$/ig, '');
107
+ return text;
108
+ }
109
+
110
+ async function writeCaptions(outputDir) {
111
+ console.log(bold(bgGreen(white('[Writing Captions]'))), green(outputDir));
112
+ if (!fs.existsSync(outputDir)) {
113
+ fs.mkdirSync(outputDir, { recursive: true });
114
+ }
115
+ fs.writeFileSync(`${outputDir}/cc.json`, JSON.stringify(captions, null, 2), { encoding: 'utf-8' });
116
+ }
117
+
118
+ function fixSpecialCases(file, lines) {
119
+ switch (file) {
120
+ case 'anim-03-c':
121
+ lines.pop();
122
+ break;
123
+ }
124
+ }
125
+
126
+ export async function generateCaptions(dir, outputDir = dir) {
127
+ return readDurations(outputDir).then(() => readCaptions(dir)).then(() => writeCaptions(outputDir));
128
+ }
@@ -0,0 +1,42 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import {execPromise, walkDir} from './utils.mjs';
4
+
5
+ const SOURCE_DIR = 'source';
6
+ const OUTPUT_DIR = 'output';
7
+
8
+ /**
9
+ * @param {string} file
10
+ * @returns {Promise<Awaited<unknown>[]>}
11
+ */
12
+ function compressFile(file) {
13
+ if (/\.(wav|m4a|mp3|ogg)$/i.test(file)) {
14
+ let outDir = path.dirname(file).replace(SOURCE_DIR, OUTPUT_DIR);
15
+ let outFile = path.join(outDir, path.basename(file)).replace(/\.\w+$/, '');
16
+
17
+ if (!fs.existsSync(outDir)) {
18
+ fs.mkdirSync(outDir);
19
+ }
20
+
21
+ const p1 = execPromise(`ffmpeg -i "${file}" -y -c:a libvorbis -q:a 1 -ac 1 "${outFile}.webm"`)
22
+ const p2 = execPromise(`ffmpeg -i "${file}" -y -c:a libmp3lame -b:a 128k -ac 1 "${outFile}.mp3"`)
23
+
24
+ return Promise.all([p1, p2]);
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Compresses audio files in a directory.
30
+ * @param dir
31
+ * @returns {Promise<*[]>}
32
+ */
33
+ export async function compress(dir) {
34
+ const sourceDir = path.join(dir, SOURCE_DIR);
35
+ if (!fs.existsSync(sourceDir)) {
36
+ return new Promise((resolve, reject) => {
37
+ reject(`No source directory found at ${sourceDir}`);
38
+ })
39
+ }
40
+ return walkDir(sourceDir, compressFile);
41
+ }
42
+
@@ -0,0 +1,56 @@
1
+ import {exec} from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+
5
+ /**
6
+ * Logs the output of an exec command.
7
+ * @param err
8
+ * @param stdout
9
+ * @param stderr
10
+ */
11
+ export function logExec(err, stdout, stderr) {
12
+ console.log(stdout);
13
+ console.error(err);
14
+ console.error(stderr);
15
+ }
16
+
17
+ /**
18
+ * Executes a command and returns a promise.
19
+ * @param command
20
+ * @returns {Promise<unknown>}
21
+ */
22
+ export function execPromise(command) {
23
+ return new Promise((resolve, reject) => {
24
+ exec(command, (err, stdout, stderr) => {
25
+ logExec(err, stdout, stderr);
26
+ if (err) {
27
+ reject(err);
28
+ }
29
+ resolve();
30
+ });
31
+ })
32
+ }
33
+
34
+
35
+ /**
36
+ * Walks a directory and executes a callback on each file.
37
+ * @param dir
38
+ * @param callback
39
+ * @param promises
40
+ * @returns {*[]}
41
+ */
42
+ export function walkDir(dir, callback, promises = []) {
43
+ const files = fs.readdirSync(dir);
44
+ for (let i = 0; i < files.length; i++) {
45
+ const f = files[i];
46
+ let dirPath = path.join(dir, f);
47
+ let isDirectory = fs.statSync(dirPath).isDirectory();
48
+ if (isDirectory) {
49
+ walkDir(dirPath, callback, promises);
50
+ } else {
51
+ promises.push(callback(path.join(dir, f)));
52
+ }
53
+ }
54
+ return promises;
55
+ }
56
+
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import {exec} from 'node:child_process';
3
+
4
+ function create() {
5
+ exec(`caper create`);
6
+ }
7
+
8
+ create();