From da3bf0d71517ff79b555f36178c687717b0a990f Mon Sep 17 00:00:00 2001 From: Ynda Jas Date: Wed, 21 Feb 2024 16:24:22 +0000 Subject: [PATCH] WIP --- client/index.ts | 1 + server/lobby.ts | 9 +- server/machines/lobby.test.ts | 55 ++++++-- server/machines/lobby.ts | 46 ++++--- server/machines/round.ts | 16 +-- server/round.ts | 15 +-- server/socketServer.ts | 2 + yarn.lock | 244 ++++++++++++++++------------------ 8 files changed, 198 insertions(+), 190 deletions(-) diff --git a/client/index.ts b/client/index.ts index 01c0b7f5..499509ce 100644 --- a/client/index.ts +++ b/client/index.ts @@ -56,6 +56,7 @@ const showStartButton = (): void => { }; startButton.addEventListener("click", () => { + console.log("emitting start round"); socket.emit("round:start"); }); diff --git a/server/lobby.ts b/server/lobby.ts index cf765938..913d9ac9 100644 --- a/server/lobby.ts +++ b/server/lobby.ts @@ -1,20 +1,19 @@ import type { Socket } from "socket.io"; -import type { InterpreterFrom } from "xstate"; -import { interpret } from "xstate"; +import { Actor, createActor } from "xstate"; import type { Player } from "./@types/models"; import { context, lobbyMachine } from "./machines/lobby"; import type { SocketServer } from "./socketServer"; class Lobby { - machine: InterpreterFrom; + machine: Actor; server: SocketServer; constructor(server: SocketServer) { this.server = server; - this.machine = interpret(lobbyMachine.withContext({ ...context })).start(); + this.machine = createActor(lobbyMachine, { ...context }).start(); this.machine.start(); - this.machine.onTransition((state) => { + this.machine.subscribe((state) => { console.info({ context: state.context, state: state.value }); switch (state.value) { diff --git a/server/machines/lobby.test.ts b/server/machines/lobby.test.ts index 9d5c8c6d..2e094157 100644 --- a/server/machines/lobby.test.ts +++ b/server/machines/lobby.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "bun:test"; -import type { InterpreterFrom } from "xstate"; -import { interpret } from "xstate"; +import type { Actor } from "xstate"; +import { createActor, getNextSnapshot } from "xstate"; import { context, isNewPlayer, lobbyMachine } from "./lobby"; @@ -11,17 +11,27 @@ describe("lobbyMachine states", () => { describe("empty", () => { it("transitions to the onePlayer state when it receives the player joins event", () => { - expect(lobbyMachine.transition("empty", "playerJoins").value).toBe( - "onePlayer", - ); + expect( + getNextSnapshot( + lobbyMachine, + lobbyMachine.resolveState({ + value: "empty", + context: { players: [] }, + }), + { + type: "playerJoins", + player: player1, + }, + ).value, + ).toBe("onePlayer"); }); }); describe("onePlayer", () => { - let actor: InterpreterFrom; + let actor: Actor; beforeEach(() => { - actor = interpret(lobbyMachine); + actor = createActor(lobbyMachine); actor.start(); actor.send({ player: player1, @@ -43,9 +53,16 @@ describe("lobbyMachine states", () => { }); it("transitions from onePlayer to empty state when it receives player leaves event", () => { - expect(lobbyMachine.transition("onePlayer", "playerLeaves").value).toBe( - "empty", - ); + expect( + getNextSnapshot( + lobbyMachine, + lobbyMachine.resolveState({ + value: "onePlayer", + context: { players: [player1] }, + }), + { type: "playerLeaves", socketId: player1.socketId }, + ).value, + ).toBe("empty"); }); it("removes a player from the player list when it receives playerLeaves event", () => { @@ -59,10 +76,10 @@ describe("lobbyMachine states", () => { }); describe("multiplePlayers", () => { - let actor: InterpreterFrom; + let actor: Actor; beforeEach(() => { - actor = interpret(lobbyMachine); + actor = createActor(lobbyMachine); actor.start(); actor.send({ @@ -136,13 +153,23 @@ describe("isNewPlayer", () => { it("returns true if the player is not present in the players array", () => { const player = { name: "a name", socketId: "id" }; const contextWithNoPlayers = { players: [] }; - expect(isNewPlayer(contextWithNoPlayers, { player })).toBe(true); + expect( + isNewPlayer({ + context: contextWithNoPlayers, + event: { player, type: "playerJoins" }, + }), + ).toBe(true); }); it("returns false if the player is present in the players array", () => { const player = { name: "a name", socketId: "id" }; const contextWithPlayer = { players: [player] }; - expect(isNewPlayer(contextWithPlayer, { player })).toBe(false); + expect( + isNewPlayer({ + context: contextWithPlayer, + event: { player, type: "playerJoins" }, + }), + ).toBe(false); }); }); diff --git a/server/machines/lobby.ts b/server/machines/lobby.ts index ba7f97bc..801aa45d 100644 --- a/server/machines/lobby.ts +++ b/server/machines/lobby.ts @@ -1,5 +1,6 @@ -import { assign, createMachine } from "xstate"; +import { EventObject, assign, createMachine } from "xstate"; +import { GuardArgs } from "xstate/guards"; import type { Player } from "../@types/models"; const context = { @@ -8,11 +9,13 @@ const context = { type Context = typeof context; +type PlayerJoinsEvent = { + player: Player; + type: "playerJoins"; +}; + type Events = - | { - player: Player; - type: "playerJoins"; - } + | PlayerJoinsEvent | { socketId: Player["socketId"]; type: "playerLeaves"; @@ -21,25 +24,23 @@ type Events = type: "playerClicksStart"; }; -const isNewPlayer = ( - { players }: { players: Player[] }, - { player: playerFromEvent }: { player: Player }, -) => - players.find((player) => player.socketId === playerFromEvent.socketId) === - undefined; +const isNewPlayer = (args: GuardArgs) => + args.context.players.find( + (player) => player.socketId === args.event.player.socketId, + ) === undefined; -const isOnlyPlayer = ({ players }: { players: Player[] }) => - players.length === 1; +const isOnlyPlayer = (args: GuardArgs) => + args.context.players.length === 1; const lobbyMachine = createMachine( { - context: context, + context, id: "lobby", initial: "empty", - predictableActionArguments: true, - schema: { + types: { context: {} as Context, events: {} as Events, + typegen: {} as import("./lobby.typegen").Typegen0, }, states: { empty: { @@ -47,7 +48,7 @@ const lobbyMachine = createMachine( }, multiplePlayers: { always: { - cond: "isOnlyPlayer", + guard: "isOnlyPlayer", target: "onePlayer", }, on: { @@ -59,7 +60,7 @@ const lobbyMachine = createMachine( on: { playerJoins: { actions: "addPlayer", - cond: "isNewPlayer", + guard: "isNewPlayer", target: "multiplePlayers", }, playerLeaves: { @@ -69,16 +70,17 @@ const lobbyMachine = createMachine( }, }, }, - tsTypes: {} as import("./lobby.typegen").Typegen0, }, { actions: { addPlayer: assign({ - players: ({ players }, { player }) => [...players, player], + players: (args) => [...args.context.players, args.event.player], }), removePlayer: assign({ - players: ({ players }, { socketId }) => - players.filter((p) => p.socketId !== socketId), + players: (args) => + args.context.players.filter( + (player) => player.socketId !== args.event.socketId, + ), }), }, guards: { diff --git a/server/machines/round.ts b/server/machines/round.ts index 793f7a43..eef827c8 100644 --- a/server/machines/round.ts +++ b/server/machines/round.ts @@ -1,5 +1,6 @@ import { assign, createMachine } from "xstate"; import { Answer } from "../@types/models"; +import questions from "../data/questions.json"; type Question = { answer: string[]; @@ -9,7 +10,7 @@ type Question = { const context = { answers: [] as Answer[], - questions: [] as Question[], + questions: questions as Question[], selectedQuestion: {} as Question | undefined, }; @@ -25,10 +26,10 @@ const gameMachine = createMachine( context, id: "game", initial: "gameStart", - predictableActionArguments: true, - schema: { + types: { context: {} as Context, events: {} as Events, + typegen: {} as import("./round.typegen").Typegen0, }, states: { gameStart: { @@ -38,19 +39,18 @@ const gameMachine = createMachine( }, }, }, - tsTypes: {} as import("./round.typegen").Typegen0, }, { actions: { addAnswer: assign({ - answers: (context, event) => [...context.answers, event.answer], + answers: (args) => [...args.context.answers, args.event.answer], }), setQuestion: assign({ - selectedQuestion: ({ questions }) => { + selectedQuestion: (args) => { const questionIndex = Math.floor( - Math.random() * (questions.length - 1), + Math.random() * (args.context.questions.length - 1), ); - return questions[questionIndex]; + return args.context.questions[questionIndex]; }, }), }, diff --git a/server/round.ts b/server/round.ts index af4aed91..34d3a1a4 100644 --- a/server/round.ts +++ b/server/round.ts @@ -1,22 +1,21 @@ -import type { InterpreterFrom } from "xstate"; -import { interpret } from "xstate"; +import type { Actor } from "xstate"; +import { createActor } from "xstate"; import { Answer, Question } from "./@types/models"; -import questions from "./data/questions.json"; import { context, gameMachine } from "./machines/round"; import type { SocketServer } from "./socketServer"; class Round { - machine: InterpreterFrom; + machine: Actor; server: SocketServer; constructor(server: SocketServer) { this.server = server; - this.machine = interpret( - gameMachine.withContext({ ...context, questions }), - ).start(); + this.machine = createActor(gameMachine, { ...context }).start(); - this.machine.onTransition((state) => { + console.log(this.machine); + + this.machine.subscribe((state) => { console.info({ context: state.context, state: state.value }); switch (state.value) { diff --git a/server/socketServer.ts b/server/socketServer.ts index 3aaa34c9..e6e680ed 100644 --- a/server/socketServer.ts +++ b/server/socketServer.ts @@ -36,10 +36,12 @@ export class SocketServer { } onQuestionSet(question: Question) { + console.log("emitting question set"); this.server.emit(...clientboundEvents.getQuestion(question)); } onRoundStarted() { + console.log("got to onRoundStarted"); this.round = new Round(this); } diff --git a/yarn.lock b/yarn.lock index 59bf4e90..1f86c7f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,5 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 +# bun ./bun.lockb --hash: 3A2667DA52A2444B-8712c3e78d855e18-0357D1BD79E9ED84-5bd3f6883482749b "@babel/code-frame@^7.0.0": @@ -26,17 +27,17 @@ "@biomejs/biome@1.5.3": version "1.5.3" - resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.5.3.tgz#0762b9f681c247a228522e6c506060e734809d48" + resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-1.5.3.tgz" integrity sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg== optionalDependencies: - "@biomejs/cli-darwin-arm64" "1.5.3" + "@biomejs/cli-win32-x64" "1.5.3" + "@biomejs/cli-win32-arm64" "1.5.3" "@biomejs/cli-darwin-x64" "1.5.3" - "@biomejs/cli-linux-arm64" "1.5.3" - "@biomejs/cli-linux-arm64-musl" "1.5.3" + "@biomejs/cli-darwin-arm64" "1.5.3" "@biomejs/cli-linux-x64" "1.5.3" + "@biomejs/cli-linux-arm64" "1.5.3" "@biomejs/cli-linux-x64-musl" "1.5.3" - "@biomejs/cli-win32-arm64" "1.5.3" - "@biomejs/cli-win32-x64" "1.5.3" + "@biomejs/cli-linux-arm64-musl" "1.5.3" "@biomejs/cli-darwin-arm64@1.5.3": version "1.5.3" @@ -48,26 +49,26 @@ resolved "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz" integrity sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw== -"@biomejs/cli-linux-arm64-musl@1.5.3": - version "1.5.3" - resolved "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz" - integrity sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ== - "@biomejs/cli-linux-arm64@1.5.3": version "1.5.3" resolved "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz" integrity sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg== -"@biomejs/cli-linux-x64-musl@1.5.3": +"@biomejs/cli-linux-arm64-musl@1.5.3": version "1.5.3" - resolved "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz" - integrity sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw== + resolved "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz" + integrity sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ== "@biomejs/cli-linux-x64@1.5.3": version "1.5.3" resolved "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz" integrity sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw== +"@biomejs/cli-linux-x64-musl@1.5.3": + version "1.5.3" + resolved "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz" + integrity sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw== + "@biomejs/cli-win32-arm64@1.5.3": version "1.5.3" resolved "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz" @@ -160,14 +161,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@~20.11.3": - version "20.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" - integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== - dependencies: - undici-types "~5.26.4" - -"@types/node@>=10.0.0": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@~20.11.3": version "20.11.17" resolved "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz" integrity sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw== @@ -183,12 +177,12 @@ "@types/web@^0.0.139": version "0.0.139" - resolved "https://registry.yarnpkg.com/@types/web/-/web-0.0.139.tgz#5be60b5af16d1f6991139c3ceeb8602806b3cd17" + resolved "https://registry.npmjs.org/@types/web/-/web-0.0.139.tgz" integrity sha512-oCJIBUMvRj2xFfXvbHY7u3IfxfIQSeXmrc25MmJEOddqpYSrWafaSTSKf21IgH4MpF06igdZ+MZUhOYMLYyBug== "@types/ws@~8.5.10": version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz" integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" @@ -293,9 +287,9 @@ braces@^3.0.2: fill-range "^7.0.1" bun-types@^1.0.2: - version "1.0.28" - resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.0.28.tgz#c4fa0a542d7629b8b651feaf72e282e061f99b23" - integrity sha512-wQqbLYRM0YnsXZMFujbCr/9YxlEl51jshMXcJ2Y9wEuU7k6TKcX2KDh032k9oHfB1wH8/SleXboIsULMtFaAaA== + version "1.0.26" + resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.0.26.tgz" + integrity sha512-VcSj+SCaWIcMb0uSGIAtr8P92zq9q+unavcQmx27fk6HulCthXHBVrdGuXxAZbFtv7bHVjizRzR2mk9r/U8Nkg== dependencies: "@types/node" "~20.11.3" "@types/ws" "~8.5.10" @@ -437,22 +431,6 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -engine.io-client@~6.5.2: - version "6.5.3" - resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz" - integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.2.1: - version "5.2.2" - resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz" - integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== - engine.io@~6.5.2: version "6.5.4" resolved "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz" @@ -469,6 +447,22 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.11.0" +engine.io-client@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz" + integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + env-paths@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" @@ -562,13 +556,6 @@ fsevents@2.3.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob@^10.3.7: version "10.3.10" resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" @@ -580,6 +567,13 @@ glob@^10.3.7: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" @@ -784,16 +778,16 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - mime-db@~1.33.0: version "1.33.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-types@2.1.18: version "2.1.18" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" @@ -907,11 +901,6 @@ picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -playwright-core@1.41.2: - version "1.41.2" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz" - integrity sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA== - playwright@1.41.2: version "1.41.2" resolved "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz" @@ -921,6 +910,20 @@ playwright@1.41.2: optionalDependencies: fsevents "2.3.2" +playwright-core@1.41.2: + version "1.41.2" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz" + integrity sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA== + +postcss@^8.4.20, postcss@^8.4.31, postcss@^8.4.32, postcss@^8.4.33: + version "8.4.35" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss-resolve-nested-selector@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz" @@ -931,7 +934,7 @@ postcss-safe-parser@^7.0.0: resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz" integrity sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg== -postcss-selector-parser@^6.0.15: +postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.15: version "6.0.15" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz" integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== @@ -949,15 +952,6 @@ postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.32, postcss@^8.4.33: - version "8.4.35" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - punycode@^1.3.2: version "1.4.1" resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" @@ -1057,6 +1051,19 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +socket.io@^4.1.3: + version "4.7.4" + resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz" + integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + socket.io-adapter@~2.5.2: version "2.5.2" resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz" @@ -1082,34 +1089,12 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@^4.1.3: - version "4.7.4" - resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz" - integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.3.2" - engine.io "~6.5.2" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.3, "string-width@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -1127,13 +1112,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -1148,34 +1126,7 @@ strip-ansi@^7.0.1, strip-ansi@^7.1.0: dependencies: ansi-regex "^6.0.1" -stylelint-config-clean-order@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/stylelint-config-clean-order/-/stylelint-config-clean-order-5.4.1.tgz" - integrity sha512-C9E94vFk7QKqPshXik3iNU5cYz7vm0Up4/wu1biRjThWLWJ3gYRdXfyV/1fFU7u4ThfSIf2/ijNhk0pf0ErPWQ== - dependencies: - stylelint-order "^6.0.4" - -stylelint-config-recommended@^14.0.0: - version "14.0.0" - resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz" - integrity sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ== - -stylelint-config-standard@^36.0.0: - version "36.0.0" - resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz" - integrity sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug== - dependencies: - stylelint-config-recommended "^14.0.0" - -stylelint-order@^6.0.4: - version "6.0.4" - resolved "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz" - integrity sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA== - dependencies: - postcss "^8.4.32" - postcss-sorting "^8.0.2" - -stylelint@^16.0.0: +stylelint@>=14, "stylelint@^14.0.0 || ^15.0.0 || ^16.0.1", stylelint@^16.0.0, stylelint@^16.1.0: version "16.2.1" resolved "https://registry.npmjs.org/stylelint/-/stylelint-16.2.1.tgz" integrity sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA== @@ -1219,6 +1170,33 @@ stylelint@^16.0.0: table "^6.8.1" write-file-atomic "^5.0.1" +stylelint-config-clean-order@^5.2.0: + version "5.4.1" + resolved "https://registry.npmjs.org/stylelint-config-clean-order/-/stylelint-config-clean-order-5.4.1.tgz" + integrity sha512-C9E94vFk7QKqPshXik3iNU5cYz7vm0Up4/wu1biRjThWLWJ3gYRdXfyV/1fFU7u4ThfSIf2/ijNhk0pf0ErPWQ== + dependencies: + stylelint-order "^6.0.4" + +stylelint-config-recommended@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz" + integrity sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ== + +stylelint-config-standard@^36.0.0: + version "36.0.0" + resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz" + integrity sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug== + dependencies: + stylelint-config-recommended "^14.0.0" + +stylelint-order@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz" + integrity sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA== + dependencies: + postcss "^8.4.32" + postcss-sorting "^8.0.2" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -1264,14 +1242,14 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -typescript@^5.2.2: +typescript@>=4.9.5, typescript@^5.2.2: version "5.3.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== uri-js@^4.2.2: @@ -1305,9 +1283,9 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -1343,5 +1321,5 @@ xmlhttprequest-ssl@~2.0.0: xstate@5.8.0: version "5.8.0" - resolved "https://registry.yarnpkg.com/xstate/-/xstate-5.8.0.tgz#6eac6fe3fce171ed0eae70d72027102cd1a2fe2d" + resolved "https://registry.npmjs.org/xstate/-/xstate-5.8.0.tgz" integrity sha512-YoJDJFRmmXcI6ZrL7H15Ew2Q5HjM/X3zcz1cqLT4OEeF/ktXDkWMGyIZOOMItM5ELR6sSqm1GY5el11M/JAb/A==