@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.
- package/LICENSE +22 -0
- package/README.md +62 -0
- package/cli/add.mjs +197 -0
- package/cli/audio/cc.mjs +128 -0
- package/cli/audio/index.mjs +42 -0
- package/cli/audio/utils.mjs +56 -0
- package/cli/create-caper.mjs +8 -0
- package/cli/create.mjs +351 -0
- package/cli/install-peerdeps.mjs +57 -0
- package/cli/update.mjs +9 -0
- package/cli/utils.mjs +81 -0
- package/cli/vite.mjs +55 -0
- package/cli/voiceover/generateVoiceoverCSV.mjs +158 -0
- package/cli/voiceover/index.mjs +1 -0
- package/cli.mjs +157 -0
- package/client.d.ts +7 -0
- package/config/assetpack.mjs +212 -0
- package/config/tsconfig.base.json +28 -0
- package/config/vite.mjs +2464 -0
- package/extras/css/accessibility.css +9 -0
- package/extras/css/fullscreen.css +28 -0
- package/extras/css/loader.css +67 -0
- package/extras/llms.txt +1602 -0
- package/lib/CaptionsPlugin-Dc8fIrjy.js +277 -0
- package/lib/CaptionsPlugin-Dc8fIrjy.js.map +1 -0
- package/lib/DataAdapter-BY2114sp.js +84 -0
- package/lib/DataAdapter-BY2114sp.js.map +1 -0
- package/lib/DebugRenderer-BJMLILqI.js +1385 -0
- package/lib/DebugRenderer-BJMLILqI.js.map +1 -0
- package/lib/DevToolsPlugin-wQ5rOkn0.js +31 -0
- package/lib/DevToolsPlugin-wQ5rOkn0.js.map +1 -0
- package/lib/GSAPPlugin-DHhSZKv8.js +350 -0
- package/lib/GSAPPlugin-DHhSZKv8.js.map +1 -0
- package/lib/LayoutPlugin-B-DF9SYM.js +1271 -0
- package/lib/LayoutPlugin-B-DF9SYM.js.map +1 -0
- package/lib/SpinePlugin-Dz_3dljz.js +6077 -0
- package/lib/SpinePlugin-Dz_3dljz.js.map +1 -0
- package/lib/StatsPlugin-Cg82JMBD.js +70 -0
- package/lib/StatsPlugin-Cg82JMBD.js.map +1 -0
- package/lib/VoiceOverPlugin-BR3ImT8C.js +114 -0
- package/lib/VoiceOverPlugin-BR3ImT8C.js.map +1 -0
- package/lib/caper.mjs +1233 -0
- package/lib/caper.mjs.map +1 -0
- package/lib/core/Application.d.ts +268 -0
- package/lib/core/Application.d.ts.map +1 -0
- package/lib/core/config.d.ts +39 -0
- package/lib/core/config.d.ts.map +1 -0
- package/lib/core/create.d.ts +41 -0
- package/lib/core/create.d.ts.map +1 -0
- package/lib/core/globals.d.ts +51 -0
- package/lib/core/globals.d.ts.map +1 -0
- package/lib/core/index.d.ts +7 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/interfaces/IApplication.d.ts +566 -0
- package/lib/core/interfaces/IApplication.d.ts.map +1 -0
- package/lib/core/interfaces/IApplicationOptions.d.ts +65 -0
- package/lib/core/interfaces/IApplicationOptions.d.ts.map +1 -0
- package/lib/core/interfaces/ICoreFunctions.d.ts +49 -0
- package/lib/core/interfaces/ICoreFunctions.d.ts.map +1 -0
- package/lib/core/interfaces/ICoreSignals.d.ts +57 -0
- package/lib/core/interfaces/ICoreSignals.d.ts.map +1 -0
- package/lib/core/interfaces/IStorageCapability.d.ts +20 -0
- package/lib/core/interfaces/IStorageCapability.d.ts.map +1 -0
- package/lib/core/interfaces/IStorageCapability.test.d.ts +2 -0
- package/lib/core/interfaces/IStorageCapability.test.d.ts.map +1 -0
- package/lib/core/interfaces/index.d.ts +7 -0
- package/lib/core/interfaces/index.d.ts.map +1 -0
- package/lib/core/registries.d.ts +8 -0
- package/lib/core/registries.d.ts.map +1 -0
- package/lib/core/types.d.ts +12 -0
- package/lib/core/types.d.ts.map +1 -0
- package/lib/display/AnimatedSprite.d.ts +40 -0
- package/lib/display/AnimatedSprite.d.ts.map +1 -0
- package/lib/display/Camera.d.ts +102 -0
- package/lib/display/Camera.d.ts.map +1 -0
- package/lib/display/Container.d.ts +115 -0
- package/lib/display/Container.d.ts.map +1 -0
- package/lib/display/Entity.d.ts +46 -0
- package/lib/display/Entity.d.ts.map +1 -0
- package/lib/display/ParticleContainer.d.ts +58 -0
- package/lib/display/ParticleContainer.d.ts.map +1 -0
- package/lib/display/Scene.d.ts +250 -0
- package/lib/display/Scene.d.ts.map +1 -0
- package/lib/display/SceneTransition.d.ts +41 -0
- package/lib/display/SceneTransition.d.ts.map +1 -0
- package/lib/display/SpineAnimation.d.ts +76 -0
- package/lib/display/SpineAnimation.d.ts.map +1 -0
- package/lib/display/Svg.d.ts +5 -0
- package/lib/display/Svg.d.ts.map +1 -0
- package/lib/display/index.d.ts +10 -0
- package/lib/display/index.d.ts.map +1 -0
- package/lib/env.d.ts +6 -0
- package/lib/hello.d.ts +2 -0
- package/lib/hello.d.ts.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/mixins/animated.d.ts +53 -0
- package/lib/mixins/animated.d.ts.map +1 -0
- package/lib/mixins/factory/Factory.d.ts +8 -0
- package/lib/mixins/factory/Factory.d.ts.map +1 -0
- package/lib/mixins/factory/const.d.ts +67 -0
- package/lib/mixins/factory/const.d.ts.map +1 -0
- package/lib/mixins/factory/index.d.ts +8 -0
- package/lib/mixins/factory/index.d.ts.map +1 -0
- package/lib/mixins/factory/methods.d.ts +3 -0
- package/lib/mixins/factory/methods.d.ts.map +1 -0
- package/lib/mixins/factory/props.d.ts +160 -0
- package/lib/mixins/factory/props.d.ts.map +1 -0
- package/lib/mixins/factory/registry.d.ts +27 -0
- package/lib/mixins/factory/registry.d.ts.map +1 -0
- package/lib/mixins/factory/registry.test.d.ts +2 -0
- package/lib/mixins/factory/registry.test.d.ts.map +1 -0
- package/lib/mixins/factory/schema.d.ts +71 -0
- package/lib/mixins/factory/schema.d.ts.map +1 -0
- package/lib/mixins/factory/ui-registry.d.ts +20 -0
- package/lib/mixins/factory/ui-registry.d.ts.map +1 -0
- package/lib/mixins/factory/utils.d.ts +11 -0
- package/lib/mixins/factory/utils.d.ts.map +1 -0
- package/lib/mixins/focus.d.ts +15 -0
- package/lib/mixins/focus.d.ts.map +1 -0
- package/lib/mixins/index.d.ts +6 -0
- package/lib/mixins/index.d.ts.map +1 -0
- package/lib/mixins/interaction.d.ts +20 -0
- package/lib/mixins/interaction.d.ts.map +1 -0
- package/lib/mixins/signals.d.ts +15 -0
- package/lib/mixins/signals.d.ts.map +1 -0
- package/lib/plugins/AssetsPlugin.d.ts +79 -0
- package/lib/plugins/AssetsPlugin.d.ts.map +1 -0
- package/lib/plugins/DataAdapter.d.ts +95 -0
- package/lib/plugins/DataAdapter.d.ts.map +1 -0
- package/lib/plugins/DevToolsPlugin.d.ts +97 -0
- package/lib/plugins/DevToolsPlugin.d.ts.map +1 -0
- package/lib/plugins/FullScreenPlugin.d.ts +240 -0
- package/lib/plugins/FullScreenPlugin.d.ts.map +1 -0
- package/lib/plugins/GSAPPlugin.d.ts +634 -0
- package/lib/plugins/GSAPPlugin.d.ts.map +1 -0
- package/lib/plugins/KeyboardPlugin.d.ts +53 -0
- package/lib/plugins/KeyboardPlugin.d.ts.map +1 -0
- package/lib/plugins/LayoutPlugin.d.ts +100 -0
- package/lib/plugins/LayoutPlugin.d.ts.map +1 -0
- package/lib/plugins/LookupPlugin.d.ts +223 -0
- package/lib/plugins/LookupPlugin.d.ts.map +1 -0
- package/lib/plugins/Plugin.d.ts +132 -0
- package/lib/plugins/Plugin.d.ts.map +1 -0
- package/lib/plugins/Plugin.test.d.ts +2 -0
- package/lib/plugins/Plugin.test.d.ts.map +1 -0
- package/lib/plugins/PopupManagerPlugin.d.ts +108 -0
- package/lib/plugins/PopupManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/ResizerPlugin.d.ts +62 -0
- package/lib/plugins/ResizerPlugin.d.ts.map +1 -0
- package/lib/plugins/SceneManagerPlugin.d.ts +122 -0
- package/lib/plugins/SceneManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/StatsPlugin.d.ts +8 -0
- package/lib/plugins/StatsPlugin.d.ts.map +1 -0
- package/lib/plugins/TimerPlugin.d.ts +401 -0
- package/lib/plugins/TimerPlugin.d.ts.map +1 -0
- package/lib/plugins/WebEventsPlugin.d.ts +60 -0
- package/lib/plugins/WebEventsPlugin.d.ts.map +1 -0
- package/lib/plugins/actions/ActionsPlugin.d.ts +39 -0
- package/lib/plugins/actions/ActionsPlugin.d.ts.map +1 -0
- package/lib/plugins/actions/constants.d.ts +52 -0
- package/lib/plugins/actions/constants.d.ts.map +1 -0
- package/lib/plugins/actions/index.d.ts +5 -0
- package/lib/plugins/actions/index.d.ts.map +1 -0
- package/lib/plugins/actions/methods.d.ts +11 -0
- package/lib/plugins/actions/methods.d.ts.map +1 -0
- package/lib/plugins/actions/types.d.ts +25 -0
- package/lib/plugins/actions/types.d.ts.map +1 -0
- package/lib/plugins/audio/AudioChannel.d.ts +46 -0
- package/lib/plugins/audio/AudioChannel.d.ts.map +1 -0
- package/lib/plugins/audio/AudioChannel.test.d.ts +2 -0
- package/lib/plugins/audio/AudioChannel.test.d.ts.map +1 -0
- package/lib/plugins/audio/AudioInstance.d.ts +79 -0
- package/lib/plugins/audio/AudioInstance.d.ts.map +1 -0
- package/lib/plugins/audio/AudioManagerPlugin.d.ts +323 -0
- package/lib/plugins/audio/AudioManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/audio/VoiceOverPlugin.d.ts +69 -0
- package/lib/plugins/audio/VoiceOverPlugin.d.ts.map +1 -0
- package/lib/plugins/audio/index.d.ts +4 -0
- package/lib/plugins/audio/index.d.ts.map +1 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.d.ts +109 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.d.ts.map +1 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts +2 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts.map +1 -0
- package/lib/plugins/breakpoints/evaluate.d.ts +53 -0
- package/lib/plugins/breakpoints/evaluate.d.ts.map +1 -0
- package/lib/plugins/breakpoints/evaluate.test.d.ts +2 -0
- package/lib/plugins/breakpoints/evaluate.test.d.ts.map +1 -0
- package/lib/plugins/breakpoints/index.d.ts +4 -0
- package/lib/plugins/breakpoints/index.d.ts.map +1 -0
- package/lib/plugins/breakpoints/methods.d.ts +23 -0
- package/lib/plugins/breakpoints/methods.d.ts.map +1 -0
- package/lib/plugins/breakpoints/types.d.ts +70 -0
- package/lib/plugins/breakpoints/types.d.ts.map +1 -0
- package/lib/plugins/captions/CaptionsPlugin.d.ts +150 -0
- package/lib/plugins/captions/CaptionsPlugin.d.ts.map +1 -0
- package/lib/plugins/captions/CaptionsRenderer.d.ts +37 -0
- package/lib/plugins/captions/CaptionsRenderer.d.ts.map +1 -0
- package/lib/plugins/captions/index.d.ts +3 -0
- package/lib/plugins/captions/index.d.ts.map +1 -0
- package/lib/plugins/defaults.d.ts +4 -0
- package/lib/plugins/defaults.d.ts.map +1 -0
- package/lib/plugins/focus/FocusManagerPlugin.d.ts +148 -0
- package/lib/plugins/focus/FocusManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/focus/FocusOutliner.d.ts +32 -0
- package/lib/plugins/focus/FocusOutliner.d.ts.map +1 -0
- package/lib/plugins/focus/index.d.ts +3 -0
- package/lib/plugins/focus/index.d.ts.map +1 -0
- package/lib/plugins/i18nPlugin.d.ts +128 -0
- package/lib/plugins/i18nPlugin.d.ts.map +1 -0
- package/lib/plugins/index.d.ts +18 -0
- package/lib/plugins/index.d.ts.map +1 -0
- package/lib/plugins/input/AbstractControls.d.ts +8 -0
- package/lib/plugins/input/AbstractControls.d.ts.map +1 -0
- package/lib/plugins/input/Controls.d.ts +16 -0
- package/lib/plugins/input/Controls.d.ts.map +1 -0
- package/lib/plugins/input/InputPlugin.d.ts +52 -0
- package/lib/plugins/input/InputPlugin.d.ts.map +1 -0
- package/lib/plugins/input/constants.d.ts +8 -0
- package/lib/plugins/input/constants.d.ts.map +1 -0
- package/lib/plugins/input/index.d.ts +10 -0
- package/lib/plugins/input/index.d.ts.map +1 -0
- package/lib/plugins/input/interfaces.d.ts +30 -0
- package/lib/plugins/input/interfaces.d.ts.map +1 -0
- package/lib/plugins/input/keyboard/KeyboardContols.d.ts +28 -0
- package/lib/plugins/input/keyboard/KeyboardContols.d.ts.map +1 -0
- package/lib/plugins/input/keyboard/index.d.ts +3 -0
- package/lib/plugins/input/keyboard/index.d.ts.map +1 -0
- package/lib/plugins/input/keyboard/interfaces.d.ts +18 -0
- package/lib/plugins/input/keyboard/interfaces.d.ts.map +1 -0
- package/lib/plugins/input/methods.d.ts +4 -0
- package/lib/plugins/input/methods.d.ts.map +1 -0
- package/lib/plugins/input/touch/TouchControls.d.ts +35 -0
- package/lib/plugins/input/touch/TouchControls.d.ts.map +1 -0
- package/lib/plugins/input/touch/constants.d.ts +14 -0
- package/lib/plugins/input/touch/constants.d.ts.map +1 -0
- package/lib/plugins/input/touch/index.d.ts +4 -0
- package/lib/plugins/input/touch/index.d.ts.map +1 -0
- package/lib/plugins/input/touch/interfaces.d.ts +15 -0
- package/lib/plugins/input/touch/interfaces.d.ts.map +1 -0
- package/lib/plugins/input/types.d.ts +32 -0
- package/lib/plugins/input/types.d.ts.map +1 -0
- package/lib/plugins/input/utils.d.ts +23 -0
- package/lib/plugins/input/utils.d.ts.map +1 -0
- package/lib/plugins/spine/SpinePlugin.d.ts +6 -0
- package/lib/plugins/spine/SpinePlugin.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts +31 -0
- package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/Spine.d.ts +211 -0
- package/lib/plugins/spine/pixi-spine/Spine.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts +81 -0
- package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts +21 -0
- package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts +16 -0
- package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts +10 -0
- package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts +6 -0
- package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts +5 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts +22 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts +5 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts +51 -0
- package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/index.d.ts +9 -0
- package/lib/plugins/spine/pixi-spine/index.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/require-shim.d.ts +34 -0
- package/lib/plugins/spine/pixi-spine/require-shim.d.ts.map +1 -0
- package/lib/registries-CYCaYKZI.js +6885 -0
- package/lib/registries-CYCaYKZI.js.map +1 -0
- package/lib/signals/Signal.d.ts +16 -0
- package/lib/signals/Signal.d.ts.map +1 -0
- package/lib/signals/Signal.test.d.ts +2 -0
- package/lib/signals/Signal.test.d.ts.map +1 -0
- package/lib/signals/index.d.ts +3 -0
- package/lib/signals/index.d.ts.map +1 -0
- package/lib/store/Store.d.ts +56 -0
- package/lib/store/Store.d.ts.map +1 -0
- package/lib/store/Store.test.d.ts +2 -0
- package/lib/store/Store.test.d.ts.map +1 -0
- package/lib/store/index.d.ts +2 -0
- package/lib/store/index.d.ts.map +1 -0
- package/lib/types/framework.d.ts +46 -0
- package/lib/types/gsap.d.ts +23 -0
- package/lib/ui/Button.d.ts +162 -0
- package/lib/ui/Button.d.ts.map +1 -0
- package/lib/ui/FlexContainer.d.ts +109 -0
- package/lib/ui/FlexContainer.d.ts.map +1 -0
- package/lib/ui/Input.d.ts +384 -0
- package/lib/ui/Input.d.ts.map +1 -0
- package/lib/ui/Joystick.d.ts +61 -0
- package/lib/ui/Joystick.d.ts.map +1 -0
- package/lib/ui/Popup.d.ts +109 -0
- package/lib/ui/Popup.d.ts.map +1 -0
- package/lib/ui/Toast.d.ts +131 -0
- package/lib/ui/Toast.d.ts.map +1 -0
- package/lib/ui/Toaster.d.ts +188 -0
- package/lib/ui/Toaster.d.ts.map +1 -0
- package/lib/ui/UICanvas.d.ts +155 -0
- package/lib/ui/UICanvas.d.ts.map +1 -0
- package/lib/ui/index.d.ts +9 -0
- package/lib/ui/index.d.ts.map +1 -0
- package/lib/utils/array.d.ts +11 -0
- package/lib/utils/array.d.ts.map +1 -0
- package/lib/utils/bind.d.ts +21 -0
- package/lib/utils/bind.d.ts.map +1 -0
- package/lib/utils/canvas.d.ts +2 -0
- package/lib/utils/canvas.d.ts.map +1 -0
- package/lib/utils/color.d.ts +66 -0
- package/lib/utils/color.d.ts.map +1 -0
- package/lib/utils/console/Logger.d.ts +15 -0
- package/lib/utils/console/Logger.d.ts.map +1 -0
- package/lib/utils/console/index.d.ts +2 -0
- package/lib/utils/console/index.d.ts.map +1 -0
- package/lib/utils/debug.d.ts +34 -0
- package/lib/utils/debug.d.ts.map +1 -0
- package/lib/utils/define.d.ts +100 -0
- package/lib/utils/define.d.ts.map +1 -0
- package/lib/utils/env.d.ts +4 -0
- package/lib/utils/env.d.ts.map +1 -0
- package/lib/utils/events.d.ts +12 -0
- package/lib/utils/events.d.ts.map +1 -0
- package/lib/utils/framework.d.ts +12 -0
- package/lib/utils/framework.d.ts.map +1 -0
- package/lib/utils/index.d.ts +28 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/map.d.ts +31 -0
- package/lib/utils/map.d.ts.map +1 -0
- package/lib/utils/math.d.ts +15 -0
- package/lib/utils/math.d.ts.map +1 -0
- package/lib/utils/misc.d.ts +13 -0
- package/lib/utils/misc.d.ts.map +1 -0
- package/lib/utils/number.d.ts +2 -0
- package/lib/utils/number.d.ts.map +1 -0
- package/lib/utils/object.d.ts +21 -0
- package/lib/utils/object.d.ts.map +1 -0
- package/lib/utils/padding.d.ts +4 -0
- package/lib/utils/padding.d.ts.map +1 -0
- package/lib/utils/pixi.d.ts +42 -0
- package/lib/utils/pixi.d.ts.map +1 -0
- package/lib/utils/platform.d.ts +20 -0
- package/lib/utils/platform.d.ts.map +1 -0
- package/lib/utils/point.d.ts +66 -0
- package/lib/utils/point.d.ts.map +1 -0
- package/lib/utils/promise/Queue.d.ts +60 -0
- package/lib/utils/promise/Queue.d.ts.map +1 -0
- package/lib/utils/promise/functions.d.ts +14 -0
- package/lib/utils/promise/functions.d.ts.map +1 -0
- package/lib/utils/promise/index.d.ts +3 -0
- package/lib/utils/promise/index.d.ts.map +1 -0
- package/lib/utils/random.d.ts +42 -0
- package/lib/utils/random.d.ts.map +1 -0
- package/lib/utils/rect.d.ts +26 -0
- package/lib/utils/rect.d.ts.map +1 -0
- package/lib/utils/set.d.ts +15 -0
- package/lib/utils/set.d.ts.map +1 -0
- package/lib/utils/string.d.ts +3 -0
- package/lib/utils/string.d.ts.map +1 -0
- package/lib/utils/text.d.ts +3 -0
- package/lib/utils/text.d.ts.map +1 -0
- package/lib/utils/typefilters.d.ts +4 -0
- package/lib/utils/typefilters.d.ts.map +1 -0
- package/lib/utils/types.d.ts +209 -0
- package/lib/utils/types.d.ts.map +1 -0
- package/lib/utils/vite.d.ts +25 -0
- package/lib/utils/vite.d.ts.map +1 -0
- package/lib/utils/web.d.ts +3 -0
- package/lib/utils/web.d.ts.map +1 -0
- package/lib/version.d.ts +3 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/webgl-check.d.ts +2 -0
- package/lib/webgl-check.d.ts.map +1 -0
- package/package.json +138 -0
- package/src/core/Application.ts +1091 -0
- package/src/core/config.ts +168 -0
- package/src/core/create.ts +186 -0
- package/src/core/globals.ts +299 -0
- package/src/core/index.ts +6 -0
- package/src/core/interfaces/IApplication.ts +628 -0
- package/src/core/interfaces/IApplicationOptions.ts +81 -0
- package/src/core/interfaces/ICoreFunctions.ts +86 -0
- package/src/core/interfaces/ICoreSignals.ts +77 -0
- package/src/core/interfaces/IStorageCapability.test.ts +27 -0
- package/src/core/interfaces/IStorageCapability.ts +26 -0
- package/src/core/interfaces/index.ts +6 -0
- package/src/core/registries.ts +7 -0
- package/src/core/types.ts +13 -0
- package/src/display/AnimatedSprite.ts +227 -0
- package/src/display/Camera.ts +371 -0
- package/src/display/Container.ts +240 -0
- package/src/display/Entity.ts +50 -0
- package/src/display/ParticleContainer.ts +107 -0
- package/src/display/Scene.ts +305 -0
- package/src/display/SceneTransition.ts +108 -0
- package/src/display/SpineAnimation.ts +170 -0
- package/src/display/Svg.ts +9 -0
- package/src/display/index.ts +11 -0
- package/src/env.d.ts +6 -0
- package/src/hello.ts +20 -0
- package/src/index.ts +17 -0
- package/src/mixins/animated.ts +340 -0
- package/src/mixins/factory/Factory.ts +24 -0
- package/src/mixins/factory/const.ts +363 -0
- package/src/mixins/factory/index.ts +7 -0
- package/src/mixins/factory/methods.ts +21 -0
- package/src/mixins/factory/props.ts +207 -0
- package/src/mixins/factory/registry.test.ts +83 -0
- package/src/mixins/factory/registry.ts +61 -0
- package/src/mixins/factory/schema.ts +153 -0
- package/src/mixins/factory/ui-registry.ts +54 -0
- package/src/mixins/factory/utils.ts +130 -0
- package/src/mixins/focus.ts +124 -0
- package/src/mixins/index.ts +5 -0
- package/src/mixins/interaction.ts +74 -0
- package/src/mixins/signals.ts +49 -0
- package/src/plugins/AssetsPlugin.ts +407 -0
- package/src/plugins/DataAdapter.ts +259 -0
- package/src/plugins/DevToolsPlugin.ts +103 -0
- package/src/plugins/FullScreenPlugin.ts +359 -0
- package/src/plugins/GSAPPlugin.ts +811 -0
- package/src/plugins/KeyboardPlugin.ts +160 -0
- package/src/plugins/LayoutPlugin.ts +127 -0
- package/src/plugins/LookupPlugin.ts +308 -0
- package/src/plugins/Plugin.test.ts +73 -0
- package/src/plugins/Plugin.ts +200 -0
- package/src/plugins/PopupManagerPlugin.ts +263 -0
- package/src/plugins/ResizerPlugin.ts +220 -0
- package/src/plugins/SceneManagerPlugin.ts +669 -0
- package/src/plugins/StatsPlugin.ts +24 -0
- package/src/plugins/TimerPlugin.ts +841 -0
- package/src/plugins/WebEventsPlugin.ts +132 -0
- package/src/plugins/actions/ActionsPlugin.ts +113 -0
- package/src/plugins/actions/constants.ts +45 -0
- package/src/plugins/actions/index.ts +4 -0
- package/src/plugins/actions/methods.ts +28 -0
- package/src/plugins/actions/types.ts +47 -0
- package/src/plugins/audio/AudioChannel.test.ts +101 -0
- package/src/plugins/audio/AudioChannel.ts +164 -0
- package/src/plugins/audio/AudioInstance.ts +228 -0
- package/src/plugins/audio/AudioManagerPlugin.ts +903 -0
- package/src/plugins/audio/VoiceOverPlugin.ts +354 -0
- package/src/plugins/audio/index.ts +3 -0
- package/src/plugins/breakpoints/BreakpointPlugin.test.ts +228 -0
- package/src/plugins/breakpoints/BreakpointPlugin.ts +293 -0
- package/src/plugins/breakpoints/evaluate.test.ts +239 -0
- package/src/plugins/breakpoints/evaluate.ts +201 -0
- package/src/plugins/breakpoints/index.ts +3 -0
- package/src/plugins/breakpoints/methods.ts +22 -0
- package/src/plugins/breakpoints/types.ts +86 -0
- package/src/plugins/captions/CaptionsPlugin.ts +468 -0
- package/src/plugins/captions/CaptionsRenderer.ts +184 -0
- package/src/plugins/captions/font/Sans.fnt +116 -0
- package/src/plugins/captions/font/Sans.png +0 -0
- package/src/plugins/captions/index.ts +2 -0
- package/src/plugins/defaults.ts +95 -0
- package/src/plugins/focus/FocusManagerPlugin.ts +773 -0
- package/src/plugins/focus/FocusOutliner.ts +111 -0
- package/src/plugins/focus/index.ts +2 -0
- package/src/plugins/i18nPlugin.ts +284 -0
- package/src/plugins/index.ts +17 -0
- package/src/plugins/input/AbstractControls.ts +15 -0
- package/src/plugins/input/Controls.ts +55 -0
- package/src/plugins/input/InputPlugin.ts +168 -0
- package/src/plugins/input/constants.ts +12 -0
- package/src/plugins/input/index.ts +9 -0
- package/src/plugins/input/interfaces.ts +37 -0
- package/src/plugins/input/keyboard/KeyboardContols.ts +182 -0
- package/src/plugins/input/keyboard/index.ts +2 -0
- package/src/plugins/input/keyboard/interfaces.ts +21 -0
- package/src/plugins/input/methods.ts +9 -0
- package/src/plugins/input/touch/TouchControls.ts +237 -0
- package/src/plugins/input/touch/constants.ts +34 -0
- package/src/plugins/input/touch/index.ts +3 -0
- package/src/plugins/input/touch/interfaces.ts +15 -0
- package/src/plugins/input/types.ts +41 -0
- package/src/plugins/input/utils.ts +10 -0
- package/src/plugins/spine/SpinePlugin.ts +14 -0
- package/src/plugins/spine/pixi-spine/BatchableSpineSlot.ts +138 -0
- package/src/plugins/spine/pixi-spine/Spine.ts +897 -0
- package/src/plugins/spine/pixi-spine/SpineDebugRenderer.ts +615 -0
- package/src/plugins/spine/pixi-spine/SpinePipe.ts +197 -0
- package/src/plugins/spine/pixi-spine/SpineTexture.ts +143 -0
- package/src/plugins/spine/pixi-spine/assets/atlasLoader.ts +156 -0
- package/src/plugins/spine/pixi-spine/assets/skeletonLoader.ts +80 -0
- package/src/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.ts +92 -0
- package/src/plugins/spine/pixi-spine/darktint/DarkTintBatcher.ts +186 -0
- package/src/plugins/spine/pixi-spine/darktint/DarkTintShader.ts +74 -0
- package/src/plugins/spine/pixi-spine/darktint/darkTintBit.ts +77 -0
- package/src/plugins/spine/pixi-spine/index.ts +43 -0
- package/src/plugins/spine/pixi-spine/require-shim.ts +43 -0
- package/src/signals/Signal.test.ts +54 -0
- package/src/signals/Signal.ts +68 -0
- package/src/signals/index.ts +10 -0
- package/src/store/Store.test.ts +146 -0
- package/src/store/Store.ts +192 -0
- package/src/store/index.ts +1 -0
- package/src/types/framework.d.ts +47 -0
- package/src/types/gsap.d.ts +26 -0
- package/src/ui/Button.ts +454 -0
- package/src/ui/FlexContainer.ts +526 -0
- package/src/ui/Input.ts +1274 -0
- package/src/ui/Joystick.ts +288 -0
- package/src/ui/Popup.ts +242 -0
- package/src/ui/Toast.ts +399 -0
- package/src/ui/Toaster.ts +409 -0
- package/src/ui/UICanvas.ts +812 -0
- package/src/ui/index.ts +8 -0
- package/src/utils/array.ts +24 -0
- package/src/utils/bind.ts +79 -0
- package/src/utils/canvas.ts +26 -0
- package/src/utils/color.ts +126 -0
- package/src/utils/console/Logger.ts +86 -0
- package/src/utils/console/index.ts +1 -0
- package/src/utils/debug.ts +69 -0
- package/src/utils/define.ts +120 -0
- package/src/utils/env.ts +3 -0
- package/src/utils/events.ts +10 -0
- package/src/utils/framework.ts +45 -0
- package/src/utils/index.ts +27 -0
- package/src/utils/map.ts +59 -0
- package/src/utils/math.ts +19 -0
- package/src/utils/misc.ts +45 -0
- package/src/utils/number.ts +3 -0
- package/src/utils/object.ts +43 -0
- package/src/utils/padding.ts +43 -0
- package/src/utils/pixi.ts +116 -0
- package/src/utils/platform.ts +33 -0
- package/src/utils/point.ts +123 -0
- package/src/utils/promise/Queue.ts +125 -0
- package/src/utils/promise/functions.ts +16 -0
- package/src/utils/promise/index.ts +2 -0
- package/src/utils/random.ts +69 -0
- package/src/utils/rect.ts +50 -0
- package/src/utils/set.ts +32 -0
- package/src/utils/string.ts +9 -0
- package/src/utils/text.ts +30 -0
- package/src/utils/typefilters.ts +29 -0
- package/src/utils/types.ts +426 -0
- package/src/utils/vite.ts +41 -0
- package/src/utils/web.ts +7 -0
- package/src/version.ts +3 -0
- package/src/webgl-check.ts +12 -0
- package/templates/app/default/.eslintrc.json +21 -0
- package/templates/app/default/.meta.json +4 -0
- package/templates/app/default/.nvmrc +1 -0
- package/templates/app/default/.prettierrc.json +7 -0
- package/templates/app/default/README.md +8 -0
- package/templates/app/default/assets/audio{m}/music/Cheerful Annoyance.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Drumming Sticks.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Game Over.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Mishief Stroll.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Night at the Beach.ogg +0 -0
- package/templates/app/default/assets/audio{m}/sfx/click.ogg +0 -0
- package/templates/app/default/assets/audio{m}/sfx/hover.ogg +0 -0
- package/templates/app/default/assets/required{m}/caper.png +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Bold{family=Space Grotesk}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Medium{family=Space Grotesk}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Regular{family=Space Grotesk}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/Syncopate-Bold{family=Syncopate}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/blue.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/green.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/grey.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/orange.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/purple.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/red.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/yellow.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_a/down.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_a/over.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_a/up.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_b/down.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_b/over.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_b/up.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/joystick/base.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/joystick/handle.png +0 -0
- package/templates/app/default/assets/required{m}/wordmark.svg +1 -0
- package/templates/app/default/assets/spine{m}/spineboy-pro.png +0 -0
- package/templates/app/default/assets/spine{m}/spineboy-pro.skel +0 -0
- package/templates/app/default/assets/spine{m}/spineboy-pro{fix}.atlas +94 -0
- package/templates/app/default/caper.config.ts +60 -0
- package/templates/app/default/index.html +23 -0
- package/templates/app/default/package.template.json +17 -0
- package/templates/app/default/public/favicon.ico +0 -0
- package/templates/app/default/src/__APPLICATION_NAME__.ts +3 -0
- package/templates/app/default/src/main.ts +9 -0
- package/templates/app/default/src/scenes/Base.ts +39 -0
- package/templates/app/default/src/scenes/Game.ts +34 -0
- package/templates/app/default/src/scenes/Splash.ts +70 -0
- package/templates/app/default/src/scenes/Start.ts +90 -0
- package/templates/app/default/src/utils/Constants.ts +3 -0
- package/templates/app/default/tsconfig.json +1 -0
- package/templates/plugin/package.template.json +33 -0
- package/templates/plugin/src/Plugin.template.ts +24 -0
- package/templates/plugin/src/index.template.ts +3 -0
- package/templates/plugin/tsconfig.template.json +43 -0
- package/templates/plugin/vite-env.template.d.ts +16 -0
- 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
|
+
}
|