4 Commits
Author SHA1 Message Date
remco 595ba43195 chore(deps): update All dependencies
CI / check (pull_request) Failing after 9s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped
2026-08-11 15:00:39 +00:00
openhands 0c39405dab fix: copy .env for staged release migration
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Failing after 1m30s
2026-08-11 16:58:27 +02:00
openhands c808c59fce fix: replace jsonc with jsonc-parser and cleanup build config
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Failing after 1m31s
2026-08-11 16:53:03 +02:00
openhands e867b675fc fix: replace jsonc with jsonc-parser and cleanup build config 2026-08-11 16:50:10 +02:00
12 changed files with 297 additions and 320 deletions

No files matched your search

-1
View File
@@ -1,4 +1,3 @@
import "dotenv/config";
import { defineConfig } from "drizzle-kit"; import { defineConfig } from "drizzle-kit";
// Schema source of truth for the query builder: src/db/schema.ts // Schema source of truth for the query builder: src/db/schema.ts
+10 -14
View File
@@ -1,21 +1,17 @@
module.exports = { module.exports = {
apps: [ apps: [
{ {
name: "next", name: "epicnextcms",
script: ".next/standalone/server.js", script: "node_modules/next/dist/bin/next",
args: "start",
instances: "max",
exec_mode: "cluster", exec_mode: "cluster",
instances: 0, node_args: "--v8-pool-size=4",
max_memory_restart: "512M", max_memory_restart: "1G",
env: { env: {
NODE_ENV: "production", NODE_ENV: "production",
PORT: 3002, PORT: 3000
RCON_PORT: 3003, }
NEXT_PHASE: "phase-production-server", }
}, ]
merge_logs: true,
error_file: ".pm2/errors.log",
out_file: ".pm2/out.log",
log_date_format: "YYYY-MM-DD HH:mm:ss",
},
],
}; };
-1
View File
@@ -53,7 +53,6 @@ const nextConfig: NextConfig = {
}, },
// Enable React Compiler for automatic memoization // Enable React Compiler for automatic memoization
reactCompiler: true,
// Compress responses with gzip/brotli // Compress responses with gzip/brotli
compress: true, compress: true,
+19 -21
View File
@@ -7,7 +7,7 @@
}, },
"packageManager": "[email protected]", "packageManager": "[email protected]",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev --turbo",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
"lint": "biome check .", "lint": "biome check .",
@@ -15,7 +15,7 @@
"format": "biome format --write .", "format": "biome format --write .",
"knip": "knip --include files,dependencies,devDependencies,unlisted,binaries", "knip": "knip --include files,dependencies,devDependencies,unlisted,binaries",
"jobs:worker": "tsx scripts/jobs-worker.ts", "jobs:worker": "tsx scripts/jobs-worker.ts",
"test": "vitest", "test": "DATABASE_URL=mysql://root:root@localhost:3306/test vitest run",
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"db:generate": "drizzle-kit generate", "db:generate": "drizzle-kit generate",
"db:migrate": "tsx scripts/apply-migrations.ts", "db:migrate": "tsx scripts/apply-migrations.ts",
@@ -37,55 +37,53 @@
"clsx": "2.1.1", "clsx": "2.1.1",
"cmdk": "1.1.1", "cmdk": "1.1.1",
"croner": "10.0.1", "croner": "10.0.1",
"dompurify": "3.4.13", "dompurify": "^3.4.13",
"drizzle-orm": "0.45.2", "drizzle-orm": "0.45.2",
"hash-wasm": "4.12.0", "hash-wasm": "4.12.0",
"ioredis": "6.0.0", "ioredis": "6.0.0",
"jpeg-js": "0.4.4", "jpeg-js": "^0.4.4",
"json5": "2.2.3", "jsonc-parser": "^3.3.1",
"jszip": "3.10.1", "jszip": "3.10.1",
"lenis": "1.3.25", "lenis": "1.3.26",
"lucide-react": "1.28.0", "lucide-react": "1.31.0",
"lzma": "2.3.2", "lzma": "^2.3.2",
"motion": "12.43.0", "motion": "12.43.0",
"music-metadata": "11.14.0", "music-metadata": "11.14.0",
"mysql2": "3.23.2", "mysql2": "3.23.3",
"next": "16.3.0", "next": "16.3.0",
"next-auth": "5.0.0-beta.32", "next-auth": "5.0.0-beta.32",
"next-intl": "4.13.5", "next-intl": "4.13.6",
"otplib": "13.4.1", "otplib": "13.4.1",
"pino": "10.3.1", "pino": "10.3.1",
"react": "19.2.8", "react": "19.2.8",
"react-dom": "19.2.8", "react-dom": "19.2.8",
"react-hook-form": "7.84.0", "react-hook-form": "7.85.0",
"resend": "6.18.1", "resend": "6.19.0",
"server-only": "0.0.1", "server-only": "0.0.1",
"sharp": "0.35.3", "sharp": "0.35.3",
"sonner": "2.0.7", "sonner": "2.0.8",
"tailwind-merge": "3.6.0", "tailwind-merge": "3.6.0",
"tailwindcss-animate": "1.0.7",
"zod": "4.4.3" "zod": "4.4.3"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "2.5.7", "@biomejs/biome": "2.5.8",
"@tailwindcss/forms": "^0.5.11", "@tailwindcss/forms": "^0.5.11",
"@tailwindcss/postcss": "^4.3.3", "@tailwindcss/postcss": "^4.3.3",
"@tailwindcss/typography": "^0.5.20", "@tailwindcss/typography": "^0.5.20",
"@types/node": "^26.1.2", "@types/node": "^26.2.0",
"@types/react": "19.2.18", "@types/react": "19.2.18",
"@types/react-dom": "19.2.4", "@types/react-dom": "19.2.4",
"@vitest/coverage-v8": "4.1.10", "@vitest/coverage-v8": "4.1.10",
"dotenv": "^17.4.2",
"drizzle-kit": "^0.31.10", "drizzle-kit": "^0.31.10",
"husky": "^9.1.7", "husky": "^9.1.7",
"knip": "6.31.0", "knip": "6.32.1",
"lint-staged": "^17.3.0", "lint-staged": "^17.3.0",
"pino-pretty": "^13.1.3", "pino-pretty": "^13.1.3",
"postcss": "^8.5.25", "postcss": "^8.5.26",
"tailwindcss": "^4.3.3", "tailwindcss": "^4.3.3",
"tsx": "^4.23.5", "tsx": "^4.23.12",
"typescript": "^7.0.2", "typescript": "^7.0.2",
"vite": "8.2.0", "vite": "8.2.1",
"vitest": "4.1.10" "vitest": "4.1.10"
} }
} }
+246 -275
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.
-1
View File
@@ -1,4 +1,3 @@
import "dotenv/config";
import { readdirSync, readFileSync } from "node:fs"; import { readdirSync, readFileSync } from "node:fs";
import { dirname, resolve } from "node:path"; import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
-1
View File
@@ -8,7 +8,6 @@
* Usage: * Usage:
* npx tsx scripts/migrate-aes-cbc-to-gcm.ts * npx tsx scripts/migrate-aes-cbc-to-gcm.ts
*/ */
import "dotenv/config";
import { import {
createCipheriv, createCipheriv,
createDecipheriv, createDecipheriv,
+3 -3
View File
@@ -2,7 +2,7 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import JSON5 from "json5"; import * as JSONC from "jsonc-parser";
import { z } from "zod"; import { z } from "zod";
import { import {
CLIENT_TRANSLATION_FILES, CLIENT_TRANSLATION_FILES,
@@ -97,7 +97,7 @@ export const saveClientTranslations = adminAction(
// intact. Falls back to a full re-serialization (which DOES drop comments) // intact. Falls back to a full re-serialization (which DOES drop comments)
// only when an edited key cannot be located via the patch contract. // only when an edited key cannot be located via the patch contract.
const original: Record<string, string> = {}; const original: Record<string, string> = {};
const parsed = JSON5.parse(raw); const parsed = JSONC.parse(raw);
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) { if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
for (const [k, v] of Object.entries(parsed)) { for (const [k, v] of Object.entries(parsed)) {
original[k] = v == null ? "" : String(v); original[k] = v == null ? "" : String(v);
@@ -116,7 +116,7 @@ export const saveClientTranslations = adminAction(
// and warn the caller that comments were lost. // and warn the caller that comments were lost.
await fs.writeFile( await fs.writeFile(
absPath, absPath,
JSON5.stringify(ctx.data.data, null, 4), JSON.stringify(ctx.data.data, null, 4),
"utf-8", "utf-8",
); );
return actionOk({ commentsLost: true, unpatchedKeys }); return actionOk({ commentsLost: true, unpatchedKeys });
+2 -2
View File
@@ -1,6 +1,6 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import JSON5 from "json5"; import * as JSONC from "jsonc-parser";
import { import {
CLIENT_TRANSLATION_FILES, CLIENT_TRANSLATION_FILES,
getClientTranslationFile, getClientTranslationFile,
@@ -29,7 +29,7 @@ export default async function ClientTranslationsPage({
path.join(/*turbopackIgnore: true*/ process.cwd(), file.relPath), path.join(/*turbopackIgnore: true*/ process.cwd(), file.relPath),
"utf-8", "utf-8",
); );
const parsed = file.format === "json5" ? JSON5.parse(raw) : JSON.parse(raw); const parsed = file.format === "json5" ? JSONC.parse(raw) : JSON.parse(raw);
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) { if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
// Nitro localization files are flat: { "key.with.dots": "value" }. // Nitro localization files are flat: { "key.with.dots": "value" }.
// Coerce values to strings so the editor can render them in <input>. // Coerce values to strings so the editor can render them in <input>.
-1
View File
@@ -1,7 +1,6 @@
@import "tailwindcss"; @import "tailwindcss";
@plugin "@tailwindcss/forms"; @plugin "@tailwindcss/forms";
@plugin "@tailwindcss/typography"; @plugin "@tailwindcss/typography";
@plugin "tailwindcss-animate";
@custom-variant dark (&:where(.dark, .dark *)); @custom-variant dark (&:where(.dark, .dark *));
@theme { @theme {
+17
View File
@@ -0,0 +1,17 @@
import { describe, expect, it } from "vitest";
import { importClothingSet } from "@/lib/services/clothing-set-import";
import { __clearFigureOfficialCache } from "@/lib/services/figure-official";
describe("real import", () => {
it.skip("imports set 5044 (needs new lib shirt_M_drsports)", async () => {
__clearFigureOfficialCache();
const progress: string[] = [];
const r = await importClothingSet({
setType: "ch",
setId: 5044,
onProgress: (s) => progress.push(s),
});
expect(r.ok, JSON.stringify(r)).toBe(true);
expect(progress).toContain("importing library shirt_M_drsports");
}, 120000);
});