diff --git a/.gitignore b/.gitignore
index 97951c3..a78dcbf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
coverage
/node_modules
/out/vendor
-/out/assets/atlas*
+/out/assets
/out/build.*
/graphics/**/*.blend?*
/typings/
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
deleted file mode 100644
index 7f029d5..0000000
--- a/.vscode/tasks.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "version": "0.1.0",
- "command": ".venv/node/bin/npm",
- "isShellCommand": true,
- "args": [
- "run",
- "--silent"
- ],
- "tasks": [
- {
- "taskName": "build",
- "isBuildCommand": true,
- "isTestCommand": false,
- "showOutput": "never",
- "problemMatcher": "$tsc"
- },
- {
- "taskName": "test",
- "isBuildCommand": false,
- "isTestCommand": true,
- "showOutput": "always",
- "problemMatcher": "$tsc"
- }
- ]
-}
\ No newline at end of file
diff --git a/TODO.md b/TODO.md
index d2b286c..20a1d8b 100644
--- a/TODO.md
+++ b/TODO.md
@@ -94,7 +94,8 @@ Common UI
Technical
---------
-* Pack all images in atlases, and split them by stage
+* Remove testing code from optimized build
+* Fix alpha being altered in atlases
* Pack sounds
* Add toggles for shaders, automatically disable them if too slow, and initially disable them on mobile
diff --git a/graphics/exported/common/arrow-down.png b/data/stage1/image/common/arrow-down.png
similarity index 100%
rename from graphics/exported/common/arrow-down.png
rename to data/stage1/image/common/arrow-down.png
diff --git a/graphics/exported/common/arrow-left.png b/data/stage1/image/common/arrow-left.png
similarity index 100%
rename from graphics/exported/common/arrow-left.png
rename to data/stage1/image/common/arrow-left.png
diff --git a/graphics/exported/common/arrow-right.png b/data/stage1/image/common/arrow-right.png
similarity index 100%
rename from graphics/exported/common/arrow-right.png
rename to data/stage1/image/common/arrow-right.png
diff --git a/graphics/exported/common/arrow-up.png b/data/stage1/image/common/arrow-up.png
similarity index 100%
rename from graphics/exported/common/arrow-up.png
rename to data/stage1/image/common/arrow-up.png
diff --git a/out/assets/images/common/arrow.png b/data/stage1/image/common/arrow.png
similarity index 100%
rename from out/assets/images/common/arrow.png
rename to data/stage1/image/common/arrow.png
diff --git a/out/assets/images/common/button-cancel.png b/data/stage1/image/common/button-cancel.png
similarity index 100%
rename from out/assets/images/common/button-cancel.png
rename to data/stage1/image/common/button-cancel.png
diff --git a/out/assets/images/common/button-ok.png b/data/stage1/image/common/button-ok.png
similarity index 100%
rename from out/assets/images/common/button-ok.png
rename to data/stage1/image/common/button-ok.png
diff --git a/out/assets/images/common/debug.png b/data/stage1/image/common/debug.png
similarity index 100%
rename from out/assets/images/common/debug.png
rename to data/stage1/image/common/debug.png
diff --git a/data/stage1/image/common/dialog-close-hover.png b/data/stage1/image/common/dialog-close-hover.png
new file mode 100644
index 0000000..29706b7
Binary files /dev/null and b/data/stage1/image/common/dialog-close-hover.png differ
diff --git a/data/stage1/image/common/dialog-close.png b/data/stage1/image/common/dialog-close.png
new file mode 100644
index 0000000..6e4628e
Binary files /dev/null and b/data/stage1/image/common/dialog-close.png differ
diff --git a/data/stage1/image/common/dialog-textbutton-hover.png b/data/stage1/image/common/dialog-textbutton-hover.png
new file mode 100644
index 0000000..bd5e5c1
Binary files /dev/null and b/data/stage1/image/common/dialog-textbutton-hover.png differ
diff --git a/data/stage1/image/common/dialog-textbutton.png b/data/stage1/image/common/dialog-textbutton.png
new file mode 100644
index 0000000..b3a1dc8
Binary files /dev/null and b/data/stage1/image/common/dialog-textbutton.png differ
diff --git a/out/assets/images/common/dialog.png b/data/stage1/image/common/dialog.png
similarity index 100%
rename from out/assets/images/common/dialog.png
rename to data/stage1/image/common/dialog.png
diff --git a/out/assets/images/common/transparent.png b/data/stage1/image/common/transparent.png
similarity index 100%
rename from out/assets/images/common/transparent.png
rename to data/stage1/image/common/transparent.png
diff --git a/data/stage1/image/menu/button-hover.png b/data/stage1/image/menu/button-hover.png
new file mode 100644
index 0000000..22e53c9
Binary files /dev/null and b/data/stage1/image/menu/button-hover.png differ
diff --git a/data/stage1/image/menu/button.png b/data/stage1/image/menu/button.png
new file mode 100644
index 0000000..73a6ed0
Binary files /dev/null and b/data/stage1/image/menu/button.png differ
diff --git a/out/assets/images/menu/load-bg.png b/data/stage1/image/menu/load-bg.png
similarity index 100%
rename from out/assets/images/menu/load-bg.png
rename to data/stage1/image/menu/load-bg.png
diff --git a/out/assets/images/menu/title.png b/data/stage1/image/menu/title.png
similarity index 100%
rename from out/assets/images/menu/title.png
rename to data/stage1/image/menu/title.png
diff --git a/out/assets/images/options/background.png b/data/stage1/image/options/background.png
similarity index 100%
rename from out/assets/images/options/background.png
rename to data/stage1/image/options/background.png
diff --git a/data/stage1/image/options/button-hover.png b/data/stage1/image/options/button-hover.png
new file mode 100644
index 0000000..297c0d9
Binary files /dev/null and b/data/stage1/image/options/button-hover.png differ
diff --git a/data/stage1/image/options/button.png b/data/stage1/image/options/button.png
new file mode 100644
index 0000000..ad93c55
Binary files /dev/null and b/data/stage1/image/options/button.png differ
diff --git a/data/stage1/image/options/option-fullscreen.png b/data/stage1/image/options/option-fullscreen.png
new file mode 100644
index 0000000..4d4851d
Binary files /dev/null and b/data/stage1/image/options/option-fullscreen.png differ
diff --git a/data/stage1/image/options/option-music.png b/data/stage1/image/options/option-music.png
new file mode 100644
index 0000000..4b4f98b
Binary files /dev/null and b/data/stage1/image/options/option-music.png differ
diff --git a/data/stage1/image/options/option-sound.png b/data/stage1/image/options/option-sound.png
new file mode 100644
index 0000000..839112b
Binary files /dev/null and b/data/stage1/image/options/option-sound.png differ
diff --git a/data/stage1/image/options/toggle-hover.png b/data/stage1/image/options/toggle-hover.png
new file mode 100644
index 0000000..0e485b1
Binary files /dev/null and b/data/stage1/image/options/toggle-hover.png differ
diff --git a/data/stage1/image/options/toggle-on.png b/data/stage1/image/options/toggle-on.png
new file mode 100644
index 0000000..c82b94e
Binary files /dev/null and b/data/stage1/image/options/toggle-on.png differ
diff --git a/data/stage1/image/options/toggle.png b/data/stage1/image/options/toggle.png
new file mode 100644
index 0000000..77e8e44
Binary files /dev/null and b/data/stage1/image/options/toggle.png differ
diff --git a/graphics/exported/translucent.png b/data/stage1/image/translucent.png
similarity index 100%
rename from graphics/exported/translucent.png
rename to data/stage1/image/translucent.png
diff --git a/out/assets/sounds/music/supernatural.mp3 b/data/stage1/sound/music/supernatural.mp3
similarity index 100%
rename from out/assets/sounds/music/supernatural.mp3
rename to data/stage1/sound/music/supernatural.mp3
diff --git a/out/assets/sounds/ui/button-click.wav b/data/stage1/sound/ui/button-click.wav
similarity index 100%
rename from out/assets/sounds/ui/button-click.wav
rename to data/stage1/sound/ui/button-click.wav
diff --git a/out/assets/sounds/ui/button-down.wav b/data/stage1/sound/ui/button-down.wav
similarity index 100%
rename from out/assets/sounds/ui/button-down.wav
rename to data/stage1/sound/ui/button-down.wav
diff --git a/out/assets/sounds/ui/button-up.wav b/data/stage1/sound/ui/button-up.wav
similarity index 100%
rename from out/assets/sounds/ui/button-up.wav
rename to data/stage1/sound/ui/button-up.wav
diff --git a/out/assets/sounds/ui/dialog-close.wav b/data/stage1/sound/ui/dialog-close.wav
similarity index 100%
rename from out/assets/sounds/ui/dialog-close.wav
rename to data/stage1/sound/ui/dialog-close.wav
diff --git a/out/assets/sounds/ui/dialog-open.wav b/data/stage1/sound/ui/dialog-open.wav
similarity index 100%
rename from out/assets/sounds/ui/dialog-open.wav
rename to data/stage1/sound/ui/dialog-open.wav
diff --git a/graphics/exported/action/damageprotector.png b/data/stage2/image/action/damageprotector.png
similarity index 100%
rename from graphics/exported/action/damageprotector.png
rename to data/stage2/image/action/damageprotector.png
diff --git a/graphics/exported/action/endturn.png b/data/stage2/image/action/endturn.png
similarity index 100%
rename from graphics/exported/action/endturn.png
rename to data/stage2/image/action/endturn.png
diff --git a/graphics/exported/action/forcefield.png b/data/stage2/image/action/forcefield.png
similarity index 100%
rename from graphics/exported/action/forcefield.png
rename to data/stage2/image/action/forcefield.png
diff --git a/graphics/exported/action/fractalhull.png b/data/stage2/image/action/fractalhull.png
similarity index 100%
rename from graphics/exported/action/fractalhull.png
rename to data/stage2/image/action/fractalhull.png
diff --git a/graphics/exported/action/gatlinggun.png b/data/stage2/image/action/gatlinggun.png
similarity index 100%
rename from graphics/exported/action/gatlinggun.png
rename to data/stage2/image/action/gatlinggun.png
diff --git a/graphics/exported/action/gravitshield.png b/data/stage2/image/action/gravitshield.png
similarity index 100%
rename from graphics/exported/action/gravitshield.png
rename to data/stage2/image/action/gravitshield.png
diff --git a/graphics/exported/action/hardcoatedhull.png b/data/stage2/image/action/hardcoatedhull.png
similarity index 100%
rename from graphics/exported/action/hardcoatedhull.png
rename to data/stage2/image/action/hardcoatedhull.png
diff --git a/graphics/exported/action/invertershield.png b/data/stage2/image/action/invertershield.png
similarity index 100%
rename from graphics/exported/action/invertershield.png
rename to data/stage2/image/action/invertershield.png
diff --git a/graphics/exported/action/ionthruster.png b/data/stage2/image/action/ionthruster.png
similarity index 100%
rename from graphics/exported/action/ionthruster.png
rename to data/stage2/image/action/ionthruster.png
diff --git a/graphics/exported/action/ironhull.png b/data/stage2/image/action/ironhull.png
similarity index 100%
rename from graphics/exported/action/ironhull.png
rename to data/stage2/image/action/ironhull.png
diff --git a/graphics/exported/action/kelvingenerator.png b/data/stage2/image/action/kelvingenerator.png
similarity index 100%
rename from graphics/exported/action/kelvingenerator.png
rename to data/stage2/image/action/kelvingenerator.png
diff --git a/graphics/exported/action/move.png b/data/stage2/image/action/move.png
similarity index 100%
rename from graphics/exported/action/move.png
rename to data/stage2/image/action/move.png
diff --git a/graphics/exported/action/nuclearreactor.png b/data/stage2/image/action/nuclearreactor.png
similarity index 100%
rename from graphics/exported/action/nuclearreactor.png
rename to data/stage2/image/action/nuclearreactor.png
diff --git a/graphics/exported/action/powerdepleter.png b/data/stage2/image/action/powerdepleter.png
similarity index 100%
rename from graphics/exported/action/powerdepleter.png
rename to data/stage2/image/action/powerdepleter.png
diff --git a/graphics/exported/action/precisionboost.png b/data/stage2/image/action/precisionboost.png
similarity index 100%
rename from graphics/exported/action/precisionboost.png
rename to data/stage2/image/action/precisionboost.png
diff --git a/graphics/exported/action/prokhorovlaser.png b/data/stage2/image/action/prokhorovlaser.png
similarity index 100%
rename from graphics/exported/action/prokhorovlaser.png
rename to data/stage2/image/action/prokhorovlaser.png
diff --git a/graphics/exported/action/repairdrone.png b/data/stage2/image/action/repairdrone.png
similarity index 100%
rename from graphics/exported/action/repairdrone.png
rename to data/stage2/image/action/repairdrone.png
diff --git a/graphics/exported/action/rocketengine.png b/data/stage2/image/action/rocketengine.png
similarity index 100%
rename from graphics/exported/action/rocketengine.png
rename to data/stage2/image/action/rocketengine.png
diff --git a/graphics/exported/action/shieldtransfer.png b/data/stage2/image/action/shieldtransfer.png
similarity index 100%
rename from graphics/exported/action/shieldtransfer.png
rename to data/stage2/image/action/shieldtransfer.png
diff --git a/graphics/exported/action/submunitionmissile.png b/data/stage2/image/action/submunitionmissile.png
similarity index 100%
rename from graphics/exported/action/submunitionmissile.png
rename to data/stage2/image/action/submunitionmissile.png
diff --git a/graphics/exported/action/voidhawkengine.png b/data/stage2/image/action/voidhawkengine.png
similarity index 100%
rename from graphics/exported/action/voidhawkengine.png
rename to data/stage2/image/action/voidhawkengine.png
diff --git a/graphics/exported/attribute/hull_capacity.png b/data/stage2/image/attribute/hull_capacity.png
similarity index 100%
rename from graphics/exported/attribute/hull_capacity.png
rename to data/stage2/image/attribute/hull_capacity.png
diff --git a/graphics/exported/attribute/maneuvrability.png b/data/stage2/image/attribute/maneuvrability.png
similarity index 100%
rename from graphics/exported/attribute/maneuvrability.png
rename to data/stage2/image/attribute/maneuvrability.png
diff --git a/graphics/exported/attribute/power_capacity.png b/data/stage2/image/attribute/power_capacity.png
similarity index 100%
rename from graphics/exported/attribute/power_capacity.png
rename to data/stage2/image/attribute/power_capacity.png
diff --git a/graphics/exported/attribute/precision.png b/data/stage2/image/attribute/precision.png
similarity index 100%
rename from graphics/exported/attribute/precision.png
rename to data/stage2/image/attribute/precision.png
diff --git a/graphics/exported/attribute/shield_capacity.png b/data/stage2/image/attribute/shield_capacity.png
similarity index 100%
rename from graphics/exported/attribute/shield_capacity.png
rename to data/stage2/image/attribute/shield_capacity.png
diff --git a/out/assets/images/battle/actionbar/actions-background.png b/data/stage2/image/battle/actionbar/actions-background.png
similarity index 100%
rename from out/assets/images/battle/actionbar/actions-background.png
rename to data/stage2/image/battle/actionbar/actions-background.png
diff --git a/out/assets/images/battle/actionbar/background.png b/data/stage2/image/battle/actionbar/background.png
similarity index 100%
rename from out/assets/images/battle/actionbar/background.png
rename to data/stage2/image/battle/actionbar/background.png
diff --git a/graphics/exported/battle/actionbar/bottom-disabled.png b/data/stage2/image/battle/actionbar/bottom-disabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/bottom-disabled.png
rename to data/stage2/image/battle/actionbar/bottom-disabled.png
diff --git a/graphics/exported/battle/actionbar/bottom-enabled.png b/data/stage2/image/battle/actionbar/bottom-enabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/bottom-enabled.png
rename to data/stage2/image/battle/actionbar/bottom-enabled.png
diff --git a/graphics/exported/battle/actionbar/bottom-targetting.png b/data/stage2/image/battle/actionbar/bottom-targetting.png
similarity index 100%
rename from graphics/exported/battle/actionbar/bottom-targetting.png
rename to data/stage2/image/battle/actionbar/bottom-targetting.png
diff --git a/graphics/exported/battle/actionbar/bottom-toggled.png b/data/stage2/image/battle/actionbar/bottom-toggled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/bottom-toggled.png
rename to data/stage2/image/battle/actionbar/bottom-toggled.png
diff --git a/data/stage2/image/battle/actionbar/button-menu-hover.png b/data/stage2/image/battle/actionbar/button-menu-hover.png
new file mode 100644
index 0000000..3b611b5
Binary files /dev/null and b/data/stage2/image/battle/actionbar/button-menu-hover.png differ
diff --git a/data/stage2/image/battle/actionbar/button-menu.png b/data/stage2/image/battle/actionbar/button-menu.png
new file mode 100644
index 0000000..5600071
Binary files /dev/null and b/data/stage2/image/battle/actionbar/button-menu.png differ
diff --git a/graphics/exported/battle/actionbar/consumption-disabled.png b/data/stage2/image/battle/actionbar/consumption-disabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/consumption-disabled.png
rename to data/stage2/image/battle/actionbar/consumption-disabled.png
diff --git a/graphics/exported/battle/actionbar/consumption-enabled.png b/data/stage2/image/battle/actionbar/consumption-enabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/consumption-enabled.png
rename to data/stage2/image/battle/actionbar/consumption-enabled.png
diff --git a/graphics/exported/battle/actionbar/consumption-targetting.png b/data/stage2/image/battle/actionbar/consumption-targetting.png
similarity index 100%
rename from graphics/exported/battle/actionbar/consumption-targetting.png
rename to data/stage2/image/battle/actionbar/consumption-targetting.png
diff --git a/graphics/exported/battle/actionbar/consumption-toggled.png b/data/stage2/image/battle/actionbar/consumption-toggled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/consumption-toggled.png
rename to data/stage2/image/battle/actionbar/consumption-toggled.png
diff --git a/graphics/exported/battle/actionbar/cooldown-front.png b/data/stage2/image/battle/actionbar/cooldown-front.png
similarity index 100%
rename from graphics/exported/battle/actionbar/cooldown-front.png
rename to data/stage2/image/battle/actionbar/cooldown-front.png
diff --git a/graphics/exported/battle/actionbar/cooldown-one.png b/data/stage2/image/battle/actionbar/cooldown-one.png
similarity index 100%
rename from graphics/exported/battle/actionbar/cooldown-one.png
rename to data/stage2/image/battle/actionbar/cooldown-one.png
diff --git a/graphics/exported/battle/actionbar/frame-disabled.png b/data/stage2/image/battle/actionbar/frame-disabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/frame-disabled.png
rename to data/stage2/image/battle/actionbar/frame-disabled.png
diff --git a/graphics/exported/battle/actionbar/frame-enabled.png b/data/stage2/image/battle/actionbar/frame-enabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/frame-enabled.png
rename to data/stage2/image/battle/actionbar/frame-enabled.png
diff --git a/graphics/exported/battle/actionbar/frame-fading.png b/data/stage2/image/battle/actionbar/frame-fading.png
similarity index 100%
rename from graphics/exported/battle/actionbar/frame-fading.png
rename to data/stage2/image/battle/actionbar/frame-fading.png
diff --git a/graphics/exported/battle/actionbar/hotkey.png b/data/stage2/image/battle/actionbar/hotkey.png
similarity index 100%
rename from graphics/exported/battle/actionbar/hotkey.png
rename to data/stage2/image/battle/actionbar/hotkey.png
diff --git a/graphics/exported/battle/actionbar/power-available.png b/data/stage2/image/battle/actionbar/power-available.png
similarity index 100%
rename from graphics/exported/battle/actionbar/power-available.png
rename to data/stage2/image/battle/actionbar/power-available.png
diff --git a/graphics/exported/battle/actionbar/power-background.png b/data/stage2/image/battle/actionbar/power-background.png
similarity index 100%
rename from graphics/exported/battle/actionbar/power-background.png
rename to data/stage2/image/battle/actionbar/power-background.png
diff --git a/graphics/exported/battle/actionbar/power-fire.png b/data/stage2/image/battle/actionbar/power-fire.png
similarity index 100%
rename from graphics/exported/battle/actionbar/power-fire.png
rename to data/stage2/image/battle/actionbar/power-fire.png
diff --git a/graphics/exported/battle/actionbar/power-generated.png b/data/stage2/image/battle/actionbar/power-generated.png
similarity index 100%
rename from graphics/exported/battle/actionbar/power-generated.png
rename to data/stage2/image/battle/actionbar/power-generated.png
diff --git a/graphics/exported/battle/actionbar/power-move.png b/data/stage2/image/battle/actionbar/power-move.png
similarity index 100%
rename from graphics/exported/battle/actionbar/power-move.png
rename to data/stage2/image/battle/actionbar/power-move.png
diff --git a/graphics/exported/battle/actionbar/power-used.png b/data/stage2/image/battle/actionbar/power-used.png
similarity index 100%
rename from graphics/exported/battle/actionbar/power-used.png
rename to data/stage2/image/battle/actionbar/power-used.png
diff --git a/graphics/exported/battle/actionbar/ship.png b/data/stage2/image/battle/actionbar/ship.png
similarity index 100%
rename from graphics/exported/battle/actionbar/ship.png
rename to data/stage2/image/battle/actionbar/ship.png
diff --git a/graphics/exported/battle/actionbar/sticky-disabled.png b/data/stage2/image/battle/actionbar/sticky-disabled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/sticky-disabled.png
rename to data/stage2/image/battle/actionbar/sticky-disabled.png
diff --git a/graphics/exported/battle/actionbar/sticky-overheat.png b/data/stage2/image/battle/actionbar/sticky-overheat.png
similarity index 100%
rename from graphics/exported/battle/actionbar/sticky-overheat.png
rename to data/stage2/image/battle/actionbar/sticky-overheat.png
diff --git a/graphics/exported/battle/actionbar/sticky-toggled.png b/data/stage2/image/battle/actionbar/sticky-toggled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/sticky-toggled.png
rename to data/stage2/image/battle/actionbar/sticky-toggled.png
diff --git a/graphics/exported/battle/actionbar/sticky-untoggled.png b/data/stage2/image/battle/actionbar/sticky-untoggled.png
similarity index 100%
rename from graphics/exported/battle/actionbar/sticky-untoggled.png
rename to data/stage2/image/battle/actionbar/sticky-untoggled.png
diff --git a/out/assets/images/battle/arena/background.png b/data/stage2/image/battle/arena/background.png
similarity index 100%
rename from out/assets/images/battle/arena/background.png
rename to data/stage2/image/battle/arena/background.png
diff --git a/out/assets/images/battle/background.jpg b/data/stage2/image/battle/background.jpg
similarity index 100%
rename from out/assets/images/battle/background.jpg
rename to data/stage2/image/battle/background.jpg
diff --git a/graphics/exported/battle/effects/blast.png b/data/stage2/image/battle/effects/blast.png
similarity index 100%
rename from graphics/exported/battle/effects/blast.png
rename to data/stage2/image/battle/effects/blast.png
diff --git a/graphics/exported/battle/effects/bullets.png b/data/stage2/image/battle/effects/bullets.png
similarity index 100%
rename from graphics/exported/battle/effects/bullets.png
rename to data/stage2/image/battle/effects/bullets.png
diff --git a/graphics/exported/battle/effects/default.png b/data/stage2/image/battle/effects/default.png
similarity index 100%
rename from graphics/exported/battle/effects/default.png
rename to data/stage2/image/battle/effects/default.png
diff --git a/graphics/exported/battle/effects/hot.png b/data/stage2/image/battle/effects/hot.png
similarity index 100%
rename from graphics/exported/battle/effects/hot.png
rename to data/stage2/image/battle/effects/hot.png
diff --git a/graphics/exported/battle/effects/laser.png b/data/stage2/image/battle/effects/laser.png
similarity index 100%
rename from graphics/exported/battle/effects/laser.png
rename to data/stage2/image/battle/effects/laser.png
diff --git a/graphics/exported/battle/effects/shield-impact.png b/data/stage2/image/battle/effects/shield-impact.png
similarity index 100%
rename from graphics/exported/battle/effects/shield-impact.png
rename to data/stage2/image/battle/effects/shield-impact.png
diff --git a/graphics/exported/battle/hud/ship-effect-bad.png b/data/stage2/image/battle/hud/ship-effect-bad.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-effect-bad.png
rename to data/stage2/image/battle/hud/ship-effect-bad.png
diff --git a/graphics/exported/battle/hud/ship-effect-good.png b/data/stage2/image/battle/hud/ship-effect-good.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-effect-good.png
rename to data/stage2/image/battle/hud/ship-effect-good.png
diff --git a/graphics/exported/battle/hud/ship-enemy-mini.png b/data/stage2/image/battle/hud/ship-enemy-mini.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-enemy-mini.png
rename to data/stage2/image/battle/hud/ship-enemy-mini.png
diff --git a/graphics/exported/battle/hud/ship-enemy.png b/data/stage2/image/battle/hud/ship-enemy.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-enemy.png
rename to data/stage2/image/battle/hud/ship-enemy.png
diff --git a/graphics/exported/battle/hud/ship-hsp.png b/data/stage2/image/battle/hud/ship-hsp.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-hsp.png
rename to data/stage2/image/battle/hud/ship-hsp.png
diff --git a/graphics/exported/battle/hud/ship-hull.png b/data/stage2/image/battle/hud/ship-hull.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-hull.png
rename to data/stage2/image/battle/hud/ship-hull.png
diff --git a/graphics/exported/battle/hud/ship-impacted.png b/data/stage2/image/battle/hud/ship-impacted.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-impacted.png
rename to data/stage2/image/battle/hud/ship-impacted.png
diff --git a/graphics/exported/battle/hud/ship-own-mini.png b/data/stage2/image/battle/hud/ship-own-mini.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-own-mini.png
rename to data/stage2/image/battle/hud/ship-own-mini.png
diff --git a/graphics/exported/battle/hud/ship-own.png b/data/stage2/image/battle/hud/ship-own.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-own.png
rename to data/stage2/image/battle/hud/ship-own.png
diff --git a/graphics/exported/battle/hud/ship-play-order.png b/data/stage2/image/battle/hud/ship-play-order.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-play-order.png
rename to data/stage2/image/battle/hud/ship-play-order.png
diff --git a/graphics/exported/battle/hud/ship-shield.png b/data/stage2/image/battle/hud/ship-shield.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-shield.png
rename to data/stage2/image/battle/hud/ship-shield.png
diff --git a/graphics/exported/battle/hud/ship-stasis.png b/data/stage2/image/battle/hud/ship-stasis.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-stasis.png
rename to data/stage2/image/battle/hud/ship-stasis.png
diff --git a/graphics/exported/battle/hud/ship-success-back.png b/data/stage2/image/battle/hud/ship-success-back.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-success-back.png
rename to data/stage2/image/battle/hud/ship-success-back.png
diff --git a/graphics/exported/battle/hud/ship-success-fill.png b/data/stage2/image/battle/hud/ship-success-fill.png
similarity index 100%
rename from graphics/exported/battle/hud/ship-success-fill.png
rename to data/stage2/image/battle/hud/ship-success-fill.png
diff --git a/graphics/exported/battle/hud/simulator-failed.png b/data/stage2/image/battle/hud/simulator-failed.png
similarity index 100%
rename from graphics/exported/battle/hud/simulator-failed.png
rename to data/stage2/image/battle/hud/simulator-failed.png
diff --git a/graphics/exported/battle/hud/simulator-ok.png b/data/stage2/image/battle/hud/simulator-ok.png
similarity index 100%
rename from graphics/exported/battle/hud/simulator-ok.png
rename to data/stage2/image/battle/hud/simulator-ok.png
diff --git a/graphics/exported/battle/hud/simulator-power.png b/data/stage2/image/battle/hud/simulator-power.png
similarity index 100%
rename from graphics/exported/battle/hud/simulator-power.png
rename to data/stage2/image/battle/hud/simulator-power.png
diff --git a/graphics/exported/battle/hud/simulator-target.png b/data/stage2/image/battle/hud/simulator-target.png
similarity index 100%
rename from graphics/exported/battle/hud/simulator-target.png
rename to data/stage2/image/battle/hud/simulator-target.png
diff --git a/graphics/exported/battle/outcome/title-defeat.png b/data/stage2/image/battle/outcome/title-defeat.png
similarity index 100%
rename from graphics/exported/battle/outcome/title-defeat.png
rename to data/stage2/image/battle/outcome/title-defeat.png
diff --git a/graphics/exported/battle/outcome/title-victory.png b/data/stage2/image/battle/outcome/title-victory.png
similarity index 100%
rename from graphics/exported/battle/outcome/title-victory.png
rename to data/stage2/image/battle/outcome/title-victory.png
diff --git a/out/assets/images/battle/shiplist/background.png b/data/stage2/image/battle/shiplist/background.png
similarity index 100%
rename from out/assets/images/battle/shiplist/background.png
rename to data/stage2/image/battle/shiplist/background.png
diff --git a/out/assets/images/battle/shiplist/damage.png b/data/stage2/image/battle/shiplist/damage.png
similarity index 100%
rename from out/assets/images/battle/shiplist/damage.png
rename to data/stage2/image/battle/shiplist/damage.png
diff --git a/out/assets/images/battle/shiplist/hover.png b/data/stage2/image/battle/shiplist/hover.png
similarity index 100%
rename from out/assets/images/battle/shiplist/hover.png
rename to data/stage2/image/battle/shiplist/hover.png
diff --git a/out/assets/images/battle/shiplist/info-button.png b/data/stage2/image/battle/shiplist/info-button.png
similarity index 100%
rename from out/assets/images/battle/shiplist/info-button.png
rename to data/stage2/image/battle/shiplist/info-button.png
diff --git a/out/assets/images/battle/shiplist/item-background.png b/data/stage2/image/battle/shiplist/item-background.png
similarity index 100%
rename from out/assets/images/battle/shiplist/item-background.png
rename to data/stage2/image/battle/shiplist/item-background.png
diff --git a/data/stage2/image/battle/splash/message-off.png b/data/stage2/image/battle/splash/message-off.png
new file mode 100644
index 0000000..978ec82
Binary files /dev/null and b/data/stage2/image/battle/splash/message-off.png differ
diff --git a/data/stage2/image/battle/splash/message-on.png b/data/stage2/image/battle/splash/message-on.png
new file mode 100644
index 0000000..3f7ef81
Binary files /dev/null and b/data/stage2/image/battle/splash/message-on.png differ
diff --git a/data/stage2/image/battle/splash/moving-part.png b/data/stage2/image/battle/splash/moving-part.png
new file mode 100644
index 0000000..3db45b4
Binary files /dev/null and b/data/stage2/image/battle/splash/moving-part.png differ
diff --git a/data/stage2/image/battle/splash/shipcard-bottom.png b/data/stage2/image/battle/splash/shipcard-bottom.png
new file mode 100644
index 0000000..3c3b1e4
Binary files /dev/null and b/data/stage2/image/battle/splash/shipcard-bottom.png differ
diff --git a/data/stage2/image/battle/splash/shipcard-top.png b/data/stage2/image/battle/splash/shipcard-top.png
new file mode 100644
index 0000000..4172c9b
Binary files /dev/null and b/data/stage2/image/battle/splash/shipcard-top.png differ
diff --git a/graphics/exported/battle/tooltip/ship-portrait.png b/data/stage2/image/battle/tooltip/ship-portrait.png
similarity index 100%
rename from graphics/exported/battle/tooltip/ship-portrait.png
rename to data/stage2/image/battle/tooltip/ship-portrait.png
diff --git a/graphics/exported/battle/tooltip/ship-value.png b/data/stage2/image/battle/tooltip/ship-value.png
similarity index 100%
rename from graphics/exported/battle/tooltip/ship-value.png
rename to data/stage2/image/battle/tooltip/ship-value.png
diff --git a/graphics/exported/character/close-button-hover.png b/data/stage2/image/character/close-button-hover.png
similarity index 100%
rename from graphics/exported/character/close-button-hover.png
rename to data/stage2/image/character/close-button-hover.png
diff --git a/graphics/exported/character/close-button.png b/data/stage2/image/character/close-button.png
similarity index 100%
rename from graphics/exported/character/close-button.png
rename to data/stage2/image/character/close-button.png
diff --git a/graphics/exported/character/entry.png b/data/stage2/image/character/entry.png
similarity index 100%
rename from graphics/exported/character/entry.png
rename to data/stage2/image/character/entry.png
diff --git a/graphics/exported/character/initial.png b/data/stage2/image/character/initial.png
similarity index 100%
rename from graphics/exported/character/initial.png
rename to data/stage2/image/character/initial.png
diff --git a/graphics/exported/character/level-display.png b/data/stage2/image/character/level-display.png
similarity index 100%
rename from graphics/exported/character/level-display.png
rename to data/stage2/image/character/level-display.png
diff --git a/graphics/exported/character/level-experience.png b/data/stage2/image/character/level-experience.png
similarity index 100%
rename from graphics/exported/character/level-experience.png
rename to data/stage2/image/character/level-experience.png
diff --git a/graphics/exported/character/level-separator.png b/data/stage2/image/character/level-separator.png
similarity index 100%
rename from graphics/exported/character/level-separator.png
rename to data/stage2/image/character/level-separator.png
diff --git a/graphics/exported/character/level-upgrades.png b/data/stage2/image/character/level-upgrades.png
similarity index 100%
rename from graphics/exported/character/level-upgrades.png
rename to data/stage2/image/character/level-upgrades.png
diff --git a/graphics/exported/character/name-button-hover.png b/data/stage2/image/character/name-button-hover.png
similarity index 100%
rename from graphics/exported/character/name-button-hover.png
rename to data/stage2/image/character/name-button-hover.png
diff --git a/graphics/exported/character/name-button.png b/data/stage2/image/character/name-button.png
similarity index 100%
rename from graphics/exported/character/name-button.png
rename to data/stage2/image/character/name-button.png
diff --git a/graphics/exported/character/name-display.png b/data/stage2/image/character/name-display.png
similarity index 100%
rename from graphics/exported/character/name-display.png
rename to data/stage2/image/character/name-display.png
diff --git a/graphics/exported/character/portrait-hover.png b/data/stage2/image/character/portrait-hover.png
similarity index 100%
rename from graphics/exported/character/portrait-hover.png
rename to data/stage2/image/character/portrait-hover.png
diff --git a/graphics/exported/character/portrait-on.png b/data/stage2/image/character/portrait-on.png
similarity index 100%
rename from graphics/exported/character/portrait-on.png
rename to data/stage2/image/character/portrait-on.png
diff --git a/graphics/exported/character/portrait.png b/data/stage2/image/character/portrait.png
similarity index 100%
rename from graphics/exported/character/portrait.png
rename to data/stage2/image/character/portrait.png
diff --git a/out/assets/images/character/sheet.png b/data/stage2/image/character/sheet.png
similarity index 100%
rename from out/assets/images/character/sheet.png
rename to data/stage2/image/character/sheet.png
diff --git a/graphics/exported/character/ship-column.png b/data/stage2/image/character/ship-column.png
similarity index 100%
rename from graphics/exported/character/ship-column.png
rename to data/stage2/image/character/ship-column.png
diff --git a/graphics/exported/character/ship-description.png b/data/stage2/image/character/ship-description.png
similarity index 100%
rename from graphics/exported/character/ship-description.png
rename to data/stage2/image/character/ship-description.png
diff --git a/graphics/exported/character/ship-model.png b/data/stage2/image/character/ship-model.png
similarity index 100%
rename from graphics/exported/character/ship-model.png
rename to data/stage2/image/character/ship-model.png
diff --git a/graphics/exported/character/upgrade-hover.png b/data/stage2/image/character/upgrade-hover.png
similarity index 100%
rename from graphics/exported/character/upgrade-hover.png
rename to data/stage2/image/character/upgrade-hover.png
diff --git a/graphics/exported/character/upgrade-locked.png b/data/stage2/image/character/upgrade-locked.png
similarity index 100%
rename from graphics/exported/character/upgrade-locked.png
rename to data/stage2/image/character/upgrade-locked.png
diff --git a/graphics/exported/character/upgrade-on.png b/data/stage2/image/character/upgrade-on.png
similarity index 100%
rename from graphics/exported/character/upgrade-on.png
rename to data/stage2/image/character/upgrade-on.png
diff --git a/graphics/exported/character/upgrade-point.png b/data/stage2/image/character/upgrade-point.png
similarity index 100%
rename from graphics/exported/character/upgrade-point.png
rename to data/stage2/image/character/upgrade-point.png
diff --git a/graphics/exported/character/upgrade.png b/data/stage2/image/character/upgrade.png
similarity index 100%
rename from graphics/exported/character/upgrade.png
rename to data/stage2/image/character/upgrade.png
diff --git a/graphics/exported/ship/avenger/portrait.png b/data/stage2/image/ship/avenger/portrait.png
similarity index 100%
rename from graphics/exported/ship/avenger/portrait.png
rename to data/stage2/image/ship/avenger/portrait.png
diff --git a/graphics/exported/ship/avenger/sprite.png b/data/stage2/image/ship/avenger/sprite.png
similarity index 100%
rename from graphics/exported/ship/avenger/sprite.png
rename to data/stage2/image/ship/avenger/sprite.png
diff --git a/graphics/exported/ship/breeze/portrait.png b/data/stage2/image/ship/breeze/portrait.png
similarity index 100%
rename from graphics/exported/ship/breeze/portrait.png
rename to data/stage2/image/ship/breeze/portrait.png
diff --git a/graphics/exported/ship/breeze/sprite.png b/data/stage2/image/ship/breeze/sprite.png
similarity index 100%
rename from graphics/exported/ship/breeze/sprite.png
rename to data/stage2/image/ship/breeze/sprite.png
diff --git a/graphics/exported/ship/commodore/portrait.png b/data/stage2/image/ship/commodore/portrait.png
similarity index 100%
rename from graphics/exported/ship/commodore/portrait.png
rename to data/stage2/image/ship/commodore/portrait.png
diff --git a/graphics/exported/ship/commodore/sprite.png b/data/stage2/image/ship/commodore/sprite.png
similarity index 100%
rename from graphics/exported/ship/commodore/sprite.png
rename to data/stage2/image/ship/commodore/sprite.png
diff --git a/graphics/exported/ship/creeper/portrait.png b/data/stage2/image/ship/creeper/portrait.png
similarity index 100%
rename from graphics/exported/ship/creeper/portrait.png
rename to data/stage2/image/ship/creeper/portrait.png
diff --git a/graphics/exported/ship/creeper/sprite.png b/data/stage2/image/ship/creeper/sprite.png
similarity index 100%
rename from graphics/exported/ship/creeper/sprite.png
rename to data/stage2/image/ship/creeper/sprite.png
diff --git a/graphics/exported/ship/falcon/portrait.png b/data/stage2/image/ship/falcon/portrait.png
similarity index 100%
rename from graphics/exported/ship/falcon/portrait.png
rename to data/stage2/image/ship/falcon/portrait.png
diff --git a/graphics/exported/ship/falcon/sprite.png b/data/stage2/image/ship/falcon/sprite.png
similarity index 100%
rename from graphics/exported/ship/falcon/sprite.png
rename to data/stage2/image/ship/falcon/sprite.png
diff --git a/graphics/exported/ship/flea/portrait.png b/data/stage2/image/ship/flea/portrait.png
similarity index 100%
rename from graphics/exported/ship/flea/portrait.png
rename to data/stage2/image/ship/flea/portrait.png
diff --git a/graphics/exported/ship/flea/sprite.png b/data/stage2/image/ship/flea/sprite.png
similarity index 100%
rename from graphics/exported/ship/flea/sprite.png
rename to data/stage2/image/ship/flea/sprite.png
diff --git a/graphics/exported/ship/jumper/portrait.png b/data/stage2/image/ship/jumper/portrait.png
similarity index 100%
rename from graphics/exported/ship/jumper/portrait.png
rename to data/stage2/image/ship/jumper/portrait.png
diff --git a/graphics/exported/ship/jumper/sprite.png b/data/stage2/image/ship/jumper/sprite.png
similarity index 100%
rename from graphics/exported/ship/jumper/sprite.png
rename to data/stage2/image/ship/jumper/sprite.png
diff --git a/graphics/exported/ship/rhino/portrait.png b/data/stage2/image/ship/rhino/portrait.png
similarity index 100%
rename from graphics/exported/ship/rhino/portrait.png
rename to data/stage2/image/ship/rhino/portrait.png
diff --git a/graphics/exported/ship/rhino/sprite.png b/data/stage2/image/ship/rhino/sprite.png
similarity index 100%
rename from graphics/exported/ship/rhino/sprite.png
rename to data/stage2/image/ship/rhino/sprite.png
diff --git a/graphics/exported/ship/tomahawk/portrait.png b/data/stage2/image/ship/tomahawk/portrait.png
similarity index 100%
rename from graphics/exported/ship/tomahawk/portrait.png
rename to data/stage2/image/ship/tomahawk/portrait.png
diff --git a/graphics/exported/ship/tomahawk/sprite.png b/data/stage2/image/ship/tomahawk/sprite.png
similarity index 100%
rename from graphics/exported/ship/tomahawk/sprite.png
rename to data/stage2/image/ship/tomahawk/sprite.png
diff --git a/graphics/exported/ship/trapper/portrait.png b/data/stage2/image/ship/trapper/portrait.png
similarity index 100%
rename from graphics/exported/ship/trapper/portrait.png
rename to data/stage2/image/ship/trapper/portrait.png
diff --git a/graphics/exported/ship/trapper/sprite.png b/data/stage2/image/ship/trapper/sprite.png
similarity index 100%
rename from graphics/exported/ship/trapper/sprite.png
rename to data/stage2/image/ship/trapper/sprite.png
diff --git a/graphics/exported/ship/xander/portrait.png b/data/stage2/image/ship/xander/portrait.png
similarity index 100%
rename from graphics/exported/ship/xander/portrait.png
rename to data/stage2/image/ship/xander/portrait.png
diff --git a/graphics/exported/ship/xander/sprite.png b/data/stage2/image/ship/xander/sprite.png
similarity index 100%
rename from graphics/exported/ship/xander/sprite.png
rename to data/stage2/image/ship/xander/sprite.png
diff --git a/out/assets/sounds/battle/drone-activate.wav b/data/stage2/sound/battle/drone-activate.wav
similarity index 100%
rename from out/assets/sounds/battle/drone-activate.wav
rename to data/stage2/sound/battle/drone-activate.wav
diff --git a/out/assets/sounds/battle/drone-deploy.wav b/data/stage2/sound/battle/drone-deploy.wav
similarity index 100%
rename from out/assets/sounds/battle/drone-deploy.wav
rename to data/stage2/sound/battle/drone-deploy.wav
diff --git a/out/assets/sounds/battle/drone-destroy.wav b/data/stage2/sound/battle/drone-destroy.wav
similarity index 100%
rename from out/assets/sounds/battle/drone-destroy.wav
rename to data/stage2/sound/battle/drone-destroy.wav
diff --git a/out/assets/sounds/battle/effect1.wav b/data/stage2/sound/battle/effect1.wav
similarity index 100%
rename from out/assets/sounds/battle/effect1.wav
rename to data/stage2/sound/battle/effect1.wav
diff --git a/out/assets/sounds/battle/ship-change.wav b/data/stage2/sound/battle/ship-change.wav
similarity index 100%
rename from out/assets/sounds/battle/ship-change.wav
rename to data/stage2/sound/battle/ship-change.wav
diff --git a/out/assets/sounds/battle/weapon-bullets.wav b/data/stage2/sound/battle/weapon-bullets.wav
similarity index 100%
rename from out/assets/sounds/battle/weapon-bullets.wav
rename to data/stage2/sound/battle/weapon-bullets.wav
diff --git a/out/assets/sounds/battle/weapon-laser.cpt b/data/stage2/sound/battle/weapon-laser.cpt
similarity index 100%
rename from out/assets/sounds/battle/weapon-laser.cpt
rename to data/stage2/sound/battle/weapon-laser.cpt
diff --git a/out/assets/sounds/battle/weapon-laser.wav b/data/stage2/sound/battle/weapon-laser.wav
similarity index 100%
rename from out/assets/sounds/battle/weapon-laser.wav
rename to data/stage2/sound/battle/weapon-laser.wav
diff --git a/out/assets/sounds/battle/weapon-missile-explosion.wav b/data/stage2/sound/battle/weapon-missile-explosion.wav
similarity index 100%
rename from out/assets/sounds/battle/weapon-missile-explosion.wav
rename to data/stage2/sound/battle/weapon-missile-explosion.wav
diff --git a/out/assets/sounds/battle/weapon-missile-launch.wav b/data/stage2/sound/battle/weapon-missile-launch.wav
similarity index 100%
rename from out/assets/sounds/battle/weapon-missile-launch.wav
rename to data/stage2/sound/battle/weapon-missile-launch.wav
diff --git a/out/assets/sounds/music/mechanolith.mp3 b/data/stage2/sound/music/mechanolith.mp3
similarity index 100%
rename from out/assets/sounds/music/mechanolith.mp3
rename to data/stage2/sound/music/mechanolith.mp3
diff --git a/out/assets/sounds/ui/drag.wav b/data/stage2/sound/ui/drag.wav
similarity index 100%
rename from out/assets/sounds/ui/drag.wav
rename to data/stage2/sound/ui/drag.wav
diff --git a/out/assets/sounds/ui/drop.wav b/data/stage2/sound/ui/drop.wav
similarity index 100%
rename from out/assets/sounds/ui/drop.wav
rename to data/stage2/sound/ui/drop.wav
diff --git a/data/stage3/image/map/action-hover.png b/data/stage3/image/map/action-hover.png
new file mode 100644
index 0000000..09ff9d2
Binary files /dev/null and b/data/stage3/image/map/action-hover.png differ
diff --git a/data/stage3/image/map/action.png b/data/stage3/image/map/action.png
new file mode 100644
index 0000000..1f5bd20
Binary files /dev/null and b/data/stage3/image/map/action.png differ
diff --git a/out/assets/images/map/boundaries.png b/data/stage3/image/map/boundaries.png
similarity index 100%
rename from out/assets/images/map/boundaries.png
rename to data/stage3/image/map/boundaries.png
diff --git a/graphics/exported/map/current-location.png b/data/stage3/image/map/current-location.png
similarity index 100%
rename from graphics/exported/map/current-location.png
rename to data/stage3/image/map/current-location.png
diff --git a/graphics/exported/map/location-planet.png b/data/stage3/image/map/location-planet.png
similarity index 100%
rename from graphics/exported/map/location-planet.png
rename to data/stage3/image/map/location-planet.png
diff --git a/graphics/exported/map/location-star.png b/data/stage3/image/map/location-star.png
similarity index 100%
rename from graphics/exported/map/location-star.png
rename to data/stage3/image/map/location-star.png
diff --git a/graphics/exported/map/location-warp.png b/data/stage3/image/map/location-warp.png
similarity index 100%
rename from graphics/exported/map/location-warp.png
rename to data/stage3/image/map/location-warp.png
diff --git a/data/stage3/image/map/mission-action-accept-hover.png b/data/stage3/image/map/mission-action-accept-hover.png
new file mode 100644
index 0000000..358e198
Binary files /dev/null and b/data/stage3/image/map/mission-action-accept-hover.png differ
diff --git a/data/stage3/image/map/mission-action-accept.png b/data/stage3/image/map/mission-action-accept.png
new file mode 100644
index 0000000..9718c6c
Binary files /dev/null and b/data/stage3/image/map/mission-action-accept.png differ
diff --git a/data/stage3/image/map/mission-action-cancel-hover.png b/data/stage3/image/map/mission-action-cancel-hover.png
new file mode 100644
index 0000000..e075af4
Binary files /dev/null and b/data/stage3/image/map/mission-action-cancel-hover.png differ
diff --git a/data/stage3/image/map/mission-action-cancel.png b/data/stage3/image/map/mission-action-cancel.png
new file mode 100644
index 0000000..28b052c
Binary files /dev/null and b/data/stage3/image/map/mission-action-cancel.png differ
diff --git a/graphics/exported/map/mission-done.png b/data/stage3/image/map/mission-done.png
similarity index 100%
rename from graphics/exported/map/mission-done.png
rename to data/stage3/image/map/mission-done.png
diff --git a/graphics/exported/map/mission-main.png b/data/stage3/image/map/mission-main.png
similarity index 100%
rename from graphics/exported/map/mission-main.png
rename to data/stage3/image/map/mission-main.png
diff --git a/graphics/exported/map/mission-standard.png b/data/stage3/image/map/mission-standard.png
similarity index 100%
rename from graphics/exported/map/mission-standard.png
rename to data/stage3/image/map/mission-standard.png
diff --git a/graphics/exported/map/mission-warning.png b/data/stage3/image/map/mission-warning.png
similarity index 100%
rename from graphics/exported/map/mission-warning.png
rename to data/stage3/image/map/mission-warning.png
diff --git a/out/assets/images/map/name.png b/data/stage3/image/map/name.png
similarity index 100%
rename from out/assets/images/map/name.png
rename to data/stage3/image/map/name.png
diff --git a/graphics/exported/map/options-hover.png b/data/stage3/image/map/options-hover.png
similarity index 100%
rename from graphics/exported/map/options-hover.png
rename to data/stage3/image/map/options-hover.png
diff --git a/graphics/exported/map/options.png b/data/stage3/image/map/options.png
similarity index 100%
rename from graphics/exported/map/options.png
rename to data/stage3/image/map/options.png
diff --git a/out/assets/images/map/orbit.png b/data/stage3/image/map/orbit.png
similarity index 100%
rename from out/assets/images/map/orbit.png
rename to data/stage3/image/map/orbit.png
diff --git a/out/assets/images/map/starsystem-background.png b/data/stage3/image/map/starsystem-background.png
similarity index 100%
rename from out/assets/images/map/starsystem-background.png
rename to data/stage3/image/map/starsystem-background.png
diff --git a/graphics/exported/map/status-clear.png b/data/stage3/image/map/status-clear.png
similarity index 100%
rename from graphics/exported/map/status-clear.png
rename to data/stage3/image/map/status-clear.png
diff --git a/graphics/exported/map/status-dockyard.png b/data/stage3/image/map/status-dockyard.png
similarity index 100%
rename from graphics/exported/map/status-dockyard.png
rename to data/stage3/image/map/status-dockyard.png
diff --git a/graphics/exported/map/status-enemy.png b/data/stage3/image/map/status-enemy.png
similarity index 100%
rename from graphics/exported/map/status-enemy.png
rename to data/stage3/image/map/status-enemy.png
diff --git a/graphics/exported/map/status-unvisited.png b/data/stage3/image/map/status-unvisited.png
similarity index 100%
rename from graphics/exported/map/status-unvisited.png
rename to data/stage3/image/map/status-unvisited.png
diff --git a/out/assets/images/map/subname.png b/data/stage3/image/map/subname.png
similarity index 100%
rename from out/assets/images/map/subname.png
rename to data/stage3/image/map/subname.png
diff --git a/graphics/exported/map/zoom-in-hover.png b/data/stage3/image/map/zoom-in-hover.png
similarity index 100%
rename from graphics/exported/map/zoom-in-hover.png
rename to data/stage3/image/map/zoom-in-hover.png
diff --git a/graphics/exported/map/zoom-in.png b/data/stage3/image/map/zoom-in.png
similarity index 100%
rename from graphics/exported/map/zoom-in.png
rename to data/stage3/image/map/zoom-in.png
diff --git a/graphics/exported/map/zoom-out-hover.png b/data/stage3/image/map/zoom-out-hover.png
similarity index 100%
rename from graphics/exported/map/zoom-out-hover.png
rename to data/stage3/image/map/zoom-out-hover.png
diff --git a/graphics/exported/map/zoom-out.png b/data/stage3/image/map/zoom-out.png
similarity index 100%
rename from graphics/exported/map/zoom-out.png
rename to data/stage3/image/map/zoom-out.png
diff --git a/out/assets/shaders/map-background.glsl b/data/stage3/shader/map-background.glsl
similarity index 100%
rename from out/assets/shaders/map-background.glsl
rename to data/stage3/shader/map-background.glsl
diff --git a/out/assets/sounds/music/division.mp3 b/data/stage3/sound/music/division.mp3
similarity index 100%
rename from out/assets/sounds/music/division.mp3
rename to data/stage3/sound/music/division.mp3
diff --git a/out/assets/sounds/music/spring-thaw.mp3 b/data/stage3/sound/music/spring-thaw.mp3
similarity index 100%
rename from out/assets/sounds/music/spring-thaw.mp3
rename to data/stage3/sound/music/spring-thaw.mp3
diff --git a/out/assets/images/common/particles.xcf b/graphics/layered/particles.xcf
similarity index 100%
rename from out/assets/images/common/particles.xcf
rename to graphics/layered/particles.xcf
diff --git a/graphics/ui/options.svg b/graphics/ui/options.svg
index 470c6e9..265fdf3 100644
--- a/graphics/ui/options.svg
+++ b/graphics/ui/options.svg
@@ -351,11 +351,11 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:zoom="0.70000001"
- inkscape:cx="875.53821"
- inkscape:cy="617.34631"
+ inkscape:zoom="1.4"
+ inkscape:cx="1069.2736"
+ inkscape:cy="738.11651"
inkscape:document-units="px"
- inkscape:current-layer="layer5"
+ inkscape:current-layer="layer1"
showgrid="false"
units="px"
showborder="true"
@@ -472,15 +472,14 @@
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/options/toggle1.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
-
+
+
-
+
+
diff --git a/graphics/ui/title.svg b/graphics/ui/title.svg
index 6649146..c4b5744 100644
--- a/graphics/ui/title.svg
+++ b/graphics/ui/title.svg
@@ -12,14 +12,15 @@
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1920"
height="1080"
- viewBox="0 0 507.99999 285.75001"
+ viewBox="0 0 1920 1080"
version="1.1"
id="svg8"
sodipodi:docname="title.svg"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="/home/michael/workspace/spacetac/out/assets/images/menu/title.png"
inkscape:export-xdpi="96"
- inkscape:export-ydpi="96">
+ inkscape:export-ydpi="96"
+ enable-background="new">
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#283646;fill-opacity:1;fill-rule:evenodd;stroke:#283646;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ inkscape:connector-curvature="0" />
+ style="fill:#283646;fill-opacity:1;fill-rule:evenodd;stroke:#283646;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(0.3,0,0,0.3,-0.69,0)"
+ inkscape:connector-curvature="0" />
+ style="fill:#9bb0c9;fill-opacity:1;fill-rule:evenodd;stroke:#9bb0c9;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)"
+ inkscape:connector-curvature="0" />
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#9bb0c9;fill-opacity:1;fill-rule:evenodd;stroke:#9bb0c9;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ gradientTransform="matrix(3.7795277,0,0,3.7795277,22.967702,-22.228707)" />
+ height="4.1184998">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ x="818.22357"
+ y="740.38416"
+ style="fill:#ff0000;fill-opacity:1;stroke-width:1px" />
SpaceTac
+ x="464.10834"
+ y="476.76624"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:213.33335876px;line-height:24.98267937px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:url(#radialGradient5288);fill-opacity:1;stroke:url(#linearGradient5254);stroke-width:3.64724422;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">SpaceTac
@@ -505,7 +702,7 @@
y="0"
xlink:href="#g7596"
id="use7598"
- transform="matrix(-1,0,0,1,510.43903,0)"
+ transform="matrix(-1,0,0,1,1929.2185,0)"
width="100%"
height="100%"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/menu/title.png"
@@ -516,7 +713,7 @@
y="0"
xlink:href="#path7585"
id="use7600"
- transform="translate(75.629323)"
+ transform="matrix(3.7795277,0,0,3.7795277,285.84312,-31.269639)"
width="100%"
height="100%"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/menu/title.png"
@@ -527,15 +724,15 @@
y="0"
xlink:href="#use7600"
id="use7603"
- transform="translate(0,29.108755)"
+ transform="translate(0,110.01735)"
width="100%"
height="100%"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/menu/title.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
@@ -581,18 +778,18 @@
a tactical turn-based RPG
+ x="821.88324"
+ y="527.09326"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;letter-spacing:2.69000006px;fill:#8fa5be;fill-opacity:1;stroke-width:1px">a tactical turn-based RPG
New game
+ x="183.24765"
+ y="747.07294"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333588px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:#529aee;fill-opacity:1;stroke-width:1px">New game
Load game
+ x="816.1272"
+ y="748.71356"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333588px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:#529aee;fill-opacity:1;stroke-width:1px">Load game
Quick battle
+ x="1448.3295"
+ y="748.71356"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333588px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:#4b8ad4;fill-opacity:1;stroke-width:1px">Quick battle
Load a saved game
+ x="367.42151"
+ y="255.34229"
+ style="font-size:42.66666794px;fill:#ffffff;fill-opacity:1;stroke-width:1px">Load a saved game
Enter an invite code
+ x="360.79651"
+ y="473.05667"
+ style="font-size:42.66666794px;fill:#ffffff;fill-opacity:1;stroke-width:1px">Enter an invite code
@@ -701,18 +898,19 @@
inkscape:rounded="0"
inkscape:randomized="0"
d="m 348.01098,69.452232 0,-10.014587 8.67289,5.007294 z"
- inkscape:transform-center-x="-1.4454898"
- inkscape:transform-center-y="3.6247564e-06"
+ inkscape:transform-center-x="-5.463256"
+ inkscape:transform-center-y="1.0903118e-05"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/character/scroll.png"
inkscape:export-xdpi="96"
- inkscape:export-ydpi="96" />
+ inkscape:export-ydpi="96"
+ transform="scale(3.7795277)" />
@@ -720,16 +918,16 @@
x="0"
y="0"
xlink:href="#path4777"
- inkscape:transform-center-x="1.4454929"
- inkscape:transform-center-y="3.6247564e-06"
+ inkscape:transform-center-x="5.4632299"
+ inkscape:transform-center-y="1.0903118e-05"
id="use6554"
width="100%"
height="100%"
- transform="matrix(-1,0,0,1,586.38849,-6.6582243e-7)" />
+ transform="matrix(-1,0,0,1,2216.2716,-2.5164943e-6)" />
+ transform="matrix(3.7795277,0,0,3.7795277,-61.149917,-86.453132)">
+ transform="matrix(3.7795277,0,0,3.7795277,0,-1.395597e-5)">
+ inkscape:export-ydpi="96"
+ transform="scale(3.7795277)" />
+ transform="matrix(3.7795277,0,0,3.7795277,0,2.0000006)">
+ inkscape:export-ydpi="96"
+ transform="scale(3.7795277)">
- |
+
+
+ |
versus |
- |
+
+
+ |
- |
+
+
+ |
Win |
diff --git a/out/assets/images/battle/actionbar/button-menu.png b/out/assets/images/battle/actionbar/button-menu.png
deleted file mode 100644
index 7c74771..0000000
Binary files a/out/assets/images/battle/actionbar/button-menu.png and /dev/null differ
diff --git a/out/assets/images/battle/splash/base.png b/out/assets/images/battle/splash/base.png
deleted file mode 100644
index 3cdaa1e..0000000
Binary files a/out/assets/images/battle/splash/base.png and /dev/null differ
diff --git a/out/assets/images/battle/splash/shipcard.png b/out/assets/images/battle/splash/shipcard.png
deleted file mode 100644
index 12a403a..0000000
Binary files a/out/assets/images/battle/splash/shipcard.png and /dev/null differ
diff --git a/out/assets/images/common/dialog-close.png b/out/assets/images/common/dialog-close.png
deleted file mode 100644
index 65da8da..0000000
Binary files a/out/assets/images/common/dialog-close.png and /dev/null differ
diff --git a/out/assets/images/common/dialog-textbutton.png b/out/assets/images/common/dialog-textbutton.png
deleted file mode 100644
index 8d69f86..0000000
Binary files a/out/assets/images/common/dialog-textbutton.png and /dev/null differ
diff --git a/out/assets/images/map/action.png b/out/assets/images/map/action.png
deleted file mode 100644
index b7ec343..0000000
Binary files a/out/assets/images/map/action.png and /dev/null differ
diff --git a/out/assets/images/map/mission-action.png b/out/assets/images/map/mission-action.png
deleted file mode 100644
index a4ede33..0000000
Binary files a/out/assets/images/map/mission-action.png and /dev/null differ
diff --git a/out/assets/images/menu/button-hover.png b/out/assets/images/menu/button-hover.png
deleted file mode 100644
index 9a420f4..0000000
Binary files a/out/assets/images/menu/button-hover.png and /dev/null differ
diff --git a/out/assets/images/menu/button.png b/out/assets/images/menu/button.png
deleted file mode 100644
index 0a63c9c..0000000
Binary files a/out/assets/images/menu/button.png and /dev/null differ
diff --git a/out/assets/images/options/button.png b/out/assets/images/options/button.png
deleted file mode 100644
index 4d0c902..0000000
Binary files a/out/assets/images/options/button.png and /dev/null differ
diff --git a/out/assets/images/options/options.png b/out/assets/images/options/options.png
deleted file mode 100644
index f21d954..0000000
Binary files a/out/assets/images/options/options.png and /dev/null differ
diff --git a/out/assets/images/options/toggle.png b/out/assets/images/options/toggle.png
deleted file mode 100644
index 48a7d00..0000000
Binary files a/out/assets/images/options/toggle.png and /dev/null differ
diff --git a/out/assets/fonts/control-freak.regular.ttf b/out/fonts/control-freak.regular.ttf
similarity index 100%
rename from out/assets/fonts/control-freak.regular.ttf
rename to out/fonts/control-freak.regular.ttf
diff --git a/out/assets/fonts/daggersquare.regular.otf b/out/fonts/daggersquare.regular.otf
similarity index 100%
rename from out/assets/fonts/daggersquare.regular.otf
rename to out/fonts/daggersquare.regular.otf
diff --git a/out/assets/fonts/fragile-bombers.regular.ttf b/out/fonts/fragile-bombers.regular.ttf
similarity index 100%
rename from out/assets/fonts/fragile-bombers.regular.ttf
rename to out/fonts/fragile-bombers.regular.ttf
diff --git a/out/assets/fonts/mysterons-brk.normal.ttf b/out/fonts/mysterons-brk.normal.ttf
similarity index 100%
rename from out/assets/fonts/mysterons-brk.normal.ttf
rename to out/fonts/mysterons-brk.normal.ttf
diff --git a/out/assets/fonts/planetium-x.regular.otf b/out/fonts/planetium-x.regular.otf
similarity index 100%
rename from out/assets/fonts/planetium-x.regular.otf
rename to out/fonts/planetium-x.regular.otf
diff --git a/out/assets/images/common/particles.png b/out/images/common/particles.png
similarity index 100%
rename from out/assets/images/common/particles.png
rename to out/images/common/particles.png
diff --git a/out/assets/images/common/waiting.png b/out/images/common/waiting.png
similarity index 100%
rename from out/assets/images/common/waiting.png
rename to out/images/common/waiting.png
diff --git a/out/assets/images/preload/bar-background.png b/out/images/preload/bar-background.png
similarity index 100%
rename from out/assets/images/preload/bar-background.png
rename to out/images/preload/bar-background.png
diff --git a/out/assets/images/preload/bar-content.png b/out/images/preload/bar-content.png
similarity index 100%
rename from out/assets/images/preload/bar-content.png
rename to out/images/preload/bar-content.png
diff --git a/out/index.html b/out/index.html
index b7397b9..743d1ba 100644
--- a/out/index.html
+++ b/out/index.html
@@ -23,7 +23,7 @@
@font-face {
font-family: 'SpaceTac';
- src: url('assets/fonts/daggersquare.regular.otf');
+ src: url('fonts/daggersquare.regular.otf');
}
body {
diff --git a/package-lock.json b/package-lock.json
index 5bd8811..3bce92e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,52 +4,6 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
- "@taskr/shell": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@taskr/shell/-/shell-1.1.0.tgz",
- "integrity": "sha1-YDV8rNlKQvXFlqpxBUK4eQDcPwY=",
- "dev": true,
- "requires": {
- "execa": "0.7.0"
- }
- },
- "@taskr/uglify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@taskr/uglify/-/uglify-1.1.0.tgz",
- "integrity": "sha1-DIspLj3sr/4KTPQa7HEWEYWbyZg=",
- "dev": true,
- "requires": {
- "uglify-js": "2.8.29"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "dev": true,
- "requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
- }
- }
- }
- },
- "@taskr/watch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@taskr/watch/-/watch-1.1.0.tgz",
- "integrity": "sha1-v0RxeM+scfyZslD/RsQK0/lhc9Y=",
- "dev": true,
- "requires": {
- "chokidar": "1.7.0"
- }
- },
"@types/jasmine": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.6.tgz",
@@ -305,6 +259,12 @@
"integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
"dev": true
},
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
"array-filter": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
@@ -379,6 +339,12 @@
"integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
"dev": true
},
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
"ast-types": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.2.tgz",
@@ -401,6 +367,26 @@
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true
},
+ "async-done": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz",
+ "integrity": "sha512-mxc+yISkb0vjsuvG3dJCIZXzRWjKndQ9Zo9zNDJ1K2wh9eP0E0oGmOWm+4cFOvW4dA0tGFImTW5tQJHCtn1kIQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0",
+ "process-nextick-args": "1.0.7",
+ "stream-exhaust": "1.0.2"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ }
+ }
+ },
"async-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
@@ -418,6 +404,12 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
+ "atob": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+ "dev": true
+ },
"aws-sign2": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
@@ -480,6 +472,38 @@
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
"base64-arraybuffer": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
@@ -903,6 +927,31 @@
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
"dev": true
},
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
"cached-path-relative": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
@@ -942,6 +991,7 @@
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
"dev": true,
+ "optional": true,
"requires": {
"align-text": "0.1.4",
"lazy-cache": "1.0.4"
@@ -993,11 +1043,104 @@
"integrity": "sha512-UjgcRlTAhAkLeXmDe2wK7ktwy/tgAqxiSndTIPiFZuIPLZmzHzWMwUIe9h9m/OokypG7snxCDEuwJshGBdPvaw==",
"dev": true
},
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
"cliui": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"dev": true,
+ "optional": true,
"requires": {
"center-align": "0.1.3",
"right-align": "0.1.3",
@@ -1008,16 +1151,11 @@
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
- "clor": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/clor/-/clor-5.2.0.tgz",
- "integrity": "sha512-Z+jjxoF4lNUJQtsdz7d9HLz7yP49hnt4CH76AB7DLusHws14gOlVMl/ShtkMPfoFculqejaiQW5EG2Gt5/cCdg==",
- "dev": true
- },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -1035,6 +1173,31 @@
"urlgrey": "0.4.4"
}
},
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
@@ -1193,6 +1356,12 @@
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
"dev": true
},
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
"core-js": {
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
@@ -1250,29 +1419,6 @@
"sha.js": "2.4.10"
}
},
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "dev": true,
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "dev": true,
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- }
- }
- },
"cryptiles": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
@@ -1377,12 +1523,36 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
"defined": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
@@ -1553,6 +1723,15 @@
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"dev": true
},
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
"engine.io": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
@@ -1653,8 +1832,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true,
- "optional": true
+ "dev": true
},
"escodegen": {
"version": "1.9.1",
@@ -1732,21 +1910,6 @@
"safe-buffer": "5.1.1"
}
},
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "dev": true,
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- }
- },
"exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -2018,6 +2181,15 @@
"mime-types": "2.1.18"
}
},
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -2101,6 +2273,21 @@
"glob": "5.0.15",
"mustache": "2.3.0",
"optimist": "0.6.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ }
}
},
"generate-function": {
@@ -2126,12 +2313,6 @@
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
"dev": true
},
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
- "dev": true
- },
"get-uri": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz",
@@ -2147,6 +2328,12 @@
"readable-stream": "2.3.5"
}
},
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -2165,11 +2352,12 @@
}
},
"glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"requires": {
+ "fs.realpath": "1.0.0",
"inflight": "1.0.6",
"inherits": "2.0.3",
"minimatch": "3.0.4",
@@ -2196,6 +2384,362 @@
"is-glob": "2.0.1"
}
},
+ "glob-watcher": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz",
+ "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==",
+ "dev": true,
+ "requires": {
+ "async-done": "1.2.4",
+ "chokidar": "2.0.2",
+ "just-debounce": "1.0.0",
+ "object.defaults": "1.1.0"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "3.1.9",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
+ "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "kind-of": "6.0.2",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.1",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz",
+ "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "2.0.0",
+ "async-each": "1.0.1",
+ "braces": "2.3.1",
+ "glob-parent": "3.1.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "4.0.0",
+ "normalize-path": "2.1.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0",
+ "upath": "1.0.4"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
+ "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.1",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.2"
+ }
+ }
+ }
+ },
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
@@ -2310,6 +2854,66 @@
"integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
"dev": true
},
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
"hash-base": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
@@ -2597,6 +3201,12 @@
}
}
},
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
"ip": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz",
@@ -2604,6 +3214,23 @@
"dev": true,
"optional": true
},
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -2634,6 +3261,42 @@
"builtin-modules": "1.1.1"
}
},
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
"is-dotfile": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
@@ -2709,6 +3372,40 @@
"kind-of": "3.2.2"
}
},
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
"is-posix-bracket": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
@@ -2746,6 +3443,12 @@
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
"is-wsl": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
@@ -2832,6 +3535,19 @@
"integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
"dev": true
},
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
"resolve": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
@@ -2991,6 +3707,12 @@
}
}
},
+ "just-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
+ "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "dev": true
+ },
"karma": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/karma/-/karma-2.0.0.tgz",
@@ -3142,7 +3864,8 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"levn": {
"version": "0.3.0",
@@ -3306,6 +4029,12 @@
"integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
"dev": true
},
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
"log4js": {
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/log4js/-/log4js-2.5.3.tgz",
@@ -3516,6 +4245,12 @@
}
}
},
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
@@ -3528,6 +4263,15 @@
"integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
"dev": true
},
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
"md5.js": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
@@ -3582,6 +4326,30 @@
}
}
},
+ "microargs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/microargs/-/microargs-1.1.0.tgz",
+ "integrity": "sha1-XsPNi9dzf1fUhVlBMZM+qUMJ+1k=",
+ "dev": true
+ },
+ "microcli": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/microcli/-/microcli-1.3.1.tgz",
+ "integrity": "sha512-0MQ0w457h33GuktLJwzA/EmZK9B7QwcG5FqWM+7Ep5XPkFJvT3vZ6XIDaqUXYLpDAqsCSnhTKTWzWiDbXkn8mQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4",
+ "microargs": "1.1.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ }
+ }
+ },
"micromatch": {
"version": "2.3.11",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
@@ -3661,11 +4429,26 @@
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
"dev": true
},
- "mk-dirs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/mk-dirs/-/mk-dirs-1.0.0.tgz",
- "integrity": "sha1-RO5n+CNBxnYnGOiOheV3iC4fZ/0=",
- "dev": true
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
},
"mkdirp": {
"version": "0.5.1",
@@ -3720,12 +4503,6 @@
"on-headers": "1.0.1"
}
},
- "mri": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz",
- "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=",
- "dev": true
- },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -3738,6 +4515,65 @@
"integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=",
"dev": true
},
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
"negotiator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@@ -3873,15 +4709,6 @@
"remove-trailing-separator": "1.1.0"
}
},
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "dev": true,
- "requires": {
- "path-key": "2.0.1"
- }
- },
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
@@ -3906,6 +4733,117 @@
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
"dev": true
},
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
"object.omit": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
@@ -3916,6 +4854,29 @@
"is-extendable": "0.1.1"
}
},
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "omelette": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/omelette/-/omelette-0.4.5.tgz",
+ "integrity": "sha512-b0k9uqwF60u15KmVkneVw96VYRtZu2QCbXUQ26SgdyVUgMBzctzIfhNPKAWl4oqJEKpe52CzBYSS+HIKtiK8sw==",
+ "dev": true
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -3993,12 +4954,6 @@
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true
- },
"pac-proxy-agent": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz",
@@ -4123,12 +5078,24 @@
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
"dev": true
},
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
"path-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
"integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
"dev": true
},
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
@@ -4144,12 +5111,6 @@
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
- },
"path-parse": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
@@ -4294,6 +5255,12 @@
}
}
},
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -4538,6 +5505,15 @@
"set-immediate-shim": "1.0.1"
}
},
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.5.0"
+ }
+ },
"redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
@@ -4588,6 +5564,37 @@
"is-equal-shallow": "0.1.3"
}
},
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
"remap-istanbul": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.10.1.tgz",
@@ -4734,11 +5741,24 @@
"path-parse": "1.0.5"
}
},
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
"right-align": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"dev": true,
+ "optional": true,
"requires": {
"align-text": "0.1.4"
}
@@ -4778,11 +5798,69 @@
"inherits": "2.0.3"
}
},
+ "runjs": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/runjs/-/runjs-4.3.0.tgz",
+ "integrity": "sha512-TQLLO6bJ5Ht1aEiF002nzdn99HeoaVt7P34nCio1AjKA8zCAgeqHOBVdJAWQ8F3SOlxVbWjina9FRE+3TFsZSg==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.0",
+ "lodash.padend": "4.6.1",
+ "microcli": "1.3.1",
+ "omelette": "0.4.5"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
@@ -4833,12 +5911,44 @@
"parseurl": "1.3.2"
}
},
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "dev": true,
+ "requires": {
+ "to-object-path": "0.3.0"
+ }
+ },
"set-immediate-shim": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
"dev": true
},
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
"setprototypeof": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
@@ -4876,21 +5986,6 @@
}
}
},
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "dev": true,
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
"shell-quote": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
@@ -4903,6 +5998,33 @@
"jsonify": "0.0.0"
}
},
+ "shelljs": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz",
+ "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "interpret": "1.1.0",
+ "rechoir": "0.6.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ }
+ }
+ },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -4935,6 +6057,142 @@
"nodemailer-shared": "1.1.0"
}
},
+ "snapdragon": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
+ "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
"sntp": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
@@ -5048,6 +6306,25 @@
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.0.3",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
"spdx-correct": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
@@ -5089,6 +6366,36 @@
"through": "2.3.8"
}
},
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -5119,6 +6426,84 @@
}
}
},
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
@@ -5154,6 +6539,12 @@
"readable-stream": "2.3.5"
}
},
+ "stream-exhaust": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+ "dev": true
+ },
"stream-http": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz",
@@ -5234,12 +6625,6 @@
"is-utf8": "0.2.1"
}
},
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
- "dev": true
- },
"strip-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
@@ -5282,36 +6667,6 @@
"acorn-node": "1.3.0"
}
},
- "taskr": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/taskr/-/taskr-1.1.0.tgz",
- "integrity": "sha1-TynQrOJvTerppHjqv5qgQy6IRDg=",
- "dev": true,
- "requires": {
- "bluebird": "3.5.1",
- "clor": "5.2.0",
- "glob": "7.1.2",
- "mk-dirs": "1.0.0",
- "mri": "1.1.0",
- "tinydate": "1.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- }
- }
- },
"throttleit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
@@ -5357,12 +6712,6 @@
"dev": true,
"optional": true
},
- "tinydate": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.0.0.tgz",
- "integrity": "sha1-IPMXVqE5We+MV+wTO6KbWt4ELKw=",
- "dev": true
- },
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -5384,6 +6733,69 @@
"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
"dev": true
},
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
@@ -5493,6 +6905,47 @@
"integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
"dev": true
},
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
"unix-crypt-td-js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz",
@@ -5505,6 +6958,64 @@
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"dev": true
},
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
+ "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
"url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
@@ -5529,6 +7040,100 @@
"integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=",
"dev": true
},
+ "use": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
+ "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "lazy-cache": "2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "dev": true,
+ "requires": {
+ "set-getter": "0.1.0"
+ }
+ }
+ }
+ },
"useragent": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
@@ -5679,7 +7284,8 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"wordwrap": {
"version": "0.0.3",
@@ -5738,6 +7344,7 @@
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"dev": true,
+ "optional": true,
"requires": {
"camelcase": "1.2.1",
"cliui": "2.1.0",
@@ -5749,7 +7356,8 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
diff --git a/package.json b/package.json
index abe7d61..09f8e4d 100644
--- a/package.json
+++ b/package.json
@@ -4,11 +4,11 @@
"description": "A tactical RPG set in space",
"main": "out/build.js",
"scripts": {
- "build": "taskr build",
- "test": "taskr test",
- "start": "taskr",
+ "build": "run build",
+ "test": "run test",
+ "start": "run continuous",
"codecov": "remap-istanbul -i out/coverage/coverage.json -o out/coverage/mapped.json -t json && codecov -f out/coverage/mapped.json",
- "deploy": "taskr deploy"
+ "deploy": "run deploy"
},
"repository": {
"type": "git",
@@ -17,12 +17,12 @@
"author": "Michael Lemaire",
"license": "MIT",
"devDependencies": {
- "@taskr/shell": "^1.1.0",
- "@taskr/watch": "^1.1.0",
"@types/jasmine": "^2.8.6",
"babel-polyfill": "6.26.0",
"codecov": "3.0.0",
"gamefroot-texture-packer": "Gamefroot/Gamefroot-Texture-Packer.git#f3687111afc94f80ea8f2877c188fb8e2004e8ff",
+ "glob": "^7.1.2",
+ "glob-watcher": "^5.0.1",
"jasmine": "^2.9.0",
"karma": "^2.0.0",
"karma-coverage": "1.1.1",
@@ -31,7 +31,8 @@
"karma-spec-reporter": "^0.0.32",
"live-server": "1.2.0",
"remap-istanbul": "^0.10.1",
- "taskr": "^1.1.0",
+ "runjs": "^4.3.0",
+ "shelljs": "^0.8.1",
"typescript": "^2.7.1",
"uglify-js": "^3.3.13"
},
@@ -40,4 +41,4 @@
"parse": "^1.11.0",
"phaser": "2.6.2"
}
-}
\ No newline at end of file
+}
diff --git a/runfile.js b/runfile.js
new file mode 100644
index 0000000..d1f8342
--- /dev/null
+++ b/runfile.js
@@ -0,0 +1,236 @@
+'use strict';
+
+const path = require('path');
+const fs = require('fs');
+const { run } = require('runjs');
+const glob = require('glob');
+const watch = require('glob-watcher');
+const shell = require('shelljs');
+const liveServer = require('live-server');
+const gfPacker = require('gamefroot-texture-packer');
+
+String.prototype.rsplit = function (sep, maxsplit) {
+ var split = this.split(sep);
+ return maxsplit ? [split.slice(0, -maxsplit).join(sep)].concat(split.slice(-maxsplit)) : split;
+}
+
+/**
+ * Promise-compatible version of glob
+ */
+function list(pattern) {
+ return new Promise((resolve, reject) => {
+ glob(pattern, (err, files) => (err) ? reject(err) : resolve(files));
+ });
+}
+
+/**
+ * Asynchronous execution of shell commands
+ */
+function exec(command) {
+ return run(command, { async: true });
+}
+
+/**
+ * Build app from typescript sources
+ */
+function ts() {
+ console.log("Building app...");
+ return exec("tsc -p .");
+}
+
+/**
+ * Start watching for typescript changes
+ */
+function watch_ts() {
+ watch(["./src/**/*.ts"], ts);
+}
+
+/**
+ * Build an atlas of images for a given stage
+ */
+function atlas(stage) {
+ shell.rm('-f', `out/assets/atlas${stage}-*`);
+ return list(`data/stage${stage}/image/**/*.{png,jpg}`).then(files => {
+ let opts = {
+ name: `out/assets/atlas${stage}`,
+ fullpath: true,
+ width: 1024,
+ height: 1024,
+ square: true,
+ powerOfTwo: true,
+ trim: true,
+ padding: 2
+ };
+ return new Promise(resolve => gfPacker(files, opts, resolve));
+ }).then(() => {
+ return list(`out/assets/atlas${stage}-*.json`);
+ }).then(outfiles => {
+ return Promise.resolve(outfiles.map(file => path.basename(file).replace('.json', '')))
+ });
+}
+
+/**
+ * Build a single data pack
+ */
+function pack(stage) {
+ console.log(`Building pack ${stage}...`);
+
+ let getKey = x => x.replace(/\//g, "-").replace(/\.[a-z0-9]+$/, '');
+
+ return atlas(stage).then(files => {
+ return Promise.resolve(files.map(file => {
+ let fname = path.basename(file);
+ return {
+ type: "atlasJSONHash",
+ key: fname,
+ atlasURL: `assets/${fname}.json`,
+ textureURL: `assets/${fname}.png`,
+ atlasData: null
+ }
+ }));
+ }).then(items => {
+ return list(`data/stage${stage}/sound/**/*.{mp3,wav}`).then(files => {
+ return Promise.resolve(items.concat(files.map(file => {
+ const [name, ext] = file.rsplit('.');
+ const key = getKey(name.replace(`data/stage${stage}/sound/`, ''));
+ shell.cp(file, `out/assets/${key}.${ext}`);
+ return {
+ type: "audio",
+ key: key,
+ urls: [`assets/${key}.${ext}`],
+ autoDecode: (ext == 'mp3')
+ };
+ })));
+ });
+ }).then(items => {
+ return list(`data/stage${stage}/shader/**/*.glsl`).then(files => {
+ return Promise.resolve(items.concat(files.map(file => {
+ const [name, ext] = file.rsplit('.');
+ const key = getKey(name.replace(`data/stage${stage}/shader/`, ''));
+ shell.cp(file, `out/assets/${key}.${ext}`);
+ return {
+ type: "shader",
+ key: key,
+ url: `assets/${key}.${ext}`
+ };
+ })));
+ });
+ }).then(items => {
+ let packdata = {};
+ packdata[`stage${stage}`] = items;
+ return new Promise(resolve => fs.writeFile(`out/assets/pack${stage}.json`, JSON.stringify(packdata), 'utf8', resolve));
+ });
+}
+
+/**
+ * Build data packs
+ */
+function data() {
+ shell.mkdir("-p", "out/assets");
+ return Promise.all([1, 2, 3].map(stage => pack(stage)));
+}
+
+/**
+ * Start watch for data changes
+ */
+function watch_data() {
+ watch(["./data/**/*.*"], data);
+}
+
+/**
+ * Copy the vendors from node_modules to dist directory
+ */
+function vendors() {
+ console.log("Copying vendors...");
+ shell.rm('-rf', 'out/vendor');
+ shell.mkdir('-p', 'out/vendor');
+ shell.cp('-R', 'node_modules/phaser/build', 'out/vendor/phaser');
+ shell.cp('-R', 'node_modules/parse/dist', 'out/vendor/parse');
+ shell.cp('-R', 'node_modules/jasmine-core/lib/jasmine-core', 'out/vendor/jasmine');
+ return Promise.resolve();
+}
+
+/**
+ * Start watching for vendors changes
+ */
+function watch_vendors() {
+ watch(['package.json'], vendors);
+}
+
+/**
+ * Trigger a single build
+ */
+function build() {
+ return Promise.all([
+ ts(),
+ data(),
+ vendors()
+ ]);
+}
+
+/**
+ * Optimize the build for production
+ */
+function optimize() {
+ return exec("uglifyjs out/build.js --source-map --output out/build.min.js");
+}
+
+/**
+ * Deploy to production
+ */
+function deploy(task) {
+ return build().then(optimize).then(() => {
+ return exec("rsync -avz --delete ./out/ hosting.thunderk.net:/srv/website/spacetac/")
+ });
+}
+
+/**
+ * Run tests in karma, using freshly built app
+ */
+function test(task) {
+ return build().then(() => {
+ return exec("karma start spec/support/karma.conf.js");
+ }).then(() => {
+ return exec("remap-istanbul -i out/coverage/coverage.json -o out/coverage -t html");
+ });
+}
+
+/**
+ * Serve the app for dev purpose
+ */
+function serve() {
+ liveServer.start({
+ host: '127.0.0.1',
+ port: 8012,
+ root: 'out',
+ ignore: 'coverage',
+ wait: 500
+ });
+ return new Promise(() => null);
+}
+
+/**
+ * Continuous development server
+ */
+function continuous() {
+ return build().then(() => Promise.all([
+ serve(),
+ watch_ts(),
+ watch_data(),
+ watch_vendors()
+ ]));
+}
+
+module.exports = {
+ ts,
+ watch_ts,
+ data,
+ watch_data,
+ vendors,
+ watch_vendors,
+ build,
+ test,
+ deploy,
+ serve,
+ continuous
+}
diff --git a/src/ui/AssetLoading.ts b/src/ui/AssetLoading.ts
index 7f1f27c..96cdb00 100644
--- a/src/ui/AssetLoading.ts
+++ b/src/ui/AssetLoading.ts
@@ -41,89 +41,21 @@ module TK.SpaceTac.UI {
if (this.required >= AssetLoadingRange.MENU && AssetLoading.loaded < AssetLoadingRange.MENU) {
console.log("Loading menu assets");
+ this.load.pack("stage1", "assets/pack1.json");
- this.loadSound("ui/button-down.wav");
- this.loadSound("ui/button-up.wav");
- this.loadSound("ui/button-click.wav");
- this.loadSound("ui/dialog-open.wav");
- this.loadSound("ui/dialog-close.wav");
-
- this.loadSheet("options/options.png", 128, 128);
-
+ // TODO pack
this.loadSheet("common/particles.png", 32);
- this.loadImage("common/transparent.png");
- this.loadImage("common/debug.png");
this.loadAnimation("common/waiting.png", 128, 128, 6);
- this.loadImage("common/arrow.png");
- this.loadImage("common/button-ok.png");
- this.loadImage("common/button-cancel.png");
- this.loadImage("common/dialog.png");
- this.loadSheet("common/dialog-textbutton.png", 316, 59);
- this.loadSheet("common/dialog-close.png", 92, 82);
-
- this.loadImage("menu/title.png");
- this.loadImage("menu/button.png");
- this.loadImage("menu/button-hover.png");
- this.loadImage("menu/load-bg.png");
-
- this.loadSound("music/supernatural.mp3");
}
if (this.required >= AssetLoadingRange.BATTLE && AssetLoading.loaded < AssetLoadingRange.BATTLE) {
console.log("Loading battle assets");
-
- // TODO automatic range
- range(4).forEach(i => this.loadAtlas(i + 1));
-
- this.loadImage("options/background.png");
- this.loadSheet("options/button.png", 497, 134);
- this.loadSheet("options/toggle.png", 149, 149);
-
- this.loadSheet("battle/splash/base.png", 853, 210);
- this.loadSheet("battle/splash/shipcard.png", 99, 114);
- this.loadImage("battle/background.jpg");
- this.loadImage("battle/actionbar/background.png");
- this.loadImage("battle/actionbar/actions-background.png");
- this.loadSheet("battle/actionbar/button-menu.png", 79, 132);
- this.loadImage("battle/arena/background.png");
- this.loadImage("battle/shiplist/background.png");
- this.loadImage("battle/shiplist/item-background.png");
- this.loadImage("battle/shiplist/damage.png");
- this.loadImage("battle/shiplist/hover.png");
- this.loadImage("battle/shiplist/info-button.png");
-
- this.loadImage("character/sheet.png");
-
- this.loadSound("ui/drag.wav");
- this.loadSound("ui/drop.wav");
-
- this.loadSound("battle/ship-change.wav");
- this.loadSound("battle/weapon-laser.wav");
- this.loadSound("battle/weapon-bullets.wav");
- this.loadSound("battle/weapon-missile-launch.wav");
- this.loadSound("battle/weapon-missile-explosion.wav");
- this.loadSound("battle/drone-deploy.wav");
- this.loadSound("battle/drone-destroy.wav");
- // this.loadSound("battle/drone-activate.wav");
-
- this.loadSound("music/mechanolith.mp3");
+ this.load.pack("stage2", "assets/pack2.json");
}
if (this.required >= AssetLoadingRange.CAMPAIGN && AssetLoading.loaded < AssetLoadingRange.CAMPAIGN) {
console.log("Loading campaign assets");
-
- this.loadImage("map/starsystem-background.png");
- this.loadImage("map/name.png");
- this.loadImage("map/subname.png");
- this.loadSheet("map/action.png", 323, 192);
- this.loadImage("map/orbit.png");
- this.loadImage("map/boundaries.png");
- this.loadSheet("map/mission-action.png", 192, 56);
-
- this.loadSound("music/division.mp3");
- this.loadSound("music/spring-thaw.mp3");
-
- this.loadShader("map-background.glsl");
+ this.load.pack("stage3", "assets/pack3.json");
}
this.load.start();
@@ -140,28 +72,12 @@ module TK.SpaceTac.UI {
return path.replace(/\//g, "-").replace(/\.[a-z0-9]+$/, '');
}
- loadAtlas(index: number) {
- this.load.atlasJSONHash(`atlas-${index}`, `assets/atlas-${index}.png`, `assets/atlas-${index}.json`);
- }
-
loadSheet(path: string, frame_width: number, frame_height = frame_width) {
- this.load.spritesheet(AssetLoading.getKey(path), "assets/images/" + path, frame_width, frame_height);
+ this.load.spritesheet(AssetLoading.getKey(path), "images/" + path, frame_width, frame_height);
}
loadAnimation(path: string, frame_width: number, frame_height = frame_width, count?: number) {
- this.load.spritesheet(AssetLoading.getKey(path), "assets/images/" + path, frame_width, frame_height, count);
- }
-
- loadImage(path: string) {
- this.load.image(AssetLoading.getKey(path), "assets/images/" + path);
- }
-
- loadSound(path: string) {
- this.load.audio(AssetLoading.getKey(path), "assets/sounds/" + path);
- }
-
- loadShader(path: string) {
- this.load.shader(AssetLoading.getKey(path), "assets/shaders/" + path);
+ this.load.spritesheet(AssetLoading.getKey(path), "images/" + path, frame_width, frame_height, count);
}
}
}
diff --git a/src/ui/BaseView.ts b/src/ui/BaseView.ts
index fa61705..bf04419 100644
--- a/src/ui/BaseView.ts
+++ b/src/ui/BaseView.ts
@@ -248,15 +248,17 @@ module TK.SpaceTac.UI {
if (this.game.cache.checkImageKey(name)) {
return { key: name, frame: 0, exists: true };
} else {
- let i = 1;
- while (this.game.cache.checkImageKey(`atlas-${i}`)) {
- let data = this.game.cache.getFrameData(`atlas-${i}`);
- let frames = data.getFrames();
- let frame = first(frames, frame => AssetLoading.getKey(frame.name) == `graphics-exported-${name}`);
- if (frame) {
- return { key: `atlas-${i}`, frame: frame.index, exists: true };
+ for (let j = 1; j <= 3; j++) {
+ let i = 1;
+ while (this.game.cache.checkImageKey(`atlas${j}-${i}`)) {
+ let data = this.game.cache.getFrameData(`atlas${j}-${i}`);
+ let frames = data.getFrames();
+ let frame = first(frames, frame => AssetLoading.getKey(frame.name) == `data-stage${j}-image-${name}`);
+ if (frame) {
+ return { key: `atlas${j}-${i}`, frame: frame.index, exists: true };
+ }
+ i++;
}
- i++;
}
return { key: `-missing-${name}`, frame: 0, exists: false };
}
diff --git a/src/ui/Boot.ts b/src/ui/Boot.ts
index ab9361d..09e18f0 100644
--- a/src/ui/Boot.ts
+++ b/src/ui/Boot.ts
@@ -7,8 +7,8 @@ module TK.SpaceTac.UI {
export class Boot extends Phaser.State {
preload() {
if (!(this.game).headless) {
- this.load.image("preload-background", "assets/images/preload/bar-background.png");
- this.load.image("preload-bar", "assets/images/preload/bar-content.png");
+ this.load.image("preload-background", "images/preload/bar-background.png");
+ this.load.image("preload-bar", "images/preload/bar-content.png");
}
}
diff --git a/src/ui/battle/ActionBar.ts b/src/ui/battle/ActionBar.ts
index 958b75b..964ae8d 100644
--- a/src/ui/battle/ActionBar.ts
+++ b/src/ui/battle/ActionBar.ts
@@ -10,7 +10,7 @@ module TK.SpaceTac.UI {
// Power indicator
power: Phaser.Group
- power_icons: Phaser.Group
+ power_icons!: Phaser.Group
// Indicator of interaction disabled
icon_waiting: Phaser.Image
@@ -31,23 +31,24 @@ module TK.SpaceTac.UI {
battleview.layer_borders.add(this);
+ let builder = new UIBuilder(battleview, this);
+
// Background
- this.add(new Phaser.Image(this.game, 0, 0, "battle-actionbar-background", 0));
+ builder.image("battle-actionbar-background");
// Group for actions
- this.actions = this.game.add.group(this, "actions");
- this.actions.position.set(86, 6);
- this.actions.add(new Phaser.Image(this.game, 0, 0, "battle-actionbar-actions-background"));
+ this.actions = builder.group("actions", 86, 6);
+ builder.in(this.actions).image("battle-actionbar-actions-background");
// Power bar
- this.power = this.game.add.group(this, "power");
- this.power.position.set(1468, 0);
- this.power.add(battleview.newImage("battle-actionbar-power-background", 0, 6));
- this.power_icons = this.game.add.group(this.power, "power icons");
- this.power_icons.position.set(50, 14);
+ this.power = builder.group("power", 1468, 0);
+ builder.in(this.power, builder => {
+ builder.image("battle-actionbar-power-background", 0, 6);
+ this.power_icons = builder.group("power icons", 50, 14);
+ });
// Playing ship
- this.add(battleview.newImage("battle-actionbar-ship", 1730, -2));
+ builder.image("battle-actionbar-ship", 1730, -2);
// Waiting icon
this.icon_waiting = new Phaser.Image(this.game, this.width / 2, this.height / 2, "common-waiting", 0);
@@ -56,8 +57,7 @@ module TK.SpaceTac.UI {
this.add(this.icon_waiting);
// Options button
- let button = battleview.add.button(0, 0, "battle-actionbar-button-menu", () => battleview.showOptions(), null, 1, 0, 0, 1, this);
- battleview.tooltip.bindStaticText(button, "Game options");
+ builder.button("battle-actionbar-button-menu", 0, 0, () => battleview.showOptions(), "Game options");
// Log processing
battleview.log_processor.register(diff => {
diff --git a/src/ui/battle/Arena.ts b/src/ui/battle/Arena.ts
index e7eafca..e6d1c79 100644
--- a/src/ui/battle/Arena.ts
+++ b/src/ui/battle/Arena.ts
@@ -93,7 +93,8 @@ module TK.SpaceTac.UI {
setupMouseCapture() {
let view = this.view;
- var background = new Phaser.Button(view.game, 0, 0, "battle-arena-background");
+ let info = view.getImageInfo("battle-arena-background");
+ var background = new Phaser.Button(view.game, 0, 0, info.key, undefined, undefined, info.frame, info.frame);
background.name = "mouse-capture";
background.scale.set(this.boundaries.width / background.width, this.boundaries.height / background.height);
this.mouse_capture = background;
diff --git a/src/ui/battle/BattleSplash.ts b/src/ui/battle/BattleSplash.ts
index dab3446..872a41d 100644
--- a/src/ui/battle/BattleSplash.ts
+++ b/src/ui/battle/BattleSplash.ts
@@ -11,50 +11,35 @@ module TK.SpaceTac.UI {
constructor(view: BaseView, fleet1: Fleet, fleet2: Fleet) {
this.view = view;
- this.message = view.game.add.image(view.getMidWidth(), view.getMidHeight(), "battle-splash-base", 0);
- this.message.anchor.set(0.5);
+ let builder = new UIBuilder(view);
+
+ this.message = builder.image("battle-splash-message-off", view.getMidWidth(), view.getMidHeight(), true);
this.message.visible = false;
- this.player1 = view.game.add.image(0, -70, "battle-splash-base", 2);
- this.player1.anchor.set(0.5);
+ this.player1 = builder.in(this.message).image("battle-splash-moving-part", 0, -70, true);
this.player1.visible = false;
- this.message.addChild(this.player1);
- let player1_name = view.game.add.text(-240, 22, fleet1.name, { font: `bold 22pt SpaceTac`, fill: "#154d13" });
- player1_name.anchor.set(0.5);
+ let player1_name = builder.in(this.player1).text(fleet1.name, -240, 22, { size: 22, bold: true, color: "#154d13" });
player1_name.angle = -48;
- this.player1.addChild(player1_name);
fleet1.ships.forEach((ship, index) => {
- let ship_card = view.game.add.image(-100 + index * 96, -26, "battle-splash-shipcard", 0);
- ship_card.anchor.set(0.5);
- let ship_portrait = view.newImage(`ship-${ship.model.code}-portrait`, -2, 2);
+ let ship_card = builder.in(this.player1).image("battle-splash-shipcard-top", -100 + index * 96, -26, true);
+ let ship_portrait = builder.in(ship_card).image(`ship-${ship.model.code}-portrait`, -2, 2, true);
ship_portrait.scale.set(0.3);
- ship_portrait.anchor.set(0.5);
- ship_card.addChild(ship_portrait);
- this.player1.addChild(ship_card);
});
- this.player2 = view.game.add.image(0, 70, "battle-splash-base", 2);
- this.player2.anchor.set(0.5);
+ this.player2 = builder.in(this.message).image("battle-splash-moving-part", 0, 70, true);
this.player2.angle = 180;
this.player2.visible = false;
- this.message.addChild(this.player2);
- let player2_name = view.game.add.text(-240, 22, fleet2.name, { font: `bold 22pt SpaceTac`, fill: "#651713" });
- player2_name.anchor.set(0.5);
+ let player2_name = builder.in(this.player2).text(fleet2.name, -240, 22, { size: 22, bold: true, color: "#651713" });
player2_name.angle = -228;
- this.player2.addChild(player2_name);
fleet2.ships.forEach((ship, index) => {
- let ship_card = view.game.add.image(-104 + index * 96, -32, "battle-splash-shipcard", 1);
- ship_card.anchor.set(0.5);
- let ship_portrait = view.newImage(`ship-${ship.model.code}-portrait`, -2, -12);
- ship_portrait.scale.set(0.3);
- ship_portrait.anchor.set(0.5);
+ let ship_card = builder.in(this.player2).image("battle-splash-shipcard-top", -104 + index * 96, -32, true);
ship_card.angle = 180;
- ship_card.addChild(ship_portrait);
- this.player2.addChild(ship_card);
+ let ship_portrait = builder.in(ship_card).image(`ship-${ship.model.code}-portrait`, -2, -12, true);
+ ship_portrait.scale.set(0.3);
});
}
@@ -75,11 +60,12 @@ module TK.SpaceTac.UI {
await anims.addAnimation(this.message.scale, { x: 1, y: 1 }, 300, Phaser.Easing.Bounce.Out);
- this.view.timer.schedule(600, () => this.message.frame = 1);
- this.view.timer.schedule(630, () => this.message.frame = 0);
- this.view.timer.schedule(640, () => this.message.frame = 1);
- this.view.timer.schedule(655, () => this.message.frame = 0);
- this.view.timer.schedule(680, () => this.message.frame = 1);
+ let builder = new UIBuilder(this.view);
+ this.view.timer.schedule(600, () => builder.change(this.message, "battle-splash-message-on"));
+ this.view.timer.schedule(630, () => builder.change(this.message, "battle-splash-message-off"));
+ this.view.timer.schedule(640, () => builder.change(this.message, "battle-splash-message-on"));
+ this.view.timer.schedule(655, () => builder.change(this.message, "battle-splash-message-off"));
+ this.view.timer.schedule(680, () => builder.change(this.message, "battle-splash-message-on"));
this.player1.x = -2000;
this.player1.visible = true;
diff --git a/src/ui/battle/BattleView.ts b/src/ui/battle/BattleView.ts
index a8652ee..869aca7 100644
--- a/src/ui/battle/BattleView.ts
+++ b/src/ui/battle/BattleView.ts
@@ -96,6 +96,8 @@ module TK.SpaceTac.UI {
this.interacting = false;
this.log_processor = new LogProcessor(this);
+ let builder = new UIBuilder(this);
+
// Add layers
this.layer_background = this.getLayer("background");
this.layer_arena = this.getLayer("arena");
@@ -104,8 +106,7 @@ module TK.SpaceTac.UI {
this.layer_sheets = this.getLayer("character_sheet");
// Background
- this.background = new Phaser.Image(game, 0, 0, "battle-background", 0);
- this.layer_background.add(this.background);
+ this.background = builder.in(this.layer_background).image("battle-background");
// Add arena (local battlefield map)
this.arena = new Arena(this, this.layer_arena);
diff --git a/src/ui/battle/ShipList.ts b/src/ui/battle/ShipList.ts
index dc3f6f0..3d1c522 100644
--- a/src/ui/battle/ShipList.ts
+++ b/src/ui/battle/ShipList.ts
@@ -40,7 +40,8 @@ module TK.SpaceTac.UI {
this.items = [];
this.hovered = null;
- this.info_button = new Phaser.Button(view.game, 0, 0, "battle-shiplist-info-button");
+ let info = view.getImageInfo("battle-shiplist-info-button");
+ this.info_button = new Phaser.Button(view.game, 0, 0, info.key, undefined, undefined, info.frame, info.frame);
this.view.inputs.setHoverClick(this.info_button,
() => tactical_mode.manipulate("shiplist")(true),
() => tactical_mode.manipulate("shiplist")(false),
diff --git a/src/ui/battle/ShipListItem.ts b/src/ui/battle/ShipListItem.ts
index 36cab03..8d41a25 100644
--- a/src/ui/battle/ShipListItem.ts
+++ b/src/ui/battle/ShipListItem.ts
@@ -21,7 +21,8 @@ module TK.SpaceTac.UI {
// Create a ship button for the battle ship list
constructor(list: ShipList, x: number, y: number, ship: Ship, owned: boolean, ship_buttons: IShipButton) {
- super(list.view.game, x, y, "battle-shiplist-item-background");
+ let info = list.view.getImageInfo("battle-shiplist-item-background");
+ super(list.view.game, x, y, info.key, undefined, undefined, info.frame, info.frame);
this.view = list.view;
this.ship = ship;
@@ -37,11 +38,11 @@ module TK.SpaceTac.UI {
this.portrait.angle = 180;
this.addChild(this.portrait);
- this.damage_indicator = new Phaser.Image(this.game, 18, 9, "battle-shiplist-damage", 0);
+ this.damage_indicator = this.view.newImage("battle-shiplist-damage", 18, 9);
this.damage_indicator.alpha = 0;
this.addChild(this.damage_indicator);
- this.hover_indicator = new Phaser.Image(this.game, 17, 8, "battle-shiplist-hover", 0);
+ this.hover_indicator = this.view.newImage("battle-shiplist-hover", 17, 8);
this.hover_indicator.visible = false;
this.addChild(this.hover_indicator);
diff --git a/src/ui/battle/Targetting.ts b/src/ui/battle/Targetting.ts
index 22e3aa2..4859803 100644
--- a/src/ui/battle/Targetting.ts
+++ b/src/ui/battle/Targetting.ts
@@ -43,7 +43,7 @@ module TK.SpaceTac.UI {
// Visual effects
this.drawn_info = new Phaser.Graphics(view.game, 0, 0);
this.drawn_info.visible = false;
- this.move_ghost = new Phaser.Image(view.game, 0, 0, "common-transparent");
+ this.move_ghost = view.newImage("common-transparent");
this.move_ghost.anchor.set(0.5, 0.5);
this.move_ghost.alpha = 0.8;
this.move_ghost.visible = false;
diff --git a/src/ui/character/CharacterSheet.ts b/src/ui/character/CharacterSheet.ts
index 052dba8..448f4dd 100644
--- a/src/ui/character/CharacterSheet.ts
+++ b/src/ui/character/CharacterSheet.ts
@@ -41,7 +41,7 @@ module TK.SpaceTac.UI {
valuebar_experience: ValueBar
constructor(view: BaseView, onclose?: Function) {
- super(view.game, 0, 0, "character-sheet");
+ super(view.game, 0, 0, view.getImageInfo("character-sheet").key, view.getImageInfo("character-sheet").frame);
this.view = view;
this.builder = new UIBuilder(view, this).styled({ color: "#e7ebf0", size: 16, shadow: true });
diff --git a/src/ui/common/ParticleBuilder.ts b/src/ui/common/ParticleBuilder.ts
index 0d9766b..e7fad9d 100644
--- a/src/ui/common/ParticleBuilder.ts
+++ b/src/ui/common/ParticleBuilder.ts
@@ -85,7 +85,7 @@ module TK.SpaceTac.UI {
*/
build(configs: ParticleConfig[]): Phaser.Image {
if (configs.length == 0) {
- return this.view.game.add.image(0, 0, "common-transparent");
+ return this.view.newImage("common-transparent");
} else {
let base = configs[0];
let result = base.getImage(this.view.game, 1);
diff --git a/src/ui/common/UIComponent.ts b/src/ui/common/UIComponent.ts
index 18d3901..43db5c2 100644
--- a/src/ui/common/UIComponent.ts
+++ b/src/ui/common/UIComponent.ts
@@ -60,7 +60,7 @@ module TK.SpaceTac.UI {
this.builder = new UIBuilder(this.view, this.container);
if (background_key) {
- this.background = this.addInternalChild(new Phaser.Image(this.view.game, 0, 0, background_key));
+ this.background = this.builder.image(background_key, 0, 0, false);
} else {
this.background = null;
}
@@ -213,20 +213,19 @@ module TK.SpaceTac.UI {
/**
* Add a button in the component, positioning its center.
+ *
+ * DEPRECATED - Use UIBuilder directly
*/
addButton(x: number, y: number, on_click: Function, background: string, frame_normal = 0, frame_hover = 1, tooltip = ""): Phaser.Button {
- let button = new Phaser.Button(this.view.game, x, y, background, on_click, undefined, frame_hover, frame_normal);
- UIComponent.setButtonSound(button);
- button.anchor.set(0.5, 0.5);
- if (tooltip) {
- this.view.tooltip.bindStaticText(button, tooltip);
- }
- this.addInternalChild(button);
- return button;
+ let result = this.builder.button(background, x, y, on_click, tooltip);
+ result.anchor.set(0.5);
+ return result;
}
/**
* Add a static text.
+ *
+ * DEPRECATED - Use UIBuilder directly
*/
addText(x: number, y: number, content: string, color = "#ffffff", size = 16, bold = false, center = true, width = 0, vcenter = center): Phaser.Text {
return this.builder.text(content, x, y, { color: color, size: size, bold: bold, center: center, width: width, vcenter: vcenter });
@@ -246,6 +245,8 @@ module TK.SpaceTac.UI {
/**
* Add a static image, from atlases, positioning its center.
+ *
+ * DEPRECATED - Use UIBuilder directly
*/
addImage(x: number, y: number, name: string, scale = 1): Phaser.Image {
let result = this.builder.image(name, x, y);
@@ -266,41 +267,6 @@ module TK.SpaceTac.UI {
return image;
}
- /**
- * Add a 2-states toggle button.
- *
- * *background* should have three frames (toggled, untoggled and hovered).
- *
- * Returns a function to force the state of the button.
- */
- addToggleButton(x: number, y: number, background: UIImageInfo, content: UIImageInfo | UITextInfo, on_change: (toggled: boolean) => void): (toggled: boolean) => void {
- let toggled = false;
- let toggle = (state: boolean, broadcast = false) => {
- toggled = state;
- if (typeof background !== "string") {
- image.frame = (toggled ? background.frame : background.frame1) || background.frame || 0;
- }
- contentobj.alpha = toggled ? 1 : 0.5;
- if (broadcast) {
- on_change(toggled);
- }
- };
-
- let button = new Phaser.Button(this.container.game, x, y, "common-transparent", () => toggle(!toggled, true));
- UIComponent.setButtonSound(button);
-
- let image = imageFromInfo(this.game, background);
- let contentobj = autoFromInfo(this.game, content);
-
- button.addChild(image);
- button.addChild(contentobj);
- this.addInternalChild(button);
-
- toggle(toggled);
-
- return toggle;
- }
-
/**
* Set the keyboard focus on this component.
*/
diff --git a/src/ui/common/UITextInput.ts b/src/ui/common/UITextInput.ts
index c5c5845..e723cca 100644
--- a/src/ui/common/UITextInput.ts
+++ b/src/ui/common/UITextInput.ts
@@ -11,7 +11,7 @@ module TK.SpaceTac.UI {
constructor(parent: UIComponent, width: number, height: number, maxlength?: number, fontcolor = "#FFFFFF") {
super(parent, width, height);
- let input_bg = new Phaser.Image(this.game, 0, 0, "common-transparent");
+ let input_bg = this.builder.image("common-transparent", 0, 0, false);
input_bg.scale.set(width, height);
input_bg.inputEnabled = true;
input_bg.input.useHandCursor = true;
diff --git a/src/ui/map/MapLocationMenu.ts b/src/ui/map/MapLocationMenu.ts
index f213abb..933ee00 100644
--- a/src/ui/map/MapLocationMenu.ts
+++ b/src/ui/map/MapLocationMenu.ts
@@ -16,14 +16,14 @@ module TK.SpaceTac.UI {
this.clearContent();
if (title) {
- this.addImageF(239, 57, "map-subname");
- this.addText(239, 57, title, "#b8d2f1", 22, false, true);
+ this.builder.image("map-subname", 239, 57, true);
+ this.builder.text(title, 239, 57, { color: "#b8d2f1", size: 22 })
}
for (let idx = actions.length - 1; idx >= 0; idx--) {
let [label, action] = actions[idx];
- this.addButton(172, 48 + idx * 100 + 96, action, "map-action", 0, 1);
- this.addText(186, 48 + idx * 100 + 136, label, "#b8d2f1", 20, false, true);
+ this.builder.button("map-action", 172, 48 + idx * 100 + 96, action).anchor.set(0.5);
+ this.builder.text(label, 186, 48 + idx * 100 + 136, { color: "#b8d2f1", size: 20 });
}
}
diff --git a/src/ui/map/MissionsDialog.ts b/src/ui/map/MissionsDialog.ts
index 4ce361d..7bc6ff3 100644
--- a/src/ui/map/MissionsDialog.ts
+++ b/src/ui/map/MissionsDialog.ts
@@ -34,7 +34,7 @@ module TK.SpaceTac.UI {
offset += 110;
active.forEach(mission => {
- this.addMission(offset, mission, 0, () => null);
+ this.addMission(offset, mission, true, () => null);
offset += 110;
});
}
@@ -45,7 +45,7 @@ module TK.SpaceTac.UI {
offset += 110;
proposed.forEach(mission => {
- this.addMission(offset, mission, 2, () => {
+ this.addMission(offset, mission, false, () => {
this.shop.acceptMission(mission, this.player);
this.close();
this.on_change();
@@ -58,7 +58,7 @@ module TK.SpaceTac.UI {
/**
* Add a mission text
*/
- addMission(yoffset: number, mission: Mission, button_frame: number, button_callback: Function) {
+ addMission(yoffset: number, mission: Mission, active: boolean, button_callback: Function) {
let title = mission.title;
let subtitle = `${capitalize(MissionDifficulty[mission.difficulty])} - Reward: ${mission.getRewardText()}`;
@@ -69,7 +69,7 @@ module TK.SpaceTac.UI {
if (subtitle) {
this.addText(380, yoffset + 22, subtitle, "#d2e1f3", 18, false, false, 620, true);
}
- this.addButton(1120, yoffset, button_callback, "map-mission-action", button_frame, button_frame + 1);
+ this.builder.button(active ? "map-mission-action-cancel" : "map-mission-action-accept", 1120, yoffset, button_callback).anchor.set(0.5);
}
}
}
\ No newline at end of file
diff --git a/src/ui/map/StarSystemDisplay.ts b/src/ui/map/StarSystemDisplay.ts
index 283bb5c..7a2fc43 100644
--- a/src/ui/map/StarSystemDisplay.ts
+++ b/src/ui/map/StarSystemDisplay.ts
@@ -2,6 +2,7 @@ module TK.SpaceTac.UI {
// Group to display a star system
export class StarSystemDisplay extends Phaser.Image {
view: UniverseMapView
+ builder: UIBuilder
circles: Phaser.Group
starsystem: Star
player: Player
@@ -10,9 +11,10 @@ module TK.SpaceTac.UI {
label: Phaser.Button
constructor(parent: UniverseMapView, starsystem: Star) {
- super(parent.game, starsystem.x, starsystem.y, "map-starsystem-background");
+ super(parent.game, starsystem.x, starsystem.y, parent.getImageInfo("map-starsystem-background").key, parent.getImageInfo("map-starsystem-background").frame);
this.view = parent;
+ this.builder = new UIBuilder(parent, this);
this.anchor.set(0.5, 0.5);
@@ -24,10 +26,8 @@ module TK.SpaceTac.UI {
this.fleet_display = parent.player_fleet;
// Show boundary
- this.circles = new Phaser.Group(this.game);
- this.addChild(this.circles);
- let boundaries = this.game.add.image(0, 0, "map-boundaries", 0, this.circles);
- boundaries.anchor.set(0.5);
+ this.circles = this.builder.group("circles");
+ let boundaries = this.builder.in(this.circles).image("map-boundaries", 0, 0, true);
boundaries.scale.set(starsystem.radius / (this.scale.x * 256));
// Show locations
@@ -67,17 +67,12 @@ module TK.SpaceTac.UI {
});
// Show name
- this.label = new Phaser.Button(this.game, 0, 460, "map-name");
- this.label.anchor.set(0.5, 0.5);
- this.label.input.useHandCursor = false;
- let label_content = new Phaser.Text(this.game, 0, 0, this.starsystem.name, { align: "center", font: `32pt SpaceTac`, fill: "#b8d2f1" });
- label_content.anchor.set(0.6, 0.5);
- this.label.addChild(label_content);
- let label_level = new Phaser.Text(this.game, 243, 30, this.starsystem.level.toString(), { align: "center", font: `24pt SpaceTac`, fill: "#a0a0a0" });
- label_level.anchor.set(0.6, 0.5);
- this.label.addChild(label_level);
- this.addChild(this.label);
- this.view.tooltip.bindStaticText(this.label, `Level ${this.starsystem.level} starsystem`);
+ this.label = this.builder.button("map-name", 0, 460, undefined, `Level ${this.starsystem.level} starsystem`);
+ this.label.anchor.set(0.5);
+ this.builder.in(this.label, builder => {
+ builder.text(this.starsystem.name, -30, 0, { size: 32, color: "#b8d2f1" });
+ builder.text(this.starsystem.level.toString(), 243, 30, { size: 24, color: "#a0a0a0" });
+ });
}
addImage(x: number, y: number, name: string, onclick: Function | null = null): Phaser.Image {
@@ -97,12 +92,9 @@ module TK.SpaceTac.UI {
let radius = Math.sqrt(x * x + y * y);
let angle = Math.atan2(y, x);
- let circle = this.game.add.image(0, 0, "map-orbit", 0, this.circles);
- circle.anchor.set(0.5);
+ let circle = this.builder.in(this.circles).image("map-orbit", 0, 0, true);
circle.scale.set(radius / (this.scale.x * 198));
circle.rotation = angle - 0.01;
-
- this.circles.add(circle);
}
/**
diff --git a/src/ui/menu/MainMenu.ts b/src/ui/menu/MainMenu.ts
index 30a2f51..22b8f29 100644
--- a/src/ui/menu/MainMenu.ts
+++ b/src/ui/menu/MainMenu.ts
@@ -44,23 +44,20 @@ module TK.SpaceTac.UI {
});
// Menu buttons
- this.button_new_game = this.addButton(322, 674, "New Game", "Start a new campaign in a generated universe", () => this.onNewGame());
- this.button_load_game = this.addButton(960, 674, "Load / Join", "Load a saved game or join a friend", () => this.onLoadGame());
- this.button_quick_battle = this.addButton(1606, 674, "Quick Battle", "Play a single generated battle", () => this.onQuickBattle());
+ this.button_new_game = this.addButton(320, 730, "New Game", "Start a new campaign in a generated universe", () => this.onNewGame());
+ this.button_load_game = this.addButton(958, 730, "Load / Join", "Load a saved game or join a friend", () => this.onLoadGame());
+ this.button_quick_battle = this.addButton(1604, 730, "Quick Battle", "Play a single generated battle", () => this.onQuickBattle());
// Fullscreen button
- let button = new Phaser.Button(this.game, this.getWidth(), 0, "options-options", () => this.options.toggleBoolean("fullscreen"), null, 2, 2);
+ let button = builder.in(this.layer_title).button("options-option-fullscreen", this.getWidth(), 0, () => this.options.toggleBoolean("fullscreen"), "Toggle full-screen");
button.anchor.set(1, 0);
- this.tooltip.bindStaticText(button, "Toggle full-screen");
- this.layer_title.add(button);
// Title
- let title = this.add.image(960, 225, "menu-title", 0, this.layer_title);
- title.anchor.set(0.5, 0);
+ let title = builder.in(this.layer_title).image("menu-title", 274, 187);
// Dialogs
this.dialog_load_game = new LoadDialog(this);
- this.dialog_load_game.setPosition(264, 160);
+ this.dialog_load_game.setPosition(286, 120);
this.dialog_load_game.moveToLayer(this.layer_title);
this.dialog_load_game.setVisible(false);
@@ -90,31 +87,14 @@ module TK.SpaceTac.UI {
}
addButton(x: number, y: number, caption: string, tooltip: string, callback: Function): Phaser.Button {
- var button = this.add.button(x - 20, y + 20, "menu-button", callback);
- button.anchor.set(0.5, 0);
- button.input.useHandCursor = true;
+ let builder = new UIBuilder(this).in(this.layer_title);
- UIComponent.setButtonSound(button);
+ let result = builder.button("menu-button", x, y, callback, tooltip);
+ result.anchor.set(0.5);
- var text = new Phaser.Text(this.game, 0, 76, caption,
- { align: "center", font: "bold 40pt SpaceTac", fill: "#529aee" });
- text.anchor.set(0.5, 0.5);
- button.addChild(text);
+ builder.in(result).text(caption, 0, 0, { bold: true, size: 40, color: "#529aee" });
- button.onInputOver.add(() => {
- button.loadTexture("menu-button-hover");
- text.fill = "#54b9ff";
- });
- button.onInputOut.add(() => {
- button.loadTexture("menu-button");
- text.fill = "#529aee";
- });
-
- this.tooltip.bindStaticText(button, tooltip);
-
- this.layer_title.add(button);
-
- return button;
+ return result;
}
// Called when "New Game" is clicked
diff --git a/src/ui/options/OptionsDialog.ts b/src/ui/options/OptionsDialog.ts
index 401a95d..31af3a3 100644
--- a/src/ui/options/OptionsDialog.ts
+++ b/src/ui/options/OptionsDialog.ts
@@ -17,23 +17,37 @@ module TK.SpaceTac.UI {
this.clearContent();
this.addCloseButton("common-dialog-close", 1304, 131, 0, 1);
- let toggle = this.addToggleButton(415, 381,
- { key: "options-toggle", frame: 0, frame1: 1, frame2: 2 },
- { key: "options-options", frame: 0 },
- toggled => options.setNumberValue("mainvolume", toggled ? 1 : 0));
- toggle(options.getNumberValue("mainvolume") > 0);
+ this.addToggleButton(415, 381, "options-option-sound", "Toggle all sound",
+ toggled => options.setNumberValue("mainvolume", toggled ? 1 : 0),
+ options.getNumberValue("mainvolume") > 0
+ );
- toggle = this.addToggleButton(this.width / 2, 381,
- { key: "options-toggle", frame: 0, frame1: 1, frame2: 2 },
- { key: "options-options", frame: 1 },
- toggled => options.setNumberValue("musicvolume", toggled ? 1 : 0));
- toggle(options.getNumberValue("musicvolume") > 0);
+ this.addToggleButton(this.width / 2, 381, "options-option-music", "Toggle music",
+ toggled => options.setNumberValue("musicvolume", toggled ? 1 : 0),
+ options.getNumberValue("musicvolume") > 0
+ );
- toggle = this.addToggleButton(this.width - 415, 381,
- { key: "options-toggle", frame: 0, frame1: 1, frame2: 2 },
- { key: "options-options", frame: 2 },
- toggled => options.setBooleanValue("fullscreen", toggled));
- toggle(options.getBooleanValue("fullscreen"));
+ this.addToggleButton(this.width - 415, 381, "options-option-fullscreen", "Toggle fullscreen",
+ toggled => options.setBooleanValue("fullscreen", toggled),
+ options.getBooleanValue("fullscreen")
+ );
+ }
+
+ /**
+ * Add a toggle button
+ */
+ addToggleButton(x: number, y: number, key: string, tooltip: string, callback: (state: boolean) => boolean, initial: boolean): UIButton {
+ let button = this.builder.button("options-toggle", x, y, undefined, tooltip, state => {
+ if (callback(state)) {
+ return state;
+ } else {
+ return !state;
+ }
+ });
+ button.anchor.set(0.5);
+ this.builder.in(button).image(key, 0, 0, true);
+ this.builder.switch(button, initial);
+ return button;
}
/**
diff --git a/taskfile.js b/taskfile.js
deleted file mode 100644
index 49cd07a..0000000
--- a/taskfile.js
+++ /dev/null
@@ -1,74 +0,0 @@
-const liveServer = require('live-server');
-
-function shell(task, cmd) {
- return task.source(".").shell(cmd);
-}
-
-module.exports = {
- *serve(task) {
- liveServer.start({
- host: '127.0.0.1',
- port: 8012,
- root: 'out',
- ignore: 'coverage',
- wait: 500
- });
- return new Promise(() => null);
- },
-
- *vendors(task) {
- yield shell(task, "rm -rf out/vendor");
- yield shell(task, "mkdir -p out/vendor");
- yield shell(task, "cp -r node_modules/phaser/build out/vendor/phaser");
- yield shell(task, "cp -r node_modules/parse/dist out/vendor/parse");
- yield shell(task, "cp -r node_modules/jasmine-core/lib/jasmine-core out/vendor/jasmine");
- },
-
- *watch_vendors(task) {
- yield task.watch("package.json", ["vendors"]);
- },
-
- *ts(task) {
- yield shell(task, "tsc -p .");
- },
-
- *watch_ts(task) {
- yield task.watch(["src/**/*.ts", "tsconfig.json"], ["ts"]);
- },
-
- *atlas(task) {
- yield shell(task, "rm -f out/assets/atlas*");
- yield shell(task, "find graphics/exported -name '*.png' -print0 | xargs -0 gf-pack --name out/assets/atlas --fullpath --width 1024 --height 1024 --square --powerOfTwo --trim --padding 2");
- },
-
- *watch_atlas(task) {
- yield task.watch("graphics/exported/**/*.png", ["atlas"]);
- },
-
- *build(task) {
- yield task.parallel(['ts', 'atlas', 'vendors']);
- },
-
- *optimize(task) {
- yield shell(task, "uglifyjs out/build.js --source-map --output out/build.min.js");
- },
-
- *deploy(task) {
- yield task.serial(['build', 'optimize']);
- yield shell(task, "rsync -avz --delete ./out/ hosting.thunderk.net:/srv/website/spacetac/");
- },
-
- *karma(task) {
- yield shell(task, "karma start spec/support/karma.conf.js");
- },
-
- *test(task) {
- yield task.serial(['build', 'karma']);
- yield shell(task, "remap-istanbul -i out/coverage/coverage.json -o out/coverage -t html");
- },
-
- *default(task) {
- yield task.start('build');
- yield task.parallel(['serve', 'watch_ts', 'watch_atlas', 'watch_vendors']);
- }
-}