first commit

This commit is contained in:
2026-11-10 10:12:09 +09:00
commit 0288412bbb
84 changed files with 312187 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
import fs from 'fs';
import path from 'path';
import { execSync } from 'child_process';
const dist = path.resolve('dist');
const adminDir = path.join(dist, 'admin');
const regionsDir = path.join(dist, 'regions');
if (!fs.existsSync(adminDir)) fs.mkdirSync(adminDir, { recursive: true });
if (!fs.existsSync(regionsDir)) fs.mkdirSync(regionsDir, { recursive: true });
if (!fs.existsSync(path.join(adminDir, 'index.html'))) {
fs.copyFileSync(path.join(dist, 'index.html'), path.join(adminDir, 'index.html'));
}
if (!fs.existsSync(path.join(regionsDir, 'index.html'))) {
fs.copyFileSync(path.join(dist, 'index.html'), path.join(regionsDir, 'index.html'));
}
if (!fs.existsSync(path.join(dist, '404.html'))) {
fs.copyFileSync(path.join(dist, 'index.html'), path.join(dist, '404.html'));
}
if (fs.existsSync('public/sitemap.xml')) {
fs.copyFileSync('public/sitemap.xml', path.join(dist, 'sitemap.xml'));
}
if (fs.existsSync('public/robots.txt')) {
fs.copyFileSync('public/robots.txt', path.join(dist, 'robots.txt'));
}
// Cloudflare Pages 표준 SPA/SSR 폴백 라우팅 (_redirects): 모든 지역 경로 200 OK 응답 보장
fs.writeFileSync(path.join(dist, '_redirects'), '/* /index.html 200\n', 'utf-8');
// ---------------------------------------------------------------------------
// Cloudflare 대시보드 무한 업로드(Hanging) 원인 파일 완전 제거:
// 1. 0바이트 파일 (.gitkeep 등)
// 2. 숨김 파일 (.htaccess, .gitkeep, .DS_Store 등 점(.)으로 시작하는 파일)
// 3. 대시보드 드래그앤드롭에서 파서 멈춤을 유발하는 _worker.js, _routes.json, _template.html
// 4. 빈 폴더 (video 등)
// ---------------------------------------------------------------------------
const blockedRootFiles = ['_worker.js', '_routes.json', '_template.html', '.htaccess'];
for (const name of blockedRootFiles) {
const p = path.join(dist, name);
if (fs.existsSync(p)) {
try { fs.unlinkSync(p); } catch {}
}
}
function cleanProblematicFiles(dirPath) {
if (!fs.existsSync(dirPath)) return;
for (const entry of fs.readdirSync(dirPath, { withFileTypes: true })) {
const fullPath = path.join(dirPath, entry.name);
if (entry.isDirectory()) {
cleanProblematicFiles(fullPath);
// 하위 정리 후 빈 폴더면 삭제 (Cloudflare 빈 폴더 업로드 멈춤 방지)
if (fs.existsSync(fullPath) && fs.readdirSync(fullPath).length === 0) {
try { fs.rmdirSync(fullPath); } catch {}
}
} else {
const size = fs.statSync(fullPath).size;
if (entry.name.startsWith('.') || size === 0) {
try { fs.unlinkSync(fullPath); } catch {}
}
}
}
}
cleanProblematicFiles(dist);
console.log('✅ [Post-Build] 무한 업로드 유발 파일(0바이트 .gitkeep, .htaccess, _worker.js) 제거 및 _redirects 설정 완료!');
try {
console.log('📦 [Zip] Cloudflare 직접 업로드용 dist.zip 자동 압축 중...');
execSync('tar -acf dist.zip -C dist .', { stdio: 'inherit' });
console.log('🎉 [Success] 최신 배포용 dist.zip (루트 압축) 생성이 완료되었습니다!');
} catch (e) {
console.log('ℹ️ tar 압축 대신 PowerShell 수동 압축 가능:', e.message);
}