76 lines
No EOL
3.2 KiB
TypeScript
76 lines
No EOL
3.2 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { promises as fs } from 'fs'
|
|
import path from 'path'
|
|
import { GroupSetting } from '@/app/layout-preview/types'
|
|
|
|
export async function GET() {
|
|
try {
|
|
// Get the path to the presentation-layouts directory
|
|
const layoutsDirectory = path.join(process.cwd(), 'presentation-layouts')
|
|
|
|
// Read all directories in the presentation-layouts directory
|
|
const items = await fs.readdir(layoutsDirectory, { withFileTypes: true })
|
|
|
|
// Filter for directories (layout groups) and exclude files
|
|
const groupDirectories = items
|
|
.filter(item => item.isDirectory())
|
|
.map(dir => dir.name)
|
|
|
|
const allLayouts: { groupName: string; files: string[]; settings: GroupSetting | null }[] = []
|
|
|
|
// Scan each group directory for layout files and settings
|
|
for (const groupName of groupDirectories) {
|
|
try {
|
|
const groupPath = path.join(layoutsDirectory, groupName)
|
|
const groupFiles = await fs.readdir(groupPath)
|
|
|
|
// Filter for .tsx files and exclude any non-layout files
|
|
const layoutFiles = groupFiles.filter(file =>
|
|
file.endsWith('.tsx') &&
|
|
!file.startsWith('.') &&
|
|
!file.includes('.test.') &&
|
|
!file.includes('.spec.') &&
|
|
file !== 'setting.json'
|
|
)
|
|
|
|
// Read settings.json if it exists
|
|
let settings: GroupSetting | null = null
|
|
const settingsPath = path.join(groupPath, 'setting.json')
|
|
try {
|
|
const settingsContent = await fs.readFile(settingsPath, 'utf-8')
|
|
settings = JSON.parse(settingsContent) as GroupSetting
|
|
} catch (settingsError) {
|
|
console.warn(`No settings.json found for group ${groupName} or invalid JSON`)
|
|
// Provide default settings if setting.json is missing or invalid
|
|
settings = {
|
|
description: `${groupName} presentation layouts`,
|
|
ordered: false,
|
|
isDefault: false
|
|
}
|
|
// write the settings to the file
|
|
fs.writeFile(settingsPath, JSON.stringify(settings, null, 2))
|
|
}
|
|
|
|
if (layoutFiles.length > 0) {
|
|
allLayouts.push({
|
|
groupName: groupName,
|
|
files: layoutFiles,
|
|
settings: settings
|
|
})
|
|
}
|
|
} catch (error) {
|
|
console.error(`Error reading group directory ${groupName}:`, error)
|
|
// Continue with other groups even if one fails
|
|
}
|
|
}
|
|
|
|
|
|
return NextResponse.json(allLayouts)
|
|
} catch (error) {
|
|
console.error('Error reading presentation-layouts directory:', error)
|
|
return NextResponse.json(
|
|
{ error: 'Failed to read presentation-layouts directory' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|