288 lines
8.9 KiB
JavaScript

#!/usr/bin/env node
/**
* Streamingle Camera Plugin Build Script
* StreamDock 플러그인 폴더에 자동 복사 기능 포함
*/
const fs = require('fs');
const path = require('path');
// 설정
const PLUGIN_NAME = 'com.mirabox.streamingle.sdPlugin';
const STREAMDOCK_PLUGINS_PATH = 'C:\\Users\\qscft\\AppData\\Roaming\\HotSpot\\StreamDock\\plugins';
const CURRENT_DIR = __dirname;
// 색상 출력 함수
function log(message, color = 'white') {
const colors = {
red: '\x1b[31m',
green: '\x1b[32m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
magenta: '\x1b[35m',
cyan: '\x1b[36m',
white: '\x1b[37m',
reset: '\x1b[0m'
};
console.log(`${colors[color]}${message}${colors.reset}`);
}
// 디렉토리 복사 함수 (제외할 파일/폴더 필터링 포함)
function copyDirectory(src, dest) {
// 제외할 파일/폴더 목록
const excludePatterns = [
'dist',
'dist-dev',
'node_modules',
'.git',
'.gitignore',
'build.js',
'build.log',
'README.md'
// package.json과 package-lock.json은 제외하지 않음 (MiraBox StreamDock에서 필요할 수 있음)
];
if (!fs.existsSync(dest)) {
fs.mkdirSync(dest, { recursive: true });
}
const entries = fs.readdirSync(src, { withFileTypes: true });
for (const entry of entries) {
// 제외할 파일/폴더 체크
if (excludePatterns.includes(entry.name)) {
console.log(`⏭️ 제외: ${entry.name}`);
continue;
}
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);
if (entry.isDirectory()) {
copyDirectory(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
}
}
}
// 디렉토리 삭제 함수
function removeDirectory(dirPath) {
if (fs.existsSync(dirPath)) {
fs.rmSync(dirPath, { recursive: true, force: true });
}
}
// 빌드 함수 - StreamDock 플러그인 폴더에 직접 빌드
function build() {
log('🔨 Streamingle Camera Plugin 빌드 시작...', 'cyan');
const buildDir = path.join(STREAMDOCK_PLUGINS_PATH, PLUGIN_NAME);
const pluginDir = CURRENT_DIR;
// StreamDock 플러그인 폴더 확인
if (!fs.existsSync(STREAMDOCK_PLUGINS_PATH)) {
log('❌ StreamDock 플러그인 폴더를 찾을 수 없습니다', 'red');
log(`📁 예상 경로: ${STREAMDOCK_PLUGINS_PATH}`, 'yellow');
return false;
}
// 기존 플러그인 삭제
if (fs.existsSync(buildDir)) {
removeDirectory(buildDir);
log('🗑️ 기존 플러그인 삭제 완료', 'yellow');
}
// 빌드 폴더 생성
fs.mkdirSync(buildDir, { recursive: true });
// 플러그인 폴더 복사
if (fs.existsSync(pluginDir)) {
copyDirectory(pluginDir, buildDir);
log('✅ 플러그인 파일 복사 완료', 'green');
} else {
log('❌ 플러그인 폴더를 찾을 수 없습니다', 'red');
return false;
}
log('🎉 빌드 완료!', 'green');
log(`📁 빌드 위치: ${buildDir}`, 'blue');
log('💡 StreamDock을 재시작하면 플러그인이 활성화됩니다', 'cyan');
return true;
}
// 개발 빌드 함수
function buildDev() {
log('🔨 Streamingle Camera Plugin 개발 빌드 시작...', 'cyan');
const buildDir = path.join(CURRENT_DIR, 'dist-dev');
const pluginDir = CURRENT_DIR;
// 기존 빌드 폴더 정리
if (fs.existsSync(buildDir)) {
removeDirectory(buildDir);
}
// 빌드 폴더 생성
fs.mkdirSync(buildDir, { recursive: true });
// 플러그인 폴더 복사
if (fs.existsSync(pluginDir)) {
copyDirectory(pluginDir, path.join(buildDir, PLUGIN_NAME));
log('✅ 플러그인 파일 복사 완료', 'green');
} else {
log('❌ 플러그인 폴더를 찾을 수 없습니다', 'red');
return false;
}
log('🎉 개발 빌드 완료!', 'green');
log(`📁 빌드 위치: ${buildDir}`, 'blue');
return true;
}
// StreamDock에 배포 함수
function deploy() {
log('🚀 StreamDock에 플러그인 배포 시작...', 'magenta');
const pluginDir = CURRENT_DIR;
const streamdockPluginPath = path.join(STREAMDOCK_PLUGINS_PATH, PLUGIN_NAME);
// StreamDock 플러그인 폴더 확인
if (!fs.existsSync(STREAMDOCK_PLUGINS_PATH)) {
log('❌ StreamDock 플러그인 폴더를 찾을 수 없습니다', 'red');
log(`📁 예상 경로: ${STREAMDOCK_PLUGINS_PATH}`, 'yellow');
return false;
}
// 기존 플러그인 삭제
if (fs.existsSync(streamdockPluginPath)) {
removeDirectory(streamdockPluginPath);
log('🗑️ 기존 플러그인 삭제 완료', 'yellow');
}
// 새 플러그인 복사
if (fs.existsSync(pluginDir)) {
copyDirectory(pluginDir, streamdockPluginPath);
log('✅ 플러그인 복사 완료', 'green');
} else {
log('❌ 플러그인 폴더를 찾을 수 없습니다', 'red');
return false;
}
log('🎉 StreamDock 배포 완료!', 'green');
log(`📁 배포 위치: ${streamdockPluginPath}`, 'blue');
log('💡 StreamDock을 재시작하면 플러그인이 활성화됩니다', 'cyan');
return true;
}
// 개발용 배포 함수 (빌드 후 배포)
function deployDev() {
log('🚀 개발용 StreamDock 배포 시작...', 'magenta');
// 먼저 빌드
if (!buildDev()) {
return false;
}
const buildDir = path.join(CURRENT_DIR, 'dist-dev', PLUGIN_NAME);
const streamdockPluginPath = path.join(STREAMDOCK_PLUGINS_PATH, PLUGIN_NAME);
// StreamDock 플러그인 폴더 확인
if (!fs.existsSync(STREAMDOCK_PLUGINS_PATH)) {
log('❌ StreamDock 플러그인 폴더를 찾을 수 없습니다', 'red');
log(`📁 예상 경로: ${STREAMDOCK_PLUGINS_PATH}`, 'yellow');
return false;
}
// 기존 플러그인 삭제
if (fs.existsSync(streamdockPluginPath)) {
removeDirectory(streamdockPluginPath);
log('🗑️ 기존 플러그인 삭제 완료', 'yellow');
}
// 새 플러그인 복사
if (fs.existsSync(buildDir)) {
copyDirectory(buildDir, streamdockPluginPath);
log('✅ 플러그인 복사 완료', 'green');
} else {
log('❌ 빌드된 플러그인 폴더를 찾을 수 없습니다', 'red');
return false;
}
log('🎉 개발용 StreamDock 배포 완료!', 'green');
log(`📁 배포 위치: ${streamdockPluginPath}`, 'blue');
log('💡 StreamDock을 재시작하면 플러그인이 활성화됩니다', 'cyan');
return true;
}
// 정리 함수
function clean() {
log('🧹 빌드 폴더 정리 시작...', 'yellow');
const buildDir = path.join(CURRENT_DIR, 'dist');
const buildDevDir = path.join(CURRENT_DIR, 'dist-dev');
if (fs.existsSync(buildDir)) {
removeDirectory(buildDir);
log('✅ dist 폴더 삭제 완료', 'green');
}
if (fs.existsSync(buildDevDir)) {
removeDirectory(buildDevDir);
log('✅ dist-dev 폴더 삭제 완료', 'green');
}
log('🎉 정리 완료!', 'green');
}
// 도움말 함수
function help() {
log('📖 Streamingle Camera Plugin 빌드 도구', 'cyan');
log('', 'white');
log('사용법:', 'yellow');
log(' node build.js <명령>', 'white');
log('', 'white');
log('명령:', 'yellow');
log(' build - 프로덕션 빌드 (dist 폴더에 생성)', 'white');
log(' build:dev - 개발 빌드 (dist-dev 폴더에 생성)', 'white');
log(' deploy - StreamDock에 직접 배포', 'white');
log(' deploy:dev - 개발 빌드 후 StreamDock에 배포', 'white');
log(' clean - 빌드 폴더 정리', 'white');
log(' help - 이 도움말 표시', 'white');
log('', 'white');
log('예시:', 'yellow');
log(' node build.js deploy # 바로 StreamDock에 배포', 'white');
log(' node build.js deploy:dev # 개발 빌드 후 배포', 'white');
}
// 메인 실행
const command = process.argv[2];
switch (command) {
case 'build':
build();
break;
case 'build:dev':
buildDev();
break;
case 'deploy':
deploy();
break;
case 'deploy:dev':
deployDev();
break;
case 'clean':
clean();
break;
case 'help':
case '--help':
case '-h':
help();
break;
default:
log('❌ 알 수 없는 명령입니다', 'red');
log('', 'white');
help();
break;
}