@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,363 @@
|
|
|
1
|
+
import { BitmapText, Graphics, HTMLText, Sprite, Text, TilingSprite } from 'pixi.js';
|
|
2
|
+
|
|
3
|
+
import { AnimatedSprite, Container, ContainerConfigKeys, SpineAnimation, Svg } from '../../display';
|
|
4
|
+
import { ParticleContainer, ParticleContainerConfigKeys } from '../../display/ParticleContainer';
|
|
5
|
+
import {
|
|
6
|
+
Button,
|
|
7
|
+
ButtonConfigKeys,
|
|
8
|
+
FlexContainer,
|
|
9
|
+
FlexContainerConfigKeys,
|
|
10
|
+
Toaster,
|
|
11
|
+
UICanvas,
|
|
12
|
+
UICanvasConfigKeys,
|
|
13
|
+
} from '../../ui';
|
|
14
|
+
import type { ButtonConfig, FlexContainerConfig, ToastConfig, ToasterConfig, UICanvasProps } from '../../ui';
|
|
15
|
+
import type { EntityId, EntityInstance, EntityProps, UIId, UIInstance, UIProps } from '../../utils';
|
|
16
|
+
import { pluck, resolvePointLike, Spine, WithRequiredProps } from '../../utils';
|
|
17
|
+
|
|
18
|
+
import type { EntityFactoryProps } from './props';
|
|
19
|
+
import {
|
|
20
|
+
AnimatedSpriteProps,
|
|
21
|
+
BitmapTextProps,
|
|
22
|
+
ButtonProps,
|
|
23
|
+
ContainerProps,
|
|
24
|
+
ExistingProps,
|
|
25
|
+
FlexContainerProps,
|
|
26
|
+
GraphicsProps,
|
|
27
|
+
HTMLTextProps,
|
|
28
|
+
ParticleContainerProps,
|
|
29
|
+
SpineProps,
|
|
30
|
+
SpriteProps,
|
|
31
|
+
SvgProps,
|
|
32
|
+
TextProps,
|
|
33
|
+
TilingSpriteProps,
|
|
34
|
+
UICanvasFactoryProps,
|
|
35
|
+
} from './props';
|
|
36
|
+
import { getEntityCtor, getRegisteredEntityIds } from './registry';
|
|
37
|
+
import { getUICtor, getRegisteredUIIds } from './ui-registry';
|
|
38
|
+
import { buildFactoryMethod } from './schema';
|
|
39
|
+
import {
|
|
40
|
+
resolveAnchor,
|
|
41
|
+
resolvePivot,
|
|
42
|
+
resolvePosition,
|
|
43
|
+
resolveScale,
|
|
44
|
+
resolveTexture,
|
|
45
|
+
resolveUnknownKeys,
|
|
46
|
+
} from './utils';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Keys consumed by text-family factory builds (`text`, `htmlText`,
|
|
50
|
+
* `bitmapText`). Shared here so the three schemas don't drift — each one
|
|
51
|
+
* flattens `{text, style, roundPixels, resolution, anchor, pivot}` into
|
|
52
|
+
* the Pixi constructor options in `build`, so all those keys must be
|
|
53
|
+
* excluded from the schema's unknown-keys passthrough.
|
|
54
|
+
*/
|
|
55
|
+
const TEXT_CONSUMED_KEYS = ['text', 'roundPixels', 'resolution', 'style', 'anchor', 'pivot'] as const;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Factory method table consumed by the `Factory()` mixin. Almost every
|
|
59
|
+
* entry is built via `buildFactoryMethod({ build, applies, exclude })`:
|
|
60
|
+
* the `build` callback owns the bespoke constructor call (including any
|
|
61
|
+
* DX reshaping Caper applies — asset-name resolution, text style
|
|
62
|
+
* flattening, config-vs-extras splits), and the helper centralizes
|
|
63
|
+
* position/scale/pivot/anchor + unknown-keys passthrough.
|
|
64
|
+
*
|
|
65
|
+
* The five bespoke entries (`existing`, `texture`, `svg`, `toaster`,
|
|
66
|
+
* `entity`) don't fit the `(props?) → instance` shape — `existing` takes
|
|
67
|
+
* `(entity, props)`, `texture` is a plain resolver re-bind, `svg` takes
|
|
68
|
+
* a required `ctx` field, `toaster` takes two config objects, and
|
|
69
|
+
* `entity` takes `(id, props)` with a generic narrowed to discovered
|
|
70
|
+
* entity ids — so they stay hand-written.
|
|
71
|
+
*/
|
|
72
|
+
export const defaultFactoryMethods = {
|
|
73
|
+
existing: <TEntity>(entity: TEntity, props?: Partial<ExistingProps>): TEntity => {
|
|
74
|
+
if (!props) return entity;
|
|
75
|
+
const { position, x, y, pivot, scale, scaleX, scaleY, ...rest } = props;
|
|
76
|
+
resolvePosition({ position, x, y }, entity);
|
|
77
|
+
resolveScale({ scale, scaleX, scaleY }, entity);
|
|
78
|
+
resolvePivot(pivot, entity);
|
|
79
|
+
resolveUnknownKeys(rest, entity);
|
|
80
|
+
return entity;
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
container: buildFactoryMethod({
|
|
84
|
+
build: (props?: Partial<ContainerProps>): Container =>
|
|
85
|
+
new Container(props ? pluck(props, ContainerConfigKeys) : undefined),
|
|
86
|
+
applies: ['position', 'scale', 'pivot'],
|
|
87
|
+
exclude: ContainerConfigKeys as readonly string[],
|
|
88
|
+
}),
|
|
89
|
+
|
|
90
|
+
particleContainer: buildFactoryMethod({
|
|
91
|
+
build: (props?: Partial<ParticleContainerProps>): ParticleContainer =>
|
|
92
|
+
new ParticleContainer(props ? pluck(props, ParticleContainerConfigKeys) : undefined),
|
|
93
|
+
applies: ['position', 'scale', 'pivot'],
|
|
94
|
+
exclude: ParticleContainerConfigKeys as readonly string[],
|
|
95
|
+
}),
|
|
96
|
+
|
|
97
|
+
texture: resolveTexture,
|
|
98
|
+
|
|
99
|
+
sprite: buildFactoryMethod({
|
|
100
|
+
build: (props?: Partial<SpriteProps>) =>
|
|
101
|
+
new Sprite(props ? resolveTexture(props) : undefined),
|
|
102
|
+
applies: ['position', 'scale', 'pivot', 'anchor'],
|
|
103
|
+
exclude: ['asset', 'sheet'],
|
|
104
|
+
}),
|
|
105
|
+
|
|
106
|
+
tilingSprite: buildFactoryMethod({
|
|
107
|
+
build: (props?: Partial<TilingSpriteProps>) =>
|
|
108
|
+
new TilingSprite(props ? resolveTexture(props) : undefined),
|
|
109
|
+
applies: ['position', 'scale', 'pivot', 'anchor'],
|
|
110
|
+
exclude: ['asset', 'sheet'],
|
|
111
|
+
}),
|
|
112
|
+
|
|
113
|
+
animatedSprite: buildFactoryMethod({
|
|
114
|
+
// AnimatedSprite's Caper-side constructor consumes the full props bag
|
|
115
|
+
// (animations, autoPlay, autoUpdate, sheet, texturePrefix, etc.), so
|
|
116
|
+
// the schema's `build` just forwards them. Position/scale/pivot are
|
|
117
|
+
// applied by the helper from the same object.
|
|
118
|
+
build: (props?: Partial<AnimatedSpriteProps>): AnimatedSprite => new AnimatedSprite(props),
|
|
119
|
+
applies: ['position', 'scale', 'pivot'],
|
|
120
|
+
exclude: [
|
|
121
|
+
'sheet',
|
|
122
|
+
'texturePrefix',
|
|
123
|
+
'zeroPad',
|
|
124
|
+
'animations',
|
|
125
|
+
'autoPlay',
|
|
126
|
+
'autoUpdate',
|
|
127
|
+
'defaultAnimation',
|
|
128
|
+
'reversible',
|
|
129
|
+
'animationSpeed',
|
|
130
|
+
'startIndex',
|
|
131
|
+
'animation',
|
|
132
|
+
],
|
|
133
|
+
}),
|
|
134
|
+
|
|
135
|
+
graphics: buildFactoryMethod({
|
|
136
|
+
build: (_props?: Partial<GraphicsProps>) => new Graphics(),
|
|
137
|
+
applies: ['position', 'scale', 'pivot'],
|
|
138
|
+
}),
|
|
139
|
+
|
|
140
|
+
svg(props: WithRequiredProps<SvgProps, 'ctx'>) {
|
|
141
|
+
const entity = new Svg(props.ctx);
|
|
142
|
+
const { position, x, y, pivot, scale, scaleX, scaleY, ctx: _ctx, ...rest } = props;
|
|
143
|
+
resolvePosition({ position, x, y }, entity);
|
|
144
|
+
resolveScale({ scale, scaleX, scaleY }, entity);
|
|
145
|
+
resolvePivot(pivot, entity);
|
|
146
|
+
resolveUnknownKeys(rest, entity);
|
|
147
|
+
return entity;
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
text: buildFactoryMethod({
|
|
151
|
+
// Text flattens Pixi's nested `style: {...}` into top-level props for
|
|
152
|
+
// DX (e.g. `{fontFamily, fontSize, fill}` without the `style:` wrapper
|
|
153
|
+
// — see TextStyle type in props.ts). The build callback rebuilds the
|
|
154
|
+
// Pixi-shape options object, including `anchor`/`pivot` pre-resolved
|
|
155
|
+
// via `resolvePointLike(..., true)` the way the hand-written method
|
|
156
|
+
// did. Post-construct resolvers handle position/scale/pivot.
|
|
157
|
+
build: (props?: Partial<TextProps>) =>
|
|
158
|
+
new Text(
|
|
159
|
+
props
|
|
160
|
+
? {
|
|
161
|
+
text: props.text,
|
|
162
|
+
roundPixels: props.roundPixels,
|
|
163
|
+
resolution: props.resolution,
|
|
164
|
+
style: props.style,
|
|
165
|
+
anchor: props.anchor ? resolvePointLike(props.anchor, true) : undefined,
|
|
166
|
+
pivot: props.pivot ? resolvePointLike(props.pivot, true) : undefined,
|
|
167
|
+
}
|
|
168
|
+
: {},
|
|
169
|
+
),
|
|
170
|
+
applies: ['position', 'scale', 'pivot'],
|
|
171
|
+
exclude: [...TEXT_CONSUMED_KEYS],
|
|
172
|
+
}),
|
|
173
|
+
|
|
174
|
+
htmlText: buildFactoryMethod({
|
|
175
|
+
build: (props?: Partial<HTMLTextProps>) =>
|
|
176
|
+
new HTMLText(
|
|
177
|
+
props
|
|
178
|
+
? {
|
|
179
|
+
text: props.text,
|
|
180
|
+
roundPixels: props.roundPixels,
|
|
181
|
+
resolution: props.resolution,
|
|
182
|
+
style: props.style,
|
|
183
|
+
anchor: props.anchor ? resolvePointLike(props.anchor, true) : undefined,
|
|
184
|
+
pivot: props.pivot ? resolvePointLike(props.pivot, true) : undefined,
|
|
185
|
+
}
|
|
186
|
+
: {},
|
|
187
|
+
),
|
|
188
|
+
applies: ['position', 'scale', 'pivot'],
|
|
189
|
+
exclude: [...TEXT_CONSUMED_KEYS],
|
|
190
|
+
}),
|
|
191
|
+
|
|
192
|
+
bitmapText: buildFactoryMethod({
|
|
193
|
+
// BitmapText's ctor doesn't take `resolution` — that's the only field
|
|
194
|
+
// that differs from Text/HTMLText here.
|
|
195
|
+
build: (props?: Partial<BitmapTextProps>) =>
|
|
196
|
+
new BitmapText(
|
|
197
|
+
props
|
|
198
|
+
? {
|
|
199
|
+
text: props.text,
|
|
200
|
+
roundPixels: props.roundPixels,
|
|
201
|
+
style: props.style,
|
|
202
|
+
anchor: props.anchor ? resolvePointLike(props.anchor, true) : undefined,
|
|
203
|
+
pivot: props.pivot ? resolvePointLike(props.pivot, true) : undefined,
|
|
204
|
+
}
|
|
205
|
+
: {},
|
|
206
|
+
),
|
|
207
|
+
applies: ['position', 'scale', 'pivot'],
|
|
208
|
+
exclude: [...TEXT_CONSUMED_KEYS],
|
|
209
|
+
}),
|
|
210
|
+
|
|
211
|
+
button: buildFactoryMethod({
|
|
212
|
+
build: (props?: Partial<ButtonProps>): Button =>
|
|
213
|
+
new Button((props ? pluck(props, ButtonConfigKeys) : undefined) as Partial<ButtonConfig>),
|
|
214
|
+
applies: ['position', 'scale', 'pivot'],
|
|
215
|
+
exclude: ButtonConfigKeys as readonly string[],
|
|
216
|
+
}),
|
|
217
|
+
|
|
218
|
+
flexContainer: buildFactoryMethod({
|
|
219
|
+
// FlexContainer takes the full props bag (minus position/scale/pivot)
|
|
220
|
+
// as its constructor config — historical: the hand-written method
|
|
221
|
+
// passed `props as Partial<FlexContainerConfig>` directly rather than
|
|
222
|
+
// plucking FlexContainerConfigKeys. Preserving that shape.
|
|
223
|
+
build: (props?: Partial<FlexContainerProps>): FlexContainer =>
|
|
224
|
+
new FlexContainer(props as Partial<FlexContainerConfig>),
|
|
225
|
+
applies: ['position', 'scale', 'pivot'],
|
|
226
|
+
exclude: FlexContainerConfigKeys as readonly string[],
|
|
227
|
+
}),
|
|
228
|
+
|
|
229
|
+
uiCanvas: buildFactoryMethod({
|
|
230
|
+
build: (props?: Partial<UICanvasFactoryProps>): UICanvas =>
|
|
231
|
+
// UICanvas's ctor takes Partial<UICanvasProps>, which is a superset
|
|
232
|
+
// of UICanvasConfig — the pluck narrows, so cast back.
|
|
233
|
+
new UICanvas(props ? (pluck(props, UICanvasConfigKeys) as Partial<UICanvasProps>) : ({} as Partial<UICanvasProps>)),
|
|
234
|
+
applies: ['position', 'scale', 'pivot'],
|
|
235
|
+
exclude: UICanvasConfigKeys as readonly string[],
|
|
236
|
+
}),
|
|
237
|
+
|
|
238
|
+
spine: buildFactoryMethod({
|
|
239
|
+
build: (props?: Partial<SpineProps>): Spine => {
|
|
240
|
+
// Resolve Caper's `{data: 'spine/foo'}` shorthand into the Pixi
|
|
241
|
+
// `{skeleton, atlas}` pair expected by Spine.from().
|
|
242
|
+
let spineData: { skeleton: string; atlas: string } | string = '';
|
|
243
|
+
const data = props?.data;
|
|
244
|
+
if (typeof data === 'string') {
|
|
245
|
+
// If the asset name is missing an extension, default to .json. If
|
|
246
|
+
// it has one, strip it so we can re-append both skeleton + atlas
|
|
247
|
+
// paths from the base name.
|
|
248
|
+
let ext = data.slice(-5);
|
|
249
|
+
if (ext !== '.json' && ext !== '.skel') {
|
|
250
|
+
ext = '.json';
|
|
251
|
+
} else {
|
|
252
|
+
spineData = data.substring(0, data.length - 5);
|
|
253
|
+
}
|
|
254
|
+
spineData = { skeleton: data + ext, atlas: data + '.atlas' };
|
|
255
|
+
}
|
|
256
|
+
const entity: Spine = (window as unknown as { Spine: { from: (d: unknown) => Spine } }).Spine.from(
|
|
257
|
+
spineData,
|
|
258
|
+
);
|
|
259
|
+
// Spine-specific post-construct setup. Has to happen here (not in
|
|
260
|
+
// `applies`) because the helper doesn't know about spine state.
|
|
261
|
+
if (props?.autoUpdate !== undefined) entity.autoUpdate = props.autoUpdate;
|
|
262
|
+
if (props?.animationName) {
|
|
263
|
+
entity.state.setAnimation(props.trackIndex ?? 0, props.animationName, props.loop);
|
|
264
|
+
}
|
|
265
|
+
return entity;
|
|
266
|
+
},
|
|
267
|
+
applies: ['position', 'scale', 'pivot', 'anchor'],
|
|
268
|
+
exclude: ['data', 'autoUpdate', 'animationName', 'trackIndex', 'loop'],
|
|
269
|
+
}),
|
|
270
|
+
|
|
271
|
+
spineAnimation: <ANames extends string = string>(
|
|
272
|
+
props?: Partial<SpineProps>,
|
|
273
|
+
): SpineAnimation<ANames> => {
|
|
274
|
+
// Hand-written rather than schema-driven because `buildFactoryMethod`
|
|
275
|
+
// can't carry the `<ANames>` generic through to the call site —
|
|
276
|
+
// kitchen-sink's SpineScene narrows the animation-name union via
|
|
277
|
+
// `this.add.spineAnimation<CharacterAnimations>({...})`, which
|
|
278
|
+
// requires the method itself to declare the generic.
|
|
279
|
+
const entity = new SpineAnimation<ANames>(props);
|
|
280
|
+
if (!props) return entity;
|
|
281
|
+
const { position, x, y, anchor, pivot, scale, scaleX, scaleY, ...rest } = props;
|
|
282
|
+
resolvePosition({ position, x, y }, entity);
|
|
283
|
+
resolveScale({ scale, scaleX, scaleY }, entity);
|
|
284
|
+
resolveAnchor(anchor, entity);
|
|
285
|
+
resolvePivot(pivot, entity);
|
|
286
|
+
resolveUnknownKeys(rest, entity);
|
|
287
|
+
return entity;
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
toaster: (toasterConfig?: Partial<ToasterConfig>, defaultToastConfig: Partial<ToastConfig> = {}): Toaster => {
|
|
291
|
+
return new Toaster(toasterConfig, defaultToastConfig);
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Construct an entity from the auto-discovered registry. `id` is narrowed
|
|
296
|
+
* to the union of entity ids declared under `src/entities/` (see the
|
|
297
|
+
* generated `caper-app.d.ts`), and `props` is typed from the entity's
|
|
298
|
+
* constructor signature via `ConstructorParameters<typeof Entity>[0]`.
|
|
299
|
+
*
|
|
300
|
+
* Throws if `id` isn't registered. Discovery runs at build time, so the
|
|
301
|
+
* only way to hit this at runtime is a stale virtual module — fail loud
|
|
302
|
+
* and list the known ids so the user can see what's wrong.
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* this.add.entity('actor', { color: 0xff0000, x: 50, y: 100 });
|
|
306
|
+
*/
|
|
307
|
+
entity: <K extends EntityId>(
|
|
308
|
+
id: K,
|
|
309
|
+
props?: EntityProps<K> & EntityFactoryProps,
|
|
310
|
+
): EntityInstance<K> => {
|
|
311
|
+
const Ctor = getEntityCtor(id as string);
|
|
312
|
+
if (!Ctor) {
|
|
313
|
+
const known = getRegisteredEntityIds();
|
|
314
|
+
throw new Error(
|
|
315
|
+
`[caper] Unknown entity id '${String(id)}'. ` +
|
|
316
|
+
`Known: ${known.length > 0 ? known.map((k) => `'${k}'`).join(', ') : '(none — discovery may have failed)'}`,
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
const instance = new (Ctor as new (props?: EntityProps<K>) => EntityInstance<K>)(props);
|
|
320
|
+
if (props) {
|
|
321
|
+
const { position, x, y, pivot, scale, scaleX, scaleY, alpha, visible } = props as EntityFactoryProps;
|
|
322
|
+
resolvePosition({ position, x, y }, instance);
|
|
323
|
+
resolveScale({ scale, scaleX, scaleY }, instance);
|
|
324
|
+
resolvePivot(pivot, instance);
|
|
325
|
+
if (alpha !== undefined) (instance as unknown as { alpha: number }).alpha = alpha;
|
|
326
|
+
if (visible !== undefined) (instance as unknown as { visible: boolean }).visible = visible;
|
|
327
|
+
}
|
|
328
|
+
return instance;
|
|
329
|
+
},
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Construct a UI element from the auto-discovered registry. `id` is
|
|
333
|
+
* narrowed to the union of UI ids declared under `src/ui/` (see the
|
|
334
|
+
* generated `caper-app.d.ts`), and `props` is typed from the UI
|
|
335
|
+
* element's constructor signature via `ConstructorParameters<...>[0]`.
|
|
336
|
+
*
|
|
337
|
+
* @example
|
|
338
|
+
* this.add.ui('close-button', { x: 100, y: 50 });
|
|
339
|
+
*/
|
|
340
|
+
ui: <K extends UIId>(
|
|
341
|
+
id: K,
|
|
342
|
+
props?: UIProps<K> & EntityFactoryProps,
|
|
343
|
+
): UIInstance<K> => {
|
|
344
|
+
const Ctor = getUICtor(id as string);
|
|
345
|
+
if (!Ctor) {
|
|
346
|
+
const known = getRegisteredUIIds();
|
|
347
|
+
throw new Error(
|
|
348
|
+
`[caper] Unknown ui id '${String(id)}'. ` +
|
|
349
|
+
`Known: ${known.length > 0 ? known.map((k) => `'${k}'`).join(', ') : '(none — discovery may have failed)'}`,
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
const instance = new (Ctor as new (props?: UIProps<K>) => UIInstance<K>)(props);
|
|
353
|
+
if (props) {
|
|
354
|
+
const { position, x, y, pivot, scale, scaleX, scaleY, alpha, visible } = props as EntityFactoryProps;
|
|
355
|
+
resolvePosition({ position, x, y }, instance);
|
|
356
|
+
resolveScale({ scale, scaleX, scaleY }, instance);
|
|
357
|
+
resolvePivot(pivot, instance);
|
|
358
|
+
if (alpha !== undefined) (instance as unknown as { alpha: number }).alpha = alpha;
|
|
359
|
+
if (visible !== undefined) (instance as unknown as { visible: boolean }).visible = visible;
|
|
360
|
+
}
|
|
361
|
+
return instance;
|
|
362
|
+
},
|
|
363
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defaultFactoryMethods } from './index';
|
|
2
|
+
|
|
3
|
+
export function createFactoryMethods<T extends typeof defaultFactoryMethods = typeof defaultFactoryMethods>(
|
|
4
|
+
methods: Partial<T>,
|
|
5
|
+
instance: any,
|
|
6
|
+
addToStage: boolean,
|
|
7
|
+
): T {
|
|
8
|
+
const factoryMethods: any = {};
|
|
9
|
+
for (const key in methods) {
|
|
10
|
+
factoryMethods[key] = (...args: any[]) => {
|
|
11
|
+
// @ts-expect-error - this is fine
|
|
12
|
+
const obj = methods[key](...args);
|
|
13
|
+
if (addToStage) {
|
|
14
|
+
instance.addChild(obj);
|
|
15
|
+
// instance.addChild(obj);
|
|
16
|
+
}
|
|
17
|
+
return obj;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return factoryMethods as T;
|
|
21
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { LayoutOptions } from '@pixi/layout';
|
|
2
|
+
import { GraphicsContext, HTMLTextStyleOptions, TextStyleOptions } from 'pixi.js';
|
|
3
|
+
import { ContainerConfig } from '../../display';
|
|
4
|
+
import { ParticleContainerConfig } from '../../display/ParticleContainer';
|
|
5
|
+
import { ButtonConfig, FlexContainerConfig, UICanvasProps } from '../../ui';
|
|
6
|
+
import type {
|
|
7
|
+
BitmapFontFamilyAsset,
|
|
8
|
+
FontFamilyAsset,
|
|
9
|
+
PointLike,
|
|
10
|
+
SpineAsset,
|
|
11
|
+
SpritesheetAsset,
|
|
12
|
+
TextureAsset,
|
|
13
|
+
WithRequiredProps,
|
|
14
|
+
} from '../../utils';
|
|
15
|
+
|
|
16
|
+
export interface AbstractProps {
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface TextureProps {
|
|
21
|
+
asset: TextureAsset;
|
|
22
|
+
sheet: SpritesheetAsset;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface PositionProps {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
position: PointLike;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ScaleProps {
|
|
32
|
+
scaleX: number;
|
|
33
|
+
scaleY: number;
|
|
34
|
+
scale: PointLike;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface PivotProps {
|
|
38
|
+
pivot: PointLike;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface VisibilityProps {
|
|
42
|
+
alpha: number;
|
|
43
|
+
visible: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface LayoutProps {
|
|
47
|
+
layout?: Omit<LayoutOptions, 'target'> | null | boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ExistingProps extends AbstractProps, PositionProps, ScaleProps, VisibilityProps, LayoutProps {}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Layout-ish props the `this.add.entity(id, props)` factory applies after
|
|
54
|
+
* construction — intentionally narrow (no `AbstractProps` index signature)
|
|
55
|
+
* so TypeScript can still narrow entity-specific props at the call site.
|
|
56
|
+
*/
|
|
57
|
+
export interface EntityFactoryProps
|
|
58
|
+
extends Partial<PositionProps>,
|
|
59
|
+
Partial<ScaleProps>,
|
|
60
|
+
Partial<PivotProps>,
|
|
61
|
+
Partial<VisibilityProps> {}
|
|
62
|
+
|
|
63
|
+
export interface GraphicsProps extends AbstractProps, PositionProps, ScaleProps, PivotProps, VisibilityProps {}
|
|
64
|
+
|
|
65
|
+
export interface SvgProps extends GraphicsProps {
|
|
66
|
+
ctx: string | GraphicsContext;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface SpriteProps
|
|
70
|
+
extends AbstractProps,
|
|
71
|
+
TextureProps,
|
|
72
|
+
ScaleProps,
|
|
73
|
+
PositionProps,
|
|
74
|
+
VisibilityProps,
|
|
75
|
+
LayoutProps {
|
|
76
|
+
anchor: PointLike;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface TilingSpriteProps extends SpriteProps {
|
|
80
|
+
tilePosition?: PointLike;
|
|
81
|
+
/**
|
|
82
|
+
* Scaling of the image that is being tiled.
|
|
83
|
+
* @default {x: 1, y: 1}
|
|
84
|
+
*/
|
|
85
|
+
tileScale?: PointLike;
|
|
86
|
+
/**
|
|
87
|
+
* The rotation of the image that is being tiled.
|
|
88
|
+
* @default 0
|
|
89
|
+
*/
|
|
90
|
+
tileRotation?: number;
|
|
91
|
+
/**
|
|
92
|
+
* The texture to use for the sprite.
|
|
93
|
+
* @default Texture.WHITE
|
|
94
|
+
*/
|
|
95
|
+
/**
|
|
96
|
+
* The width of the tiling sprite. #
|
|
97
|
+
* @default 256
|
|
98
|
+
*/
|
|
99
|
+
width?: number;
|
|
100
|
+
/**
|
|
101
|
+
* The height of the tiling sprite.
|
|
102
|
+
* @default 256
|
|
103
|
+
*/
|
|
104
|
+
height?: number;
|
|
105
|
+
/**
|
|
106
|
+
* @default false
|
|
107
|
+
*/
|
|
108
|
+
applyAnchorToTexture?: boolean;
|
|
109
|
+
/** Whether or not to round the x/y position. */
|
|
110
|
+
roundPixels?: boolean;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface AnimatedSpriteAnimationProps
|
|
114
|
+
extends AbstractProps,
|
|
115
|
+
ScaleProps,
|
|
116
|
+
PositionProps,
|
|
117
|
+
VisibilityProps,
|
|
118
|
+
LayoutProps {
|
|
119
|
+
texturePrefix: string;
|
|
120
|
+
sheet: SpritesheetAsset;
|
|
121
|
+
startIndex: number;
|
|
122
|
+
numFrames: number;
|
|
123
|
+
zeroPad: number;
|
|
124
|
+
autoUpdate: boolean;
|
|
125
|
+
updateAnchor: boolean;
|
|
126
|
+
loop: boolean;
|
|
127
|
+
animationSpeed: number;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface AnimatedSpriteProps extends AbstractProps, ScaleProps, PositionProps, VisibilityProps, LayoutProps {
|
|
131
|
+
sheet: SpritesheetAsset;
|
|
132
|
+
texturePrefix: string;
|
|
133
|
+
zeroPad: number;
|
|
134
|
+
animations: { [animationName: string]: Partial<AnimatedSpriteAnimationProps> };
|
|
135
|
+
autoPlay: boolean;
|
|
136
|
+
autoUpdate: boolean;
|
|
137
|
+
defaultAnimation: string;
|
|
138
|
+
reversible: boolean;
|
|
139
|
+
animationSpeed: number;
|
|
140
|
+
startIndex: number;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export type TextStyle = Partial<Omit<TextStyleOptions, 'fontFamily'> & { fontFamily: FontFamilyAsset }>;
|
|
144
|
+
|
|
145
|
+
export interface TextProps extends AbstractProps, PositionProps, ScaleProps, VisibilityProps, LayoutProps {
|
|
146
|
+
text: string;
|
|
147
|
+
anchor: PointLike;
|
|
148
|
+
resolution: number;
|
|
149
|
+
roundPixels: boolean;
|
|
150
|
+
style: TextStyle;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface BitmapTextProps extends AbstractProps, PositionProps, ScaleProps, VisibilityProps, LayoutProps {
|
|
154
|
+
text: string;
|
|
155
|
+
anchor: PointLike;
|
|
156
|
+
resolution: number;
|
|
157
|
+
roundPixels: boolean;
|
|
158
|
+
style: Partial<Omit<TextStyleOptions, 'fontFamily'> & { fontFamily: BitmapFontFamilyAsset }>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface HTMLTextProps extends AbstractProps, PositionProps, ScaleProps, VisibilityProps, LayoutProps {
|
|
162
|
+
text: string;
|
|
163
|
+
anchor: PointLike;
|
|
164
|
+
resolution: number;
|
|
165
|
+
roundPixels: boolean;
|
|
166
|
+
style: Partial<Omit<HTMLTextStyleOptions, 'fontFamily'> & { fontFamily: FontFamilyAsset }>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface OmittedTextProps extends AbstractProps, PositionProps, ScaleProps, VisibilityProps {}
|
|
170
|
+
|
|
171
|
+
export const TextPropsKeys: (keyof TextProps)[] = ['text', 'anchor', 'roundPixels', 'style', 'pivot'];
|
|
172
|
+
|
|
173
|
+
export interface ContainerProps
|
|
174
|
+
extends AbstractProps,
|
|
175
|
+
PositionProps,
|
|
176
|
+
ScaleProps,
|
|
177
|
+
PivotProps,
|
|
178
|
+
VisibilityProps,
|
|
179
|
+
LayoutProps,
|
|
180
|
+
ContainerConfig {}
|
|
181
|
+
|
|
182
|
+
export interface ParticleContainerProps extends AbstractProps, ParticleContainerConfig {}
|
|
183
|
+
|
|
184
|
+
export interface FlexContainerProps extends ContainerProps, FlexContainerConfig {}
|
|
185
|
+
|
|
186
|
+
export interface UICanvasFactoryProps extends ContainerProps, UICanvasProps {}
|
|
187
|
+
|
|
188
|
+
// spine
|
|
189
|
+
export interface SpineProps extends AbstractProps, ScaleProps, PositionProps, VisibilityProps, LayoutProps {
|
|
190
|
+
data: SpineAsset;
|
|
191
|
+
autoUpdate: boolean;
|
|
192
|
+
animationName: string;
|
|
193
|
+
trackIndex: number;
|
|
194
|
+
loop: boolean;
|
|
195
|
+
paused: boolean;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
interface _ButtonProps
|
|
199
|
+
extends AbstractProps,
|
|
200
|
+
ScaleProps,
|
|
201
|
+
PositionProps,
|
|
202
|
+
PivotProps,
|
|
203
|
+
VisibilityProps,
|
|
204
|
+
ButtonConfig,
|
|
205
|
+
LayoutProps {}
|
|
206
|
+
|
|
207
|
+
export type ButtonProps = WithRequiredProps<_ButtonProps, 'textures'>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { _resetEntityRegistry, getEntityCtor, getRegisteredEntityIds } from './registry';
|
|
4
|
+
|
|
5
|
+
// The registry reads from `globalThis.Caper.get('entityList')` on first
|
|
6
|
+
// access — the caper-runtime virtual module normally populates this. In
|
|
7
|
+
// tests we stub it manually.
|
|
8
|
+
function stubGlobalEntityList(list: unknown): void {
|
|
9
|
+
(globalThis as unknown as { Caper: { get: (key: string) => unknown } }).Caper = {
|
|
10
|
+
get: (key: string) => (key === 'entityList' ? list : undefined),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
class FakeActor {
|
|
15
|
+
constructor(public props?: { color?: number }) {}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
class FakeBoy {
|
|
19
|
+
constructor() {}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe('entity registry', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
_resetEntityRegistry();
|
|
25
|
+
delete (globalThis as unknown as { Caper?: unknown }).Caper;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('registers static-import entities from globalThis.Caper.entityList on first access', () => {
|
|
29
|
+
stubGlobalEntityList([
|
|
30
|
+
{ id: 'actor', active: true, module: FakeActor },
|
|
31
|
+
{ id: 'boy', active: true, module: FakeBoy },
|
|
32
|
+
]);
|
|
33
|
+
expect(getRegisteredEntityIds().sort()).toEqual(['actor', 'boy']);
|
|
34
|
+
expect(getEntityCtor('actor')).toBe(FakeActor);
|
|
35
|
+
expect(getEntityCtor('boy')).toBe(FakeBoy);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('skips inactive entries', () => {
|
|
39
|
+
stubGlobalEntityList([
|
|
40
|
+
{ id: 'actor', active: true, module: FakeActor },
|
|
41
|
+
{ id: 'inactive', active: false, module: FakeBoy },
|
|
42
|
+
]);
|
|
43
|
+
expect(getRegisteredEntityIds()).toEqual(['actor']);
|
|
44
|
+
expect(getEntityCtor('inactive')).toBeUndefined();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('skips dynamic-import entries (arrow functions without prototypes)', () => {
|
|
48
|
+
const dynamicLoader = () => Promise.resolve({ default: FakeBoy });
|
|
49
|
+
stubGlobalEntityList([
|
|
50
|
+
{ id: 'actor', active: true, module: FakeActor },
|
|
51
|
+
{ id: 'lazy', active: true, module: dynamicLoader },
|
|
52
|
+
]);
|
|
53
|
+
// Only the static-import entry is registered — sync `this.add.entity`
|
|
54
|
+
// can't wait for a dynamic import.
|
|
55
|
+
expect(getRegisteredEntityIds()).toEqual(['actor']);
|
|
56
|
+
expect(getEntityCtor('lazy')).toBeUndefined();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('returns undefined for unknown ids without throwing', () => {
|
|
60
|
+
stubGlobalEntityList([{ id: 'actor', active: true, module: FakeActor }]);
|
|
61
|
+
expect(getEntityCtor('nonexistent')).toBeUndefined();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('handles missing globalThis.Caper gracefully (empty registry)', () => {
|
|
65
|
+
// No stub set — Caper is undefined.
|
|
66
|
+
expect(getRegisteredEntityIds()).toEqual([]);
|
|
67
|
+
expect(getEntityCtor('anything')).toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('caches the registry after first lookup (list only read once)', () => {
|
|
71
|
+
let readCount = 0;
|
|
72
|
+
(globalThis as unknown as { Caper: { get: (key: string) => unknown } }).Caper = {
|
|
73
|
+
get: (key: string) => {
|
|
74
|
+
if (key === 'entityList') readCount++;
|
|
75
|
+
return [{ id: 'actor', active: true, module: FakeActor }];
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
getEntityCtor('actor');
|
|
79
|
+
getEntityCtor('actor');
|
|
80
|
+
getRegisteredEntityIds();
|
|
81
|
+
expect(readCount).toBe(1);
|
|
82
|
+
});
|
|
83
|
+
});
|