Spaces:
Running
Running
| import { NextRequest, NextResponse } from 'next/server' | |
| import fs from 'fs' | |
| import path from 'path' | |
| const DATA_DIR = process.env.NODE_ENV === 'production' && fs.existsSync('/data') | |
| ? '/data' | |
| : path.join(process.cwd(), 'data') | |
| const FLUTTER_APPS_DIR = path.join(DATA_DIR, 'documents', 'flutter_apps') | |
| // Ensure directory exists | |
| if (!fs.existsSync(FLUTTER_APPS_DIR)) { | |
| fs.mkdirSync(FLUTTER_APPS_DIR, { recursive: true }) | |
| } | |
| export async function POST(request: NextRequest) { | |
| try { | |
| const body = await request.json() | |
| const { name, dartCode, dependencies = [], pubspecYaml } = body | |
| if (!name || !dartCode) { | |
| return NextResponse.json( | |
| { success: false, error: 'Name and dartCode are required' }, | |
| { status: 400 } | |
| ) | |
| } | |
| // Sanitize name | |
| const safeName = name.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase() | |
| if (!safeName) { | |
| return NextResponse.json( | |
| { success: false, error: 'Invalid app name' }, | |
| { status: 400 } | |
| ) | |
| } | |
| // Generate default pubspec.yaml if not provided | |
| let finalPubspecYaml = pubspecYaml | |
| if (!finalPubspecYaml) { | |
| const depLines = dependencies.map((dep: string) => ` ${dep}`).join('\n') | |
| finalPubspecYaml = `name: ${safeName} | |
| description: A Flutter application created via Reuben OS | |
| version: 1.0.0 | |
| environment: | |
| sdk: '>=3.0.0 <4.0.0' | |
| dependencies: | |
| flutter: | |
| sdk: flutter | |
| ${depLines} | |
| flutter: | |
| uses-material-design: true | |
| ` | |
| } | |
| // Create Flutter app object | |
| const flutterApp = { | |
| type: 'flutter_app', | |
| name: safeName, | |
| dartCode, | |
| dependencies, | |
| pubspecYaml: finalPubspecYaml, | |
| metadata: { | |
| created: new Date().toISOString(), | |
| modified: new Date().toISOString(), | |
| author: 'claude' | |
| } | |
| } | |
| // Save to file | |
| const fileName = `${safeName}.flutter.json` | |
| const filePath = path.join(FLUTTER_APPS_DIR, fileName) | |
| // Check if file exists | |
| if (fs.existsSync(filePath)) { | |
| return NextResponse.json( | |
| { success: false, error: `Flutter app '${safeName}' already exists. Use update instead.` }, | |
| { status: 400 } | |
| ) | |
| } | |
| fs.writeFileSync(filePath, JSON.stringify(flutterApp, null, 2), 'utf-8') | |
| return NextResponse.json({ | |
| success: true, | |
| appName: safeName, | |
| fileName, | |
| filePath: `flutter_apps/${fileName}`, | |
| dependencies, | |
| message: 'Flutter app created successfully' | |
| }) | |
| } catch (error) { | |
| console.error('Error creating Flutter app:', error) | |
| return NextResponse.json( | |
| { success: false, error: 'Failed to create Flutter app' }, | |
| { status: 500 } | |
| ) | |
| } | |
| } | |