From 7b89066ef3d5bd9348e1f1a9754a5261e2eec0e0 Mon Sep 17 00:00:00 2001 From: Daniel Arroyo Date: Wed, 12 Aug 2026 17:57:23 -0400 Subject: [PATCH] fix(ci): gitignore was excluding src/frontend/src/data/defaults.ts The .gitignore had 'data/' which matches any 'data' directory at any depth. That excluded src/frontend/src/data/ from git, so the file defaults.ts (with DEFAULT_INSUMOS, DEFAULT_FORMULAS, etc.) was never committed. CI was failing with TS2307 because the file was in the local working tree but not in the git checkout. Tighten the rule to '/data/' so only the root runtime H2 database folder is ignored, not the source data directory. --- .gitignore | 2 +- src/frontend/src/data/defaults.ts | 90 +++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/frontend/src/data/defaults.ts diff --git a/.gitignore b/.gitignore index 2ee7c7f..ed2d46e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ src/frontend/node_modules/ src/frontend/dist/ src/frontend/tsconfig.app.tsbuildinfo src/frontend/tsconfig.node.tsbuildinfo -data/ +/data/ .idea/ .vscode/ *.iml diff --git a/src/frontend/src/data/defaults.ts b/src/frontend/src/data/defaults.ts new file mode 100644 index 0000000..6c9d316 --- /dev/null +++ b/src/frontend/src/data/defaults.ts @@ -0,0 +1,90 @@ +import type { AppState as ApiAppState } from '../api/client' +import type { CristalesDisponibles, Formula, Insumos } from '../types' + +export const DEFAULT_INSUMOS: Insumos = { + cristales: { + D: 1500, + C: 4500, + B: 18000, + A: 60000, + S: 200000, + }, + soulOre: 320, + spiritOre: 450, + venta: { + Soulshot: { D: 7, C: 18, B: 70, A: 220, S: 800 }, + Spiritshot: { D: 22, C: 60, B: 180, A: 400, S: 950 }, + 'Blessed Spiritshot': { D: 60, C: 180, B: 700, A: 1800, S: 4500 }, + }, +} + +export const DEFAULT_FORMULAS: Formula[] = [ + { id: 'Soulshot-D', tipo: 'Soulshot', grado: 'D', cristalesReq: 1, soulOreReq: 3, spiritOreReq: null, shotsObtenidos: 200 }, + { id: 'Soulshot-C', tipo: 'Soulshot', grado: 'C', cristalesReq: 1, soulOreReq: 15, spiritOreReq: null, shotsObtenidos: 600 }, + { id: 'Soulshot-B', tipo: 'Soulshot', grado: 'B', cristalesReq: 1, soulOreReq: 54, spiritOreReq: null, shotsObtenidos: 540 }, + { id: 'Soulshot-A', tipo: 'Soulshot', grado: 'A', cristalesReq: 1, soulOreReq: 60, spiritOreReq: null, shotsObtenidos: 500 }, + { id: 'Soulshot-S', tipo: 'Soulshot', grado: 'S', cristalesReq: 1, soulOreReq: 40, spiritOreReq: null, shotsObtenidos: 350 }, + + { id: 'Spiritshot-D', tipo: 'Spiritshot', grado: 'D', cristalesReq: 1, soulOreReq: null, spiritOreReq: 3, shotsObtenidos: 140 }, + { id: 'Spiritshot-C', tipo: 'Spiritshot', grado: 'C', cristalesReq: 1, soulOreReq: null, spiritOreReq: 10, shotsObtenidos: 270 }, + { id: 'Spiritshot-B', tipo: 'Spiritshot', grado: 'B', cristalesReq: 1, soulOreReq: null, spiritOreReq: 15, shotsObtenidos: 200 }, + { id: 'Spiritshot-A', tipo: 'Spiritshot', grado: 'A', cristalesReq: 1, soulOreReq: null, spiritOreReq: 30, shotsObtenidos: 350 }, + { id: 'Spiritshot-S', tipo: 'Spiritshot', grado: 'S', cristalesReq: 1, soulOreReq: null, spiritOreReq: 15, shotsObtenidos: 200 }, + + { id: 'Blessed Spiritshot-D', tipo: 'Blessed Spiritshot', grado: 'D', cristalesReq: 2, soulOreReq: null, spiritOreReq: 8, shotsObtenidos: 120 }, + { id: 'Blessed Spiritshot-C', tipo: 'Blessed Spiritshot', grado: 'C', cristalesReq: 2, soulOreReq: null, spiritOreReq: 30, shotsObtenidos: 240 }, + { id: 'Blessed Spiritshot-B', tipo: 'Blessed Spiritshot', grado: 'B', cristalesReq: 2, soulOreReq: null, spiritOreReq: 16, shotsObtenidos: 120 }, + { id: 'Blessed Spiritshot-A', tipo: 'Blessed Spiritshot', grado: 'A', cristalesReq: 2, soulOreReq: null, spiritOreReq: 84, shotsObtenidos: 300 }, + { id: 'Blessed Spiritshot-S', tipo: 'Blessed Spiritshot', grado: 'S', cristalesReq: 2, soulOreReq: null, spiritOreReq: 50, shotsObtenidos: 200 }, +] + +export const DEFAULT_CRISTALES_DISP: CristalesDisponibles = { + Soulshot: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + Spiritshot: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + 'Blessed Spiritshot': { D: 0, C: 0, B: 0, A: 0, S: 0 }, +} + +export const EMPTY_INSUMOS: Insumos = { + cristales: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + soulOre: 0, + spiritOre: 0, + venta: { + Soulshot: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + Spiritshot: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + 'Blessed Spiritshot': { D: 0, C: 0, B: 0, A: 0, S: 0 }, + }, +} + +export const EMPTY_FORMULAS: Formula[] = DEFAULT_FORMULAS.map((f) => ({ + ...f, + cristalesReq: 0, + soulOreReq: null, + spiritOreReq: null, + shotsObtenidos: 0, +})) + +export const EMPTY_CRISTALES_DISP: CristalesDisponibles = { + Soulshot: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + Spiritshot: { D: 0, C: 0, B: 0, A: 0, S: 0 }, + 'Blessed Spiritshot': { D: 0, C: 0, B: 0, A: 0, S: 0 }, +} + +export function makeDefaultAppState(): ApiAppState { + return { + insumos: structuredCopy(DEFAULT_INSUMOS), + formulas: structuredCopy(DEFAULT_FORMULAS), + disponibles: structuredCopy(DEFAULT_CRISTALES_DISP), + } +} + +export function makeEmptyAppState(): ApiAppState { + return { + insumos: structuredCopy(EMPTY_INSUMOS), + formulas: structuredCopy(EMPTY_FORMULAS), + disponibles: structuredCopy(EMPTY_CRISTALES_DISP), + } +} + +function structuredCopy(value: T): T { + return JSON.parse(JSON.stringify(value)) +}