From 0cb5dc9bab81bd5d89d25076e7b1aeb0e3524232 Mon Sep 17 00:00:00 2001 From: Matteo Rosati Date: Fri, 16 Jan 2026 10:14:55 +0100 Subject: [PATCH] working version --- .gitignore | 34 ++++ .kilocode/rules/agents.md | 10 + .kilocode/rules/plan.md | 18 ++ .kilocode/rules/python.md | 21 ++ .kilocode/rules/search.md | 5 + .kilocode/rules/typescript.md | 26 +++ .kilocode/rules/ultrathink.md | 16 ++ README.md | 21 ++ bun-env.d.ts | 17 ++ bun.lock | 133 ++++++++++++ bunfig.toml | 2 + debug-screenshot.png | Bin 0 -> 47439 bytes package.json | 24 +++ src/APITester.tsx | 39 ++++ src/App.tsx | 81 ++++++++ src/api.ts | 27 +++ src/components/PlayerMap.tsx | 82 ++++++++ src/components/StatsDashboard.tsx | 206 +++++++++++++++++++ src/frontend.tsx | 26 +++ src/index.css | 323 ++++++++++++++++++++++++++++++ src/index.html | 13 ++ src/index.ts | 41 ++++ src/logo.svg | 1 + src/react.svg | 8 + src/types.ts | 59 ++++++ tsconfig.json | 36 ++++ 26 files changed, 1269 insertions(+) create mode 100644 .gitignore create mode 100644 .kilocode/rules/agents.md create mode 100644 .kilocode/rules/plan.md create mode 100644 .kilocode/rules/python.md create mode 100644 .kilocode/rules/search.md create mode 100644 .kilocode/rules/typescript.md create mode 100644 .kilocode/rules/ultrathink.md create mode 100644 README.md create mode 100644 bun-env.d.ts create mode 100644 bun.lock create mode 100644 bunfig.toml create mode 100644 debug-screenshot.png create mode 100644 package.json create mode 100644 src/APITester.tsx create mode 100644 src/App.tsx create mode 100644 src/api.ts create mode 100644 src/components/PlayerMap.tsx create mode 100644 src/components/StatsDashboard.tsx create mode 100644 src/frontend.tsx create mode 100644 src/index.css create mode 100644 src/index.html create mode 100644 src/index.ts create mode 100644 src/logo.svg create mode 100644 src/react.svg create mode 100644 src/types.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a14702c --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/.kilocode/rules/agents.md b/.kilocode/rules/agents.md new file mode 100644 index 0000000..82f1070 --- /dev/null +++ b/.kilocode/rules/agents.md @@ -0,0 +1,10 @@ +# AGENT FILES + +Always search the root folder for the following files, if they exist: + +- `AGENTS.md` +- `CONSTITUTION.md` +- `GEMINI.md` +- `CLAUDE.md` + +These files are generally used to configure the agent's behavior and capabilities. They are not required, but are recommended for most agents. diff --git a/.kilocode/rules/plan.md b/.kilocode/rules/plan.md new file mode 100644 index 0000000..7473eab --- /dev/null +++ b/.kilocode/rules/plan.md @@ -0,0 +1,18 @@ +# PLANNING + +You are an expert senior software engineer with 20+ years of experience in software development. You excel in planning and designing software systems. + +**PLAN AND WAIT**: Before any code implementation you craft a complete, solid and detailed execution plan. You are a master of breaking down complex problems into smaller, manageable tasks. You are also a master of identifying dependencies and creating a clear roadmap for the project. + +**ACTIONABLE PLANS**: Your plans are actionable and can be executed step by step, to track the progress of the implementation. + +You will be given a problem to solve and you will create a plan to solve it. The plan will include: + +1. A list of tasks to be completed +2. A list of dependencies between tasks +3. A list of resources needed to complete the tasks +4. A list of risks and mitigation strategies +5. A list of success criteria + +**NEVER EXECUTE**: You will never execute the plan automatically. You will only create the plan and present it to the user. +**ALWAYS ASK**: You will always ask the user to execute the plan. You will then review the results and provide a detailed report on them. diff --git a/.kilocode/rules/python.md b/.kilocode/rules/python.md new file mode 100644 index 0000000..1670276 --- /dev/null +++ b/.kilocode/rules/python.md @@ -0,0 +1,21 @@ +# PYTHON RULES + +You are a Python expert with 15+ years of experience. You follow all the best practices and standards for Python development. + +## CODE STYLE + +- **ALWAYS**: Use `uv` module for dependency management and for script execution. +- **PREFER**: Use PEP 8 style guide for Python code. +- **ALWAYS**: Use type hints for function parameters and return values. +- **ALWAYS**: Enforce OOP, code reuse, modularity, separation of concerns and dependency injection. +- **ALWAYS**: Use docstrings for all functions and classes. +- **ALWAYS**: Use descriptive variable names. +- **ALWAYS**: Use constants for values that do not change. +- **ALWAYS**: Use list comprehensions instead of for loops when possible. +- **ALWAYS**: Use `with` statement for file operations. +- **PREFER**: Use `try`/`except` blocks for error handling. +- **ALWAYS**: Use `logging` module for logging. +- **PREFER**: Use `argparse` module for command line arguments. +- **ALWAYS**: Use `pyright` module for type checking before committing to a final code change (`uv run pyright `). +- **NEVER**: Accept a change that produces warnings or errors either from `pyright` or from the script execution. If so, you must find a solution and address the issue. +- **NEVER**: Use outdated syntax, antipatterns, or deprecated features. diff --git a/.kilocode/rules/search.md b/.kilocode/rules/search.md new file mode 100644 index 0000000..fae1da1 --- /dev/null +++ b/.kilocode/rules/search.md @@ -0,0 +1,5 @@ +# SEARCH + +You have access to the Brave search tool. You can use it to search for information on the web. + +**ALWAYS** use the Brave search tool to search for information about the user request. Use the information you get to get additional context. diff --git a/.kilocode/rules/typescript.md b/.kilocode/rules/typescript.md new file mode 100644 index 0000000..89f40e6 --- /dev/null +++ b/.kilocode/rules/typescript.md @@ -0,0 +1,26 @@ +# TYPESCRIPT RULES + +You are a TypeScript expert with 15+ years of experience. You follow all the best practices and standards for TypeScript development. + +## CODE STYLE + +- **ALWAYS**: Use `pnpm` for dependency management and for script execution. +- **PREFER**: Use the official TypeScript style guide and ESLint configuration. +- **ALWAYS**: Use type annotations for function parameters and return values. +- **ALWAYS**: Enforce OOP, code reuse, modularity, separation of concerns and dependency injection. +- **ALWAYS**: Use JSDoc comments for all functions and classes. +- **ALWAYS**: Use descriptive variable names following camelCase convention. +- **ALWAYS**: Use `const` and `readonly` for values that do not change. +- **ALWAYS**: Use array methods (map, filter, reduce) instead of for loops when possible. +- **ALWAYS**: Use `try`/`catch` blocks for error handling. +- **ALWAYS**: Use a logging library (e.g., winston, pino) for logging. +- **PREFER**: Use a CLI library (e.g., commander, yargs) for command line arguments. +- **ALWAYS**: Use `tsc --noEmit` for type checking before committing to a final code change. +- **ALWAYS**: Use ESLint with typescript-eslint for linting before committing to a final code change. +- **NEVER**: Accept a change that produces warnings or errors either from `tsc`, ESLint, or from the script execution. If so, you must find a solution and address the issue. +- **NEVER**: Use `any` type unless absolutely necessary. Use `unknown` instead when the type is truly unknown. +- **NEVER**: Use outdated syntax, antipatterns, or deprecated features. +- **ALWAYS**: Enable strict mode in tsconfig.json for comprehensive type checking. +- **PREFER**: Use interfaces for object shapes and type aliases for union types or primitives. +- **ALWAYS**: Use enums only when necessary; prefer string literal unions for better type safety. +- **PREFER**: Use utility types (Partial, Required, Readonly, Pick, Omit) for type transformations. diff --git a/.kilocode/rules/ultrathink.md b/.kilocode/rules/ultrathink.md new file mode 100644 index 0000000..efe992d --- /dev/null +++ b/.kilocode/rules/ultrathink.md @@ -0,0 +1,16 @@ +# ROSI'S ULTRATHINK PROTOCOL™ + +The Rosi's Ultrathink Protocol™ is used only if explicitly requested by the user. It adds an extra layer of reasoning to the standard workflow. + +# STEPS + +When in Ultrathink mode, you will: + +1. **ALWAYS**: You will always notify the user when we're in Ultrathink mode with "🧠 ULTRATHINK MODE ACTIVATED 🧠". +2. **THINKING**: You will first think deeply about the user's request, the context of the conversation and the current codebase. +3. **BEST SOLUTION**: You accept a solution only if it is the best possible to the problem. +4. **ANALYZE**: You will analyze the solution and validate it only if it respects the current tools, versions and libraries. +5. **THINK AGAIN**: If an immediate solution is possible, hold on and think again. Challenge yourself and investigate if other possible better implementations are possible. If you find a better solution, you will use it instead of the first one, or merge the best ideas of the two solutions into a single, refined one. +6. **ZERO LAZINESS**: Being lazy is strictly prohibited. Do not propose something because "it's easier" or "it's faster". You will always find the best solution, even if it takes more time. +7. **LOW TRUST ON KNOWLEDGE**: Your knowledge is limited and likely outdated. You have at your disposal a web search tool via Brave, use it as much as you need. +8. **NO ASSUMPTIONS**: You will not make any assumptions about the user's intent or the context of the conversation. You will always ask for clarification if needed. diff --git a/README.md b/README.md new file mode 100644 index 0000000..89d19c0 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# bun-react-template + +To install dependencies: + +```bash +bun install +``` + +To start a development server: + +```bash +bun dev +``` + +To run for production: + +```bash +bun start +``` + +This project was created using `bun init` in bun v1.3.5. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime. diff --git a/bun-env.d.ts b/bun-env.d.ts new file mode 100644 index 0000000..72f1c26 --- /dev/null +++ b/bun-env.d.ts @@ -0,0 +1,17 @@ +// Generated by `bun init` + +declare module "*.svg" { + /** + * A path to the SVG file + */ + const path: `${string}.svg`; + export = path; +} + +declare module "*.module.css" { + /** + * A record of class names to their corresponding CSS module classes + */ + const classes: { readonly [key: string]: string }; + export = classes; +} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..843db4a --- /dev/null +++ b/bun.lock @@ -0,0 +1,133 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "bun-react-template", + "dependencies": { + "leaflet": "^1.9.4", + "react": "^19", + "react-dom": "^19", + "react-leaflet": "^5.0.0", + "recharts": "^3.6.0", + }, + "devDependencies": { + "@types/bun": "latest", + "@types/leaflet": "^1.9.21", + "@types/react": "^19", + "@types/react-dom": "^19", + }, + }, + }, + "packages": { + "@react-leaflet/core": ["@react-leaflet/core@3.0.0", "", { "peerDependencies": { "leaflet": "^1.9.0", "react": "^19.0.0", "react-dom": "^19.0.0" } }, "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ=="], + + "@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + + "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/leaflet": ["@types/leaflet@1.9.21", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w=="], + + "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], + + "@types/react": ["@types/react@19.2.8", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="], + + "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], + + "es-toolkit": ["es-toolkit@1.44.0", "", {}, "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + + "leaflet": ["leaflet@1.9.4", "", {}, "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="], + + "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + + "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + + "react-is": ["react-is@19.2.3", "", {}, "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA=="], + + "react-leaflet": ["react-leaflet@5.0.0", "", { "dependencies": { "@react-leaflet/core": "^3.0.0" }, "peerDependencies": { "leaflet": "^1.9.0", "react": "^19.0.0", "react-dom": "^19.0.0" } }, "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw=="], + + "react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="], + + "recharts": ["recharts@3.6.0", "", { "dependencies": { "@reduxjs/toolkit": "1.x.x || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg=="], + + "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="], + + "redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="], + + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], + + "@reduxjs/toolkit/immer": ["immer@11.1.3", "", {}, "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q=="], + } +} diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..9819bf6 --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[serve.static] +env = "BUN_PUBLIC_*" \ No newline at end of file diff --git a/debug-screenshot.png b/debug-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8702f2f720289d24a75f16b21e820da434ef8ded GIT binary patch literal 47439 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%0APow$ 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%0DmfAunt`HxiMkm#%;nV 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 Lp4v+l>%jj98Ph*u literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..6d6baff --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "bun-react-template", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "bun --hot src/index.ts", + "build": "bun build ./src/index.html --outdir=dist --sourcemap --target=browser --minify --define:process.env.NODE_ENV='\"production\"' --env='BUN_PUBLIC_*'", + "start": "NODE_ENV=production bun src/index.ts" + }, + "dependencies": { + "leaflet": "^1.9.4", + "react": "^19", + "react-dom": "^19", + "react-leaflet": "^5.0.0", + "recharts": "^3.6.0" + }, + "devDependencies": { + "@types/bun": "latest", + "@types/leaflet": "^1.9.21", + "@types/react": "^19", + "@types/react-dom": "^19" + } +} diff --git a/src/APITester.tsx b/src/APITester.tsx new file mode 100644 index 0000000..fd2af48 --- /dev/null +++ b/src/APITester.tsx @@ -0,0 +1,39 @@ +import { useRef, type FormEvent } from "react"; + +export function APITester() { + const responseInputRef = useRef(null); + + const testEndpoint = async (e: FormEvent) => { + e.preventDefault(); + + try { + const form = e.currentTarget; + const formData = new FormData(form); + const endpoint = formData.get("endpoint") as string; + const url = new URL(endpoint, location.href); + const method = formData.get("method") as string; + const res = await fetch(url, { method }); + + const data = await res.json(); + responseInputRef.current!.value = JSON.stringify(data, null, 2); + } catch (error) { + responseInputRef.current!.value = String(error); + } + }; + + return ( +
+
+ + + +
+