import type { ActionFunctionArgs, LoaderFunction } from '@remix-run/cloudflare'; import { json } from '@remix-run/cloudflare'; import { execSync } from 'child_process'; // These are injected by Vite at build time declare const __APP_VERSION: string; declare const __PKG_NAME: string; declare const __PKG_DESCRIPTION: string; declare const __PKG_LICENSE: string; declare const __PKG_DEPENDENCIES: Record; declare const __PKG_DEV_DEPENDENCIES: Record; declare const __PKG_PEER_DEPENDENCIES: Record; declare const __PKG_OPTIONAL_DEPENDENCIES: Record; const getGitInfo = () => { try { return { commitHash: execSync('git rev-parse --short HEAD').toString().trim(), branch: execSync('git rev-parse --abbrev-ref HEAD').toString().trim(), commitTime: execSync('git log -1 --format=%cd').toString().trim(), author: execSync('git log -1 --format=%an').toString().trim(), email: execSync('git log -1 --format=%ae').toString().trim(), remoteUrl: execSync('git config --get remote.origin.url').toString().trim(), repoName: execSync('git config --get remote.origin.url') .toString() .trim() .replace(/^.*github.com[:/]/, '') .replace(/\.git$/, ''), }; } catch (error) { console.error('Failed to get git info:', error); return { commitHash: 'unknown', branch: 'unknown', commitTime: 'unknown', author: 'unknown', email: 'unknown', remoteUrl: 'unknown', repoName: 'unknown', }; } }; const formatDependencies = ( deps: Record, type: 'production' | 'development' | 'peer' | 'optional', ): Array<{ name: string; version: string; type: string }> => { return Object.entries(deps || {}).map(([name, version]) => ({ name, version: version.replace(/^\^|~/, ''), type, })); }; const getAppResponse = () => { const gitInfo = getGitInfo(); return { name: __PKG_NAME || 'bolt.diy', version: __APP_VERSION || '0.1.0', description: __PKG_DESCRIPTION || 'A DIY LLM interface', license: __PKG_LICENSE || 'MIT', environment: process.env.NODE_ENV || 'development', gitInfo, timestamp: new Date().toISOString(), runtimeInfo: { nodeVersion: process.version || 'unknown', }, dependencies: { production: formatDependencies(__PKG_DEPENDENCIES, 'production'), development: formatDependencies(__PKG_DEV_DEPENDENCIES, 'development'), peer: formatDependencies(__PKG_PEER_DEPENDENCIES, 'peer'), optional: formatDependencies(__PKG_OPTIONAL_DEPENDENCIES, 'optional'), }, }; }; export const loader: LoaderFunction = async ({ request: _request }) => { try { return json(getAppResponse()); } catch (error) { console.error('Failed to get webapp info:', error); return json( { name: 'bolt.diy', version: '0.0.0', description: 'Error fetching app info', license: 'MIT', environment: 'error', gitInfo: { commitHash: 'error', branch: 'unknown', commitTime: 'unknown', author: 'unknown', email: 'unknown', remoteUrl: 'unknown', repoName: 'unknown', }, timestamp: new Date().toISOString(), runtimeInfo: { nodeVersion: 'unknown' }, dependencies: { production: [], development: [], peer: [], optional: [], }, }, { status: 500 }, ); } }; export const action = async ({ request: _request }: ActionFunctionArgs) => { try { return json(getAppResponse()); } catch (error) { console.error('Failed to get webapp info:', error); return json( { name: 'bolt.diy', version: '0.0.0', description: 'Error fetching app info', license: 'MIT', environment: 'error', gitInfo: { commitHash: 'error', branch: 'unknown', commitTime: 'unknown', author: 'unknown', email: 'unknown', remoteUrl: 'unknown', repoName: 'unknown', }, timestamp: new Date().toISOString(), runtimeInfo: { nodeVersion: 'unknown' }, dependencies: { production: [], development: [], peer: [], optional: [], }, }, { status: 500 }, ); } };