- Turborepo + pnpm workspaces with apps/web and packages/types - SvelteKit app: Tailwind, Paraglide i18n (en/es), keycloak-js, Supabase client, auth/collective stores, PWA service worker skeleton, all route placeholders - packages/types: domain types (User, Collective, ShoppingList, etc.) and database.ts placeholder for generated types - Justfile with dev, db-*, kc-*, build, backup, restore, deploy recipes - infra/docker-compose.dev.yml: Postgres 15, GoTrue, PostgREST, Realtime v2.83, Storage, Kong (port 8001), Studio, Keycloak 24 - infra/docker-compose.prod.yml, kong.yml, db-init scripts, backup/deploy scripts - keycloak/realm-export.json with colectivo realm and 5 dev test users - supabase/config.toml and seed.sql with sample collective and items - GitHub Actions: ci.yml (lint+typecheck+build) and deploy.yml (GHCR + SSH) - .env.example documenting all required variables - Fixed docker-compose issues: Studio image tag, Kong port conflict (8001), internal role passwords init script, Realtime METRICS_JWT_SECRET/APP_NAME Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
/// <reference types="@sveltejs/kit" />
|
|
/// <reference no-default-lib="true"/>
|
|
/// <reference lib="esnext" />
|
|
/// <reference lib="webworker" />
|
|
|
|
import { build, files, version } from '$service-worker';
|
|
import { precacheAndRoute } from 'workbox-precaching';
|
|
import { registerRoute, NavigationRoute } from 'workbox-routing';
|
|
import { NetworkFirst, CacheFirst } from 'workbox-strategies';
|
|
import { BackgroundSyncPlugin } from 'workbox-background-sync';
|
|
|
|
declare const self: ServiceWorkerGlobalScope;
|
|
|
|
const CACHE_NAME = `colectivo-${version}`;
|
|
const ASSETS = [...build, ...files];
|
|
|
|
// Precache all static assets
|
|
precacheAndRoute(ASSETS.map((url) => ({ url, revision: version })));
|
|
|
|
// Cache-first for static assets (JS, CSS, fonts, icons)
|
|
registerRoute(
|
|
({ request }) =>
|
|
request.destination === 'style' ||
|
|
request.destination === 'script' ||
|
|
request.destination === 'font' ||
|
|
request.destination === 'image',
|
|
new CacheFirst({ cacheName: `${CACHE_NAME}-assets` })
|
|
);
|
|
|
|
// Network-first for app routes (HTML navigation)
|
|
registerRoute(
|
|
new NavigationRoute(
|
|
new NetworkFirst({
|
|
cacheName: `${CACHE_NAME}-pages`,
|
|
networkTimeoutSeconds: 3
|
|
})
|
|
)
|
|
);
|
|
|
|
// Background Sync for pending offline operations
|
|
const bgSyncPlugin = new BackgroundSyncPlugin('pending-ops-queue', {
|
|
maxRetentionTime: 24 * 60 // 24 hours
|
|
});
|
|
|
|
// Listen for messages from the app
|
|
self.addEventListener('message', (event) => {
|
|
if (event.data?.type === 'SKIP_WAITING') {
|
|
self.skipWaiting();
|
|
}
|
|
});
|