Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
701f679
feat: lru_cache and nextjs update
Producdevity May 22, 2026
2813fb4
feat: implement cache invalidation for device catalogs and SEO update…
Producdevity May 22, 2026
3e78a67
feat: SEO cache invalidation with new listing SEO functions and batch…
Producdevity May 22, 2026
e2fc784
feat: improve session tracking with null safety checks and initializa…
Producdevity May 22, 2026
511820f
feat: update ESLint configuration and react-hooks plugin version for …
Producdevity May 22, 2026
bbd8f31
feat: add SEO functions for approved listings and user metadata taggi…
Producdevity May 22, 2026
7e3ce02
feat: add SEO invalidation tests for admin updates on PC listings
Producdevity May 22, 2026
8cd3dd1
feat: add authentication handling for mobile API requests
Producdevity May 22, 2026
4b4e5e1
feat: SEO invalidation logic for PC listings updates
Producdevity May 22, 2026
9ce21f8
feat: enhance GET request handling with connection setup
Producdevity May 22, 2026
9a7177d
feat: improve caching and SEO by adding connection setup in GET requests
Producdevity May 22, 2026
df5afd2
feat: refactor admin layout to use Suspense and separate client logic
Producdevity May 22, 2026
83037a6
feat: wrap components in Suspense for improved loading handling
Producdevity May 22, 2026
67a2b91
feat: wrap components in Suspense for improved loading handling
Producdevity May 22, 2026
688127a
feat: service worker registration and caching logic
Producdevity May 23, 2026
5efb9e6
feat: update eslint config to clarify TODO for React Compiler rule vi…
Producdevity May 23, 2026
31e9f62
feat: error handling for game and listing data loading
Producdevity May 23, 2026
db13662
feat: simplify import statement for role permission utility
Producdevity May 23, 2026
98a76d4
feat: error handling and messaging for game, emulator, and listing pages
Producdevity May 23, 2026
b4bcdfa
feat: refactor role import and usage in page component
Producdevity May 23, 2026
5ea131a
feat: add logging for HTTP errors in response interceptor
Producdevity May 23, 2026
182b5be
feat: error handling and logging in API routes
Producdevity May 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.docker.example
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ TUNNEL_TOKEN="your_cloudflare_tunnel_token_here"
# Google reCAPTCHA for form protection
NEXT_PUBLIC_RECAPTCHA_SITE_KEY="your_recaptcha_site_key_here"
RECAPTCHA_SECRET_KEY="your_recaptcha_secret_key_here"
NEXT_PUBLIC_DISABLE_RECAPTCHA="false"

# ===========================================
# EMAIL SERVICES (Optional)
Expand Down
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ IGDB_CLIENT_KEY="IGDB-Client-Secret"
# reCAPTCHA v3
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=site-key-here
RECAPTCHA_SECRET_KEY=secret-key-here
NEXT_PUBLIC_DISABLE_RECAPTCHA=false

# Email Providers (For the future)
EMAIL_ENABLED=false
Expand Down
1 change: 1 addition & 0 deletions .env.test.example
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ CLERK_SECRET_KEY="sk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# reCAPTCHA V3
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=
RECAPTCHA_SECRET_KEY=
NEXT_PUBLIC_DISABLE_RECAPTCHA=false

# Email (For the future)
EMAIL_ENABLED=false
Expand Down
36 changes: 15 additions & 21 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { FlatCompat } from '@eslint/eslintrc'
import typescriptEslint from '@typescript-eslint/eslint-plugin'
import typescriptParser from '@typescript-eslint/parser'
import importPlugin from 'eslint-plugin-import'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

const compat = new FlatCompat({
baseDirectory: __dirname,
})
import eslintConfigPrettier from 'eslint-config-prettier'
import nextCoreWebVitals from 'eslint-config-next/core-web-vitals'
import nextTypeScript from 'eslint-config-next/typescript'

