From bc67f97b5ce55e0b673cb192ade852b12c07b02e Mon Sep 17 00:00:00 2001 From: Joshua Sharp Date: Tue, 25 Apr 2023 01:37:33 +1000 Subject: [PATCH 1/2] chore: migrate to Typescript --- agent/{ServerAgent.js => ServerAgent.ts} | 41 ++- agent/extract-json-from-string.d.ts | 1 + agent/{index.js => index.ts} | 17 +- agent/package.json | 3 +- agent/tsconfig.json | 17 + package-lock.json | 345 ++++++++++++++++++ package.json | 7 +- ui-admin/package-lock.json | 136 +++++-- ui-admin/package.json | 8 +- ui-admin/src/{Agent.js => Agent.ts} | 27 +- ui-admin/src/App.js | 52 --- ui-admin/src/{App.test.js => App.test.ts} | 2 +- ui-admin/src/App.tsx | 8 + ui-admin/src/PhaserGame.ts | 32 ++ ui-admin/src/create.js | 53 --- ui-admin/src/{index.js => index.tsx} | 6 +- ui-admin/src/preload.js | 21 -- ...{reportWebVitals.js => reportWebVitals.ts} | 4 +- ui-admin/src/scenes/main.scene.ts | 188 ++++++++++ ui-admin/src/{setupTests.js => setupTests.ts} | 0 ui-admin/src/update.js | 71 ---- ui-admin/tsconfig.json | 23 ++ ui-admin/types/react-app-env.d.ts | 1 + ui-admin/types/window.d.ts | 7 + 24 files changed, 821 insertions(+), 249 deletions(-) rename agent/{ServerAgent.js => ServerAgent.ts} (74%) create mode 100644 agent/extract-json-from-string.d.ts rename agent/{index.js => index.ts} (86%) create mode 100644 agent/tsconfig.json rename ui-admin/src/{Agent.js => Agent.ts} (87%) delete mode 100644 ui-admin/src/App.js rename ui-admin/src/{App.test.js => App.test.ts} (88%) create mode 100644 ui-admin/src/App.tsx create mode 100644 ui-admin/src/PhaserGame.ts delete mode 100644 ui-admin/src/create.js rename ui-admin/src/{index.js => index.tsx} (87%) delete mode 100644 ui-admin/src/preload.js rename ui-admin/src/{reportWebVitals.js => reportWebVitals.ts} (75%) create mode 100644 ui-admin/src/scenes/main.scene.ts rename ui-admin/src/{setupTests.js => setupTests.ts} (100%) delete mode 100644 ui-admin/src/update.js create mode 100644 ui-admin/tsconfig.json create mode 100644 ui-admin/types/react-app-env.d.ts create mode 100644 ui-admin/types/window.d.ts diff --git a/agent/ServerAgent.js b/agent/ServerAgent.ts similarity index 74% rename from agent/ServerAgent.js rename to agent/ServerAgent.ts index c260c52..5248d2b 100644 --- a/agent/ServerAgent.js +++ b/agent/ServerAgent.ts @@ -1,7 +1,24 @@ import { Configuration, OpenAIApi } from "openai"; import extract from "extract-json-from-string"; -import env from "./env.json" assert { type: "json" }; +import env from "./env.json"; + +interface ParsedData { + agent_id: string; + position: { + x: number; + y: number; + } + surroundings: any; + sleepiness: number; +} + +interface ActionResponse { + action: { + type: "move" | "wait", + direction?: "up" | "down" | "left" | "right" + } +} const configuration = new Configuration({ apiKey: env.OPENAI_API_KEY, @@ -10,11 +27,13 @@ const configuration = new Configuration({ const openai = new OpenAIApi(configuration); class ServerAgent { - constructor(id) { + id: string; + + constructor(id: string) { this.id = id; } - async processMessage(parsedData) { + async processMessage(parsedData: ParsedData) { try { const prompt = `# Introduction @@ -66,7 +85,7 @@ class ServerAgent { } } - async callOpenAI(prompt, attempt) { + async callOpenAI(prompt: string, attempt: number): Promise { if (attempt > 3) { return null; } @@ -80,9 +99,17 @@ class ServerAgent { messages: [{ role: "user", content: prompt }], }); - console.log('OpenAI response', response.data.choices[0].message.content) + const message = response.data.choices[0].message + + if (!message) { + console.error('Message is undefined, response: ', response) + + return null + } + + console.log('OpenAI response', message.content) - const responseObject = this.cleanAndProcess(response.data.choices[0].message.content); + const responseObject = this.cleanAndProcess(message.content); if (responseObject) { return responseObject; } @@ -90,7 +117,7 @@ class ServerAgent { return await this.callOpenAI(prompt, attempt + 1); } - cleanAndProcess(text) { + cleanAndProcess(text: string) { const extractedJson = extract(text)[0]; if (!extractedJson) { diff --git a/agent/extract-json-from-string.d.ts b/agent/extract-json-from-string.d.ts new file mode 100644 index 0000000..fbb244b --- /dev/null +++ b/agent/extract-json-from-string.d.ts @@ -0,0 +1 @@ +declare module 'extract-json-from-string'; \ No newline at end of file diff --git a/agent/index.js b/agent/index.ts similarity index 86% rename from agent/index.js rename to agent/index.ts index fc02589..7cacb5d 100644 --- a/agent/index.js +++ b/agent/index.ts @@ -1,29 +1,40 @@ import { WebSocketServer } from 'ws'; -import ServerAgent from './ServerAgent.js'; +import ServerAgent from './ServerAgent'; + const wss = new WebSocketServer({ port: 8080 }); -const agents = {}; +const agents: { + [id: string]: ServerAgent +} = {}; wss.on('connection', function connection(ws) { ws.on('error', console.error); ws.on('message', async function message(data) { - const parsedData = JSON.parse(data); + const parsedData = JSON.parse(data.toString()); if (parsedData.type === 'create_agent') { console.log(`Creating Agent: ${parsedData.agent_id}`); + const newAgentId = parsedData.agent_id; + if(agents[newAgentId]) { ws.send(JSON.stringify({ type: 'agent_created', success: false, message: `Agent with id ${newAgentId} already exists` })); + return; } + agents[newAgentId] = new ServerAgent(newAgentId); + ws.send(JSON.stringify({ type: 'agent_created', success: true, agent_id: newAgentId, message: `Agent with id ${newAgentId} created` })); } else if (parsedData.type === 'requestNextMove') { const agentId = parsedData.agent_id; + console.log(`requestNextMove message for agent: ${agentId}`); + if (agents[agentId]) { const completion = await agents[agentId].processMessage(parsedData); + ws.send(JSON.stringify({ type: 'nextMove', agent_id: agentId, data: completion })); } else { ws.send(JSON.stringify({ type: 'error', message: `Agent with id ${agentId} not found` })); diff --git a/agent/package.json b/agent/package.json index 94de5da..c125ce4 100644 --- a/agent/package.json +++ b/agent/package.json @@ -4,10 +4,9 @@ "description": "", "main": "index.js", "scripts": { - "start": "nodemon index.js", + "start": "nodemon ./index.ts", "test": "echo \"Error: no test specified\" && exit 1" }, - "type": "module", "author": "", "license": "ISC", "dependencies": { diff --git a/agent/tsconfig.json b/agent/tsconfig.json new file mode 100644 index 0000000..d68a75a --- /dev/null +++ b/agent/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "target": "es6", + "noImplicitAny": true, + "moduleResolution": "node", + "sourceMap": true, + "outDir": "dist", + "baseUrl": ".", + }, + "include": [ + "./**/*" + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b4ad51f..dd9b575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,108 @@ "license": "ISC", "dependencies": { "concurrently": "^8.0.1" + }, + "devDependencies": { + "@types/ws": "8.5.4", + "ts-node": "10.9.1", + "typescript": "5.0.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" } }, "node_modules/ansi-regex": { @@ -35,6 +137,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -116,6 +224,12 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", @@ -128,6 +242,15 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -170,6 +293,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -245,11 +374,73 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -298,9 +489,100 @@ "engines": { "node": ">=12" } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } } }, "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/node": { + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", + "dev": true + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -314,6 +596,12 @@ "color-convert": "^2.0.1" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -372,11 +660,23 @@ "yargs": "^17.7.1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -407,6 +707,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -461,11 +767,44 @@ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -499,6 +838,12 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } diff --git a/package.json b/package.json index 6d83e2f..3c62eff 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "gptrpg", "version": "1.0.0", "description": "This repo contains two things:", - "main": "index.js", + "main": "index.ts", "scripts": { "start": "concurrently \"npm:start --prefix agent\" \"npm:start --prefix ui-admin\"", "install": "cd agent && npm install && cd ../ui-admin && npm install" @@ -11,5 +11,10 @@ "license": "ISC", "dependencies": { "concurrently": "^8.0.1" + }, + "devDependencies": { + "@types/ws": "8.5.4", + "ts-node": "10.9.1", + "typescript": "5.0.4" } } diff --git a/ui-admin/package-lock.json b/ui-admin/package-lock.json index 674f580..342a06e 100644 --- a/ui-admin/package-lock.json +++ b/ui-admin/package-lock.json @@ -8,9 +8,6 @@ "name": "gptrpg", "version": "0.1.0", "dependencies": { - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^13.1.1", - "@testing-library/user-event": "^13.5.0", "grid-engine": "^2.15.0", "phaser": "^3.55.2", "react": "^18.1.0", @@ -18,6 +15,11 @@ "react-scripts": "5.0.1", "web-vitals": "^2.1.4", "ws": "^8.13.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.1.1", + "@testing-library/user-event": "^13.5.0" } }, "node_modules/@ampproject/remapping": { @@ -3207,6 +3209,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3225,6 +3228,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3239,6 +3243,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -3247,6 +3252,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3262,6 +3268,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3272,12 +3279,14 @@ "node_modules/@testing-library/dom/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@testing-library/dom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3286,6 +3295,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3297,6 +3307,7 @@ "version": "5.16.4", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", + "dev": true, "dependencies": { "@babel/runtime": "^7.9.2", "@types/testing-library__jest-dom": "^5.9.1", @@ -3318,6 +3329,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3332,6 +3344,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -3340,6 +3353,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3352,6 +3366,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3362,12 +3377,14 @@ "node_modules/@testing-library/jest-dom/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@testing-library/jest-dom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3376,6 +3393,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3387,6 +3405,7 @@ "version": "13.1.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.1.1.tgz", "integrity": "sha512-8mirlAa0OKaUvnqnZF6MdAh2tReYA2KtWVw1PKvaF5EcCZqgK5pl8iF+3uW90JdG5Ua2c2c2E2wtLdaug3dsVg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^8.5.0", @@ -3404,6 +3423,7 @@ "version": "13.5.0", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -3434,7 +3454,8 @@ "node_modules/@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.1.19", @@ -3597,6 +3618,7 @@ "version": "27.4.1", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "dev": true, "dependencies": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" @@ -3635,7 +3657,8 @@ "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true }, "node_modules/@types/q": { "version": "1.5.5", @@ -3656,6 +3679,7 @@ "version": "18.0.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz", "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==", + "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3666,6 +3690,7 @@ "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.0.tgz", "integrity": "sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==", + "dev": true, "dependencies": { "@types/react": "*" } @@ -3686,7 +3711,8 @@ "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true }, "node_modules/@types/serve-index": { "version": "1.9.1", @@ -3722,6 +3748,7 @@ "version": "5.14.3", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", "integrity": "sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==", + "dev": true, "dependencies": { "@types/jest": "*" } @@ -4454,6 +4481,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, "bin": { "atob": "bin/atob.js" }, @@ -5510,6 +5538,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, "dependencies": { "inherits": "^2.0.4", "source-map": "^0.6.1", @@ -5724,12 +5753,14 @@ "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true }, "node_modules/css/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5883,7 +5914,8 @@ "node_modules/csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", + "dev": true }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -5960,6 +5992,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, "engines": { "node": ">=0.10" } @@ -6163,7 +6196,8 @@ "node_modules/dom-accessibility-api": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true }, "node_modules/dom-converter": { "version": "0.2.0", @@ -8463,6 +8497,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { "node": ">=8" } @@ -11247,6 +11282,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -11393,6 +11429,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "engines": { "node": ">=4" } @@ -13828,6 +13865,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -14705,6 +14743,7 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0" @@ -14941,6 +14980,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, "dependencies": { "min-indent": "^1.0.0" }, @@ -18569,6 +18609,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -18584,6 +18625,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -18591,12 +18633,14 @@ "aria-query": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18606,6 +18650,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -18613,17 +18658,20 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -18634,6 +18682,7 @@ "version": "5.16.4", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", + "dev": true, "requires": { "@babel/runtime": "^7.9.2", "@types/testing-library__jest-dom": "^5.9.1", @@ -18650,6 +18699,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -18657,12 +18707,14 @@ "aria-query": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18672,6 +18724,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -18679,17 +18732,20 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -18700,6 +18756,7 @@ "version": "13.1.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.1.1.tgz", "integrity": "sha512-8mirlAa0OKaUvnqnZF6MdAh2tReYA2KtWVw1PKvaF5EcCZqgK5pl8iF+3uW90JdG5Ua2c2c2E2wtLdaug3dsVg==", + "dev": true, "requires": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^8.5.0", @@ -18710,6 +18767,7 @@ "version": "13.5.0", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, "requires": { "@babel/runtime": "^7.12.5" } @@ -18727,7 +18785,8 @@ "@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "dev": true }, "@types/babel__core": { "version": "7.1.19", @@ -18890,6 +18949,7 @@ "version": "27.4.1", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "dev": true, "requires": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" @@ -18928,7 +18988,8 @@ "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true }, "@types/q": { "version": "1.5.5", @@ -18949,6 +19010,7 @@ "version": "18.0.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz", "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==", + "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -18959,6 +19021,7 @@ "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.0.tgz", "integrity": "sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==", + "dev": true, "requires": { "@types/react": "*" } @@ -18979,7 +19042,8 @@ "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true }, "@types/serve-index": { "version": "1.9.1", @@ -19015,6 +19079,7 @@ "version": "5.14.3", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", "integrity": "sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==", + "dev": true, "requires": { "@types/jest": "*" } @@ -19546,7 +19611,8 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "autoprefixer": { "version": "10.4.5", @@ -20335,6 +20401,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, "requires": { "inherits": "^2.0.4", "source-map": "^0.6.1", @@ -20344,7 +20411,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -20470,7 +20538,8 @@ "css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true }, "cssdb": { "version": "6.5.0", @@ -20586,7 +20655,8 @@ "csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", + "dev": true }, "damerau-levenshtein": { "version": "1.0.8", @@ -20644,7 +20714,8 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "dedent": { "version": "0.7.0", @@ -20794,7 +20865,8 @@ "dom-accessibility-api": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true }, "dom-converter": { "version": "0.2.0", @@ -22467,7 +22539,8 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -24487,7 +24560,8 @@ "lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "dev": true }, "magic-string": { "version": "0.25.9", @@ -24593,7 +24667,8 @@ "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true }, "mini-css-extract-plugin": { "version": "2.6.0", @@ -26226,6 +26301,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, "requires": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -26873,6 +26949,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0" @@ -27068,6 +27145,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, "requires": { "min-indent": "^1.0.0" } diff --git a/ui-admin/package.json b/ui-admin/package.json index 77d7b51..844ad7d 100644 --- a/ui-admin/package.json +++ b/ui-admin/package.json @@ -3,9 +3,6 @@ "version": "0.1.0", "private": true, "dependencies": { - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^13.1.1", - "@testing-library/user-event": "^13.5.0", "grid-engine": "^2.15.0", "phaser": "^3.55.2", "react": "^18.1.0", @@ -14,6 +11,11 @@ "web-vitals": "^2.1.4", "ws": "^8.13.0" }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.1.1", + "@testing-library/user-event": "^13.5.0" + }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", diff --git a/ui-admin/src/Agent.js b/ui-admin/src/Agent.ts similarity index 87% rename from ui-admin/src/Agent.js rename to ui-admin/src/Agent.ts index 43dd3d3..65275a2 100644 --- a/ui-admin/src/Agent.js +++ b/ui-admin/src/Agent.ts @@ -1,5 +1,22 @@ +import { GridEngine, Direction } from "grid-engine" + class Agent { - constructor(gridEngine, fieldMapTileMap, agent_id, bedPosition = { x: 3, y: 3 }) { + private gridEngine: GridEngine + +private fieldMapTileMap: Phaser.Tilemaps.Tilemap; + +private agent_id: string; + +private sleepiness: number + +private bedPosition: { + x: number + y: number +} + +private socket: WebSocket; + + constructor(gridEngine: GridEngine, fieldMapTileMap: Phaser.Tilemaps.Tilemap, agent_id: string, bedPosition = { x: 3, y: 3 }) { this.gridEngine = gridEngine; this.fieldMapTileMap = fieldMapTileMap; this.agent_id = agent_id; @@ -83,7 +100,11 @@ class Agent { right: 'walkable' }; - const directions = [ + const directions: { + key: keyof typeof surroundings; + dx: -1 | 0 | 1; + dy: -1 | 0 | 1; + }[] = [ { key: 'up', dx: 0, dy: -1 }, { key: 'down', dx: 0, dy: 1 }, { key: 'left', dx: -1, dy: 0 }, @@ -108,7 +129,7 @@ class Agent { return surroundings; } - moveAndCheckCollision(direction, fieldMapTileMap) { + moveAndCheckCollision(direction: Direction, fieldMapTileMap: Phaser.Tilemaps.Tilemap) { const currentPosition = this.gridEngine.getPosition(this.agent_id); let nextPosition = { ...currentPosition }; diff --git a/ui-admin/src/App.js b/ui-admin/src/App.js deleted file mode 100644 index 18214b8..0000000 --- a/ui-admin/src/App.js +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useEffect, useRef } from "react"; -import Phaser from 'phaser'; -import './App.css'; -import GridEngine from "grid-engine"; - -import preload from './preload'; -import create from './create'; -import update from './update'; - -function App() { - const gameRef = useRef(null); - - useEffect(() => { - if (gameRef.current === null) { - gameRef.current = new Phaser.Game({ - title: "GPTRPG", - render: { - antialias: false, - }, - type: Phaser.AUTO, - physics: { - default: "arcade", - }, - plugins: { - scene: [ - { - key: "gridEngine", - plugin: GridEngine, - mapping: "gridEngine", - }, - ], - }, - scene: { - preload, - create, - update, - }, - scale: { - width: window.innerWidth, - height: window.innerHeight, - autoCenter: Phaser.Scale.CENTER_BOTH, - }, - parent: "game", - backgroundColor: "#48C4F8", - }); - } - }, []); - - return
; -} - -export default App; diff --git a/ui-admin/src/App.test.js b/ui-admin/src/App.test.ts similarity index 88% rename from ui-admin/src/App.test.js rename to ui-admin/src/App.test.ts index 1f03afe..2850949 100644 --- a/ui-admin/src/App.test.js +++ b/ui-admin/src/App.test.ts @@ -1,5 +1,5 @@ import { render, screen } from '@testing-library/react'; -import App from './App'; +import App from './App.tsx'; test('renders learn react link', () => { render(); diff --git a/ui-admin/src/App.tsx b/ui-admin/src/App.tsx new file mode 100644 index 0000000..d319542 --- /dev/null +++ b/ui-admin/src/App.tsx @@ -0,0 +1,8 @@ +import React from "react"; +import './App.css'; + +function App() { + return
; +} + +export default App; diff --git a/ui-admin/src/PhaserGame.ts b/ui-admin/src/PhaserGame.ts new file mode 100644 index 0000000..1ecc0de --- /dev/null +++ b/ui-admin/src/PhaserGame.ts @@ -0,0 +1,32 @@ +import { GridEngine } from "grid-engine" +import MainScene from "./scenes/main.scene" + +const config: Phaser.Types.Core.GameConfig = { + title: "GPTRPG", + render: { + antialias: false, + }, + type: Phaser.AUTO, + physics: { + default: "arcade", + }, + plugins: { + scene: [ + { + key: "gridEngine", + plugin: GridEngine, + mapping: "gridEngine", + }, + ], + }, + scene: [MainScene], + scale: { + width: window.innerWidth, + height: window.innerHeight, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + parent: "game", + backgroundColor: "#48C4F8", + } + + export default new Phaser.Game(config) diff --git a/ui-admin/src/create.js b/ui-admin/src/create.js deleted file mode 100644 index e60774d..0000000 --- a/ui-admin/src/create.js +++ /dev/null @@ -1,53 +0,0 @@ -import Agent from "./Agent"; - -export default function create() { - this.fieldMapTileMap = this.make.tilemap({ key: "field-map" }); - this.fieldMapTileMap.addTilesetImage("GPTRPG", "tiles"); - this.fieldMapTileMap.layers.forEach((_, i) => { - const layer = this.fieldMapTileMap.createLayer(i, "GPTRPG", 0, 0); - layer.scale = 3; - }); - - this.plantLayer = this.fieldMapTileMap.createBlankLayer("plants", "GPTRPG", 0, 0); - this.plantLayer.scale = 3; - - this.plantLayer = this.add.container(); - - // START: Add character to grid engine - const playerSprite = this.add.sprite(0, 0, "player"); - playerSprite.scale = 3; - playerSprite.setDepth(6); - this.cameras.main.startFollow(playerSprite, true); - this.cameras.main.setFollowOffset(-playerSprite.width, -playerSprite.height); - - const agentId = "agent1"; - - const gridEngineConfig = { - characters: [ - { - id: agentId, - sprite: playerSprite, - walkingAnimationMapping: 6, - startPosition: { x: 7, y: 6 } - }, - ], - }; - // END: Add character to grid engine - - this.gridEngine.create(this.fieldMapTileMap, gridEngineConfig); - - // START: Create agent - this.agent = new Agent(this.gridEngine, this.fieldMapTileMap, agentId, {x: 6, y: 5}); - // END: Create agent - - // Create walkable tiles bridge - this.gridEngine.setTransition({ x: 10, y: 26 }, 'ground', 'bridge'); - this.gridEngine.setTransition({ x: 10, y: 39 }, 'bridge', 'ground'); - this.gridEngine.setTransition({ x: 11, y: 26 }, 'ground', 'bridge'); - this.gridEngine.setTransition({ x: 11, y: 39 }, 'bridge', 'ground'); - this.gridEngine.setTransition({ x: 9, y: 26 }, 'ground', 'bridge'); - this.gridEngine.setTransition({ x: 9, y: 39 }, 'bridge', 'ground'); - - // EXPOSE TO EXTENSION - window.__GRID_ENGINE__ = this.gridEngine; -}; diff --git a/ui-admin/src/index.js b/ui-admin/src/index.tsx similarity index 87% rename from ui-admin/src/index.js rename to ui-admin/src/index.tsx index d563c0f..ad2da31 100644 --- a/ui-admin/src/index.js +++ b/ui-admin/src/index.tsx @@ -1,10 +1,12 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; -import App from './App'; +import App from './App.tsx'; import reportWebVitals from './reportWebVitals'; -const root = ReactDOM.createRoot(document.getElementById('root')); +import './PhaserGame.ts' + +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( diff --git a/ui-admin/src/preload.js b/ui-admin/src/preload.js deleted file mode 100644 index bfb0eb5..0000000 --- a/ui-admin/src/preload.js +++ /dev/null @@ -1,21 +0,0 @@ - -import tileset from "./assets/v2.png" -import mapJson from "./assets/GPTRPGMap.json" -import characters from "./assets/characters.png" - -export default function preload() { - this.load.image("tiles", tileset, { - frameWidth: 16, - frameHeight: 16, - }); - this.load.tilemapTiledJSON("field-map", mapJson); - this.load.spritesheet("player", characters, { - frameWidth: 26, - frameHeight: 36, - }); - - this.load.spritesheet("plant", tileset, { - frameWidth: 16, - frameHeight: 16, - }); -} diff --git a/ui-admin/src/reportWebVitals.js b/ui-admin/src/reportWebVitals.ts similarity index 75% rename from ui-admin/src/reportWebVitals.js rename to ui-admin/src/reportWebVitals.ts index 5253d3a..49a2a16 100644 --- a/ui-admin/src/reportWebVitals.js +++ b/ui-admin/src/reportWebVitals.ts @@ -1,4 +1,6 @@ -const reportWebVitals = onPerfEntry => { +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { if (onPerfEntry && onPerfEntry instanceof Function) { import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { getCLS(onPerfEntry); diff --git a/ui-admin/src/scenes/main.scene.ts b/ui-admin/src/scenes/main.scene.ts new file mode 100644 index 0000000..4f474cc --- /dev/null +++ b/ui-admin/src/scenes/main.scene.ts @@ -0,0 +1,188 @@ +import Phaser from 'phaser' +import tileset from "../assets/v2.png" +import mapJson from "../assets/GPTRPGMap.json" +import characters from "../assets/characters.png" +import Agent from '../Agent'; +import { Direction, GridEngine } from 'grid-engine'; + +export default class MainScene extends Phaser.Scene { + agent?: Agent; + + fieldMapTileMap?: Phaser.Tilemaps.Tilemap; + + plantLayer?: Phaser.GameObjects.Container; + + gridEngine?: GridEngine; + + + preload() { + this.load.image("tiles", tileset); + + this.load.tilemapTiledJSON("field-map", mapJson); + + this.load.spritesheet("player", characters, { + frameWidth: 26, + frameHeight: 36, + }); + + this.load.spritesheet("plant", tileset, { + frameWidth: 16, + frameHeight: 16, + }); + } + + create() { + if (!this.gridEngine) { + console.log('Cannot initialise grid engine') + return; + } + + this.fieldMapTileMap = this.make.tilemap({ key: "field-map" }); + if (!this.fieldMapTileMap) { + console.log('Cannot initialise tilemap') + return; + } + + this.fieldMapTileMap.addTilesetImage("GPTRPG", "tiles"); + for (let i = 0; i < this.fieldMapTileMap.layers.length; i++) { + const layer = this.fieldMapTileMap.createLayer(i, "GPTRPG", 0, 0); + layer.scale = 3; + } + + const plantLayer = this.fieldMapTileMap.createBlankLayer("plants", "GPTRPG", 0, 0); + plantLayer.scale = 3; + + this.plantLayer = this.add.container(); + + // START: Add character to grid engine + const playerSprite = this.add.sprite(0, 0, "player"); + playerSprite.scale = 3; + playerSprite.setDepth(6); + + this.cameras.main.startFollow(playerSprite, true); + this.cameras.main.setFollowOffset(-playerSprite.width, -playerSprite.height); + + const agentId = "agent1"; + + const gridEngineConfig = { + characters: [ + { + id: agentId, + sprite: playerSprite, + walkingAnimationMapping: 6, + startPosition: { x: 7, y: 6 } + }, + ], + }; + + // END: Add character to grid engine + + this.gridEngine.create(this.fieldMapTileMap, gridEngineConfig); + + // START: Create agent + this.agent = new Agent(this.gridEngine, this.fieldMapTileMap, agentId, {x: 6, y: 5}); + // END: Create agent + + // Create walkable tiles bridge + this.gridEngine.setTransition({ x: 10, y: 26 }, 'ground', 'bridge'); + this.gridEngine.setTransition({ x: 10, y: 39 }, 'bridge', 'ground'); + this.gridEngine.setTransition({ x: 11, y: 26 }, 'ground', 'bridge'); + this.gridEngine.setTransition({ x: 11, y: 39 }, 'bridge', 'ground'); + this.gridEngine.setTransition({ x: 9, y: 26 }, 'ground', 'bridge'); + this.gridEngine.setTransition({ x: 9, y: 39 }, 'bridge', 'ground'); + + // EXPOSE TO EXTENSION + window.__GRID_ENGINE__ = this.gridEngine; + }; + + +update() { + if (!this.fieldMapTileMap) { + console.error('Error: tilemap not initialised') + return + } + + if (!this.gridEngine) { + console.error('Error: grid engine not initialised') + return + } + + if (!this.agent) { + console.error('Error: agent not initialised') + return + } + + if (!this.plantLayer) { + console.error('Error: plant layer not initialised') + return + } + + const cursors = this.input.keyboard.createCursorKeys(); + + const addPlantKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S); + const removePlantKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D); + const randomDestinationKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.R); + + if(randomDestinationKey.isDown) { + this.gridEngine.moveTo("player", { x: 15, y: 18 }); + } + + if (addPlantKey.isDown) { + const playerPosition = this.gridEngine.getPosition("player"); + const tileX = playerPosition.x; + const tileY = playerPosition.y; + + // Get the grass layer + const grassLayer = this.fieldMapTileMap.layers[0].tilemapLayer; + + // Check if there's a grass tile at the character's position and it has the property 'plantable' + const grassTile = grassLayer.getTileAt(tileX, tileY); + + if (grassTile && grassTile.properties.plantable) { + // Check if there's no tile at the character's position in other layers + const noOtherTile = this.fieldMapTileMap.layers.every((layer, index) => { + if (index === 0) return true; // Skip the grass layer + return !layer.tilemapLayer.hasTileAt(tileX, tileY); + }); + + if (noOtherTile) { + const { x: worldX, y: worldY } = this.fieldMapTileMap.tileToWorldXY(tileX, tileY); + + const plant = this.add.sprite(worldX, worldY, "plant"); + + plant.setFrame(446); + plant.setOrigin(0, 0); + plant.scale = 3; + this.plantLayer?.add(plant); + } + } + } + + if (removePlantKey.isDown) { + const playerPosition = this.gridEngine.getPosition("player"); + const { x: worldX, y: worldY } = this.fieldMapTileMap.tileToWorldXY(playerPosition.x, playerPosition.y); + + // Find all overlapping plants + const plantsToRemove = this.plantLayer.list.filter((plant) => { + // @ts-ignore + const distance = Phaser.Math.Distance.Between(plant.x, plant.y, worldX, worldY); + return distance < (16 * 3) / 2; + }); + + // Remove all the overlapping plants + plantsToRemove.forEach((plant) => { + plant.destroy(); + }); + } + + if (cursors.left.isDown) { + this.agent.moveAndCheckCollision(Direction.LEFT, this.fieldMapTileMap); + } else if (cursors.right.isDown) { + this.agent.moveAndCheckCollision(Direction.RIGHT, this.fieldMapTileMap); + } else if (cursors.up.isDown) { + this.agent.moveAndCheckCollision(Direction.UP, this.fieldMapTileMap); + } else if (cursors.down.isDown) { + this.agent.moveAndCheckCollision(Direction.DOWN, this.fieldMapTileMap); + } + }; +} \ No newline at end of file diff --git a/ui-admin/src/setupTests.js b/ui-admin/src/setupTests.ts similarity index 100% rename from ui-admin/src/setupTests.js rename to ui-admin/src/setupTests.ts diff --git a/ui-admin/src/update.js b/ui-admin/src/update.js deleted file mode 100644 index e3ab154..0000000 --- a/ui-admin/src/update.js +++ /dev/null @@ -1,71 +0,0 @@ -import Phaser from "phaser"; - -export default function update() { - const cursors = this.input.keyboard.createCursorKeys(); - - const addPlantKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S); - const removePlantKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D); - const randomDestinationKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.R); - - if(randomDestinationKey.isDown) { - this.gridEngine.moveTo("player", { x: 15, y: 18 }); - } - - if (addPlantKey.isDown) { - const playerPosition = this.gridEngine.getPosition("player"); - const tileX = playerPosition.x; - const tileY = playerPosition.y; - - // Get the grass layer - const grassLayer = this.fieldMapTileMap.layers[0].tilemapLayer; - - // Check if there's a grass tile at the character's position and it has the property 'plantable' - const grassTile = grassLayer.getTileAt(tileX, tileY); - - if (grassTile && grassTile.properties.plantable) { - // Check if there's no tile at the character's position in other layers - const noOtherTile = this.fieldMapTileMap.layers.every((layer, index) => { - if (index === 0) return true; // Skip the grass layer - return !layer.tilemapLayer.hasTileAt(tileX, tileY); - }); - - if (noOtherTile) { - const { x: worldX, y: worldY } = this.fieldMapTileMap.tileToWorldXY(tileX, tileY); - - const plant = this.add.sprite(worldX, worldY, "plant"); - - plant.setFrame(446); - plant.setOrigin(0, 0); - plant.scale = 3; - this.plantLayer.add(plant); - } - } - } - - if (removePlantKey.isDown) { - const playerPosition = this.gridEngine.getPosition("player"); - const { x: worldX, y: worldY } = this.fieldMapTileMap.tileToWorldXY(playerPosition.x, playerPosition.y); - - // Find all overlapping plants - const plantsToRemove = this.plantLayer.list.filter((plant) => { - const distance = Phaser.Math.Distance.Between(plant.x, plant.y, worldX, worldY); - return distance < (16 * 3) / 2; - }); - - // Remove all the overlapping plants - plantsToRemove.forEach((plant) => { - plant.destroy(); - }); - } - - if (cursors.left.isDown) { - this.agent.moveAndCheckCollision("left", this.fieldMapTileMap); - } else if (cursors.right.isDown) { - this.agent.moveAndCheckCollision("right", this.fieldMapTileMap); - } else if (cursors.up.isDown) { - this.agent.moveAndCheckCollision("up", this.fieldMapTileMap); - } else if (cursors.down.isDown) { - this.agent.moveAndCheckCollision("down", this.fieldMapTileMap); - } - -}; \ No newline at end of file diff --git a/ui-admin/tsconfig.json b/ui-admin/tsconfig.json new file mode 100644 index 0000000..5079273 --- /dev/null +++ b/ui-admin/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "allowImportingTsExtensions": true, + "jsx": "react-jsx", + "baseUrl": ".", + }, + "include": ["src", "types"], + "exclude": ["node_modules"] +} diff --git a/ui-admin/types/react-app-env.d.ts b/ui-admin/types/react-app-env.d.ts new file mode 100644 index 0000000..6431bc5 --- /dev/null +++ b/ui-admin/types/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/ui-admin/types/window.d.ts b/ui-admin/types/window.d.ts new file mode 100644 index 0000000..b9708d9 --- /dev/null +++ b/ui-admin/types/window.d.ts @@ -0,0 +1,7 @@ +import { GridEngine } from "grid-engine"; + +declare global { + interface Window { + __GRID_ENGINE__: GridEngine + } +} \ No newline at end of file From 91608d94e42993f5f63dd4db9f090817f5f19dff Mon Sep 17 00:00:00 2001 From: Joshua Sharp Date: Tue, 25 Apr 2023 17:54:59 +1000 Subject: [PATCH 2/2] chore: indenting --- ui-admin/src/Agent.ts | 16 ++-- ui-admin/src/scenes/main.scene.ts | 154 +++++++++++++++--------------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/ui-admin/src/Agent.ts b/ui-admin/src/Agent.ts index 65275a2..9a47542 100644 --- a/ui-admin/src/Agent.ts +++ b/ui-admin/src/Agent.ts @@ -3,18 +3,18 @@ import { GridEngine, Direction } from "grid-engine" class Agent { private gridEngine: GridEngine -private fieldMapTileMap: Phaser.Tilemaps.Tilemap; + private fieldMapTileMap: Phaser.Tilemaps.Tilemap; -private agent_id: string; + private agent_id: string; -private sleepiness: number + private sleepiness: number -private bedPosition: { - x: number - y: number -} + private bedPosition: { + x: number + y: number + } -private socket: WebSocket; + private socket: WebSocket; constructor(gridEngine: GridEngine, fieldMapTileMap: Phaser.Tilemaps.Tilemap, agent_id: string, bedPosition = { x: 3, y: 3 }) { this.gridEngine = gridEngine; diff --git a/ui-admin/src/scenes/main.scene.ts b/ui-admin/src/scenes/main.scene.ts index 4f474cc..64f5d99 100644 --- a/ui-admin/src/scenes/main.scene.ts +++ b/ui-admin/src/scenes/main.scene.ts @@ -31,91 +31,91 @@ export default class MainScene extends Phaser.Scene { }); } - create() { - if (!this.gridEngine) { - console.log('Cannot initialise grid engine') - return; - } + create() { + if (!this.gridEngine) { + console.log('Cannot initialise grid engine') + return; + } - this.fieldMapTileMap = this.make.tilemap({ key: "field-map" }); - if (!this.fieldMapTileMap) { - console.log('Cannot initialise tilemap') - return; - } - - this.fieldMapTileMap.addTilesetImage("GPTRPG", "tiles"); - for (let i = 0; i < this.fieldMapTileMap.layers.length; i++) { - const layer = this.fieldMapTileMap.createLayer(i, "GPTRPG", 0, 0); - layer.scale = 3; - } - - const plantLayer = this.fieldMapTileMap.createBlankLayer("plants", "GPTRPG", 0, 0); - plantLayer.scale = 3; - - this.plantLayer = this.add.container(); - - // START: Add character to grid engine - const playerSprite = this.add.sprite(0, 0, "player"); - playerSprite.scale = 3; - playerSprite.setDepth(6); + this.fieldMapTileMap = this.make.tilemap({ key: "field-map" }); + if (!this.fieldMapTileMap) { + console.log('Cannot initialise tilemap') + return; + } + + this.fieldMapTileMap.addTilesetImage("GPTRPG", "tiles"); + for (let i = 0; i < this.fieldMapTileMap.layers.length; i++) { + const layer = this.fieldMapTileMap.createLayer(i, "GPTRPG", 0, 0); + layer.scale = 3; + } + + const plantLayer = this.fieldMapTileMap.createBlankLayer("plants", "GPTRPG", 0, 0); + plantLayer.scale = 3; + + this.plantLayer = this.add.container(); + + // START: Add character to grid engine + const playerSprite = this.add.sprite(0, 0, "player"); + playerSprite.scale = 3; + playerSprite.setDepth(6); - this.cameras.main.startFollow(playerSprite, true); - this.cameras.main.setFollowOffset(-playerSprite.width, -playerSprite.height); - - const agentId = "agent1"; - - const gridEngineConfig = { - characters: [ - { - id: agentId, - sprite: playerSprite, - walkingAnimationMapping: 6, - startPosition: { x: 7, y: 6 } - }, - ], - }; + this.cameras.main.startFollow(playerSprite, true); + this.cameras.main.setFollowOffset(-playerSprite.width, -playerSprite.height); + + const agentId = "agent1"; + + const gridEngineConfig = { + characters: [ + { + id: agentId, + sprite: playerSprite, + walkingAnimationMapping: 6, + startPosition: { x: 7, y: 6 } + }, + ], + }; - // END: Add character to grid engine - - this.gridEngine.create(this.fieldMapTileMap, gridEngineConfig); - - // START: Create agent - this.agent = new Agent(this.gridEngine, this.fieldMapTileMap, agentId, {x: 6, y: 5}); - // END: Create agent - - // Create walkable tiles bridge - this.gridEngine.setTransition({ x: 10, y: 26 }, 'ground', 'bridge'); - this.gridEngine.setTransition({ x: 10, y: 39 }, 'bridge', 'ground'); - this.gridEngine.setTransition({ x: 11, y: 26 }, 'ground', 'bridge'); - this.gridEngine.setTransition({ x: 11, y: 39 }, 'bridge', 'ground'); - this.gridEngine.setTransition({ x: 9, y: 26 }, 'ground', 'bridge'); - this.gridEngine.setTransition({ x: 9, y: 39 }, 'bridge', 'ground'); - - // EXPOSE TO EXTENSION - window.__GRID_ENGINE__ = this.gridEngine; - }; + // END: Add character to grid engine + + this.gridEngine.create(this.fieldMapTileMap, gridEngineConfig); + + // START: Create agent + this.agent = new Agent(this.gridEngine, this.fieldMapTileMap, agentId, {x: 6, y: 5}); + // END: Create agent + + // Create walkable tiles bridge + this.gridEngine.setTransition({ x: 10, y: 26 }, 'ground', 'bridge'); + this.gridEngine.setTransition({ x: 10, y: 39 }, 'bridge', 'ground'); + this.gridEngine.setTransition({ x: 11, y: 26 }, 'ground', 'bridge'); + this.gridEngine.setTransition({ x: 11, y: 39 }, 'bridge', 'ground'); + this.gridEngine.setTransition({ x: 9, y: 26 }, 'ground', 'bridge'); + this.gridEngine.setTransition({ x: 9, y: 39 }, 'bridge', 'ground'); + + // EXPOSE TO EXTENSION + window.__GRID_ENGINE__ = this.gridEngine; + }; -update() { - if (!this.fieldMapTileMap) { - console.error('Error: tilemap not initialised') - return - } + update() { + if (!this.fieldMapTileMap) { + console.error('Error: tilemap not initialised') + return + } - if (!this.gridEngine) { - console.error('Error: grid engine not initialised') - return - } + if (!this.gridEngine) { + console.error('Error: grid engine not initialised') + return + } - if (!this.agent) { - console.error('Error: agent not initialised') - return - } + if (!this.agent) { + console.error('Error: agent not initialised') + return + } - if (!this.plantLayer) { - console.error('Error: plant layer not initialised') - return - } + if (!this.plantLayer) { + console.error('Error: plant layer not initialised') + return + } const cursors = this.input.keyboard.createCursorKeys();