UNPKG

@ordojs/mobile

Version:

Mobile and PWA support for OrdoJS applications

1 lines 52.3 kB
{"version":3,"sources":["../src/gestures.ts","../src/native.ts","../src/pwa.ts"],"names":["GestureManager","element","config","event","touch","point","existingPoint","duration","points","startPoint","p","deltaX","deltaY","distance","velocity","direction","point1","point2","startPoint1","startPoint2","startDistance","scale","startAngle","rotation","dx","dy","absX","absY","type","listeners","listener","error","index","newConfig","NativeManager","feature","info","userAgent","connection","battery","nativeFeature","track","resolve","options","reject","input","file","reader","position","PWAManager","swConfig","manifest","strategies","strategy","pattern","promptEvent","e"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { GestureConfig, GestureEvent, TouchPoint } from './types';\n\nexport class GestureManager {\n private config: GestureConfig;\n private element: HTMLElement;\n private touchPoints: Map<number, TouchPoint> = new Map();\n private gestureStartTime: number = 0;\n private gestureStartPoints: TouchPoint[] = [];\n private listeners: Map<string, ((event: GestureEvent) => void)[]> = new Map();\n\n constructor(element: HTMLElement, config: Partial<GestureConfig> = {}) {\n this.element = element;\n this.config = {\n enabled: true,\n threshold: 10,\n velocity: 0.3,\n direction: 'both',\n preventDefault: true,\n ...config\n };\n\n this.initialize();\n }\n\n /**\n * Initializes gesture detection\n */\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.element.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false });\n this.element.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: false });\n this.element.addEventListener('touchend', this.handleTouchEnd.bind(this), { passive: false });\n this.element.addEventListener('touchcancel', this.handleTouchCancel.bind(this), { passive: false });\n }\n\n /**\n * Handles touch start events\n */\n private handleTouchStart(event: TouchEvent): void {\n if (this.config.preventDefault) {\n event.preventDefault();\n }\n\n this.gestureStartTime = Date.now();\n this.gestureStartPoints = [];\n this.touchPoints.clear();\n\n Array.from(event.touches).forEach(touch => {\n const point: TouchPoint = {\n x: touch.clientX,\n y: touch.clientY,\n identifier: touch.identifier,\n timestamp: Date.now()\n };\n this.touchPoints.set(touch.identifier, point);\n this.gestureStartPoints.push({ ...point });\n });\n\n // Detect tap and long press\n if (this.touchPoints.size === 1) {\n this.detectTap();\n this.detectLongPress();\n }\n }\n\n /**\n * Handles touch move events\n */\n private handleTouchMove(event: TouchEvent): void {\n if (this.config.preventDefault) {\n event.preventDefault();\n }\n\n Array.from(event.touches).forEach(touch => {\n const existingPoint = this.touchPoints.get(touch.identifier);\n if (existingPoint) {\n existingPoint.x = touch.clientX;\n existingPoint.y = touch.clientY;\n existingPoint.timestamp = Date.now();\n }\n });\n\n // Detect gestures based on touch count\n if (this.touchPoints.size === 1) {\n this.detectSwipe();\n this.detectPan();\n } else if (this.touchPoints.size === 2) {\n this.detectPinch();\n this.detectRotate();\n }\n }\n\n /**\n * Handles touch end events\n */\n private handleTouchEnd(event: TouchEvent): void {\n if (this.config.preventDefault) {\n event.preventDefault();\n }\n\n const duration = Date.now() - this.gestureStartTime;\n const points = Array.from(this.touchPoints.values());\n\n if (points.length === 1) {\n const point = points[0];\n if (!point) return;\n const startPoint = this.gestureStartPoints.find(p => p.identifier === point.identifier);\n\n if (startPoint) {\n const deltaX = point.x - startPoint.x;\n const deltaY = point.y - startPoint.y;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n const velocity = distance / duration;\n\n // Detect tap\n if (distance < this.config.threshold && duration < 300) {\n this.emitGesture('tap', {\n type: 'tap',\n points: [point],\n deltaX,\n deltaY,\n velocity,\n direction: 'none',\n duration\n });\n }\n\n // Detect swipe\n if (distance > this.config.threshold && velocity > this.config.velocity) {\n const direction = this.getDirection(deltaX, deltaY);\n this.emitGesture('swipe', {\n type: 'swipe',\n points: [point],\n deltaX,\n deltaY,\n velocity,\n direction,\n duration\n });\n }\n }\n }\n\n this.touchPoints.clear();\n this.gestureStartPoints = [];\n }\n\n /**\n * Handles touch cancel events\n */\n private handleTouchCancel(event: TouchEvent): void {\n this.touchPoints.clear();\n this.gestureStartPoints = [];\n }\n\n /**\n * Detects tap gesture\n */\n private detectTap(): void {\n // Tap detection is handled in handleTouchEnd\n }\n\n /**\n * Detects long press gesture\n */\n private detectLongPress(): void {\n setTimeout(() => {\n if (this.touchPoints.size === 1) {\n const point = Array.from(this.touchPoints.values())[0];\n if (!point) return;\n this.emitGesture('longpress', {\n type: 'longpress',\n points: [point],\n deltaX: 0,\n deltaY: 0,\n velocity: 0,\n direction: 'none',\n duration: 500\n });\n }\n }, 500);\n }\n\n /**\n * Detects swipe gesture\n */\n private detectSwipe(): void {\n // Swipe detection is handled in handleTouchEnd\n }\n\n /**\n * Detects pan gesture\n */\n private detectPan(): void {\n const points = Array.from(this.touchPoints.values());\n if (points.length === 1) {\n const point = points[0];\n if (!point) return;\n const startPoint = this.gestureStartPoints.find(p => p.identifier === point.identifier);\n\n if (startPoint) {\n const deltaX = point.x - startPoint.x;\n const deltaY = point.y - startPoint.y;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n if (distance > this.config.threshold) {\n const direction = this.getDirection(deltaX, deltaY);\n this.emitGesture('pan', {\n type: 'pan',\n points: [point],\n deltaX,\n deltaY,\n velocity: distance / (Date.now() - this.gestureStartTime),\n direction,\n duration: Date.now() - this.gestureStartTime\n });\n }\n }\n }\n }\n\n /**\n * Detects pinch gesture\n */\n private detectPinch(): void {\n const points = Array.from(this.touchPoints.values());\n if (points.length === 2) {\n const point1 = points[0];\n const point2 = points[1];\n const startPoint1 = this.gestureStartPoints[0];\n const startPoint2 = this.gestureStartPoints[1];\n\n if (!point1 || !point2 || !startPoint1 || !startPoint2) return;\n\n const startDistance = this.getDistance(startPoint1, startPoint2);\n const currentDistance = this.getDistance(point1, point2);\n const scale = currentDistance / startDistance;\n\n this.emitGesture('pinch', {\n type: 'pinch',\n points,\n deltaX: 0,\n deltaY: 0,\n scale,\n velocity: 0,\n direction: 'none',\n duration: Date.now() - this.gestureStartTime\n });\n }\n }\n\n /**\n * Detects rotate gesture\n */\n private detectRotate(): void {\n const points = Array.from(this.touchPoints.values());\n if (points.length === 2) {\n const point1 = points[0];\n const point2 = points[1];\n const startPoint1 = this.gestureStartPoints[0];\n const startPoint2 = this.gestureStartPoints[1];\n\n if (!point1 || !point2 || !startPoint1 || !startPoint2) return;\n\n const startAngle = this.getAngle(startPoint1, startPoint2);\n const currentAngle = this.getAngle(point1, point2);\n const rotation = currentAngle - startAngle;\n\n this.emitGesture('rotate', {\n type: 'rotate',\n points,\n deltaX: 0,\n deltaY: 0,\n rotation,\n velocity: 0,\n direction: 'none',\n duration: Date.now() - this.gestureStartTime\n });\n }\n }\n\n /**\n * Calculates distance between two points\n */\n private getDistance(point1: TouchPoint, point2: TouchPoint): number {\n const dx = point1.x - point2.x;\n const dy = point1.y - point2.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n /**\n * Calculates angle between two points\n */\n private getAngle(point1: TouchPoint, point2: TouchPoint): number {\n return Math.atan2(point2.y - point1.y, point2.x - point1.x) * 180 / Math.PI;\n }\n\n /**\n * Determines direction based on deltas\n */\n private getDirection(deltaX: number, deltaY: number): 'left' | 'right' | 'up' | 'down' | 'none' {\n const absX = Math.abs(deltaX);\n const absY = Math.abs(deltaY);\n\n if (absX > absY) {\n return deltaX > 0 ? 'right' : 'left';\n } else {\n return deltaY > 0 ? 'down' : 'up';\n }\n }\n\n /**\n * Emits a gesture event\n */\n private emitGesture(type: string, event: GestureEvent): void {\n const listeners = this.listeners.get(type);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(event);\n } catch (error) {\n console.error(`Error in gesture listener for ${type}:`, error);\n }\n });\n }\n }\n\n /**\n * Adds a gesture listener\n */\n on(type: string, listener: (event: GestureEvent) => void): void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, []);\n }\n this.listeners.get(type)!.push(listener);\n }\n\n /**\n * Removes a gesture listener\n */\n off(type: string, listener: (event: GestureEvent) => void): void {\n const listeners = this.listeners.get(type);\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n }\n\n /**\n * Updates the configuration\n */\n updateConfig(newConfig: Partial<GestureConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n /**\n * Gets the current configuration\n */\n getConfig(): GestureConfig {\n return { ...this.config };\n }\n\n /**\n * Destroys the gesture manager\n */\n destroy(): void {\n this.element.removeEventListener('touchstart', this.handleTouchStart.bind(this));\n this.element.removeEventListener('touchmove', this.handleTouchMove.bind(this));\n this.element.removeEventListener('touchend', this.handleTouchEnd.bind(this));\n this.element.removeEventListener('touchcancel', this.handleTouchCancel.bind(this));\n this.listeners.clear();\n this.touchPoints.clear();\n }\n}\n\n// Additional types for gestures\nexport interface GestureOptions {\n threshold?: number;\n velocity?: number;\n direction?: 'horizontal' | 'vertical' | 'both';\n preventDefault?: boolean;\n}\n\nexport interface GestureListener {\n (event: GestureEvent): void;\n}\n","import type { DeviceInfo, NativeConfig, NativeFeature } from './types';\n\nexport class NativeManager {\n private config: NativeConfig;\n private features: Map<string, NativeFeature> = new Map();\n\n constructor(config: Partial<NativeConfig> = {}) {\n this.config = {\n features: {\n camera: true,\n geolocation: true,\n contacts: true,\n calendar: true,\n notifications: true,\n storage: true,\n network: true,\n device: true\n },\n permissions: [],\n plugins: [],\n ...config\n };\n\n this.initializeFeatures();\n }\n\n /**\n * Initializes available native features\n */\n private initializeFeatures(): void {\n // Camera\n if (this.config.features.camera) {\n this.features.set('camera', {\n name: 'Camera',\n available: this.isFeatureAvailable('camera'),\n permission: 'camera',\n description: 'Access device camera for photo/video capture'\n });\n }\n\n // Geolocation\n if (this.config.features.geolocation) {\n this.features.set('geolocation', {\n name: 'Geolocation',\n available: this.isFeatureAvailable('geolocation'),\n permission: 'geolocation',\n description: 'Access device location services'\n });\n }\n\n // Contacts\n if (this.config.features.contacts) {\n this.features.set('contacts', {\n name: 'Contacts',\n available: this.isFeatureAvailable('contacts'),\n permission: 'contacts',\n description: 'Access device contacts'\n });\n }\n\n // Calendar\n if (this.config.features.calendar) {\n this.features.set('calendar', {\n name: 'Calendar',\n available: this.isFeatureAvailable('calendar'),\n permission: 'calendar',\n description: 'Access device calendar'\n });\n }\n\n // Notifications\n if (this.config.features.notifications) {\n this.features.set('notifications', {\n name: 'Notifications',\n available: this.isFeatureAvailable('notifications'),\n permission: 'notifications',\n description: 'Send push notifications'\n });\n }\n\n // Storage\n if (this.config.features.storage) {\n this.features.set('storage', {\n name: 'Storage',\n available: this.isFeatureAvailable('storage'),\n description: 'Access device storage'\n });\n }\n\n // Network\n if (this.config.features.network) {\n this.features.set('network', {\n name: 'Network',\n available: this.isFeatureAvailable('network'),\n description: 'Access network information'\n });\n }\n\n // Device\n if (this.config.features.device) {\n this.features.set('device', {\n name: 'Device',\n available: this.isFeatureAvailable('device'),\n description: 'Access device information'\n });\n }\n }\n\n /**\n * Checks if a feature is available\n */\n private isFeatureAvailable(feature: string): boolean {\n if (typeof window === 'undefined') return false;\n\n switch (feature) {\n case 'camera':\n return 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices;\n case 'geolocation':\n return 'geolocation' in navigator;\n case 'contacts':\n return 'contacts' in navigator || 'ContactsManager' in window;\n case 'calendar':\n return 'Calendar' in window;\n case 'notifications':\n return 'Notification' in window;\n case 'storage':\n return 'localStorage' in window || 'indexedDB' in window;\n case 'network':\n return 'connection' in navigator || 'onLine' in navigator;\n case 'device':\n return 'deviceMemory' in navigator || 'hardwareConcurrency' in navigator;\n default:\n return false;\n }\n }\n\n /**\n * Gets device information\n */\n async getDeviceInfo(): Promise<DeviceInfo> {\n const info: DeviceInfo = {\n platform: 'web',\n version: '',\n model: '',\n manufacturer: '',\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n pixelRatio: window.devicePixelRatio || 1,\n orientation: window.screen.width > window.screen.height ? 'landscape' : 'portrait',\n isOnline: navigator.onLine,\n connectionType: 'unknown',\n batteryLevel: 0,\n isCharging: false\n };\n\n // Detect platform\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('iphone') || userAgent.includes('ipad')) {\n info.platform = 'ios';\n } else if (userAgent.includes('android')) {\n info.platform = 'android';\n }\n\n // Get connection type\n if ('connection' in navigator) {\n const connection = (navigator as any).connection;\n if (connection) {\n info.connectionType = connection.effectiveType || 'unknown';\n }\n }\n\n // Get battery information\n if ('getBattery' in navigator) {\n try {\n const battery = await (navigator as any).getBattery();\n info.batteryLevel = battery.level;\n info.isCharging = battery.charging;\n } catch (error) {\n console.warn('Battery API not available:', error);\n }\n }\n\n return info;\n }\n\n /**\n * Requests permission for a feature\n */\n async requestPermission(feature: string): Promise<boolean> {\n const nativeFeature = this.features.get(feature);\n if (!nativeFeature) {\n throw new Error(`Feature ${feature} not found`);\n }\n\n if (!nativeFeature.available) {\n throw new Error(`Feature ${feature} not available on this device`);\n }\n\n switch (feature) {\n case 'camera':\n return this.requestCameraPermission();\n case 'geolocation':\n return this.requestGeolocationPermission();\n case 'notifications':\n return this.requestNotificationPermission();\n default:\n return true; // Assume granted for other features\n }\n }\n\n /**\n * Requests camera permission\n */\n private async requestCameraPermission(): Promise<boolean> {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n stream.getTracks().forEach(track => track.stop());\n return true;\n } catch (error) {\n console.error('Camera permission denied:', error);\n return false;\n }\n }\n\n /**\n * Requests geolocation permission\n */\n private async requestGeolocationPermission(): Promise<boolean> {\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n () => resolve(true),\n () => resolve(false),\n { timeout: 5000 }\n );\n });\n }\n\n /**\n * Requests notification permission\n */\n private async requestNotificationPermission(): Promise<boolean> {\n if ('Notification' in window) {\n const permission = await Notification.requestPermission();\n return permission === 'granted';\n }\n return false;\n }\n\n /**\n * Takes a photo using the camera\n */\n async takePhoto(options: CameraOptions = {}): Promise<PhotoResult> {\n if (!this.features.get('camera')?.available) {\n throw new Error('Camera not available');\n }\n\n const hasPermission = await this.requestPermission('camera');\n if (!hasPermission) {\n throw new Error('Camera permission denied');\n }\n\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'image/*';\n input.capture = options.source === 'camera' ? 'camera' : undefined as any;\n\n input.onchange = (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = () => {\n resolve({\n dataUrl: reader.result as string,\n file,\n width: 0, // Would need to load image to get dimensions\n height: 0\n });\n };\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsDataURL(file);\n } else {\n reject(new Error('No file selected'));\n }\n };\n\n input.click();\n });\n }\n\n /**\n * Gets current location\n */\n async getLocation(options: GeolocationOptions = {}): Promise<LocationResult> {\n if (!this.features.get('geolocation')?.available) {\n throw new Error('Geolocation not available');\n }\n\n const hasPermission = await this.requestPermission('geolocation');\n if (!hasPermission) {\n throw new Error('Geolocation permission denied');\n }\n\n return new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n resolve({\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n altitude: position.coords.altitude ?? undefined,\n heading: position.coords.heading ?? undefined,\n speed: position.coords.speed ?? undefined,\n timestamp: position.timestamp\n });\n },\n (error) => {\n reject(new Error(`Geolocation error: ${error.message}`));\n },\n {\n enableHighAccuracy: options.highAccuracy || false,\n timeout: options.timeout || 10000,\n maximumAge: options.maximumAge || 60000\n }\n );\n });\n }\n\n /**\n * Sends a notification\n */\n async sendNotification(options: NotificationOptions): Promise<void> {\n if (!this.features.get('notifications')?.available) {\n throw new Error('Notifications not available');\n }\n\n const hasPermission = await this.requestPermission('notifications');\n if (!hasPermission) {\n throw new Error('Notification permission denied');\n }\n\n if ('Notification' in window) {\n new Notification(options.title, options);\n }\n }\n\n /**\n * Gets available features\n */\n getAvailableFeatures(): NativeFeature[] {\n return Array.from(this.features.values());\n }\n\n\n\n /**\n * Updates the configuration\n */\n updateConfig(newConfig: Partial<NativeConfig>): void {\n this.config = { ...this.config, ...newConfig };\n this.initializeFeatures();\n }\n\n /**\n * Gets the current configuration\n */\n getConfig(): NativeConfig {\n return { ...this.config };\n }\n}\n\n// Additional types for native features\nexport interface CameraOptions {\n source?: 'camera' | 'gallery';\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport interface PhotoResult {\n dataUrl: string;\n file: File;\n width: number;\n height: number;\n}\n\nexport interface GeolocationOptions {\n highAccuracy?: boolean;\n timeout?: number;\n maximumAge?: number;\n}\n\nexport interface LocationResult {\n latitude: number;\n longitude: number;\n accuracy: number;\n altitude?: number | undefined;\n heading?: number | undefined;\n speed?: number | undefined;\n timestamp: number;\n}\n\nexport interface NotificationOptions {\n title: string;\n body?: string;\n icon?: string;\n badge?: string;\n tag?: string;\n data?: any;\n requireInteraction?: boolean;\n silent?: boolean;\n vibrate?: number[];\n actions?: NotificationAction[];\n}\n\nexport interface NotificationAction {\n action: string;\n title: string;\n icon?: string;\n}\n","import type { CacheStrategy, PWAConfig, ServiceWorkerConfig } from './types';\n\nexport class PWAManager {\n private config: PWAConfig;\n private swConfig: ServiceWorkerConfig;\n\n constructor(config: PWAConfig, swConfig: ServiceWorkerConfig) {\n this.config = config;\n this.swConfig = swConfig;\n }\n\n /**\n * Generates the web app manifest\n */\n generateManifest(): string {\n const manifest = {\n name: this.config.name,\n short_name: this.config.shortName,\n description: this.config.description,\n start_url: this.config.startUrl,\n display: this.config.display,\n theme_color: this.config.themeColor,\n background_color: this.config.backgroundColor,\n icons: this.config.icons,\n categories: this.config.categories,\n lang: this.config.lang,\n dir: this.config.dir,\n orientation: this.config.orientation,\n scope: this.config.scope,\n prefer_related_applications: this.config.preferRelatedApplications,\n related_applications: this.config.relatedApplications\n };\n\n return JSON.stringify(manifest, null, 2);\n }\n\n /**\n * Generates the service worker script\n */\n generateServiceWorker(): string {\n const swScript = `\n// OrdoJS Service Worker\nconst CACHE_NAME = 'ordojs-cache-v1';\nconst STATIC_CACHE = 'static-cache-v1';\nconst DYNAMIC_CACHE = 'dynamic-cache-v1';\n\n// Install event\nself.addEventListener('install', (event) => {\n console.log('Service Worker installing...');\n event.waitUntil(\n caches.open(STATIC_CACHE).then((cache) => {\n return cache.addAll([\n '/',\n '/offline.html',\n '/static/css/main.css',\n '/static/js/main.js'\n ]);\n })\n );\n self.skipWaiting();\n});\n\n// Activate event\nself.addEventListener('activate', (event) => {\n console.log('Service Worker activating...');\n event.waitUntil(\n caches.keys().then((cacheNames) => {\n return Promise.all(\n cacheNames.map((cacheName) => {\n if (cacheName !== STATIC_CACHE && cacheName !== DYNAMIC_CACHE) {\n return caches.delete(cacheName);\n }\n })\n );\n })\n );\n self.clients.claim();\n});\n\n// Fetch event\nself.addEventListener('fetch', (event) => {\n const { request } = event;\n const url = new URL(request.url);\n\n // Handle different cache strategies\n ${this.generateCacheStrategies()}\n\n // Background sync\n ${this.generateBackgroundSync()}\n\n // Push notifications\n ${this.generatePushNotifications()}\n});\n\n${this.generateCacheStrategies()}\n${this.generateBackgroundSync()}\n${this.generatePushNotifications()}\n `.trim();\n\n return swScript;\n }\n\n /**\n * Generates cache strategies for different resource types\n */\n private generateCacheStrategies(): string {\n let strategies = '';\n\n this.swConfig.cacheStrategies.forEach(strategy => {\n strategies += `\n // ${strategy.name} strategy\n if (${this.generatePatternMatcher(strategy.pattern)}) {\n event.respondWith(\n ${this.generateStrategyHandler(strategy)}\n );\n return;\n }\n `;\n });\n\n return strategies;\n }\n\n /**\n * Generates pattern matcher for cache strategies\n */\n private generatePatternMatcher(pattern: string): string {\n if (pattern.includes('*')) {\n const regex = pattern.replace(/\\*/g, '.*');\n return `url.pathname.match(/^${regex}$/)`;\n }\n return `url.pathname === '${pattern}'`;\n }\n\n /**\n * Generates strategy handler for different cache strategies\n */\n private generateStrategyHandler(strategy: CacheStrategy): string {\n switch (strategy.strategy) {\n case 'cache-first':\n return `\n caches.match(request).then((response) => {\n return response || fetch(request).then((fetchResponse) => {\n return caches.open(DYNAMIC_CACHE).then((cache) => {\n cache.put(request, fetchResponse.clone());\n return fetchResponse;\n });\n });\n })\n `;\n case 'network-first':\n return `\n fetch(request).then((response) => {\n return caches.open(DYNAMIC_CACHE).then((cache) => {\n cache.put(request, response.clone());\n return response;\n });\n }).catch(() => {\n return caches.match(request);\n })\n `;\n case 'stale-while-revalidate':\n return `\n caches.match(request).then((cachedResponse) => {\n const fetchPromise = fetch(request).then((networkResponse) => {\n return caches.open(DYNAMIC_CACHE).then((cache) => {\n cache.put(request, networkResponse.clone());\n return networkResponse;\n });\n });\n return cachedResponse || fetchPromise;\n })\n `;\n case 'network-only':\n return `fetch(request)`;\n case 'cache-only':\n return `caches.match(request)`;\n default:\n return `fetch(request)`;\n }\n }\n\n /**\n * Generates background sync functionality\n */\n private generateBackgroundSync(): string {\n if (!this.swConfig.backgroundSync.enabled) {\n return '';\n }\n\n return `\n// Background sync\nself.addEventListener('sync', (event) => {\n if (event.tag === '${this.swConfig.backgroundSync.syncName}') {\n event.waitUntil(\n // Perform background sync operations\n console.log('Background sync triggered');\n );\n }\n});\n `;\n }\n\n /**\n * Generates push notification functionality\n */\n private generatePushNotifications(): string {\n if (!this.swConfig.pushNotifications.enabled) {\n return '';\n }\n\n return `\n// Push notifications\nself.addEventListener('push', (event) => {\n const options = {\n body: event.data ? event.data.text() : 'New notification',\n icon: '/icon-192x192.png',\n badge: '/badge-72x72.png',\n vibrate: [100, 50, 100],\n data: {\n dateOfArrival: Date.now(),\n primaryKey: 1\n },\n actions: [\n {\n action: 'explore',\n title: 'View',\n icon: '/icon-192x192.png'\n },\n {\n action: 'close',\n title: 'Close',\n icon: '/icon-192x192.png'\n }\n ]\n };\n\n event.waitUntil(\n self.registration.showNotification('${this.config.name}', options)\n );\n});\n\nself.addEventListener('notificationclick', (event) => {\n event.notification.close();\n\n if (event.action === 'explore') {\n event.waitUntil(\n clients.openWindow('/')\n );\n }\n});\n `;\n }\n\n /**\n * Registers the service worker\n */\n registerServiceWorker(): Promise<ServiceWorkerRegistration | null> {\n if ('serviceWorker' in navigator) {\n return navigator.serviceWorker.register('/sw.js', {\n scope: this.swConfig.scope,\n updateViaCache: this.swConfig.updateViaCache\n });\n }\n return Promise.resolve(null);\n }\n\n /**\n * Checks if the app is installed\n */\n isInstalled(): boolean {\n return window.matchMedia('(display-mode: standalone)').matches ||\n (window.navigator as any).standalone === true;\n }\n\n /**\n * Shows install prompt\n */\n showInstallPrompt(): Promise<void> {\n return new Promise((resolve, rejec