diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000..d3510226
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,11 @@
+artwork/*
+build/*
+electron/*
+gulp/*
+node_modules/*
+res/*
+res_built/*
+res_raw/*
+tmp_standalone_files/*
+tools/*
+translations/*
diff --git a/.eslintrc.yml b/.eslintrc.yml
new file mode 100644
index 00000000..8fd0b51b
--- /dev/null
+++ b/.eslintrc.yml
@@ -0,0 +1,25 @@
+env:
+ browser: true
+ es6: true
+extends:
+ - 'eslint:recommended'
+ - 'plugin:@typescript-eslint/eslint-recommended'
+ - 'prettier'
+globals:
+ Atomics: readonly
+ SharedArrayBuffer: readonly
+parser: '@typescript-eslint/parser'
+parserOptions:
+ ecmaVersion: 6
+ sourceType: 'module'
+ ecmaFeatures:
+ - modules: true
+plugins:
+ - '@typescript-eslint'
+ - 'prettier'
+rules:
+ prettier/prettier: error
+ no-undef: off
+ no-unused-vars: off
+ no-prototype-builtins: off
+
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..3b8e4a08
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,42 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - master
+ - ModdedGamers-GH-Actions
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ setup:
+
+ name: CI
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Install Dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install ffmpeg
+
+ - name: Setup Node
+ uses: actions/setup-node@v2-beta
+ with:
+ node-version: 10.x
+
+ - name: Checkout repo
+ uses: actions/checkout@v2
+
+ - name: Install Yarn Dependencies
+ run: |
+ yarn
+ cd gulp/
+ yarn
+ cd ..
+
+ - name: Lint
+ run: |
+ npx eslint src/js
diff --git a/package.json b/package.json
index 2e90c019..10584493 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
"core-js": "3",
"cssnano-preset-advanced": "^4.0.7",
"email-validator": "^2.0.4",
- "eslint": "^5.9.0",
+ "eslint": "7.1.0",
"fastdom": "^1.0.8",
"flatted": "^2.0.1",
"howler": "^2.1.2",
@@ -47,6 +47,7 @@
"strictdom": "^1.0.1",
"string-replace-webpack-plugin": "^0.1.3",
"terser-webpack-plugin": "^1.1.0",
+ "typescript": "3.9.3",
"uglify-template-string-loader": "^1.1.0",
"unused-files-webpack-plugin": "^3.4.0",
"webpack": "^4.31.0",
@@ -59,12 +60,16 @@
"worker-loader": "^2.0.0"
},
"devDependencies": {
+ "@typescript-eslint/eslint-plugin": "3.0.1",
+ "@typescript-eslint/parser": "3.0.1",
"autoprefixer": "^9.4.3",
"babel-plugin-closure-elimination": "^1.3.0",
"babel-plugin-console-source": "^2.0.2",
"babel-plugin-danger-remove-unused-import": "^1.1.2",
"css-mqpacker": "^7.0.0",
"cssnano": "^4.1.10",
+ "eslint-config-prettier": "6.11.0",
+ "eslint-plugin-prettier": "3.1.3",
"faster.js": "^1.1.0",
"glob": "^7.1.3",
"imagemin-mozjpeg": "^8.0.0",
diff --git a/shapez.code-workspace b/shapez.code-workspace
index e0766264..29dae2a2 100644
--- a/shapez.code-workspace
+++ b/shapez.code-workspace
@@ -8,6 +8,7 @@
"files.exclude": {
"**/build": true,
"**/node_modules": true,
+ "**/tmp_standalone_files": true,
"**/typedefs_gen": true
},
"vetur.format.defaultFormatter.js": "vscode-typescript",
diff --git a/src/css/ingame_hud/buildings_toolbar.scss b/src/css/ingame_hud/buildings_toolbar.scss
index d9f91fcc..a16acfb3 100644
--- a/src/css/ingame_hud/buildings_toolbar.scss
+++ b/src/css/ingame_hud/buildings_toolbar.scss
@@ -4,7 +4,6 @@
left: 50%;
transform: translateX(-50%);
- $toolbarBg: rgba($accentColorBright, 0.9);
display: flex;
flex-direction: column;
background-color: rgb(255, 255, 255);
@@ -12,8 +11,7 @@
border-bottom-width: 0;
transition: transform 0.12s ease-in-out;
- background: uiResource("toolbar_bg.lossless.png") center center / 100% 100% no-repeat;
- @include S(padding, 20px, 100px, 0);
+ background: rgba(mix(#ddd, $colorBlueBright, 80%), 0.89);
&:not(.visible) {
transform: translateX(-50%) translateY(#{D(100px)});
@@ -59,7 +57,7 @@
@include S(border-radius, $globalBorderRadius);
&.selected {
- background-color: rgba($colorBlueBright, 0.3) !important;
+ background-color: rgba($colorBlueBright, 0.6) !important;
transform: scale(1.05);
.keybinding {
color: #111;
diff --git a/src/html/index.html b/src/html/index.html
index ffcab1d7..b1d89377 100644
--- a/src/html/index.html
+++ b/src/html/index.html
@@ -1,7 +1,7 @@
- shapez.io - Build your own shape factory!
+ shapez.io - Build automated factories to build, combine and color shapes!
diff --git a/src/js/changelog.js b/src/js/changelog.js
index 44475e63..10c78d3a 100644
--- a/src/js/changelog.js
+++ b/src/js/changelog.js
@@ -1,4 +1,12 @@
export const CHANGELOG = [
+ {
+ version: "1.1.0",
+ date: "unreleased",
+ entries: [
+ "UX Added background to toolbar to increase contrast",
+ "UX Added confirmation when deleting more than 500 buildings at a time",
+ ],
+ },
{
version: "1.0.4",
date: "26.05.2020",
diff --git a/src/js/core/config.js b/src/js/core/config.js
index 99770c4b..f5bdbf76 100644
--- a/src/js/core/config.js
+++ b/src/js/core/config.js
@@ -93,7 +93,7 @@ export const globalConfig = {
// disableZoomLimits: true,
// showChunkBorders: true,
// rewardsInstant: true,
- // allBuildingsUnlocked: true,
+ allBuildingsUnlocked: true,
// upgradesNoCost: true,
// disableUnlockDialog: true,
// disableLogicTicks: true,
@@ -103,6 +103,8 @@ export const globalConfig = {
// enableEntityInspector: true,
// testAds: true,
// disableMapOverview: true,
+ disableTutorialHints: true,
+ disableUpgradeNotification: true,
/* dev:end */
},
diff --git a/src/js/core/vector.js b/src/js/core/vector.js
index 2bd6cfe9..2a02f75d 100644
--- a/src/js/core/vector.js
+++ b/src/js/core/vector.js
@@ -103,6 +103,17 @@ export class Vector {
return new Vector(this.x - other.x, this.y - other.y);
}
+ /**
+ * Subs a vector
+ * @param {Vector} other
+ * @returns {Vector}
+ */
+ subInplace(other) {
+ this.x -= other.x;
+ this.y -= other.y;
+ return this;
+ }
+
/**
* Multiplies with a vector and return a new vector
* @param {Vector} other
diff --git a/src/js/game/buildings/hub.js b/src/js/game/buildings/hub.js
index b7b960de..49d95005 100644
--- a/src/js/game/buildings/hub.js
+++ b/src/js/game/buildings/hub.js
@@ -24,6 +24,10 @@ export class MetaHubBuilding extends MetaBuilding {
return false;
}
+ getBlueprintSprite() {
+ return null;
+ }
+
/**
* Creates the entity at the given location
* @param {Entity} entity
diff --git a/src/js/game/component.js b/src/js/game/component.js
index 8c492351..1d44d60f 100644
--- a/src/js/game/component.js
+++ b/src/js/game/component.js
@@ -17,6 +17,14 @@ export class Component extends BasicSerializableObject {
return {};
}
+ /**
+ * Should duplicate the component but without its contents
+ * @returns {object}
+ */
+ duplicateWithoutContents() {
+ abstract;
+ }
+
/* dev:start */
/**
diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js
index 9d64187c..dcac6ecb 100644
--- a/src/js/game/components/belt.js
+++ b/src/js/game/components/belt.js
@@ -18,6 +18,10 @@ export class BeltComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ return new BeltComponent({ direction: this.direction });
+ }
+
/**
*
* @param {object} param0
diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js
index d5546d4b..d9505d18 100644
--- a/src/js/game/components/item_acceptor.js
+++ b/src/js/game/components/item_acceptor.js
@@ -54,6 +54,32 @@ export class ItemAcceptorComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ const slotsCopy = [];
+ for (let i = 0; i < this.slots.length; ++i) {
+ const slot = this.slots[i];
+ slotsCopy.push({
+ pos: slot.pos.copy(),
+ directions: slot.directions.slice(),
+ });
+ }
+
+ const beltUnderlaysCopy = [];
+ for (let i = 0; i < this.beltUnderlays.length; ++i) {
+ const underlay = this.beltUnderlays[i];
+ beltUnderlaysCopy.push({
+ pos: underlay.pos.copy(),
+ direction: underlay.direction,
+ });
+ }
+
+ return new ItemAcceptorComponent({
+ slots: slotsCopy,
+ beltUnderlays: beltUnderlaysCopy,
+ animated: this.animated,
+ });
+ }
+
/**
*
* @param {object} param0
diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js
index 5cf96754..d5881a7d 100644
--- a/src/js/game/components/item_ejector.js
+++ b/src/js/game/components/item_ejector.js
@@ -32,6 +32,22 @@ export class ItemEjectorComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ const slotsCopy = [];
+ for (let i = 0; i < this.slots.length; ++i) {
+ const slot = this.slots[i];
+ slotsCopy.push({
+ pos: slot.pos.copy(),
+ direction: slot.direction,
+ });
+ }
+
+ return new ItemEjectorComponent({
+ slots: slotsCopy,
+ instantEject: false,
+ });
+ }
+
/**
*
* @param {object} param0
diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js
index 0c4e90c6..eab51ae2 100644
--- a/src/js/game/components/item_processor.js
+++ b/src/js/game/components/item_processor.js
@@ -48,6 +48,13 @@ export class ItemProcessorComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ return new ItemProcessorComponent({
+ processorType: this.type,
+ inputsPerCharge: this.inputsPerCharge,
+ });
+ }
+
/**
*
* @param {object} param0
diff --git a/src/js/game/components/miner.js b/src/js/game/components/miner.js
index e08d2906..57de7e2f 100644
--- a/src/js/game/components/miner.js
+++ b/src/js/game/components/miner.js
@@ -19,6 +19,12 @@ export class MinerComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ return new MinerComponent({
+ chainable: this.chainable,
+ });
+ }
+
/**
*/
constructor({ chainable = false }) {
diff --git a/src/js/game/components/replaceable_map_entity.js b/src/js/game/components/replaceable_map_entity.js
index e6fd95d5..78861caf 100644
--- a/src/js/game/components/replaceable_map_entity.js
+++ b/src/js/game/components/replaceable_map_entity.js
@@ -8,4 +8,8 @@ export class ReplaceableMapEntityComponent extends Component {
static getId() {
return "ReplaceableMapEntity";
}
+
+ duplicateWithoutContents() {
+ return new ReplaceableMapEntityComponent();
+ }
}
diff --git a/src/js/game/components/static_map_entity.js b/src/js/game/components/static_map_entity.js
index 6f9abb87..ed616213 100644
--- a/src/js/game/components/static_map_entity.js
+++ b/src/js/game/components/static_map_entity.js
@@ -19,10 +19,23 @@ export class StaticMapEntityComponent extends Component {
rotation: types.float,
originalRotation: types.float,
spriteKey: types.nullable(types.string),
+ blueprintSpriteKey: types.string,
silhouetteColor: types.nullable(types.string),
};
}
+ duplicateWithoutContents() {
+ return new StaticMapEntityComponent({
+ origin: this.origin.copy(),
+ tileSize: this.tileSize.copy(),
+ rotation: this.rotation,
+ originalRotation: this.originalRotation,
+ spriteKey: this.spriteKey,
+ silhouetteColor: this.silhouetteColor,
+ blueprintSpriteKey: this.blueprintSpriteKey,
+ });
+ }
+
/**
*
* @param {object} param0
@@ -31,6 +44,7 @@ export class StaticMapEntityComponent extends Component {
* @param {number=} param0.rotation Rotation in degrees. Must be multiple of 90
* @param {number=} param0.originalRotation Original Rotation in degrees. Must be multiple of 90
* @param {string=} param0.spriteKey Optional sprite
+ * @param {string} param0.blueprintSpriteKey Blueprint sprite, required
* @param {string=} param0.silhouetteColor Optional silhouette color override
*/
constructor({
@@ -40,6 +54,7 @@ export class StaticMapEntityComponent extends Component {
originalRotation = 0,
spriteKey = null,
silhouetteColor = null,
+ blueprintSpriteKey = null,
}) {
super();
assert(
@@ -53,6 +68,7 @@ export class StaticMapEntityComponent extends Component {
this.rotation = rotation;
this.originalRotation = originalRotation;
this.silhouetteColor = silhouetteColor;
+ this.blueprintSpriteKey = blueprintSpriteKey;
}
/**
@@ -202,14 +218,25 @@ export class StaticMapEntityComponent extends Component {
* @param {AtlasSprite} sprite
* @param {number=} extrudePixels How many pixels to extrude the sprite
* @param {boolean=} clipping Whether to clip
+ * @param {Vector=} overridePosition Whether to drwa the entity at a different location
*/
- drawSpriteOnFullEntityBounds(parameters, sprite, extrudePixels = 0, clipping = true) {
- const worldX = this.origin.x * globalConfig.tileSize;
- const worldY = this.origin.y * globalConfig.tileSize;
-
- if (!this.shouldBeDrawn(parameters)) {
+ drawSpriteOnFullEntityBounds(
+ parameters,
+ sprite,
+ extrudePixels = 0,
+ clipping = true,
+ overridePosition = null
+ ) {
+ if (!this.shouldBeDrawn(parameters) && !overridePosition) {
return;
}
+ let worldX = this.origin.x * globalConfig.tileSize;
+ let worldY = this.origin.y * globalConfig.tileSize;
+
+ if (overridePosition) {
+ worldX = overridePosition.x * globalConfig.tileSize;
+ worldY = overridePosition.y * globalConfig.tileSize;
+ }
if (this.rotation === 0) {
// Early out, is faster
diff --git a/src/js/game/components/storage.js b/src/js/game/components/storage.js
index e024d522..69f4e367 100644
--- a/src/js/game/components/storage.js
+++ b/src/js/game/components/storage.js
@@ -19,6 +19,10 @@ export class StorageComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ return new StorageComponent({ maximumStorage: this.maximumStorage });
+ }
+
/**
* @param {object} param0
* @param {number=} param0.maximumStorage How much this storage can hold
diff --git a/src/js/game/components/underground_belt.js b/src/js/game/components/underground_belt.js
index e581ebe9..4fcbbb48 100644
--- a/src/js/game/components/underground_belt.js
+++ b/src/js/game/components/underground_belt.js
@@ -23,6 +23,13 @@ export class UndergroundBeltComponent extends Component {
};
}
+ duplicateWithoutContents() {
+ return new UndergroundBeltComponent({
+ mode: this.mode,
+ tier: this.tier,
+ });
+ }
+
/**
*
* @param {object} param0
diff --git a/src/js/game/components/unremovable.js b/src/js/game/components/unremovable.js
index 17e9f36b..f3864cf8 100644
--- a/src/js/game/components/unremovable.js
+++ b/src/js/game/components/unremovable.js
@@ -8,4 +8,8 @@ export class UnremovableComponent extends Component {
static getSchema() {
return {};
}
+
+ duplicateWithoutContents() {
+ return new UnremovableComponent();
+ }
}
diff --git a/src/js/game/entity.js b/src/js/game/entity.js
index 50f4cae5..dc849851 100644
--- a/src/js/game/entity.js
+++ b/src/js/game/entity.js
@@ -77,11 +77,14 @@ export class Entity extends BasicSerializableObject {
}
/**
- * Returns whether the entity is still alive
- * @returns {boolean}
+ * Returns a clone of this entity without contents
*/
- isAlive() {
- return !this.destroyed && !this.queuedForDestroy;
+ duplicateWithoutContents() {
+ const clone = new Entity(this.root);
+ for (const key in this.components) {
+ clone.components[key] = this.components[key].duplicateWithoutContents();
+ }
+ return clone;
}
/**
diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js
index f1fc15c9..a6f24284 100644
--- a/src/js/game/hub_goals.js
+++ b/src/js/game/hub_goals.js
@@ -97,8 +97,8 @@ export class HubGoals extends BasicSerializableObject {
// Allow quickly switching goals in dev mode with key "C"
if (G_IS_DEV) {
this.root.gameState.inputReciever.keydown.add(key => {
- if (key.keyCode === 67) {
- // Key: c
+ if (key.keyCode === 66) {
+ // Key: b
this.onGoalCompleted();
}
});
diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js
index 2d317b7f..2294b4f1 100644
--- a/src/js/game/hud/hud.js
+++ b/src/js/game/hud/hud.js
@@ -8,6 +8,7 @@ import { HUDProcessingOverlay } from "./parts/processing_overlay";
import { HUDBuildingsToolbar } from "./parts/buildings_toolbar";
import { HUDBuildingPlacer } from "./parts/building_placer";
import { HUDBetaOverlay } from "./parts/beta_overlay";
+import { HUDBlueprintPlacer } from "./parts/blueprint_placer";
import { HUDKeybindingOverlay } from "./parts/keybinding_overlay";
import { HUDUnlockNotification } from "./parts/unlock_notification";
import { HUDGameMenu } from "./parts/game_menu";
@@ -45,6 +46,7 @@ export class GameHUD {
buildingsToolbar: new HUDBuildingsToolbar(this.root),
buildingPlacer: new HUDBuildingPlacer(this.root),
+ blueprintPlacer: new HUDBlueprintPlacer(this.root),
unlockNotification: new HUDUnlockNotification(this.root),
@@ -72,6 +74,7 @@ export class GameHUD {
selectedPlacementBuildingChanged: /** @type {TypedSignal<[MetaBuilding|null]>} */ (new Signal()),
shapePinRequested: /** @type {TypedSignal<[ShapeDefinition, number]>} */ (new Signal()),
notification: /** @type {TypedSignal<[string, enumNotificationType]>} */ (new Signal()),
+ buildingsSelectedForCopy: /** @type {TypedSignal<[Array]>} */ (new Signal()),
};
if (!IS_MOBILE) {
@@ -185,7 +188,7 @@ export class GameHUD {
* @param {DrawParameters} parameters
*/
draw(parameters) {
- const partsOrder = ["massSelector", "buildingPlacer"];
+ const partsOrder = ["massSelector", "buildingPlacer", "blueprintPlacer"];
for (let i = 0; i < partsOrder.length; ++i) {
if (this.parts[partsOrder[i]]) {
diff --git a/src/js/game/hud/parts/blueprint.js b/src/js/game/hud/parts/blueprint.js
new file mode 100644
index 00000000..f6dccc4c
--- /dev/null
+++ b/src/js/game/hud/parts/blueprint.js
@@ -0,0 +1,176 @@
+import { GameRoot } from "../../root";
+import { Vector } from "../../../core/vector";
+import { Entity } from "../../entity";
+import { DrawParameters } from "../../../core/draw_parameters";
+import { StaticMapEntityComponent } from "../../components/static_map_entity";
+import { createLogger } from "../../../core/logging";
+import { Loader } from "../../../core/loader";
+
+const logger = createLogger("blueprint");
+
+export class Blueprint {
+ /**
+ * @param {Array} entities
+ */
+ constructor(entities) {
+ this.entities = entities;
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {Array} uids
+ */
+ static fromUids(root, uids) {
+ const newEntities = [];
+
+ let averagePosition = new Vector();
+
+ // First, create a copy
+ for (let i = 0; i < uids.length; ++i) {
+ const entity = root.entityMgr.findByUid(uids[i]);
+ assert(entity, "Entity for blueprint not found:" + uids[i]);
+
+ const clone = entity.duplicateWithoutContents();
+ newEntities.push(clone);
+
+ const pos = entity.components.StaticMapEntity.getTileSpaceBounds().getCenter();
+ averagePosition.addInplace(pos);
+ }
+
+ averagePosition.divideScalarInplace(uids.length);
+ const blueprintOrigin = averagePosition.floor();
+ for (let i = 0; i < uids.length; ++i) {
+ newEntities[i].components.StaticMapEntity.origin.subInplace(blueprintOrigin);
+ }
+
+ // Now, make sure the origin is 0,0
+ return new Blueprint(newEntities);
+ }
+
+ /**
+ *
+ * @param {DrawParameters} parameters
+ */
+ draw(parameters, tile) {
+ parameters.context.globalAlpha = 0.8;
+ for (let i = 0; i < this.entities.length; ++i) {
+ const entity = this.entities[i];
+ const staticComp = entity.components.StaticMapEntity;
+ if (!staticComp.blueprintSpriteKey) {
+ logger.warn("Blueprint entity without sprite!");
+ return;
+ }
+ const newPos = staticComp.origin.add(tile);
+
+ const rect = staticComp.getTileSpaceBounds();
+ rect.moveBy(tile.x, tile.y);
+
+ let placeable = true;
+ placementCheck: for (let x = rect.x; x < rect.right(); ++x) {
+ for (let y = rect.y; y < rect.bottom(); ++y) {
+ if (parameters.root.map.isTileUsedXY(x, y)) {
+ placeable = false;
+ break placementCheck;
+ }
+ }
+ }
+
+ if (!placeable) {
+ parameters.context.globalAlpha = 0.3;
+ } else {
+ parameters.context.globalAlpha = 1;
+ }
+
+ staticComp.drawSpriteOnFullEntityBounds(
+ parameters,
+ Loader.getSprite(staticComp.blueprintSpriteKey),
+ 0,
+ true,
+ newPos
+ );
+ }
+ parameters.context.globalAlpha = 1;
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {Vector} tile
+ */
+ canPlace(root, tile) {
+ let anyPlaceable = false;
+
+ for (let i = 0; i < this.entities.length; ++i) {
+ let placeable = true;
+ const entity = this.entities[i];
+ const staticComp = entity.components.StaticMapEntity;
+ const rect = staticComp.getTileSpaceBounds();
+ rect.moveBy(tile.x, tile.y);
+ placementCheck: for (let x = rect.x; x < rect.right(); ++x) {
+ for (let y = rect.y; y < rect.bottom(); ++y) {
+ if (root.map.isTileUsedXY(x, y)) {
+ placeable = false;
+ break placementCheck;
+ }
+ }
+ }
+
+ if (placeable) {
+ anyPlaceable = true;
+ }
+ }
+
+ return anyPlaceable;
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {Vector} tile
+ */
+ tryPlace(root, tile) {
+ let anyPlaced = false;
+ for (let i = 0; i < this.entities.length; ++i) {
+ let placeable = true;
+ const entity = this.entities[i];
+ const staticComp = entity.components.StaticMapEntity;
+ const rect = staticComp.getTileSpaceBounds();
+ rect.moveBy(tile.x, tile.y);
+ placementCheck: for (let x = rect.x; x < rect.right(); ++x) {
+ for (let y = rect.y; y < rect.bottom(); ++y) {
+ const contents = root.map.getTileContentXY(x, y);
+ if (contents && !contents.components.ReplaceableMapEntity) {
+ placeable = false;
+ break placementCheck;
+ }
+ }
+ }
+
+ if (placeable) {
+ for (let x = rect.x; x < rect.right(); ++x) {
+ for (let y = rect.y; y < rect.bottom(); ++y) {
+ const contents = root.map.getTileContentXY(x, y);
+ if (contents) {
+ assert(
+ contents.components.ReplaceableMapEntity,
+ "Can not delete entity for blueprint"
+ );
+ if (!root.logic.tryDeleteBuilding(contents)) {
+ logger.error(
+ "Building has replaceable component but is also unremovable in blueprint"
+ );
+ return false;
+ }
+ }
+ }
+ }
+
+ const clone = entity.duplicateWithoutContents();
+ clone.components.StaticMapEntity.origin.addInplace(tile);
+
+ root.map.placeStaticEntity(clone);
+ root.entityMgr.registerEntity(clone);
+ anyPlaced = true;
+ }
+ }
+ return anyPlaced;
+ }
+}
diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js
new file mode 100644
index 00000000..32993ffc
--- /dev/null
+++ b/src/js/game/hud/parts/blueprint_placer.js
@@ -0,0 +1,103 @@
+import { DrawParameters } from "../../../core/draw_parameters";
+import { STOP_PROPAGATION } from "../../../core/signal";
+import { TrackedState } from "../../../core/tracked_state";
+import { Vector } from "../../../core/vector";
+import { enumMouseButton } from "../../camera";
+import { KEYMAPPINGS } from "../../key_action_mapper";
+import { BaseHUDPart } from "../base_hud_part";
+import { Blueprint } from "./blueprint";
+
+export class HUDBlueprintPlacer extends BaseHUDPart {
+ createElements(parent) {}
+
+ initialize() {
+ this.root.hud.signals.buildingsSelectedForCopy.add(this.onBuildingsSelected, this);
+
+ /** @type {TypedTrackedState} */
+ this.currentBlueprint = new TrackedState(this.onBlueprintChanged, this);
+
+ const keyActionMapper = this.root.keyMapper;
+ keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this);
+ keyActionMapper
+ .getBinding(KEYMAPPINGS.placement.abortBuildingPlacement)
+ .add(this.abortPlacement, this);
+
+ this.root.camera.downPreHandler.add(this.onMouseDown, this);
+ this.root.camera.movePreHandler.add(this.onMouseMove, this);
+
+ this.root.hud.signals.selectedPlacementBuildingChanged.add(this.abortPlacement, this);
+ }
+
+ abortPlacement() {
+ if (this.currentBlueprint.get()) {
+ this.currentBlueprint.set(null);
+
+ return STOP_PROPAGATION;
+ }
+ }
+
+ onBlueprintChanged(blueprint) {}
+
+ /**
+ * mouse down pre handler
+ * @param {Vector} pos
+ * @param {enumMouseButton} button
+ */
+ onMouseDown(pos, button) {
+ if (button === enumMouseButton.right) {
+ this.abortPlacement();
+ return STOP_PROPAGATION;
+ }
+
+ const blueprint = this.currentBlueprint.get();
+ if (!blueprint) {
+ return;
+ }
+
+ console.log("down");
+ const worldPos = this.root.camera.screenToWorld(pos);
+ const tile = worldPos.toTileSpace();
+ if (blueprint.tryPlace(this.root, tile)) {
+ if (!this.root.app.inputMgr.shiftIsDown) {
+ this.currentBlueprint.set(null);
+ }
+ }
+ }
+
+ onMouseMove() {
+ // Prevent movement while blueprint is selected
+ if (this.currentBlueprint.get()) {
+ return STOP_PROPAGATION;
+ }
+ }
+
+ /**
+ * @param {Array} uids
+ */
+ onBuildingsSelected(uids) {
+ if (uids.length === 0) {
+ return;
+ }
+ this.currentBlueprint.set(Blueprint.fromUids(this.root, uids));
+ }
+
+ /**
+ *
+ * @param {DrawParameters} parameters
+ */
+ draw(parameters) {
+ const blueprint = this.currentBlueprint.get();
+ if (!blueprint) {
+ return;
+ }
+ const mousePosition = this.root.app.mousePosition;
+ if (!mousePosition) {
+ // Not on screen
+ return;
+ }
+
+ const worldPos = this.root.camera.screenToWorld(mousePosition);
+ const tile = worldPos.toTileSpace();
+ blueprint.draw(parameters, tile);
+ }
+}
diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js
index b7330130..1e09dbd4 100644
--- a/src/js/game/hud/parts/building_placer.js
+++ b/src/js/game/hud/parts/building_placer.js
@@ -39,6 +39,8 @@ export class HUDBuildingPlacer extends BaseHUDPart {
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.tryRotate, this);
keyActionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildingVariants).add(this.cycleVariants, this);
+ this.root.hud.signals.buildingsSelectedForCopy.add(this.abortPlacement, this);
+
this.domAttach = new DynamicDomAttach(this.root, this.element, {});
this.root.camera.downPreHandler.add(this.onMouseDown, this);
@@ -255,6 +257,7 @@ export class HUDBuildingPlacer extends BaseHUDPart {
origin: new Vector(0, 0),
rotation: 0,
tileSize: metaBuilding.getDimensions(this.currentVariant.get()).copy(),
+ blueprintSpriteKey: "",
})
);
metaBuilding.updateVariants(this.fakeEntity, 0, this.currentVariant.get());
diff --git a/src/js/game/hud/parts/mass_selector.js b/src/js/game/hud/parts/mass_selector.js
index 79c119b2..1f628c38 100644
--- a/src/js/game/hud/parts/mass_selector.js
+++ b/src/js/game/hud/parts/mass_selector.js
@@ -5,12 +5,13 @@ import { DrawParameters } from "../../../core/draw_parameters";
import { Entity } from "../../entity";
import { Loader } from "../../../core/loader";
import { globalConfig } from "../../../core/config";
-import { makeDiv } from "../../../core/utils";
+import { makeDiv, formatBigNumber, formatBigNumberFull } from "../../../core/utils";
import { DynamicDomAttach } from "../dynamic_dom_attach";
import { createLogger } from "../../../core/logging";
import { enumMouseButton } from "../../camera";
import { T } from "../../../translations";
import { KEYMAPPINGS } from "../../key_action_mapper";
+import { THEME } from "../../theme";
const logger = createLogger("hud/mass_selector");
@@ -20,13 +21,17 @@ export class HUDMassSelector extends BaseHUDPart {
.getBinding(KEYMAPPINGS.massSelect.confirmMassDelete)
.getKeyCodeString();
const abortKeybinding = this.root.keyMapper.getBinding(KEYMAPPINGS.general.back).getKeyCodeString();
+ const copyKeybinding = this.root.keyMapper
+ .getBinding(KEYMAPPINGS.massSelect.massSelectCopy)
+ .getKeyCodeString();
this.element = makeDiv(
parent,
"ingame_HUD_MassSelector",
[],
- T.ingame.massDelete.infoText
+ T.ingame.massSelect.infoText
.replace("", removalKeybinding)
+ .replace("", copyKeybinding)
.replace("", abortKeybinding)
);
}
@@ -36,7 +41,7 @@ export class HUDMassSelector extends BaseHUDPart {
this.currentSelectionStart = null;
this.currentSelectionEnd = null;
- this.entityUidsMarkedForDeletion = new Set();
+ this.selectedUids = new Set();
this.root.signals.entityQueuedForDestroy.add(this.onEntityDestroyed, this);
@@ -48,6 +53,7 @@ export class HUDMassSelector extends BaseHUDPart {
this.root.keyMapper
.getBinding(KEYMAPPINGS.massSelect.confirmMassDelete)
.add(this.confirmDelete, this);
+ this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectCopy).add(this.startCopy, this);
this.domAttach = new DynamicDomAttach(this.root, this.element);
}
@@ -57,7 +63,7 @@ export class HUDMassSelector extends BaseHUDPart {
* @param {Entity} entity
*/
onEntityDestroyed(entity) {
- this.entityUidsMarkedForDeletion.delete(entity.uid);
+ this.selectedUids.delete(entity.uid);
}
/**
@@ -65,24 +71,50 @@ export class HUDMassSelector extends BaseHUDPart {
*/
onBack() {
// Clear entities on escape
- if (this.entityUidsMarkedForDeletion.size > 0) {
- this.entityUidsMarkedForDeletion = new Set();
+ if (this.selectedUids.size > 0) {
+ this.selectedUids = new Set();
return STOP_PROPAGATION;
}
}
confirmDelete() {
- const entityUids = Array.from(this.entityUidsMarkedForDeletion);
+ if (this.selectedUids.size > 500) {
+ const { ok } = this.root.hud.parts.dialogs.showWarning(
+ T.dialogs.massDeleteConfirm.title,
+ T.dialogs.massDeleteConfirm.desc.replace(
+ "",
+ "" + formatBigNumberFull(this.selectedUids.size)
+ ),
+ ["cancel:good", "ok:bad"]
+ );
+ ok.add(() => this.doDelete());
+ } else {
+ this.doDelete();
+ }
+ }
+
+ doDelete() {
+ const entityUids = Array.from(this.selectedUids);
for (let i = 0; i < entityUids.length; ++i) {
const uid = entityUids[i];
const entity = this.root.entityMgr.findByUid(uid);
if (!this.root.logic.tryDeleteBuilding(entity)) {
logger.error("Error in mass delete, could not remove building");
- this.entityUidsMarkedForDeletion.delete(uid);
+ this.selectedUids.delete(uid);
}
}
}
+ startCopy() {
+ if (this.selectedUids.size > 0) {
+ this.root.hud.signals.buildingsSelectedForCopy.dispatch(Array.from(this.selectedUids));
+ this.selectedUids = new Set();
+ this.root.soundProxy.playUiClick();
+ } else {
+ this.root.soundProxy.playUiError();
+ }
+ }
+
/**
* mouse down pre handler
* @param {Vector} pos
@@ -99,7 +131,7 @@ export class HUDMassSelector extends BaseHUDPart {
if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiple).currentlyDown) {
// Start new selection
- this.entityUidsMarkedForDeletion = new Set();
+ this.selectedUids = new Set();
}
this.currentSelectionStart = pos.copy();
@@ -132,7 +164,7 @@ export class HUDMassSelector extends BaseHUDPart {
for (let y = realTileStart.y; y <= realTileEnd.y; ++y) {
const contents = this.root.map.getTileContentXY(x, y);
if (contents && this.root.logic.canDeleteBuilding(contents)) {
- this.entityUidsMarkedForDeletion.add(contents.uid);
+ this.selectedUids.add(contents.uid);
}
}
}
@@ -143,7 +175,7 @@ export class HUDMassSelector extends BaseHUDPart {
}
update() {
- this.domAttach.update(this.entityUidsMarkedForDeletion.size > 0);
+ this.domAttach.update(this.selectedUids.size > 0);
}
/**
@@ -151,6 +183,8 @@ export class HUDMassSelector extends BaseHUDPart {
* @param {DrawParameters} parameters
*/
draw(parameters) {
+ const boundsBorder = 2;
+
if (this.currentSelectionStart) {
const worldStart = this.root.camera.screenToWorld(this.currentSelectionStart);
const worldEnd = this.root.camera.screenToWorld(this.currentSelectionEnd);
@@ -165,8 +199,8 @@ export class HUDMassSelector extends BaseHUDPart {
const realTileEnd = tileStart.max(tileEnd);
parameters.context.lineWidth = 1;
- parameters.context.fillStyle = "rgba(255, 127, 127, 0.2)";
- parameters.context.strokeStyle = "rgba(255, 127, 127, 0.5)";
+ parameters.context.fillStyle = THEME.map.selectionBackground;
+ parameters.context.strokeStyle = THEME.map.selectionOutline;
parameters.context.beginPath();
parameters.context.rect(
realWorldStart.x,
@@ -177,34 +211,40 @@ export class HUDMassSelector extends BaseHUDPart {
parameters.context.fill();
parameters.context.stroke();
+ parameters.context.fillStyle = THEME.map.selectionOverlay;
+
for (let x = realTileStart.x; x <= realTileEnd.x; ++x) {
for (let y = realTileStart.y; y <= realTileEnd.y; ++y) {
const contents = this.root.map.getTileContentXY(x, y);
if (contents && this.root.logic.canDeleteBuilding(contents)) {
const staticComp = contents.components.StaticMapEntity;
- const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
- this.deletionMarker.drawCachedCentered(
- parameters,
- center.x,
- center.y,
- globalConfig.tileSize * 0.5
+ const bounds = staticComp.getTileSpaceBounds();
+ parameters.context.beginRoundedRect(
+ bounds.x * globalConfig.tileSize + boundsBorder,
+ bounds.y * globalConfig.tileSize + boundsBorder,
+ bounds.w * globalConfig.tileSize - 2 * boundsBorder,
+ bounds.h * globalConfig.tileSize - 2 * boundsBorder,
+ 2
);
+ parameters.context.fill();
}
}
}
}
- this.entityUidsMarkedForDeletion.forEach(uid => {
+ parameters.context.fillStyle = THEME.map.selectionOverlay;
+ this.selectedUids.forEach(uid => {
const entity = this.root.entityMgr.findByUid(uid);
const staticComp = entity.components.StaticMapEntity;
- const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
-
- this.deletionMarker.drawCachedCentered(
- parameters,
- center.x,
- center.y,
- globalConfig.tileSize * 0.5
+ const bounds = staticComp.getTileSpaceBounds();
+ parameters.context.beginRoundedRect(
+ bounds.x * globalConfig.tileSize + boundsBorder,
+ bounds.y * globalConfig.tileSize + boundsBorder,
+ bounds.w * globalConfig.tileSize - 2 * boundsBorder,
+ bounds.h * globalConfig.tileSize - 2 * boundsBorder,
+ 2
);
+ parameters.context.fill();
});
}
}
diff --git a/src/js/game/hud/parts/tutorial_hints.js b/src/js/game/hud/parts/tutorial_hints.js
index 853d054f..27fd5530 100644
--- a/src/js/game/hud/parts/tutorial_hints.js
+++ b/src/js/game/hud/parts/tutorial_hints.js
@@ -6,6 +6,7 @@ import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
import { BaseHUDPart } from "../base_hud_part";
import { DynamicDomAttach } from "../dynamic_dom_attach";
import { T } from "../../../translations";
+import { globalConfig } from "../../../core/config";
const tutorialVideos = [1, 2, 3, 4, 5, 6, 7, 9, 10, 11];
@@ -56,7 +57,7 @@ export class HUDPartTutorialHints extends BaseHUDPart {
this.currentShownLevel = new TrackedState(this.updateVideoUrl, this);
this.root.signals.postLoadHook.add(() => {
- if (this.root.hubGoals.level === 1) {
+ if (this.root.hubGoals.level === 1 && !(G_IS_DEV && globalConfig.debug.disableTutorialHints)) {
this.root.hud.parts.dialogs.showInfo(
T.dialogs.hintDescription.title,
T.dialogs.hintDescription.desc
diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js
index 2423cdb4..acc78024 100644
--- a/src/js/game/key_action_mapper.js
+++ b/src/js/game/key_action_mapper.js
@@ -60,6 +60,7 @@ export const KEYMAPPINGS = {
massSelect: {
massSelectStart: { keyCode: 17 }, // CTRL
massSelectSelectMultiple: { keyCode: 16 }, // SHIFT
+ massSelectCopy: { keyCode: key("C") },
confirmMassDelete: { keyCode: key("X") },
},
diff --git a/src/js/game/logic.js b/src/js/game/logic.js
index c96364da..dc89f8c2 100644
--- a/src/js/game/logic.js
+++ b/src/js/game/logic.js
@@ -60,6 +60,7 @@ export class GameLogic {
origin,
tileSize: building.getDimensions(variant),
rotation,
+ blueprintSpriteKey: "",
});
const rect = checker.getTileSpaceBounds();
@@ -168,6 +169,7 @@ export class GameLogic {
origin,
tileSize: building.getDimensions(variant),
rotation,
+ blueprintSpriteKey: "",
});
const rect = checker.getTileSpaceBounds();
diff --git a/src/js/game/map.js b/src/js/game/map.js
index 3fd82844..ef745c6d 100644
--- a/src/js/game/map.js
+++ b/src/js/game/map.js
@@ -147,6 +147,17 @@ export class BaseMap extends BasicSerializableObject {
return chunk && chunk.getTileContentFromWorldCoords(tile.x, tile.y) != null;
}
+ /**
+ * Checks if the tile is used
+ * @param {number} x
+ * @param {number} y
+ * @returns {boolean}
+ */
+ isTileUsedXY(x, y) {
+ const chunk = this.getChunkAtTileOrNull(x, y);
+ return chunk && chunk.getTileContentFromWorldCoords(x, y) != null;
+ }
+
/**
* Sets the tiles content
* @param {Vector} tile
diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js
index ad360ac0..8753aac5 100644
--- a/src/js/game/meta_building.js
+++ b/src/js/game/meta_building.js
@@ -154,6 +154,9 @@ export class MetaBuilding {
*/
createAndPlaceEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
const entity = new Entity(root);
+
+ const blueprintSprite = this.getBlueprintSprite(rotationVariant, variant);
+
entity.addComponent(
new StaticMapEntityComponent({
spriteKey:
@@ -166,6 +169,7 @@ export class MetaBuilding {
originalRotation,
tileSize: this.getDimensions(variant).copy(),
silhouetteColor: this.getSilhouetteColor(),
+ blueprintSpriteKey: blueprintSprite ? blueprintSprite.spriteName : "",
})
);
diff --git a/src/js/game/themes/dark.json b/src/js/game/themes/dark.json
index caf28bfb..fa4c22a8 100644
--- a/src/js/game/themes/dark.json
+++ b/src/js/game/themes/dark.json
@@ -4,7 +4,7 @@
"background": "#2e2f37",
"grid": "rgba(255, 255, 255, 0.02)",
"gridLineWidth": 0.5,
-
+ "selectionColor": "rgba(127, 127, 255, 0.5)",
"resources": {
"shape": "#3d3f4a",
"red": "#4a3d3f",
diff --git a/src/js/game/themes/light.json b/src/js/game/themes/light.json
index 4837574c..59e9e58f 100644
--- a/src/js/game/themes/light.json
+++ b/src/js/game/themes/light.json
@@ -5,6 +5,10 @@
"grid": "#fafafa",
"gridLineWidth": 1,
+ "selectionOverlay": "rgba(74, 163, 223, 0.7)",
+ "selectionOutline": "rgba(74, 163, 223, 0.5)",
+ "selectionBackground": "rgba(74, 163, 223, 0.2)",
+
"resources": {
"shape": "#eaebec",
"red": "#ffbfc1",
diff --git a/src/js/savegame/savegame.js b/src/js/savegame/savegame.js
index 8b9d2b3b..8027c188 100644
--- a/src/js/savegame/savegame.js
+++ b/src/js/savegame/savegame.js
@@ -11,8 +11,7 @@ import { createLogger } from "../core/logging";
import { globalConfig } from "../core/config";
import { SavegameInterface_V1000 } from "./schemas/1000";
import { getSavegameInterface } from "./savegame_interface_registry";
-import { compressObject } from "./savegame_compressor";
-import { compressX64 } from "../core/lzstring";
+import { SavegameInterface_V1001 } from "./schemas/1001";
const logger = createLogger("savegame");
@@ -29,7 +28,7 @@ export class Savegame extends ReadWriteProxy {
this.internalId = internalId;
this.metaDataRef = metaDataRef;
- /** @type {SavegameData} */
+ /** @type {import("./savegame_typedefs").SavegameData} */
this.currentData = this.getDefaultData();
}
@@ -39,14 +38,14 @@ export class Savegame extends ReadWriteProxy {
* @returns {number}
*/
static getCurrentVersion() {
- return 1000;
+ return 1001;
}
/**
* @returns {typeof BaseSavegameInterface}
*/
static getReaderClass() {
- return SavegameInterface_V1000;
+ return SavegameInterface_V1001;
}
/**
@@ -58,7 +57,7 @@ export class Savegame extends ReadWriteProxy {
/**
* Returns the savegames default data
- * @returns {SavegameData}
+ * @returns {import("./savegame_typedefs").SavegameData}
*/
getDefaultData() {
return {
@@ -73,18 +72,25 @@ export class Savegame extends ReadWriteProxy {
/**
* Migrates the savegames data
- * @param {SavegameData} data
+ * @param {import("./savegame_typedefs").SavegameData} data
*/
migrate(data) {
if (data.version < 1000) {
return ExplainedResult.bad("Can not migrate savegame, too old");
}
+
+ console.log("TODO: Migrate from", data.version);
+ if (data.version === 1000) {
+ SavegameInterface_V1001.migrate1000to1001(data);
+ data.version = 1001;
+ }
+
return ExplainedResult.good();
}
/**
* Verifies the savegames data
- * @param {SavegameData} data
+ * @param {import("./savegame_typedefs").SavegameData} data
*/
verify(data) {
if (!data.dump) {
@@ -109,7 +115,7 @@ export class Savegame extends ReadWriteProxy {
}
/**
* Returns the statistics of the savegame
- * @returns {SavegameStats}
+ * @returns {import("./savegame_typedefs").SavegameStats}
*/
getStatistics() {
return this.currentData.stats;
@@ -132,7 +138,7 @@ export class Savegame extends ReadWriteProxy {
/**
* Returns the current game dump
- * @returns {SerializedGame}
+ * @returns {import("./savegame_typedefs").SerializedGame}
*/
getCurrentDump() {
return this.currentData.dump;
diff --git a/src/js/savegame/savegame_interface_registry.js b/src/js/savegame/savegame_interface_registry.js
index 6ad22a42..2560b23e 100644
--- a/src/js/savegame/savegame_interface_registry.js
+++ b/src/js/savegame/savegame_interface_registry.js
@@ -1,10 +1,12 @@
import { BaseSavegameInterface } from "./savegame_interface";
import { SavegameInterface_V1000 } from "./schemas/1000";
import { createLogger } from "../core/logging";
+import { SavegameInterface_V1001 } from "./schemas/1001";
/** @type {Object.} */
const interfaces = {
1000: SavegameInterface_V1000,
+ 1001: SavegameInterface_V1001,
};
const logger = createLogger("savegame_interface_registry");
diff --git a/src/js/savegame/savegame_typedefs.js b/src/js/savegame/savegame_typedefs.js
index ca72d856..821306a4 100644
--- a/src/js/savegame/savegame_typedefs.js
+++ b/src/js/savegame/savegame_typedefs.js
@@ -4,14 +4,7 @@
* }} SavegameStats
*/
-/**
- * @typedef {{
- * x: number,
- * y: number,
- * uid: number,
- * key: string
- * }} SerializedMapResource
- */
+import { Entity } from "../game/entity";
/**
* @typedef {{
@@ -20,7 +13,7 @@
* entityMgr: any,
* map: any,
* hubGoals: any,
- * entities: Array
+ * entities: Array
* }} SerializedGame
*/
diff --git a/src/js/savegame/schemas/1001.js b/src/js/savegame/schemas/1001.js
new file mode 100644
index 00000000..7604dec4
--- /dev/null
+++ b/src/js/savegame/schemas/1001.js
@@ -0,0 +1,52 @@
+import { SavegameInterface_V1000 } from "./1000.js";
+import { createLogger } from "../../core/logging.js";
+
+const schema = require("./1001.json");
+
+const logger = createLogger("savegame_interface/1001");
+
+export class SavegameInterface_V1001 extends SavegameInterface_V1000 {
+ getVersion() {
+ return 1001;
+ }
+
+ getSchemaUncached() {
+ return schema;
+ }
+
+ /**
+ * @param {import("../savegame_typedefs.js").SavegameData} data
+ */
+ static migrate1000to1001(data) {
+ logger.log("Migrating 1000 to 1001");
+ const dump = data.dump;
+ if (!dump) {
+ return true;
+ }
+
+ const entities = dump.entities;
+ for (let i = 0; i < entities.length; ++i) {
+ const entity = entities[i];
+
+ const staticComp = entity.components.StaticMapEntity;
+ const beltComp = entity.components.Belt;
+ if (staticComp) {
+ if (staticComp.spriteKey) {
+ staticComp.blueprintSpriteKey = staticComp.spriteKey.replace(
+ "sprites/buildings",
+ "sprites/blueprints"
+ );
+ } else {
+ if (entity.components.Hub) {
+ staticComp.blueprintSpriteKey = "";
+ } else if (beltComp) {
+ const direction = beltComp.direction;
+ staticComp.blueprintSpriteKey = "sprites/blueprints/belt_" + direction + ".png";
+ } else {
+ assertAlways(false, "Could not deduct entity type for migrating 1000 -> 1001");
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/js/savegame/schemas/1001.json b/src/js/savegame/schemas/1001.json
new file mode 100644
index 00000000..6682f615
--- /dev/null
+++ b/src/js/savegame/schemas/1001.json
@@ -0,0 +1,5 @@
+{
+ "type": "object",
+ "required": [],
+ "additionalProperties": true
+}
diff --git a/src/js/savegame/serializer_internal.js b/src/js/savegame/serializer_internal.js
index 3eb0f72b..ec761beb 100644
--- a/src/js/savegame/serializer_internal.js
+++ b/src/js/savegame/serializer_internal.js
@@ -43,7 +43,7 @@ export class SerializerInternal {
* @param {Entity} payload
*/
deserializeEntity(root, payload) {
- const entity = new Entity(null);
+ const entity = new Entity(root);
this.deserializeComponents(entity, payload.components);
root.entityMgr.registerEntity(entity, payload.uid);
diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js
index 9dd18909..d95f520e 100644
--- a/src/js/states/main_menu.js
+++ b/src/js/states/main_menu.js
@@ -198,12 +198,12 @@ export class MainMenuState extends GameState {
this.trackClicks(qs(".mainContainer .importButton"), this.requestImportSavegame);
if (G_IS_DEV && globalConfig.debug.fastGameEnter) {
- // // const games = this.app.savegameMgr.getSavegamesMetaData();
- // if (games.length > 0) {
- // this.resumeGame(games[0]);
- // } else {
- this.onPlayButtonClicked();
- // }
+ const games = this.app.savegameMgr.getSavegamesMetaData();
+ if (games.length > 0) {
+ this.resumeGame(games[0]);
+ } else {
+ this.onPlayButtonClicked();
+ }
}
// Initialize video
diff --git a/src/js/states/preload.js b/src/js/states/preload.js
index 43c84eb0..29d5bdd4 100644
--- a/src/js/states/preload.js
+++ b/src/js/states/preload.js
@@ -6,6 +6,7 @@ import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper";
import { T } from "../translations";
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
import { CHANGELOG } from "../changelog";
+import { globalConfig } from "../core/config";
const logger = createLogger("state/preload");
@@ -179,6 +180,10 @@ export class PreloadState extends GameState {
.then(() => this.setStatus("Checking changelog"))
.then(() => {
+ if (G_IS_DEV && globalConfig.debug.disableUpgradeNotification) {
+ return;
+ }
+
return this.app.storage
.readFileAsync("lastversion.bin")
.catch(err => {
diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json
index 57c0a852..e42edc98 100644
--- a/src/js/tsconfig.json
+++ b/src/js/tsconfig.json
@@ -55,5 +55,4 @@
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
"resolveJsonModule": true
},
- "exclude": ["backend/shared/gameserver_base_impl", "backend/shared/sentry_logger.js"]
}
diff --git a/translations/base-en.yaml b/translations/base-en.yaml
index 2318c342..889e6583 100644
--- a/translations/base-en.yaml
+++ b/translations/base-en.yaml
@@ -172,6 +172,11 @@ dialogs:
All shapes you produce can be used to unlock upgrades - Don't destroy your old factories!
The upgrades tab can be found on the top right corner of the screen.
+ massDeleteConfirm:
+ title: Confirm delete
+ desc: >-
+ You are deleting a lot of buildings ( to be exact)! Are you sure you want to do this?
+
ingame:
# This is shown in the top left corner and displays useful keybindings in
# every situation
@@ -221,10 +226,10 @@ ingame:
newUpgrade: A new upgrade is available!
gameSaved: Your game has been saved.
- # Mass delete information, this is when you hold CTRL and then drag with your mouse
- # to select multiple buildings to delete
- massDelete:
- infoText: Press to remove selected buildings and to cancel.
+ # Mass select information, this is when you hold CTRL and then drag with your mouse
+ # to select multiple buildings
+ massSelect:
+ infoText: Press to copy, to remove and to cancel.
# The "Upgrades" window
shop:
diff --git a/yarn.lock b/yarn.lock
index 7fbd075b..90c6e840 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1023,6 +1023,11 @@
resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-0.0.34.tgz#ea7addf74ecec3d7629827a0c39e2c9addc73d04"
integrity sha1-6nrd907Ow9dimCegw54smt3HPQQ=
+"@types/eslint-visitor-keys@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
+ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
+
"@types/filesystem@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748"
@@ -1035,11 +1040,60 @@
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3"
integrity sha1-wFTor02d11205jq8dviFFocU1LM=
+"@types/json-schema@^7.0.3":
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
+ integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
+
"@types/q@^1.5.1":
version "1.5.2"
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
+"@typescript-eslint/eslint-plugin@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.0.1.tgz#368fe7d4c3d927e9fd27b7ba150b4b7e83ddfabe"
+ integrity sha512-RxGldRQD3hgOK2xtBfNfA5MMV3rn5gVChe+MIf14hKm51jO2urqF64xOyVrGtzThkrd4rS1Kihqx2nkSxkXHvA==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "3.0.1"
+ functional-red-black-tree "^1.0.1"
+ regexpp "^3.0.0"
+ semver "^7.3.2"
+ tsutils "^3.17.1"
+
+"@typescript-eslint/experimental-utils@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.0.1.tgz#e2721c970068fabd6621709234809c98cd3343ad"
+ integrity sha512-GdwOVz80MOWxbc/br1DC30eeqlxfpVzexHgHtf3L0hcbOu1xAs1wSCNcaBTLMOMZbh1gj/cKZt0eB207FxWfFA==
+ dependencies:
+ "@types/json-schema" "^7.0.3"
+ "@typescript-eslint/typescript-estree" "3.0.1"
+ eslint-scope "^5.0.0"
+ eslint-utils "^2.0.0"
+
+"@typescript-eslint/parser@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.0.1.tgz#f5163e3a789422f5c62f4daf822bfa03b7e4472d"
+ integrity sha512-Pn2tDmOc4Ri93VQnT70W0pqQr6i/pEZqIPXfWXm4RuiIprL0t6SG13ViVXHgfScknL2Fm2G4IqXhUzxSRCWXCw==
+ dependencies:
+ "@types/eslint-visitor-keys" "^1.0.0"
+ "@typescript-eslint/experimental-utils" "3.0.1"
+ "@typescript-eslint/typescript-estree" "3.0.1"
+ eslint-visitor-keys "^1.1.0"
+
+"@typescript-eslint/typescript-estree@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.0.1.tgz#8c0cfb7cda64bd6f54185a7b7d1923d25d36b2a8"
+ integrity sha512-FrbMdgVCeIGHKaP9OYTttFTlF8Ds7AkjMca2GzYCE7pVch10PAJc1mmAFt+DfQPgu/2TrLAprg2vI0PK/WTdcg==
+ dependencies:
+ debug "^4.1.1"
+ eslint-visitor-keys "^1.1.0"
+ glob "^7.1.6"
+ is-glob "^4.0.1"
+ lodash "^4.17.15"
+ semver "^7.3.2"
+ tsutils "^3.17.1"
+
"@webassemblyjs/ast@1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
@@ -1210,7 +1264,7 @@ acorn-jsx@^3.0.0:
dependencies:
acorn "^3.0.4"
-acorn-jsx@^5.0.0:
+acorn-jsx@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
@@ -1230,7 +1284,7 @@ acorn@^5.5.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
-acorn@^6.0.7, acorn@^6.2.1:
+acorn@^6.2.1:
version "6.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
@@ -1255,7 +1309,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
-ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.9.1:
+ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0:
version "6.12.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
@@ -1265,6 +1319,16 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.9.1:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ajv@^6.10.0:
+ version "6.12.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
+ integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
alphanum-sort@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
@@ -1287,10 +1351,12 @@ ansi-escapes@^1.1.0:
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
-ansi-escapes@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
- integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
+ansi-escapes@^4.2.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
+ integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
+ dependencies:
+ type-fest "^0.11.0"
ansi-gray@^0.1.1:
version "0.1.1"
@@ -1331,7 +1397,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.0.0:
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
@@ -2216,7 +2282,7 @@ chalk@2.3.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -2225,6 +2291,22 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
+ integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chance@1.0.13:
version "1.0.13"
resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.13.tgz#666bec2db42b3084456a3e4f4c28a82db5ccb7e6"
@@ -2330,6 +2412,13 @@ cli-cursor@^2.1.0:
dependencies:
restore-cursor "^2.0.0"
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
cli-table@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
@@ -2709,7 +2798,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
-cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+cross-spawn@6.0.5, cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -2729,6 +2818,15 @@ cross-spawn@^5.0.1:
shebang-command "^1.2.0"
which "^1.2.9"
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
crypt@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
@@ -2965,7 +3063,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
-debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@~4.1.0:
+debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
@@ -3049,7 +3147,7 @@ decompress@^4.0.0, decompress@^4.2.0:
pify "^2.3.0"
strip-dirs "^2.0.0"
-deep-is@~0.1.3:
+deep-is@^0.1.3, deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
@@ -3480,6 +3578,20 @@ escodegen-wallaby@1.6.18:
optionalDependencies:
source-map "~0.2.0"
+eslint-config-prettier@6.11.0:
+ version "6.11.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1"
+ integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==
+ dependencies:
+ get-stdin "^6.0.0"
+
+eslint-plugin-prettier@3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca"
+ integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
@@ -3488,59 +3600,67 @@ eslint-scope@^4.0.3:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-utils@^1.3.1:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+eslint-scope@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
+ integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
+ integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
dependencies:
eslint-visitor-keys "^1.1.0"
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+eslint-visitor-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-eslint@^5.9.0:
- version "5.16.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
- integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
+eslint@7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.1.0.tgz#d9a1df25e5b7859b0a3d86bb05f0940ab676a851"
+ integrity sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==
dependencies:
"@babel/code-frame" "^7.0.0"
- ajv "^6.9.1"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
debug "^4.0.1"
doctrine "^3.0.0"
- eslint-scope "^4.0.3"
- eslint-utils "^1.3.1"
- eslint-visitor-keys "^1.0.0"
- espree "^5.0.1"
- esquery "^1.0.1"
+ eslint-scope "^5.0.0"
+ eslint-utils "^2.0.0"
+ eslint-visitor-keys "^1.1.0"
+ espree "^7.0.0"
+ esquery "^1.2.0"
esutils "^2.0.2"
file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1"
- glob "^7.1.2"
- globals "^11.7.0"
+ glob-parent "^5.0.0"
+ globals "^12.1.0"
ignore "^4.0.6"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
- inquirer "^6.2.2"
- js-yaml "^3.13.0"
+ inquirer "^7.0.0"
+ is-glob "^4.0.0"
+ js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.11"
+ levn "^0.4.1"
+ lodash "^4.17.14"
minimatch "^3.0.4"
- mkdirp "^0.5.1"
natural-compare "^1.4.0"
- optionator "^0.8.2"
- path-is-inside "^1.0.2"
+ optionator "^0.9.1"
progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^5.5.1"
- strip-ansi "^4.0.0"
- strip-json-comments "^2.0.1"
+ regexpp "^3.1.0"
+ semver "^7.2.1"
+ strip-ansi "^6.0.0"
+ strip-json-comments "^3.1.0"
table "^5.2.3"
text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
espree@3.5.4:
version "3.5.4"
@@ -3550,14 +3670,14 @@ espree@3.5.4:
acorn "^5.5.0"
acorn-jsx "^3.0.0"
-espree@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
- integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
+espree@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e"
+ integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==
dependencies:
- acorn "^6.0.7"
- acorn-jsx "^5.0.0"
- eslint-visitor-keys "^1.0.0"
+ acorn "^7.1.1"
+ acorn-jsx "^5.2.0"
+ eslint-visitor-keys "^1.1.0"
esprima@^2.7.1:
version "2.7.3"
@@ -3574,12 +3694,12 @@ esprima@~3.1.0:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
-esquery@^1.0.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.1.tgz#105239e215c5aa480369c7794d74b8b5914c19d4"
- integrity sha512-/IcAXa9GWOX9BUIb/Tz2QrrAWFWzWGrFIeLeMRwtiuwg9qTFhSYemsi9DixwrFFqVbhBZ47vGcxEnu5mbPqbig==
+esquery@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+ integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
dependencies:
- estraverse "^5.0.0"
+ estraverse "^5.1.0"
esrecurse@^4.1.0, esrecurse@^4.2.1:
version "4.2.1"
@@ -3603,10 +3723,10 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-estraverse@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22"
- integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==
+estraverse@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+ integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
esutils@^2.0.2:
version "2.0.3"
@@ -3820,12 +3940,17 @@ fast-deep-equal@^3.1.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
+fast-diff@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+ integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@~2.0.6:
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
@@ -3874,6 +3999,13 @@ figures@^2.0.0:
dependencies:
escape-string-regexp "^1.0.5"
+figures@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+ integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
file-entry-cache@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
@@ -4172,6 +4304,11 @@ get-stdin@^4.0.1:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
+get-stdin@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
+ integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
+
get-stream@3.0.0, get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -4213,7 +4350,14 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob@^7.0.5, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+glob-parent@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+ integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.0.5, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -4269,11 +4413,18 @@ global@~4.3.0:
min-document "^2.19.0"
process "~0.5.1"
-globals@^11.1.0, globals@^11.7.0:
+globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+globals@^12.1.0:
+ version "12.4.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
+ integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+ dependencies:
+ type-fest "^0.8.1"
+
gonzales-pe@^4.2.3:
version "4.3.0"
resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
@@ -4371,6 +4522,11 @@ has-flag@^3.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
has-symbol-support-x@^1.4.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
@@ -4727,23 +4883,23 @@ inquirer@3.0.6:
strip-ansi "^3.0.0"
through "^2.3.6"
-inquirer@^6.2.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
- integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
+inquirer@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
+ integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
dependencies:
- ansi-escapes "^3.2.0"
- chalk "^2.4.2"
- cli-cursor "^2.1.0"
+ ansi-escapes "^4.2.1"
+ chalk "^3.0.0"
+ cli-cursor "^3.1.0"
cli-width "^2.0.0"
external-editor "^3.0.3"
- figures "^2.0.0"
- lodash "^4.17.12"
- mute-stream "0.0.7"
- run-async "^2.2.0"
- rxjs "^6.4.0"
- string-width "^2.1.0"
- strip-ansi "^5.1.0"
+ figures "^3.0.0"
+ lodash "^4.17.15"
+ mute-stream "0.0.8"
+ run-async "^2.4.0"
+ rxjs "^6.5.3"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
through "^2.3.6"
interpret@1.2.0:
@@ -4942,7 +5098,7 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
-is-glob@^4.0.0:
+is-glob@^4.0.0, is-glob@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@@ -5152,7 +5308,7 @@ js-string-escape@1.0.1:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.0, js-yaml@^3.13.1:
+js-yaml@^3.13.1:
version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -5278,7 +5434,15 @@ levenary@^1.1.1:
dependencies:
leven "^3.1.0"
-levn@^0.3.0, levn@~0.3.0:
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
@@ -5427,7 +5591,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0:
+lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -5700,7 +5864,7 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-mimic-fn@^2.0.0:
+mimic-fn@^2.0.0, mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
@@ -5843,6 +6007,11 @@ mute-stream@0.0.7:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
+mute-stream@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
nan@^2.12.1:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@@ -6134,6 +6303,13 @@ onetime@^2.0.0:
dependencies:
mimic-fn "^1.0.0"
+onetime@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
+ integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
+ dependencies:
+ mimic-fn "^2.1.0"
+
opencollective@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1"
@@ -6171,7 +6347,7 @@ opn@5.3.0:
dependencies:
is-wsl "^1.1.0"
-optionator@^0.8.1, optionator@^0.8.2:
+optionator@^0.8.1:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -6183,6 +6359,18 @@ optionator@^0.8.1, optionator@^0.8.2:
type-check "~0.3.2"
word-wrap "~1.2.3"
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.3"
+
os-browserify@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
@@ -6482,16 +6670,16 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-is-inside@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
- integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
-
path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
@@ -7293,6 +7481,11 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2
source-map "^0.6.1"
supports-color "^6.1.0"
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -7308,6 +7501,13 @@ prepend-http@^2.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
prettier@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef"
@@ -7621,10 +7821,10 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+regexpp@^3.0.0, regexpp@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
+ integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
regexpu-core@^4.7.0:
version "4.7.0"
@@ -7762,6 +7962,14 @@ restore-cursor@^2.0.0:
onetime "^2.0.0"
signal-exit "^3.0.2"
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -7806,6 +8014,11 @@ run-async@^2.2.0:
dependencies:
is-promise "^2.1.0"
+run-async@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
run-queue@^1.0.0, run-queue@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
@@ -7830,7 +8043,7 @@ rxjs@^5.5.6:
dependencies:
symbol-observable "1.0.1"
-rxjs@^6.4.0:
+rxjs@^6.5.3:
version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
@@ -7916,7 +8129,7 @@ semver-truncate@^1.1.2:
dependencies:
semver "^5.3.0"
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -7926,6 +8139,11 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+semver@^7.2.1, semver@^7.3.2:
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+ integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
@@ -8057,11 +8275,23 @@ shebang-command@^1.2.0:
dependencies:
shebang-regex "^1.0.0"
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
@@ -8454,7 +8684,7 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
-string-width@^2.0.0, string-width@^2.1.0:
+string-width@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@@ -8582,12 +8812,7 @@ strip-indent@^1.0.1:
dependencies:
get-stdin "^4.0.1"
-strip-json-comments@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-
-strip-json-comments@^3.0.1:
+strip-json-comments@^3.0.1, strip-json-comments@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
@@ -8641,6 +8866,13 @@ supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ dependencies:
+ has-flag "^4.0.0"
+
svgo@^1.0.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
@@ -8872,11 +9104,23 @@ tslib@1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
+tslib@^1.8.1:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
+ integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+
tslib@^1.9.0:
version "1.11.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
+tsutils@^3.17.1:
+ version "3.17.1"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
+ integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
+ dependencies:
+ tslib "^1.8.1"
+
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -8889,6 +9133,13 @@ tunnel-agent@^0.6.0:
dependencies:
safe-buffer "^5.0.1"
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
type-check@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
@@ -8896,11 +9147,21 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
+type-fest@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+ integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
type-fest@^0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2"
integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -8914,6 +9175,11 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+typescript@3.9.3:
+ version "3.9.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a"
+ integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==
+
ua-parser-js@0.7.17:
version "0.7.17"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
@@ -9141,6 +9407,11 @@ v8-compile-cache@2.0.3:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
+v8-compile-cache@^2.0.3:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
+ integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
+
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -9326,12 +9597,19 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1:
dependencies:
isexe "^2.0.0"
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
window-size@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
-word-wrap@~1.2.3:
+word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==