Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
76 lines
2.6 KiB
JavaScript
76 lines
2.6 KiB
JavaScript
/**
|
|
* Script to sync thumbnails from /thumbnails to /public/thumbnails
|
|
* This allows static file serving for GHL hosting or static deployments
|
|
*/
|
|
|
|
import { readdir, copyFile, mkdir, stat } from 'fs/promises'
|
|
import { join } from 'path'
|
|
import { existsSync } from 'fs'
|
|
|
|
const PROJECT_ROOT = join(process.cwd(), '..')
|
|
const THUMBNAILS_SOURCE = join(PROJECT_ROOT, 'thumbnails')
|
|
const THUMBNAILS_PUBLIC = join(process.cwd(), 'public', 'thumbnails')
|
|
|
|
async function syncThumbnails() {
|
|
try {
|
|
// Check if source directory exists
|
|
if (!existsSync(THUMBNAILS_SOURCE)) {
|
|
console.log('⚠️ Thumbnails source directory not found, skipping...')
|
|
return
|
|
}
|
|
|
|
// Create public/thumbnails directory structure
|
|
if (!existsSync(THUMBNAILS_PUBLIC)) {
|
|
await mkdir(THUMBNAILS_PUBLIC, { recursive: true })
|
|
}
|
|
|
|
/**
|
|
* Recursively copy thumbnails, preserving directory structure
|
|
*/
|
|
async function copyDirectory(sourceDir, destDir, relativePath = '') {
|
|
const entries = await readdir(sourceDir, { withFileTypes: true })
|
|
|
|
for (const entry of entries) {
|
|
const sourcePath = join(sourceDir, entry.name)
|
|
const destPath = join(destDir, entry.name)
|
|
const entryRelativePath = relativePath ? join(relativePath, entry.name) : entry.name
|
|
|
|
if (entry.isDirectory()) {
|
|
// Create destination directory
|
|
if (!existsSync(destPath)) {
|
|
await mkdir(destPath, { recursive: true })
|
|
}
|
|
// Recursively copy subdirectories
|
|
await copyDirectory(sourcePath, destPath, entryRelativePath)
|
|
} else if (entry.isFile()) {
|
|
// Copy image files (jpg, jpeg, png, webp)
|
|
const ext = entry.name.toLowerCase()
|
|
if (ext.endsWith('.jpg') || ext.endsWith('.jpeg') || ext.endsWith('.png') || ext.endsWith('.webp')) {
|
|
// Check if file needs updating (compare modification times)
|
|
let shouldCopy = true
|
|
if (existsSync(destPath)) {
|
|
const sourceStats = await stat(sourcePath)
|
|
const destStats = await stat(destPath)
|
|
shouldCopy = sourceStats.mtime > destStats.mtime
|
|
}
|
|
|
|
if (shouldCopy) {
|
|
await copyFile(sourcePath, destPath)
|
|
console.log(`Copied: ${entryRelativePath}`)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
await copyDirectory(THUMBNAILS_SOURCE, THUMBNAILS_PUBLIC)
|
|
|
|
console.log('✅ Thumbnails synced to public folder successfully!')
|
|
} catch (error) {
|
|
console.error('❌ Error syncing thumbnails:', error)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
syncThumbnails()
|
|
|