const eslintConfig = [
{
Expand All @@ -37,10 +29,9 @@ const eslintConfig = [
'test-results/**',
],
},
// Next.js + Prettier via FlatCompat
...compat.config({
extends: ['next/core-web-vitals', 'next/typescript', 'prettier'],
}), // JS and TS global config
...nextCoreWebVitals,
...nextTypeScript,
eslintConfigPrettier,
{
files: ['**/*.{js,jsx,ts,tsx}'],
languageOptions: {
Expand All @@ -55,14 +46,21 @@ const eslintConfig = [
},
},
rules: {
// Your custom JS rules
'prefer-template': 'error',
'no-useless-escape': 'off',
'no-case-declarations': 'off',
'no-prototype-builtins': 'off',
'no-redeclare': 'off',
// TODO: set to error after fixing existing React Compiler rule violations.
Comment thread
Producdevity marked this conversation as resolved.
'react-hooks/purity': 'warn',
'react-hooks/static-components': 'warn',
'react-hooks/immutability': 'warn',
'react-hooks/incompatible-library': 'warn',
'react-hooks/preserve-manual-memoization': 'warn',
'react-hooks/refs': 'warn',
'react-hooks/set-state-in-effect': 'warn',
},
}, // TypeScript config
},
{
files: ['**/*.{ts,tsx}'],
languageOptions: {
Expand All @@ -74,9 +72,6 @@ const eslintConfig = [
ecmaFeatures: { jsx: true },
},
},
plugins: {
'@typescript-eslint': typescriptEslint,
},
rules: {
...typescriptEslint.configs.recommended.rules,
'@typescript-eslint/array-type': ['error', { default: 'array' }],
Expand All @@ -101,7 +96,6 @@ const eslintConfig = [
}, // Import plugin
{
files: ['**/*.{js,jsx,ts,tsx}'],
plugins: { import: importPlugin },
settings: {
'import/resolver': {
typescript: { project: './tsconfig.json' },
Expand Down
29 changes: 25 additions & 4 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,31 @@ const nextConfig: NextConfig = {

allowedDevOrigins: ['dev.emuready.com', '127.0.0.1'],

cacheComponents: true,

cacheLife: {
'seo-record': {
stale: 300,
revalidate: 3600,
expire: 86400,
},
'seo-report': {
stale: 300,
revalidate: 1800,
expire: 43200,
},
'seo-sitemap': {
stale: 300,
revalidate: 21600,
expire: 172800,
},
'seo-miss': {
stale: 30,
revalidate: 60,
expire: 300,
},
},

turbopack: {
rules: {
'*.svg': {
Expand Down Expand Up @@ -274,10 +299,6 @@ const nextConfig: NextConfig = {
],
},

eslint: {
dirs: ['src', 'tests'],
},

webpack: (config: WebpackConfiguration) => {
config.module?.rules?.push({
test: /\.svg$/,
Expand Down
30 changes: 18 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@hookform/resolvers": "^5.0.1",
"@next/third-parties": "15.5.18",
"@next/third-parties": "16.2.6",
"@prisma/adapter-pg": "7.8.0",
"@prisma/client": "7.8.0",
"@radix-ui/react-alert-dialog": "^1.1.14",
Expand Down Expand Up @@ -99,13 +99,13 @@
"lucide-react": "^0.511.0",
"mailersend": "^2.6.0",
"markdown-it": "14.1.1",
"next": "15.5.18",
"next": "16.2.6",
"next-themes": "^0.4.6",
"pg": "8.21.0",
"pg-pool": "3.14.0",
"postcss": "8.5.14",
"react": "19.1.4",
"react-dom": "19.1.4",
"react": "19.2.6",
"react-dom": "19.2.6",
"react-error-boundary": "^6.0.0",
"react-google-recaptcha-v3": "^1.11.0",
"react-hook-form": "^7.56.4",
Expand All @@ -123,8 +123,8 @@
"@clerk/types": "4.101.23",
"@eslint/eslintrc": "^3",
"@eslint/js": "^9.28.0",
"@next/bundle-analyzer": "15.5.18",
"@next/eslint-plugin-next": "15.5.18",
"@next/bundle-analyzer": "16.2.6",
"@next/eslint-plugin-next": "16.2.6",
"@playwright/test": "^1.60.0",
"@svgr/webpack": "^8.1.0",
"@tailwindcss/postcss": "^4.1.6",
Expand All @@ -135,8 +135,8 @@
"@types/jsdom": "^21.1.7",
"@types/markdown-it": "^14.1.2",
"@types/node": "^20",
"@types/react": "19.1.8",
"@types/react-dom": "19.1.6",
"@types/react": "19.2.15",
"@types/react-dom": "19.2.3",
"@types/swagger-jsdoc": "^6.0.4",
"@types/webpack": "^5.28.5",
"@typescript-eslint/eslint-plugin": "^8.34.0",
Expand All @@ -145,11 +145,11 @@
"dotenv": "^16.5.0",
"dotenv-cli": "^8.0.0",
"eslint": "^9",
"eslint-config-next": "15.5.18",
"eslint-config-next": "16.2.6",
"eslint-config-prettier": "^10.1.5",
"eslint-import-resolver-typescript": "^4.4.3",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-react-hooks": "5.2.0",
"eslint-plugin-react-hooks": "^7.1.1",
"husky": "^9.1.7",
"lightningcss": "^1.30.1",
"lint-staged": "^16.0.0",
Expand All @@ -173,7 +173,13 @@
"sharp": "^0.33.5"
},
"overrides": {
"@types/react": "19.1.8",
"@types/react-dom": "19.1.6"
"@types/react": "19.2.15",
"@types/react-dom": "19.2.3"
},
"pnpm": {
"overrides": {
"@types/react": "19.2.15",
"@types/react-dom": "19.2.3"
}
}
}
Loading
Loading