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
|
|
};
|
|
}
|