Compare commits

..

3 Commits

Author SHA1 Message Date
hikari e8610667b5 fix: silently reload on ChunkLoadError after deployments
Node.js CI / CI (pull_request) Successful in 1m47s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m53s
Stale chunk errors occur when a user has an old version of the app cached
after a redeployment. Detect ChunkLoadError before logging so the page
reloads automatically without showing a toast or sending noise to the API.
2026-02-23 20:11:46 -08:00
hikari b81b77ac2f fix: omit audit log entries for 401s on /api/auth/me
Token expiry probes against /api/auth/me are expected behaviour during
the refresh flow and should not generate unauthorized access audit events.
2026-02-23 20:09:36 -08:00
hikari fa4c1d8958 fix: correct base64 cover image validation for books, shows, manga, music
Remove premature URL length check that ran before data URL detection,
causing all base64 uploads to be incorrectly rejected. Also fix size
calculation to use only the base64 data portion (after the comma) rather
than the full data URL string, matching the correct pattern already in
game.service.ts.
2026-02-23 20:06:22 -08:00
6 changed files with 159 additions and 432 deletions
+2 -2
View File
@@ -14,11 +14,11 @@ const helmetPlugin: FastifyPluginAsync = async (app) => {
directives: {
defaultSrc: ["'self'"],
// Angular uses inline styles for component encapsulation, so we need to allow them
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https:"],
scriptSrc: ["'self'"],
connectSrc: ["'self'", process.env.FRONTEND_URL ?? "http://localhost:4200"],
fontSrc: ["'self'", "data:", "https://fonts.gstatic.com"],
fontSrc: ["'self'", "data:"],
objectSrc: ["'none'"],
baseUri: ["'self'"],
formAction: ["'self'"],
-5
View File
@@ -25,11 +25,6 @@
},
"configurations": {
"production": {
"optimization": {
"styles": {
"inlineCritical": false
}
},
"budgets": [
{
"type": "initial",
-3
View File
@@ -8,9 +8,6 @@
<meta name="description" content="Naomi's curated collection of games, books, music, shows, manga, and art. Browse, engage, and suggest new additions!" />
<meta name="theme-color" content="#9d4edd" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Creepster&family=Griffy&family=Henny+Penny&family=Kalam:wght@300;400;700&display=swap" rel="stylesheet" />
<script defer src="https://analytics.nhcarrigan.com/js/pa-YUXAn1vhhRttySUAw_LMN.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
+1 -22
View File
@@ -38,7 +38,7 @@
body {
margin: 0;
padding: 0;
font-family: 'Kalam', cursive;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
font-size: 14pt;
line-height: 1.6;
color: var(--foreground);
@@ -75,30 +75,10 @@ body::after {
pointer-events: none;
}
@keyframes wiggle {
0%, 100% { transform: rotate(-2deg); }
50% { transform: rotate(2deg); }
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
line-height: 1.2;
color: var(--witch-purple);
font-family: 'Griffy', cursive;
}
h1 {
animation: wiggle 4s ease-in-out infinite;
display: inline-block;
}
.witchy-accent,
.spooky-title {
font-family: 'Creepster', cursive;
}
.mystical-text {
font-family: 'Henny Penny', cursive;
}
a {
@@ -141,7 +121,6 @@ select:focus {
// Button base styles
button {
font-family: inherit;
transition: all 0.3s;
}
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@library/source",
"version": "1.1.1",
"version": "1.1.0",
"license": "MIT",
"scripts": {
"dev": "nx run-many --target=build --all && NODE_ENV=production op run --env-file=dev.env -- node dist/api/main.js",
@@ -31,7 +31,7 @@
"@fastify/csrf-protection": "7.1.0",
"@fastify/helmet": "13.0.2",
"@fastify/jwt": "10.0.0",
"@fastify/oauth2": "8.2.0",
"@fastify/oauth2": "8.1.2",
"@fastify/rate-limit": "10.3.0",
"@fastify/sensible": "6.0.4",
"@fastify/static": "9.0.0",
@@ -44,8 +44,8 @@
"dompurify": "3.3.1",
"fastify": "5.7.3",
"fastify-plugin": "5.0.1",
"jsdom": "28.1.0",
"marked": "17.0.3",
"jsdom": "28.0.0",
"marked": "17.0.1",
"rxjs": "7.8.2"
},
"devDependencies": {
@@ -76,7 +76,7 @@
"@types/jsdom": "27.0.0",
"@types/jsonwebtoken": "9.0.10",
"@types/node": "20.19.9",
"@typescript-eslint/utils": "8.56.0",
"@typescript-eslint/utils": "8.54.0",
"angular-eslint": "21.1.0",
"cypress": "15.9.0",
"esbuild": "0.19.12",
@@ -91,6 +91,6 @@
"ts-node": "10.9.1",
"tslib": "2.8.1",
"typescript": "5.9.3",
"typescript-eslint": "8.56.1"
"typescript-eslint": "8.54.0"
}
}
+150 -394
View File
File diff suppressed because it is too large Load Diff