You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							139 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							139 lines
						
					
					
						
							3.3 KiB
						
					
					
				
								import * as path from "path";
							 | 
						|
								import { fileURLToPath } from 'url';
							 | 
						|
								import { promises as fs } from "fs";
							 | 
						|
								
							 | 
						|
								const __dirname = path.dirname(fileURLToPath(import.meta.url));
							 | 
						|
								
							 | 
						|
								async function loadPackageJson() {
							 | 
						|
								  const packageJsonPath = path.join(__dirname, 'package.json');
							 | 
						|
								  const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');
							 | 
						|
								  return JSON.parse(packageJsonContent);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								interface ManifestIcon {
							 | 
						|
								  src: string;
							 | 
						|
								  sizes: string;
							 | 
						|
								  type: string;
							 | 
						|
								  purpose?: string;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								interface ShareTarget {
							 | 
						|
								  action: string;
							 | 
						|
								  method: "POST";
							 | 
						|
								  enctype: string;
							 | 
						|
								  params: {
							 | 
						|
								    files: Array<{
							 | 
						|
								      name: string;
							 | 
						|
								      accept: string[];
							 | 
						|
								    }>;
							 | 
						|
								  };
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								interface PWAConfig {
							 | 
						|
								  registerType: string;
							 | 
						|
								  strategies: string;
							 | 
						|
								  srcDir: string;
							 | 
						|
								  filename: string;
							 | 
						|
								  manifest: {
							 | 
						|
								    name: string;
							 | 
						|
								    short_name: string;
							 | 
						|
								    theme_color: string;
							 | 
						|
								    background_color: string;
							 | 
						|
								    icons: ManifestIcon[];
							 | 
						|
								    share_target: ShareTarget;
							 | 
						|
								  };
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								interface AppConfig {
							 | 
						|
								  pwaConfig: PWAConfig;
							 | 
						|
								  aliasConfig: {
							 | 
						|
								    [key: string]: string;
							 | 
						|
								  };
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								export async function loadAppConfig(): Promise<AppConfig> {
							 | 
						|
								  const packageJson = await loadPackageJson();
							 | 
						|
								  const appName = process.env.TIME_SAFARI_APP_TITLE || packageJson.name;
							 | 
						|
								
							 | 
						|
								  return {
							 | 
						|
								    pwaConfig: {
							 | 
						|
								      registerType: "autoUpdate",
							 | 
						|
								      strategies: "injectManifest",
							 | 
						|
								      srcDir: ".",
							 | 
						|
								      filename: "sw_scripts-combined.js",
							 | 
						|
								      manifest: {
							 | 
						|
								        name: appName,
							 | 
						|
								        short_name: appName,
							 | 
						|
								        theme_color: "#4a90e2",
							 | 
						|
								        background_color: "#ffffff",
							 | 
						|
								        icons: [
							 | 
						|
								          {
							 | 
						|
								            src: "./img/icons/android-chrome-192x192.png",
							 | 
						|
								            sizes: "192x192",
							 | 
						|
								            type: "image/png",
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            src: "./img/icons/android-chrome-512x512.png",
							 | 
						|
								            sizes: "512x512",
							 | 
						|
								            type: "image/png",
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            src: "./img/icons/android-chrome-maskable-192x192.png",
							 | 
						|
								            sizes: "192x192",
							 | 
						|
								            type: "image/png",
							 | 
						|
								            purpose: "maskable",
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            src: "./img/icons/android-chrome-maskable-512x512.png",
							 | 
						|
								            sizes: "512x512",
							 | 
						|
								            type: "image/png",
							 | 
						|
								            purpose: "maskable",
							 | 
						|
								          },
							 | 
						|
								        ],
							 | 
						|
								        share_target: {
							 | 
						|
								          action: "/share-target",
							 | 
						|
								          method: "POST",
							 | 
						|
								          enctype: "multipart/form-data",
							 | 
						|
								          params: {
							 | 
						|
								            files: [
							 | 
						|
								              {
							 | 
						|
								                name: "photo",
							 | 
						|
								                accept: ["image/*"],
							 | 
						|
								              },
							 | 
						|
								            ],
							 | 
						|
								          },
							 | 
						|
								        },
							 | 
						|
								      },
							 | 
						|
								    },
							 | 
						|
								    aliasConfig: {
							 | 
						|
								      "@": path.resolve(__dirname, "src"),
							 | 
						|
								      buffer: path.resolve(__dirname, "node_modules", "buffer"),
							 | 
						|
								      "dexie-export-import/dist/import":
							 | 
						|
								        "dexie-export-import/dist/import/index.js",
							 | 
						|
								    },
							 | 
						|
								  };
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Shared ESBuild configuration that ensures builds fail on errors
							 | 
						|
								 */
							 | 
						|
								export function getStrictESBuildConfig() {
							 | 
						|
								  return {
							 | 
						|
								    target: 'es2015',
							 | 
						|
								    supported: {
							 | 
						|
								      'bigint': true
							 | 
						|
								    },
							 | 
						|
								    // Fail on any ESBuild errors
							 | 
						|
								    logLevel: 'error' as const,
							 | 
						|
								    // Ensure build fails on syntax errors and other critical issues
							 | 
						|
								    logOverride: { 
							 | 
						|
								      'duplicate-export': 'error',
							 | 
						|
								      'duplicate-member': 'error',
							 | 
						|
								      'syntax-error': 'error',
							 | 
						|
								      'invalid-identifier': 'error'
							 | 
						|
								    },
							 | 
						|
								    // Additional strict settings
							 | 
						|
								    keepNames: false,
							 | 
						|
								    minifyIdentifiers: false
							 | 
						|
								  };
							 | 
						|
								} 
							 |