aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--diplomacy/daide/tests/test_daide_game.py6
-rw-r--r--diplomacy/engine/game.py5
-rw-r--r--diplomacy/server/request_managers.py15
-rw-r--r--diplomacy/server/server.py47
-rw-r--r--diplomacy/server/server_game.py20
-rw-r--r--diplomacy/utils/strings.py1
-rw-r--r--diplomacy/web/package-lock.json378
-rw-r--r--diplomacy/web/package.json3
-rw-r--r--diplomacy/web/src/diplomacy/engine/game.js1
-rw-r--r--diplomacy/web/src/gui/components/power_orders_actions_bar.js2
-rw-r--r--diplomacy/web/src/gui/pages/content_game.jsx15
11 files changed, 294 insertions, 199 deletions
diff --git a/diplomacy/daide/tests/test_daide_game.py b/diplomacy/daide/tests/test_daide_game.py
index e950edf..ef2efce 100644
--- a/diplomacy/daide/tests/test_daide_game.py
+++ b/diplomacy/daide/tests/test_daide_game.py
@@ -340,8 +340,10 @@ def run_game_data(nb_daide_clients, rules, csv_file):
server.start(port=port)
nb_regular_players = min(1, 7 - nb_daide_clients)
- server_game = ServerGame(map_name='standard', n_controls=nb_daide_clients + nb_regular_players, rules=rules)
- server_game.server = server
+ server_game = ServerGame(map_name='standard',
+ n_controls=nb_daide_clients + nb_regular_players,
+ rules=rules,
+ server=server)
# Register game on server.
server.add_new_game(server_game)
diff --git a/diplomacy/engine/game.py b/diplomacy/engine/game.py
index 06d2fe6..52ade4f 100644
--- a/diplomacy/engine/game.py
+++ b/diplomacy/engine/game.py
@@ -61,6 +61,7 @@ class Game(Jsonable):
e.g. [(START_LOC, {Fleets Req}, {possible dest}), ...]
- convoy_paths_dest - Contains a dictionary of possible paths to reach destination from start or None
e.g. {start_loc: {dest_loc_1: [{fleets}, {fleets}, {fleets}], dest_loc_2: [{fleets, fleets}]}
+ - daide_port: for client games only. Port when a DAIDE bot can connect, to play with this game.
- deadline: integer: game deadline in seconds.
- dislodged - Contains a dictionary of dislodged units (and the site that dislodged them')
e.g. { 'A PAR': 'MAR' }
@@ -166,11 +167,12 @@ class Game(Jsonable):
'convoy_paths_dest', 'zobrist_hash', 'renderer', 'game_id', 'map_name', 'role', 'rules',
'message_history', 'state_history', 'result_history', 'status', 'timestamp_created', 'n_controls',
'deadline', 'registration_password', 'observer_level', 'controlled_powers', '_phase_wrapper_type',
- 'phase_abbr', '_unit_owner_cache']
+ 'phase_abbr', '_unit_owner_cache', 'daide_port']
zobrist_tables = {}
rule_cache = ()
model = {
strings.CONTROLLED_POWERS: parsing.OptionalValueType(parsing.SequenceType(str)),
+ strings.DAIDE_PORT: parsing.OptionalValueType(int),
strings.DEADLINE: parsing.DefaultValueType(int, 300),
strings.ERROR: parsing.DefaultValueType(parsing.SequenceType(parsing.StringableType(err.Error)), []),
strings.GAME_ID: parsing.OptionalValueType(str),
@@ -232,6 +234,7 @@ class Game(Jsonable):
self.registration_password = None
self.observer_level = None
self.controlled_powers = None
+ self.daide_port = None
# Caches
self._unit_owner_cache = None # {(unit, coast_required): owner}
diff --git a/diplomacy/server/request_managers.py b/diplomacy/server/request_managers.py
index fdc4564..5fa434e 100644
--- a/diplomacy/server/request_managers.py
+++ b/diplomacy/server/request_managers.py
@@ -132,13 +132,16 @@ def on_create_game(server, request, connection_handler):
initial_state=state,
n_controls=request.n_controls,
deadline=request.deadline,
- registration_password=request.registration_password)
- server_game.server = server
+ registration_password=request.registration_password,
+ server=server)
# Make sure game creator will be a game master (set him as moderator if he's not an admin).
if not server.users.has_admin(username):
server_game.promote_moderator(username)
+ # Register game on server.
+ server.add_new_game(server_game)
+
# Register game creator, as either power player or omniscient observer.
if power_name:
server_game.control(power_name, username, token)
@@ -147,10 +150,6 @@ def on_create_game(server, request, connection_handler):
server_game.add_omniscient_token(token)
client_game = server_game.as_omniscient_game(username)
- # Register game on server.
- server.add_new_game(server_game)
- server.start_new_daide_server(game_id)
-
# Start game immediately if possible (e.g. if it's a solitaire game).
if server_game.game_can_start():
server.start_game(server_game)
@@ -217,7 +216,6 @@ def on_delete_game(server, request, connection_handler):
level = verify_request(server, request, connection_handler, observer_role=False, power_role=False)
server.delete_game(level.game)
server.unschedule_game(level.game)
- server.stop_daide_server(level.game.game_id)
Notifier(server, ignore_tokens=[request.token]).notify_game_deleted(level.game)
def on_get_dummy_waiting_powers(server, request, connection_handler):
@@ -270,7 +268,8 @@ def on_get_daide_port(server, request, connection_handler):
del connection_handler
daide_port = server.get_daide_port(request.game_id)
if daide_port is None:
- raise exceptions.DaidePortException('Invalid game id or game\'s DAIDE server is not started for that game')
+ raise exceptions.DaidePortException(
+ "Invalid game id %s or game's DAIDE server is not started for that game" % request.game_id)
return responses.DataPort(data=daide_port, request_id=request.request_id)
def on_get_playable_powers(server, request, connection_handler):
diff --git a/diplomacy/server/server.py b/diplomacy/server/server.py
index 4a1647c..ee585c3 100644
--- a/diplomacy/server/server.py
+++ b/diplomacy/server/server.py
@@ -53,6 +53,7 @@ import os
from random import randint
import socket
import signal
+from typing import Dict, Set
import tornado
import tornado.web
@@ -227,13 +228,13 @@ class Server():
self.backup_delay_seconds = constants.DEFAULT_BACKUP_DELAY_SECONDS
self.ping_seconds = constants.DEFAULT_PING_SECONDS
self.users = None # type: Users # Users and administrators usernames.
- self.available_maps = {} # type: dict{str, set()} # {"map_name" => set("map_power")}
+ self.available_maps = {} # type: Dict[str, Set[str]] # {"map_name" => set("map_power")}
self.maps_mtime = 0 # Latest maps modification date (used to manage maps cache in server object).
# Server games loaded on memory (stored on disk).
# Saved separately (each game in one JSON file).
# Each game also stores tokens connected (player tokens, observer tokens, omniscient tokens).
- self.games = {} # type: dict{str, ServerGame}
+ self.games = {} # type: Dict[str, ServerGame]
# Dictionary mapping game IDs to dummy power names.
self.games_with_dummy_powers = {} # type: dict{str, set}
@@ -404,6 +405,12 @@ class Server():
# Game was processed normally.
# Send game updates to powers, observers and omniscient observers.
yield notifier.notify_game_processed(server_game, previous_phase_data, current_phase_data)
+
+ # If game is completed, we must close associated DAIDE port.
+ if server_game.is_game_done:
+ self.stop_daide_server(server_game.game_id)
+
+ # Game must be stopped if not active.
return not server_game.is_game_active
@gen.coroutine
@@ -596,7 +603,7 @@ class Server():
If such game is already stored in server object, return it.
Else, load it from disk but ** does not store it in server object **.
To load and immediately store a game object in server object, please use method get_game().
- Method load_game() is convenient where you want to iterate over all games in server database
+ Method load_game() is convenient when you want to iterate over all games in server database
without taking memory space.
:param game_id: ID of game to load.
:return: a ServerGame object
@@ -621,15 +628,22 @@ class Server():
# This should be an internal server error.
raise exc
+ #
def add_new_game(self, server_game):
- """ Add a new game data on server in memory. This does not save the game on disk.
+ """ Add a new game data on server in memory and perform any addition processing.
+ This does not save the game on disk.
:type server_game: ServerGame
"""
+ # Register game on memory.
self.games[server_game.game_id] = server_game
+ # Start DAIDE server for this game.
+ self.start_new_daide_server(server_game.game_id)
+ #
def get_game(self, game_id):
""" Return game saved on server matching given game ID. Raise an exception if game ID not found.
- Return game if already loaded on memory, else load it from disk, store it and return it.
+ Return game if already loaded on memory, else load it from disk, store it,
+ perform any loading/addition processing and return it.
:param game_id: ID of game to load.
:return: a ServerGame object.
:rtype: ServerGame
@@ -639,35 +653,43 @@ class Server():
LOGGER.debug('Game loaded: %s', game_id)
# Check dummy powers for this game as soon as it's loaded from disk.
self.register_dummy_power_names(server_game)
+ # Register game on memory.
self.games[server_game.game_id] = server_game
+ # Start DAIDE server for this game.
+ self.start_new_daide_server(server_game.game_id)
# We have just loaded game from disk. Start it if necessary.
if not server_game.start_master and server_game.has_expected_controls_count():
# We may have to start game.
- stop = False
if server_game.does_not_wait():
# We must process game.
- process_result = server_game.process()
- stop = process_result is None or process_result[-1]
+ server_game.process()
self.save_game(server_game)
- if not stop:
+ # Game must be scheduled only if active.
+ if server_game.is_game_active:
LOGGER.debug('Game loaded and scheduled: %s', server_game.game_id)
self.schedule_game(server_game)
return server_game
+ #
def delete_game(self, server_game):
- """ Delete given game from server (both from memory and disk).
+ """ Delete given game from server (both from memory and disk) and perform any post-deletion processing.
:param server_game: game to delete
:type server_game: ServerGame
"""
if not (server_game.is_game_canceled or server_game.is_game_completed):
server_game.set_status(strings.CANCELED)
game_filename = os.path.join(self.games_path, '%s.json' % server_game.game_id)
+ backup_game_filename = get_backup_filename(game_filename)
if os.path.isfile(game_filename):
os.remove(game_filename)
+ if os.path.isfile(backup_game_filename):
+ os.remove(backup_game_filename)
self.games.pop(server_game.game_id, None)
self.backup_games.pop(server_game.game_id, None)
self.games_with_dummy_powers.pop(server_game.game_id, None)
self.dispatched_dummy_powers.pop(server_game.game_id, None)
+ # Stop DAIDE server associated to this game.
+ self.stop_daide_server(server_game.game_id)
@gen.coroutine
def schedule_game(self, server_game):
@@ -821,7 +843,7 @@ class Server():
def start_new_daide_server(self, game_id, port=None):
""" Start a new DAIDE TCP server to handle DAIDE clients connections
:param game_id: game id to pass to the DAIDE server
- :param port: the port to use. If None, an available random prot will be used
+ :param port: the port to use. If None, an available random port will be used
"""
if port in self.daide_servers:
raise RuntimeError('Port already in used by a DAIDE server')
@@ -837,12 +859,13 @@ class Server():
daide_server = DaideServer(self, game_id)
daide_server.listen(port)
self.daide_servers[port] = daide_server
- LOGGER.info('DAIDE server running on port %d', port)
+ LOGGER.info('DAIDE server running for game %s on port %d', game_id, port)
return port
def stop_daide_server(self, game_id):
""" Stop one or all DAIDE TCP server
:param game_id: game id of the DAIDE server. If None, all servers will be stopped
+ :type game_id: str
"""
for port in list(self.daide_servers.keys()):
server = self.daide_servers[port]
diff --git a/diplomacy/server/server_game.py b/diplomacy/server/server_game.py
index 6ea349e..4e90152 100644
--- a/diplomacy/server/server_game.py
+++ b/diplomacy/server/server_game.py
@@ -23,6 +23,7 @@ from diplomacy.utils.game_phase_data import GamePhaseData
class ServerGame(Game):
""" ServerGame class. Properties:
+ - server: (optional) server (Server object) that handles this game.
- omniscient_usernames (only for server games):
set of usernames allowed to be omniscient observers for this game.
- moderator_usernames (only for server games):
@@ -40,9 +41,9 @@ class ServerGame(Game):
strings.OMNISCIENT_USERNAMES: parsing.DefaultValueType(parsing.SequenceType(str, sequence_builder=set), ()),
})
- def __init__(self, **kwargs):
+ def __init__(self, server=None, **kwargs):
# Reference to a Server instance.
- self.server = None # type: diplomacy.Server
+ self.server = server # type: diplomacy.Server
self.omniscient_usernames = None # type: set
self.moderator_usernames = None # type: set
self.observer = None # type: Power
@@ -154,11 +155,9 @@ class ServerGame(Game):
""" Return a player game data object copy of this game for given power name. """
for_username = self.get_power(power_name).get_controller()
game = Game.from_dict(self.to_dict())
- game.controlled_powers = self.get_controlled_power_names(for_username)
game.error = []
game.message_history = self.get_message_history(power_name)
game.messages = self.get_messages(power_name)
- game.observer_level = self.get_observer_level(for_username)
game.phase_abbr = game.current_short_phase
related_power_names = self.get_related_power_names(power_name)
for power in game.powers.values(): # type: Power
@@ -168,36 +167,41 @@ class ServerGame(Game):
power.vote = strings.NEUTRAL
power.orders.clear()
game.role = power_name
+ game.controlled_powers = self.get_controlled_power_names(for_username)
+ game.observer_level = self.get_observer_level(for_username)
+ game.daide_port = self.server.get_daide_port(self.game_id) if self.server else None
return game
def as_omniscient_game(self, for_username):
""" Return an omniscient game data object copy of this game. """
game = Game.from_dict(self.to_dict())
- game.controlled_powers = self.get_controlled_power_names(for_username)
game.message_history = self.get_message_history(strings.OMNISCIENT_TYPE)
game.messages = self.get_messages(strings.OMNISCIENT_TYPE)
- game.observer_level = self.get_observer_level(for_username)
game.phase_abbr = game.current_short_phase
for power in game.powers.values(): # type: Power
power.role = strings.OMNISCIENT_TYPE
power.tokens.clear()
game.role = strings.OMNISCIENT_TYPE
+ game.controlled_powers = self.get_controlled_power_names(for_username)
+ game.observer_level = self.get_observer_level(for_username)
+ game.daide_port = self.server.get_daide_port(self.game_id) if self.server else None
return game
def as_observer_game(self, for_username):
""" Return an observer game data object copy of this game. """
game = Game.from_dict(self.to_dict())
- game.controlled_powers = self.get_controlled_power_names(for_username)
game.error = []
game.message_history = self.get_message_history(strings.OBSERVER_TYPE)
game.messages = self.get_messages(strings.OBSERVER_TYPE)
- game.observer_level = self.get_observer_level(for_username)
game.phase_abbr = game.current_short_phase
for power in game.powers.values(): # type: Power
power.role = strings.OBSERVER_TYPE
power.tokens.clear()
power.vote = strings.NEUTRAL
game.role = strings.OBSERVER_TYPE
+ game.controlled_powers = self.get_controlled_power_names(for_username)
+ game.observer_level = self.get_observer_level(for_username)
+ game.daide_port = self.server.get_daide_port(self.game_id) if self.server else None
return game
def cast(self, role, for_username):
diff --git a/diplomacy/utils/strings.py b/diplomacy/utils/strings.py
index 19823a8..65efb64 100644
--- a/diplomacy/utils/strings.py
+++ b/diplomacy/utils/strings.py
@@ -112,6 +112,7 @@ NOTIFICATION = 'notification'
NOTIFICATION_ID = 'notification_id'
OBSERVER = 'observer'
OBSERVER_LEVEL = 'observer_level'
+DAIDE_PORT = 'daide_port'
OBSERVER_NAME = 'observer_name'
OBSERVER_TYPE = 'observer_type'
OK = 'ok'
diff --git a/diplomacy/web/package-lock.json b/diplomacy/web/package-lock.json
index 782716f..6f65557 100644
--- a/diplomacy/web/package-lock.json
+++ b/diplomacy/web/package-lock.json
@@ -5,9 +5,9 @@
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
- "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
"requires": {
"@babel/highlight": "^7.0.0"
}
@@ -41,13 +41,13 @@
}
},
"@babel/generator": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz",
- "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
+ "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
"requires": {
- "@babel/types": "^7.5.0",
+ "@babel/types": "^7.5.5",
"jsesc": "^2.5.1",
- "lodash": "^4.17.11",
+ "lodash": "^4.17.13",
"source-map": "^0.5.0",
"trim-right": "^1.0.1"
}
@@ -89,26 +89,26 @@
}
},
"@babel/helper-create-class-features-plugin": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.0.tgz",
- "integrity": "sha512-EAoMc3hE5vE5LNhMqDOwB1usHvmRjCDAnH8CD4PVkX9/Yr3W/tcz8xE8QvdZxfsFBDICwZnF2UTHIqslRpvxmA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz",
+ "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==",
"requires": {
"@babel/helper-function-name": "^7.1.0",
- "@babel/helper-member-expression-to-functions": "^7.0.0",
+ "@babel/helper-member-expression-to-functions": "^7.5.5",
"@babel/helper-optimise-call-expression": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.4.4",
+ "@babel/helper-replace-supers": "^7.5.5",
"@babel/helper-split-export-declaration": "^7.4.4"
}
},
"@babel/helper-define-map": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz",
- "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
+ "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
"requires": {
"@babel/helper-function-name": "^7.1.0",
- "@babel/types": "^7.4.4",
- "lodash": "^4.17.11"
+ "@babel/types": "^7.5.5",
+ "lodash": "^4.17.13"
}
},
"@babel/helper-explode-assignable-expression": {
@@ -147,11 +147,11 @@
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
- "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
+ "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.5.5"
}
},
"@babel/helper-module-imports": {
@@ -163,16 +163,16 @@
}
},
"@babel/helper-module-transforms": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz",
- "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
+ "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/helper-simple-access": "^7.1.0",
"@babel/helper-split-export-declaration": "^7.4.4",
"@babel/template": "^7.4.4",
- "@babel/types": "^7.4.4",
- "lodash": "^4.17.11"
+ "@babel/types": "^7.5.5",
+ "lodash": "^4.17.13"
}
},
"@babel/helper-optimise-call-expression": {
@@ -189,11 +189,11 @@
"integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA=="
},
"@babel/helper-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz",
- "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
+ "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
"requires": {
- "lodash": "^4.17.11"
+ "lodash": "^4.17.13"
}
},
"@babel/helper-remap-async-to-generator": {
@@ -209,14 +209,14 @@
}
},
"@babel/helper-replace-supers": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz",
- "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
+ "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.0.0",
+ "@babel/helper-member-expression-to-functions": "^7.5.5",
"@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/traverse": "^7.4.4",
- "@babel/types": "^7.4.4"
+ "@babel/traverse": "^7.5.5",
+ "@babel/types": "^7.5.5"
}
},
"@babel/helper-simple-access": {
@@ -248,19 +248,19 @@
}
},
"@babel/helpers": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.4.tgz",
- "integrity": "sha512-6LJ6xwUEJP51w0sIgKyfvFMJvIb9mWAfohJp0+m6eHJigkFdcH8duZ1sfhn0ltJRzwUIT/yqqhdSfRpCpL7oow==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz",
+ "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==",
"requires": {
"@babel/template": "^7.4.4",
- "@babel/traverse": "^7.5.0",
- "@babel/types": "^7.5.0"
+ "@babel/traverse": "^7.5.5",
+ "@babel/types": "^7.5.5"
}
},
"@babel/highlight": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
- "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
"requires": {
"chalk": "^2.0.0",
"esutils": "^2.0.2",
@@ -268,9 +268,9 @@
}
},
"@babel/parser": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz",
- "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA=="
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
+ "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g=="
},
"@babel/plugin-proposal-async-generator-functions": {
"version": "7.2.0",
@@ -320,9 +320,9 @@
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.4.tgz",
- "integrity": "sha512-KCx0z3y7y8ipZUMAEEJOyNi11lMb/FOPUjjB113tfowgw0c16EGYos7worCKBcUAh2oG+OBnoUhsnTSoLpV9uA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz",
+ "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==",
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0"
@@ -446,25 +446,25 @@
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz",
- "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz",
+ "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==",
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "lodash": "^4.17.11"
+ "lodash": "^4.17.13"
}
},
"@babel/plugin-transform-classes": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz",
- "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
+ "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
"requires": {
"@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-define-map": "^7.4.4",
+ "@babel/helper-define-map": "^7.5.5",
"@babel/helper-function-name": "^7.1.0",
"@babel/helper-optimise-call-expression": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.4.4",
+ "@babel/helper-replace-supers": "^7.5.5",
"@babel/helper-split-export-declaration": "^7.4.4",
"globals": "^11.1.0"
}
@@ -611,12 +611,12 @@
}
},
"@babel/plugin-transform-object-super": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz",
- "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
+ "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.1.0"
+ "@babel/helper-replace-supers": "^7.5.5"
}
},
"@babel/plugin-transform-parameters": {
@@ -759,11 +759,11 @@
}
},
"@babel/plugin-transform-typescript": {
- "version": "7.5.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.2.tgz",
- "integrity": "sha512-r4zJOMbKY5puETm8+cIpaa0RQZG/sSASW1u0pj8qYklcERgVIbxVbP2wyJA7zI1//h7lEagQmXi9IL9iI5rfsA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz",
+ "integrity": "sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==",
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.5.0",
+ "@babel/helper-create-class-features-plugin": "^7.5.5",
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-syntax-typescript": "^7.2.0"
}
@@ -779,16 +779,16 @@
}
},
"@babel/preset-env": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.4.tgz",
- "integrity": "sha512-hFnFnouyRNiH1rL8YkX1ANCNAUVC8Djwdqfev8i1415tnAG+7hlA5zhZ0Q/3Q5gkop4HioIPbCEWAalqcbxRoQ==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz",
+ "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==",
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-proposal-async-generator-functions": "^7.2.0",
"@babel/plugin-proposal-dynamic-import": "^7.5.0",
"@babel/plugin-proposal-json-strings": "^7.2.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.5.4",
+ "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
"@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
"@babel/plugin-syntax-async-generators": "^7.2.0",
@@ -799,8 +799,8 @@
"@babel/plugin-transform-arrow-functions": "^7.2.0",
"@babel/plugin-transform-async-to-generator": "^7.5.0",
"@babel/plugin-transform-block-scoped-functions": "^7.2.0",
- "@babel/plugin-transform-block-scoping": "^7.4.4",
- "@babel/plugin-transform-classes": "^7.4.4",
+ "@babel/plugin-transform-block-scoping": "^7.5.5",
+ "@babel/plugin-transform-classes": "^7.5.5",
"@babel/plugin-transform-computed-properties": "^7.2.0",
"@babel/plugin-transform-destructuring": "^7.5.0",
"@babel/plugin-transform-dotall-regex": "^7.4.4",
@@ -816,7 +816,7 @@
"@babel/plugin-transform-modules-umd": "^7.2.0",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
"@babel/plugin-transform-new-target": "^7.4.4",
- "@babel/plugin-transform-object-super": "^7.2.0",
+ "@babel/plugin-transform-object-super": "^7.5.5",
"@babel/plugin-transform-parameters": "^7.4.4",
"@babel/plugin-transform-property-literals": "^7.2.0",
"@babel/plugin-transform-regenerator": "^7.4.5",
@@ -827,7 +827,7 @@
"@babel/plugin-transform-template-literals": "^7.4.4",
"@babel/plugin-transform-typeof-symbol": "^7.2.0",
"@babel/plugin-transform-unicode-regex": "^7.4.4",
- "@babel/types": "^7.5.0",
+ "@babel/types": "^7.5.5",
"browserslist": "^4.6.0",
"core-js-compat": "^3.1.1",
"invariant": "^2.2.2",
@@ -882,28 +882,28 @@
}
},
"@babel/traverse": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz",
- "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
+ "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
"requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.5.0",
+ "@babel/code-frame": "^7.5.5",
+ "@babel/generator": "^7.5.5",
"@babel/helper-function-name": "^7.1.0",
"@babel/helper-split-export-declaration": "^7.4.4",
- "@babel/parser": "^7.5.0",
- "@babel/types": "^7.5.0",
+ "@babel/parser": "^7.5.5",
+ "@babel/types": "^7.5.5",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.11"
+ "lodash": "^4.17.13"
}
},
"@babel/types": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz",
- "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
+ "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
"requires": {
"esutils": "^2.0.2",
- "lodash": "^4.17.11",
+ "lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
}
},
@@ -1283,21 +1283,21 @@
},
"dependencies": {
"@babel/core": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.4.tgz",
- "integrity": "sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.5.0",
- "@babel/helpers": "^7.5.4",
- "@babel/parser": "^7.5.0",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz",
+ "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==",
+ "requires": {
+ "@babel/code-frame": "^7.5.5",
+ "@babel/generator": "^7.5.5",
+ "@babel/helpers": "^7.5.5",
+ "@babel/parser": "^7.5.5",
"@babel/template": "^7.4.4",
- "@babel/traverse": "^7.5.0",
- "@babel/types": "^7.5.0",
+ "@babel/traverse": "^7.5.5",
+ "@babel/types": "^7.5.5",
"convert-source-map": "^1.1.0",
"debug": "^4.1.0",
"json5": "^2.1.0",
- "lodash": "^4.17.11",
+ "lodash": "^4.17.13",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
@@ -1629,9 +1629,9 @@
}
},
"acorn": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
- "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA=="
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz",
+ "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw=="
},
"acorn-dynamic-import": {
"version": "4.0.0",
@@ -1663,9 +1663,9 @@
"integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
},
"ajv": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
- "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -3922,11 +3922,11 @@
"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
},
"cssstyle": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.3.0.tgz",
- "integrity": "sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
+ "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
"requires": {
- "cssom": "~0.3.6"
+ "cssom": "0.3.x"
}
},
"cyclist": {
@@ -4308,9 +4308,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
- "version": "1.3.191",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.191.tgz",
- "integrity": "sha512-jasjtY5RUy/TOyiUYM2fb4BDaPZfm6CXRFeJDMfFsXYADGxUN49RBqtgB7EL2RmJXeIRUk9lM1U6A5yk2YJMPQ=="
+ "version": "1.3.194",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.194.tgz",
+ "integrity": "sha512-w0LHR2YD9Ex1o+Sz4IN2hYzCB8vaFtMNW+yJcBf6SZlVqgFahkne/4rGVJdk4fPF98Gch9snY7PiabOh+vqHNg=="
},
"elliptic": {
"version": "6.5.0",
@@ -4490,9 +4490,9 @@
},
"dependencies": {
"import-fresh": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
- "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
+ "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -4778,16 +4778,18 @@
}
},
"eslint-plugin-react": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz",
- "integrity": "sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ==",
+ "version": "7.14.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz",
+ "integrity": "sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA==",
"dev": true,
"requires": {
"array-includes": "^3.0.3",
"doctrine": "^2.1.0",
"has": "^1.0.3",
"jsx-ast-utils": "^2.1.0",
+ "object.entries": "^1.1.0",
"object.fromentries": "^2.0.0",
+ "object.values": "^1.1.0",
"prop-types": "^15.7.2",
"resolve": "^1.10.1"
},
@@ -4802,9 +4804,9 @@
}
},
"resolve": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
- "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
+ "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
@@ -4827,9 +4829,12 @@
}
},
"eslint-utils": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
- "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q=="
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz",
+ "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==",
+ "requires": {
+ "eslint-visitor-keys": "^1.0.0"
+ }
},
"eslint-visitor-keys": {
"version": "1.0.0",
@@ -5083,9 +5088,9 @@
}
},
"external-editor": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
- "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
"requires": {
"chardet": "^0.7.0",
"iconv-lite": "^0.4.24",
@@ -5353,9 +5358,9 @@
}
},
"flatted": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
- "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg=="
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
+ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg=="
},
"flatten": {
"version": "1.0.2",
@@ -5911,6 +5916,13 @@
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
}
},
"http-parser-js": {
@@ -6067,9 +6079,9 @@
}
},
"inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
"version": "1.3.5",
@@ -6077,9 +6089,9 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
},
"inquirer": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz",
- "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz",
+ "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==",
"requires": {
"ansi-escapes": "^3.2.0",
"chalk": "^2.4.2",
@@ -6087,7 +6099,7 @@
"cli-width": "^2.0.0",
"external-editor": "^3.0.3",
"figures": "^2.0.0",
- "lodash": "^4.17.11",
+ "lodash": "^4.17.12",
"mute-stream": "0.0.7",
"run-async": "^2.2.0",
"rxjs": "^6.4.0",
@@ -7653,11 +7665,12 @@
}
},
"jsx-ast-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz",
- "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz",
+ "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==",
"requires": {
- "array-includes": "^3.0.3"
+ "array-includes": "^3.0.3",
+ "object.assign": "^4.1.0"
}
},
"killable": {
@@ -7811,9 +7824,9 @@
}
},
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
+ "version": "4.17.14",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz",
+ "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw=="
},
"lodash._reinterpolate": {
"version": "3.0.0",
@@ -8200,9 +8213,9 @@
}
},
"ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"multicast-dns": {
"version": "6.2.3",
@@ -8503,6 +8516,18 @@
"object-keys": "^1.0.11"
}
},
+ "object.entries": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz",
+ "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.12.0",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"object.fromentries": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz",
@@ -10086,6 +10111,14 @@
"text-table": "0.2.0"
},
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
@@ -10890,6 +10923,11 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
@@ -10931,6 +10969,11 @@
"statuses": ">= 1.4.0 < 2"
}
},
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -11580,9 +11623,9 @@
}
},
"svg-parser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.0.tgz",
- "integrity": "sha512-0vSo6x2Sm8c5CIkif/xGWpeDjzTzaR4F0QPjWOnK9zgiFZXYoK1Qvii+Sr464H1/RgKdI3usDH8EgTUBhAlKLw=="
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.1.tgz",
+ "integrity": "sha512-8eUnCsU2sc2hyfvjK++zi5u24a2UQIB2DK9GY/cprGlaDr7SIhm9F0m9CkGYOnOgrK3iTUSnJ7M1DTLqqZt96g=="
},
"svgo": {
"version": "1.3.0",
@@ -11610,12 +11653,12 @@
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
"table": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz",
- "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==",
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.4.tgz",
+ "integrity": "sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==",
"requires": {
- "ajv": "^6.9.1",
- "lodash": "^4.17.11",
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
"slice-ansi": "^2.1.0",
"string-width": "^3.0.0"
},
@@ -11833,9 +11876,9 @@
"integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA=="
},
"tslib": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
- "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
},
"tsutils": {
"version": "3.14.0",
@@ -11886,9 +11929,9 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"ua-parser-js": {
- "version": "0.7.19",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz",
- "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ=="
+ "version": "0.7.20",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz",
+ "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
},
"uglify-js": {
"version": "3.4.10",
@@ -12090,9 +12133,9 @@
},
"dependencies": {
"xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
}
}
},
@@ -12107,6 +12150,13 @@
"integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
"requires": {
"inherits": "2.0.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
}
},
"util-deprecate": {
diff --git a/diplomacy/web/package.json b/diplomacy/web/package.json
index 1b57985..5e1d505 100644
--- a/diplomacy/web/package.json
+++ b/diplomacy/web/package.json
@@ -25,8 +25,7 @@
"eject": "react-scripts eject"
},
"devDependencies": {
- "eslint": "^5.16.0",
- "eslint-plugin-react": "^7.13.0"
+ "eslint-plugin-react": "^7.14.2"
},
"browserslist": {
"production": [
diff --git a/diplomacy/web/src/diplomacy/engine/game.js b/diplomacy/web/src/diplomacy/engine/game.js
index e44fdf6..e86ae85 100644
--- a/diplomacy/web/src/diplomacy/engine/game.js
+++ b/diplomacy/web/src/diplomacy/engine/game.js
@@ -100,6 +100,7 @@ export class Game {
this.registration_password = gameData.registration_password;
this.observer_level = gameData.observer_level;
this.controlled_powers = gameData.controlled_powers;
+ this.daide_port = gameData.daide_port;
this.result = gameData.result || null;
this.phase = gameData.phase_abbr || null; // phase abbreviation
diff --git a/diplomacy/web/src/gui/components/power_orders_actions_bar.js b/diplomacy/web/src/gui/components/power_orders_actions_bar.js
index 2e33a6e..3ffef63 100644
--- a/diplomacy/web/src/gui/components/power_orders_actions_bar.js
+++ b/diplomacy/web/src/gui/components/power_orders_actions_bar.js
@@ -11,7 +11,7 @@ export class PowerOrdersActionBar extends React.Component {
<Button title={'reset'} onClick={this.props.onReset}/>
<Button title={'delete all'} onClick={this.props.onDeleteAll}/>
<Button color={'primary'} title={'update'} onClick={this.props.onUpdate}/>
- {(!this.props.onProcess &&
+ {(this.props.onProcess &&
<Button color={'danger'} title={'process game'} onClick={this.props.onProcess}/>) || ''}
</Bar>
);
diff --git a/diplomacy/web/src/gui/pages/content_game.jsx b/diplomacy/web/src/gui/pages/content_game.jsx
index f1bc76c..7e7c7e9 100644
--- a/diplomacy/web/src/gui/pages/content_game.jsx
+++ b/diplomacy/web/src/gui/pages/content_game.jsx
@@ -71,6 +71,11 @@ const TABLE_POWER_VIEW = {
wait: ['Waiting', 3]
};
+const PRETTY_ROLES = {
+ [STRINGS.OMNISCIENT_TYPE]: 'Omnicient',
+ [STRINGS.OBSERVER_TYPE]: 'Observer'
+};
+
export class ContentGame extends React.Component {
constructor(props) {
@@ -157,8 +162,16 @@ export class ContentGame extends React.Component {
this.vote = this.vote.bind(this);
}
+ static prettyRole(role) {
+ if (PRETTY_ROLES.hasOwnProperty(role))
+ return PRETTY_ROLES[role];
+ return role;
+ }
+
static gameTitle(game) {
- let title = `${game.game_id} | ${game.phase} | ${game.status} | ${game.role} | ${game.map_name}`;
+ let title = `${game.game_id} | ${game.phase} | ${game.status} | ${ContentGame.prettyRole(game.role)} | ${game.map_name}`;
+ if (game.daide_port)
+ title += ` | DAIDE ${game.daide_port}`;
const remainingTime = game.deadline_timer;
if (remainingTime === undefined)
title += ` (deadline: ${game.deadline} sec)`;