first commit
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user