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