| import type { ActionFunctionArgs, LoaderFunction } from '@remix-run/cloudflare'; |
| import { json } from '@remix-run/cloudflare'; |
| import { execSync } from 'child_process'; |
|
|
| |
| 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<string, string>; |
| declare const __PKG_DEV_DEPENDENCIES: Record<string, string>; |
| declare const __PKG_PEER_DEPENDENCIES: Record<string, string>; |
| declare const __PKG_OPTIONAL_DEPENDENCIES: Record<string, string>; |
|
|
| 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<string, string>, |
| 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 }, |
| ); |
| } |
| }; |
|
|