From 8accc42167f574c5ba6b7bd23ae72c70711f57f6 Mon Sep 17 00:00:00 2001 From: zikaeroh <48577114+zikaeroh@users.noreply.github.com> Date: Tue, 26 May 2020 20:34:30 -0700 Subject: [PATCH] Mark incoming state as readonly --- frontend/package.json | 1 + frontend/src/protocol/index.ts | 39 +++++++++++++++++++--------------- frontend/yarn.lock | 5 +++++ 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 875e7b3..d37122b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,6 +25,7 @@ "react-hook-form": "^5.6.3", "react-scripts": "^3.4.1", "react-use-websocket": "^2.0.1", + "ts-essentials": "^6.0.5", "typeface-roboto": "^0.0.75", "typescript": "^3.9.2", "uuid": "^8.0.0" diff --git a/frontend/src/protocol/index.ts b/frontend/src/protocol/index.ts index 2d646ef..d0b78ad 100644 --- a/frontend/src/protocol/index.ts +++ b/frontend/src/protocol/index.ts @@ -1,17 +1,9 @@ import myzod, { Infer } from 'myzod'; +import { DeepReadonly } from 'ts-essentials'; // See protocol.go. -export type RoomResponse = Infer; -export const RoomResponse = myzod.object({ - id: myzod.string().optional().nullable(), - error: myzod.string().optional().nullable(), -}); - -export type TimeResponse = Infer; -export const TimeResponse = myzod.object({ - time: myzod.date(), -}); +// Messages sent from client to server. export type WordPack = Infer; const WordPack = myzod.object({ @@ -83,7 +75,20 @@ export const ClientNote = myzod ]) ); -export type StateTile = Infer; +// Messages sent from server to client. + +export type RoomResponse = DeepReadonly>; +export const RoomResponse = myzod.object({ + id: myzod.string().optional().nullable(), + error: myzod.string().optional().nullable(), +}); + +export type TimeResponse = DeepReadonly>; +export const TimeResponse = myzod.object({ + time: myzod.date(), +}); + +export type StateTile = DeepReadonly>; const StateTile = myzod.object({ word: myzod.string(), revealed: myzod.boolean(), @@ -97,26 +102,26 @@ const StateTile = myzod.object({ .nullable(), }); -export type StateBoard = Infer; +export type StateBoard = DeepReadonly>; const StateBoard = myzod.array(myzod.array(StateTile)); -export type StatePlayer = Infer; +export type StatePlayer = DeepReadonly>; const StatePlayer = myzod.object({ playerID: myzod.string(), nickname: myzod.string(), spymaster: myzod.boolean(), }); -export type StateTeams = Infer; +export type StateTeams = DeepReadonly>; const StateTeams = myzod.array(myzod.array(StatePlayer)); -export type StateTimer = Infer; +export type StateTimer = DeepReadonly>; const StateTimer = myzod.object({ turnTime: myzod.number(), turnEnd: myzod.date(), }); -export type State = Infer; +export type State = DeepReadonly>; export const State = myzod.object({ version: myzod.number(), teams: StateTeams, @@ -136,7 +141,7 @@ export const State = myzod.object({ hideBomb: myzod.boolean(), }); -export type ServerNote = Infer; +export type ServerNote = DeepReadonly>; export const ServerNote = myzod.union([ myzod.object({ method: myzod.literal('state'), diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 5b64d69..f214b86 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -10531,6 +10531,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +ts-essentials@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.5.tgz#dd5b98f73bd56dc94d15dfbc0fbf01da3163eb42" + integrity sha512-RSAKlpu+E0DCGY8FsbG92EveRLw2Y+UgK3ksX01w1VaHeG01dKkYo/KtAV4q0qPT6nPbLfyerb2YPVSediP+8g== + ts-pnp@1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"