Some checks failed
ParentFlow CI/CD Pipeline / Backend Tests (push) Has been cancelled
ParentFlow CI/CD Pipeline / Frontend Tests (push) Has been cancelled
ParentFlow CI/CD Pipeline / Security Scanning (push) Has been cancelled
ParentFlow CI/CD Pipeline / Build Docker Images (map[context:maternal-app/maternal-app-backend dockerfile:Dockerfile.production name:backend]) (push) Has been cancelled
ParentFlow CI/CD Pipeline / Build Docker Images (map[context:maternal-web dockerfile:Dockerfile.production name:frontend]) (push) Has been cancelled
ParentFlow CI/CD Pipeline / Deploy to Development (push) Has been cancelled
ParentFlow CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Lint and Test (push) Has been cancelled
CI/CD Pipeline / E2E Tests (push) Has been cancelled
CI/CD Pipeline / Build Application (push) Has been cancelled
- Remove production Docker Compose files (docker-compose.production.yml, docker-compose.prod-simple.yml) - Remove production Dockerfiles (backend and frontend) - Move implementation docs to docs/implementation-docs/ directory - Remove test scripts (test-embeddings.js, test-voice-*.js/sh) - Update ecosystem.config.js with production environment variables (CORS, JWT secrets, database config) - Add database connection pooling configuration - Update CORS configuration for production domains (parentflowapp.com) - Fix frontend dev server port configuration (3005) - Add PWA web push implementation plan documentation - Simplify health check endpoints (remove MongoDB/Redis specific checks) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
189 lines
4.5 KiB
JavaScript
189 lines
4.5 KiB
JavaScript
const withPWA = require('next-pwa')({
|
|
dest: 'public',
|
|
register: true,
|
|
skipWaiting: true,
|
|
disable: process.env.NODE_ENV === 'development',
|
|
runtimeCaching: [
|
|
{
|
|
urlPattern: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,
|
|
handler: 'CacheFirst',
|
|
options: {
|
|
cacheName: 'google-fonts-webfonts',
|
|
expiration: {
|
|
maxEntries: 4,
|
|
maxAgeSeconds: 365 * 24 * 60 * 60, // 365 days
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'google-fonts-stylesheets',
|
|
expiration: {
|
|
maxEntries: 4,
|
|
maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'static-font-assets',
|
|
expiration: {
|
|
maxEntries: 4,
|
|
maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'static-image-assets',
|
|
expiration: {
|
|
maxEntries: 64,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\/_next\/image\?url=.+$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'next-image',
|
|
expiration: {
|
|
maxEntries: 64,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\.(?:mp3|wav|ogg)$/i,
|
|
handler: 'CacheFirst',
|
|
options: {
|
|
rangeRequests: true,
|
|
cacheName: 'static-audio-assets',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\.(?:mp4)$/i,
|
|
handler: 'CacheFirst',
|
|
options: {
|
|
rangeRequests: true,
|
|
cacheName: 'static-video-assets',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\.(?:js)$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'static-js-assets',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\.(?:css|less)$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'static-style-assets',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\/_next\/data\/.+\/.+\.json$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'next-data',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /\/api\/.*$/i,
|
|
handler: 'NetworkFirst',
|
|
method: 'GET',
|
|
options: {
|
|
cacheName: 'apis',
|
|
expiration: {
|
|
maxEntries: 16,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
networkTimeoutSeconds: 10, // fall back to cache if API doesn't respond within 10s
|
|
},
|
|
},
|
|
{
|
|
urlPattern: /.*/i,
|
|
handler: 'NetworkFirst',
|
|
options: {
|
|
cacheName: 'others',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
},
|
|
networkTimeoutSeconds: 10,
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
reactStrictMode: true,
|
|
|
|
// Enable standalone output for Docker
|
|
output: 'standalone',
|
|
|
|
// Allow access through reverse proxy
|
|
assetPrefix: process.env.NODE_ENV === 'production' ? undefined : undefined,
|
|
|
|
// Performance optimizations
|
|
compiler: {
|
|
removeConsole: process.env.NODE_ENV === 'production',
|
|
},
|
|
|
|
// Image optimization
|
|
images: {
|
|
formats: ['image/avif', 'image/webp'],
|
|
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
|
},
|
|
|
|
// Compression
|
|
compress: true,
|
|
|
|
// Disable ESLint during production builds
|
|
eslint: {
|
|
ignoreDuringBuilds: true,
|
|
},
|
|
|
|
// Disable TypeScript errors during builds (for production)
|
|
typescript: {
|
|
ignoreBuildErrors: process.env.NODE_ENV === 'production',
|
|
},
|
|
|
|
// Enable experimental features for better performance
|
|
experimental: {
|
|
optimizePackageImports: ['@mui/material', '@mui/icons-material'],
|
|
},
|
|
}
|
|
|
|
module.exports = withPWA(nextConfig)
|