UPDATE: next16 and minifyjson
Gitea Auto Deploy / Deploy-Container (push) Failing after 1m25s

This commit is contained in:
2025-11-18 14:09:00 +07:00
parent 99c8ae82f9
commit afdb92cc2d
64 changed files with 748 additions and 2908848 deletions
+603 -310
View File
File diff suppressed because it is too large Load Diff
+1 -23545
View File
File diff suppressed because one or more lines are too long
+1 -23545
View File
File diff suppressed because one or more lines are too long
+1 -23545
View File
File diff suppressed because one or more lines are too long
+1 -23545
View File
File diff suppressed because one or more lines are too long
+1 -296461
View File
File diff suppressed because one or more lines are too long
+1 -296461
View File
File diff suppressed because one or more lines are too long
+1 -296461
View File
File diff suppressed because one or more lines are too long
+1 -296461
View File
File diff suppressed because one or more lines are too long
+1 -40482
View File
File diff suppressed because one or more lines are too long
+1 -40482
View File
File diff suppressed because one or more lines are too long
+1 -40482
View File
File diff suppressed because one or more lines are too long
+1 -40482
View File
File diff suppressed because one or more lines are too long
+1 -68248
View File
File diff suppressed because one or more lines are too long
+1 -68248
View File
File diff suppressed because one or more lines are too long
+1 -68248
View File
File diff suppressed because one or more lines are too long
+1 -68248
View File
File diff suppressed because one or more lines are too long
+1 -261333
View File
File diff suppressed because one or more lines are too long
+1 -261333
View File
File diff suppressed because one or more lines are too long
+1 -261333
View File
File diff suppressed because one or more lines are too long
+1 -261333
View File
File diff suppressed because one or more lines are too long
+1 -1581
View File
File diff suppressed because one or more lines are too long
+1 -1581
View File
File diff suppressed because one or more lines are too long
+1 -1581
View File
File diff suppressed because one or more lines are too long
+1 -1581
View File
File diff suppressed because one or more lines are too long
+1 -33227
View File
File diff suppressed because one or more lines are too long
+1 -33227
View File
File diff suppressed because one or more lines are too long
+1 -33227
View File
File diff suppressed because one or more lines are too long
+1 -33227
View File
File diff suppressed because one or more lines are too long
+1 -2239
View File
File diff suppressed because one or more lines are too long
+1 -2239
View File
File diff suppressed because one or more lines are too long
+1 -2239
View File
File diff suppressed because one or more lines are too long
+1 -2239
View File
File diff suppressed because one or more lines are too long
+5 -8
View File
@@ -1,16 +1,13 @@
import nextCoreWebVitals from "eslint-config-next/core-web-vitals";
import nextTypescript from "eslint-config-next/typescript";
import { dirname } from "path"; import { dirname } from "path";
import { fileURLToPath } from "url"; import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename); const __dirname = dirname(__filename);
const compat = new FlatCompat({ const eslintConfig = [...nextCoreWebVitals, ...nextTypescript, {
baseDirectory: __dirname, ignores: ["node_modules/**", ".next/**", "out/**", "build/**", "next-env.d.ts"]
}); }];
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
];
export default eslintConfig; export default eslintConfig;
+2 -2
View File
@@ -36,8 +36,8 @@ const nextConfig: NextConfig = {
}, },
], ],
}, },
eslint: { compiler: {
ignoreDuringBuilds: true, styledComponents: true,
}, },
}; };
+31 -28
View File
@@ -3,43 +3,46 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev --turbopack", "dev": "next dev",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
"lint": "next lint" "lint": "eslint ."
}, },
"dependencies": { "dependencies": {
"@next/bundle-analyzer": "^15.5.4", "@next/bundle-analyzer": "16.0.3",
"@tanstack/react-query": "^5.83.0", "@tanstack/react-query": "^5.90.10",
"axios": "^1.10.0", "axios": "^1.13.2",
"fast-average-color": "^9.5.0", "fast-average-color": "^9.5.0",
"framer-motion": "^12.12.1", "framer-motion": "^12.23.24",
"html2canvas-pro": "^1.5.11", "html2canvas-pro": "^1.5.13",
"lucide-react": "^0.536.0", "lucide-react": "^0.554.0",
"next": "15.3.2", "next": "16.0.3",
"next-intl": "^4.1.0", "next-intl": "^4.5.3",
"react": "^19.0.0", "react": "19.2.0",
"react-dom": "^19.0.0", "react-dom": "19.2.0",
"react-select": "^5.10.1", "react-select": "^5.10.2",
"react-toastify": "^11.0.5", "react-toastify": "^11.0.5",
"sharp": "^0.34.4", "sharp": "^0.34.5",
"socket.io-client": "^4.8.1", "socket.io-client": "^4.8.1",
"zod": "^3.25.67", "zod": "^4.1.12",
"zustand": "^5.0.5" "zustand": "^5.0.8"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4.1.17",
"@tailwindcss/postcss": "^4", "@types/jest": "^30.0.0",
"@types/jest": "^29.5.14", "@types/node": "^24.10.1",
"@types/node": "^20", "@types/react": "19.2.6",
"@types/react": "^19", "@types/react-dom": "19.2.3",
"@types/react-dom": "^19", "daisyui": "^5.5.5",
"daisyui": "^5.0.27", "eslint": "^9.39.1",
"eslint": "^9", "eslint-config-next": "16.0.3",
"eslint-config-next": "15.3.1",
"tailwind-scrollbar": "^4.0.2", "tailwind-scrollbar": "^4.0.2",
"tailwindcss": "^4", "tailwindcss": "^4.1.17",
"ts-to-zod": "^3.15.0", "ts-to-zod": "^5.0.1",
"typescript": "^5" "typescript": "^5.9.3"
},
"overrides": {
"@types/react": "19.2.6",
"@types/react-dom": "19.2.3"
} }
} }
+3 -2
View File
@@ -13,6 +13,7 @@ export async function GET(
if (!as) { if (!as) {
return NextResponse.json({ error: 'AS info not found' }, { status: 404 }) return NextResponse.json({ error: 'AS info not found' }, { status: 404 })
} }
return new NextResponse(JSON.stringify(as), {
return NextResponse.json(as) headers: { "Content-Type": "application/json" }
});
} }
+3 -1
View File
@@ -13,7 +13,9 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const asData = await loadAS(asIds, locale); const asData = await loadAS(asIds, locale);
return NextResponse.json(asData); return new NextResponse(JSON.stringify(asData), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load as data' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load as data' }, { status: 500 });
} }
@@ -14,5 +14,7 @@ export async function GET(
return NextResponse.json({ error: 'Character not found' }, { status: 404 }) return NextResponse.json({ error: 'Character not found' }, { status: 404 })
} }
return NextResponse.json(char) return new NextResponse(JSON.stringify(char), {
headers: { "Content-Type": "application/json" }
});
} }
+4 -2
View File
@@ -6,14 +6,16 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const body = await request.json(); const body = await request.json();
const charIds = body.charIds as string[]; const charIds = body.charIds as string[];
const { locale } = await params; const { locale } = await params;
if (!Array.isArray(charIds) || charIds.some(id => typeof id !== 'string')) { if (!Array.isArray(charIds) || charIds.some(id => typeof id !== 'string')) {
return NextResponse.json({ error: 'Invalid charIds' }, { status: 400 }); return NextResponse.json({ error: 'Invalid charIds' }, { status: 400 });
} }
const characters = await loadCharacters(charIds, locale); const characters = await loadCharacters(charIds, locale);
return NextResponse.json(characters); return new NextResponse(JSON.stringify(characters), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load characters' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load characters' }, { status: 500 });
} }
@@ -14,5 +14,7 @@ export async function GET(
return NextResponse.json({ error: 'Lightcone not found' }, { status: 404 }) return NextResponse.json({ error: 'Lightcone not found' }, { status: 404 })
} }
return NextResponse.json(lightcone) return new NextResponse(JSON.stringify(lightcone), {
headers: { "Content-Type": "application/json" }
});
} }
+4 -2
View File
@@ -6,14 +6,16 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const body = await request.json(); const body = await request.json();
const lightconeIds = body.lightconeIds as string[]; const lightconeIds = body.lightconeIds as string[];
const { locale } = await params; const { locale } = await params;
if (!Array.isArray(lightconeIds) || lightconeIds.some(id => typeof id !== 'string')) { if (!Array.isArray(lightconeIds) || lightconeIds.some(id => typeof id !== 'string')) {
return NextResponse.json({ error: 'Invalid lightconeIds' }, { status: 400 }); return NextResponse.json({ error: 'Invalid lightconeIds' }, { status: 400 });
} }
const lightcones = await loadLightcones(lightconeIds, locale); const lightcones = await loadLightcones(lightconeIds, locale);
return NextResponse.json(lightcones); return new NextResponse(JSON.stringify(lightcones), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load lightcones' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load lightcones' }, { status: 500 });
} }
+3 -1
View File
@@ -14,5 +14,7 @@ export async function GET(
return NextResponse.json({ error: 'MOC info not found' }, { status: 404 }) return NextResponse.json({ error: 'MOC info not found' }, { status: 404 })
} }
return NextResponse.json(moc) return new NextResponse(JSON.stringify(moc), {
headers: { "Content-Type": "application/json" }
});
} }
+3 -1
View File
@@ -13,7 +13,9 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const mocData = await loadMOC(mocIds, locale); const mocData = await loadMOC(mocIds, locale);
return NextResponse.json(mocData); return new NextResponse(JSON.stringify(mocData), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load moc data' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load moc data' }, { status: 500 });
} }
+3 -2
View File
@@ -13,6 +13,7 @@ export async function GET(
if (!monster) { if (!monster) {
return NextResponse.json({ error: 'Monster info not found' }, { status: 404 }) return NextResponse.json({ error: 'Monster info not found' }, { status: 404 })
} }
return new NextResponse(JSON.stringify(monster), {
return NextResponse.json(monster) headers: { "Content-Type": "application/json" }
});
} }
+4 -2
View File
@@ -6,14 +6,16 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const body = await request.json(); const body = await request.json();
const monsterIds = body.monsterIds as string[]; const monsterIds = body.monsterIds as string[];
const { locale } = await params; const { locale } = await params;
if (!Array.isArray(monsterIds) || monsterIds.some(id => typeof id !== 'string')) { if (!Array.isArray(monsterIds) || monsterIds.some(id => typeof id !== 'string')) {
return NextResponse.json({ error: 'Invalid monsterIds' }, { status: 400 }); return NextResponse.json({ error: 'Invalid monsterIds' }, { status: 400 });
} }
const monsterData = await loadMonster(monsterIds, locale); const monsterData = await loadMonster(monsterIds, locale);
return NextResponse.json(monsterData); return new NextResponse(JSON.stringify(monsterData), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load monster data' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load monster data' }, { status: 500 });
} }
+3 -1
View File
@@ -14,5 +14,7 @@ export async function GET(
return NextResponse.json({ error: 'Peak info not found' }, { status: 404 }) return NextResponse.json({ error: 'Peak info not found' }, { status: 404 })
} }
return NextResponse.json(peak) return new NextResponse(JSON.stringify(peak), {
headers: { "Content-Type": "application/json" }
});
} }
+3 -1
View File
@@ -13,7 +13,9 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const peakData = await loadPeak(peakIds, locale); const peakData = await loadPeak(peakIds, locale);
return NextResponse.json(peakData); return new NextResponse(JSON.stringify(peakData), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load peak data' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load peak data' }, { status: 500 });
} }
+4 -1
View File
@@ -14,5 +14,8 @@ export async function GET(
return NextResponse.json({ error: 'PF info not found' }, { status: 404 }) return NextResponse.json({ error: 'PF info not found' }, { status: 404 })
} }
return NextResponse.json(pf)
return new NextResponse(JSON.stringify(pf), {
headers: { "Content-Type": "application/json" }
});
} }
+4 -2
View File
@@ -6,14 +6,16 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const body = await request.json(); const body = await request.json();
const pfIds = body.pfIds as string[]; const pfIds = body.pfIds as string[];
const { locale } = await params; const { locale } = await params;
if (!Array.isArray(pfIds) || pfIds.some(id => typeof id !== 'string')) { if (!Array.isArray(pfIds) || pfIds.some(id => typeof id !== 'string')) {
return NextResponse.json({ error: 'Invalid pfIds' }, { status: 400 }); return NextResponse.json({ error: 'Invalid pfIds' }, { status: 400 });
} }
const pfData = await loadPF(pfIds, locale); const pfData = await loadPF(pfIds, locale);
return NextResponse.json(pfData); return new NextResponse(JSON.stringify(pfData), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load pf data' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load pf data' }, { status: 500 });
} }
+3 -1
View File
@@ -14,5 +14,7 @@ export async function GET(
return NextResponse.json({ error: 'Relic not found' }, { status: 404 }) return NextResponse.json({ error: 'Relic not found' }, { status: 404 })
} }
return NextResponse.json(relic) return new NextResponse(JSON.stringify(relic), {
headers: { "Content-Type": "application/json" }
});
} }
+4 -2
View File
@@ -6,14 +6,16 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
const body = await request.json(); const body = await request.json();
const relicIds = body.relicIds as string[]; const relicIds = body.relicIds as string[];
const { locale } = await params; const { locale } = await params;
if (!Array.isArray(relicIds) || relicIds.some(id => typeof id !== 'string')) { if (!Array.isArray(relicIds) || relicIds.some(id => typeof id !== 'string')) {
return NextResponse.json({ error: 'Invalid relicIds' }, { status: 400 }); return NextResponse.json({ error: 'Invalid relicIds' }, { status: 400 });
} }
const relics = await loadRelics(relicIds, locale); const relics = await loadRelics(relicIds, locale);
return NextResponse.json(relics); return new NextResponse(JSON.stringify(relics), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load relics' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load relics' }, { status: 500 });
} }
+3 -1
View File
@@ -4,7 +4,9 @@ import { NextResponse } from "next/server";
export async function GET() { export async function GET() {
try { try {
const configMaze = await loadConfigMaze(); const configMaze = await loadConfigMaze();
return NextResponse.json(configMaze); return new NextResponse(JSON.stringify(configMaze), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load config maze' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load config maze' }, { status: 500 });
} }
+3 -1
View File
@@ -4,7 +4,9 @@ import { NextResponse } from "next/server";
export async function GET() { export async function GET() {
try { try {
const mainAffix = await loadMainAffix(); const mainAffix = await loadMainAffix();
return NextResponse.json(mainAffix); return new NextResponse(JSON.stringify(mainAffix), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load main affix' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load main affix' }, { status: 500 });
} }
+3 -1
View File
@@ -4,7 +4,9 @@ import { NextResponse } from "next/server";
export async function GET() { export async function GET() {
try { try {
const subAffix = await loadSubAffix(); const subAffix = await loadSubAffix();
return NextResponse.json(subAffix); return new NextResponse(JSON.stringify(subAffix), {
headers: { "Content-Type": "application/json" }
});
} catch { } catch {
return NextResponse.json({ error: 'Failed to load sub affix' }, { status: 500 }); return NextResponse.json({ error: 'Failed to load sub affix' }, { status: 500 });
} }
+2 -1
View File
@@ -43,7 +43,8 @@ export async function loadAS(charIds: string[], locale: string): Promise<Record<
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
asFileCache[locale] = result; asFileCache[locale] = result;
asMap = result; asMap = result;
+1 -1
View File
@@ -55,7 +55,7 @@ export async function loadCharacters(charIds: string[], locale: string): Promise
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
characterFileCache[locale] = result; characterFileCache[locale] = result;
characterMap = result; characterMap = result;
+1 -1
View File
@@ -56,7 +56,7 @@ export async function loadLightcones(charIds: string[], locale: string): Promise
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
lightconeFileCache[locale] = result; lightconeFileCache[locale] = result;
lightconeMap = result; lightconeMap = result;
+1 -1
View File
@@ -43,7 +43,7 @@ export async function loadMOC(charIds: string[], locale: string): Promise<Record
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
mocFileCache[locale] = result; mocFileCache[locale] = result;
mocMap = result; mocMap = result;
+1 -1
View File
@@ -43,7 +43,7 @@ export async function loadMonster(charIds: string[], locale: string): Promise<Re
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
monsterFileCache[locale] = result; monsterFileCache[locale] = result;
monsterMap = result; monsterMap = result;
+1 -1
View File
@@ -43,7 +43,7 @@ export async function loadPeak(charIds: string[], locale: string): Promise<Recor
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
peakFileCache[locale] = result; peakFileCache[locale] = result;
peakMap = result; peakMap = result;
+1 -1
View File
@@ -43,7 +43,7 @@ export async function loadPF(charIds: string[], locale: string): Promise<Record<
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
pfFileCache[locale] = result; pfFileCache[locale] = result;
pfMap = result; pfMap = result;
+1 -1
View File
@@ -54,7 +54,7 @@ export async function loadRelics(charIds: string[], locale: string): Promise<Rec
fs.mkdirSync(DATA_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true });
const filePath = getJsonFilePath(locale); const filePath = getJsonFilePath(locale);
fs.writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8'); fs.writeFileSync(filePath, JSON.stringify(result), 'utf-8');
relicFileCache[locale] = result; relicFileCache[locale] = result;
relicMap = result; relicMap = result;
+3 -2
View File
@@ -14,7 +14,7 @@
"moduleResolution": "bundler", "moduleResolution": "bundler",
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"jsx": "preserve", "jsx": "react-jsx",
"incremental": true, "incremental": true,
"plugins": [ "plugins": [
{ {
@@ -32,7 +32,8 @@
"next-env.d.ts", "next-env.d.ts",
"**/*.ts", "**/*.ts",
"**/*.tsx", "**/*.tsx",
".next/types/**/*.ts" ".next/types/**/*.ts",
".next/dev/types/**/*.ts"
], ],
"exclude": [ "exclude": [
"node_modules" "node_modules"