136 lines
3.2 KiB
JavaScript
136 lines
3.2 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Mizuki 内容仓库初始化脚本
|
|
* 帮助用户快速设置代码内容分离
|
|
*/
|
|
|
|
import { execSync } from "child_process";
|
|
import fs from "fs";
|
|
import path from "path";
|
|
import readline from "readline";
|
|
import { fileURLToPath } from "url";
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
const rootDir = path.resolve(__dirname, "..");
|
|
|
|
// 加载 .env 文件的辅助函数
|
|
function loadEnvFile(envPath) {
|
|
if (!fs.existsSync(envPath)) return;
|
|
|
|
const envContent = fs.readFileSync(envPath, "utf-8");
|
|
envContent.split("\n").forEach((line) => {
|
|
line = line.trim();
|
|
if (!line || line.startsWith("#")) return;
|
|
|
|
const match = line.match(/^([^=]+)=(.*)$/);
|
|
if (match) {
|
|
const key = match[1].trim();
|
|
let value = match[2].trim();
|
|
value = value.replace(/^["']|["']$/g, "");
|
|
process.env[key] = value;
|
|
}
|
|
});
|
|
}
|
|
|
|
// 加载现有的 .env 文件
|
|
loadEnvFile(path.join(rootDir, ".env"));
|
|
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
});
|
|
|
|
function question(query) {
|
|
return new Promise((resolve) => rl.question(query, resolve));
|
|
}
|
|
|
|
function exec(command, options = {}) {
|
|
try {
|
|
return execSync(command, { stdio: "inherit", ...options });
|
|
} catch (error) {
|
|
console.error(`Command execution failed: ${command}`);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
console.log("Mizuki Content Repository Initialization\n");
|
|
|
|
console.log("Using independent repository mode to manage content\n");
|
|
|
|
// 询问内容仓库 URL
|
|
const repoUrl = await question("Content repository URL: ");
|
|
|
|
if (!repoUrl.trim()) {
|
|
console.error("Error: Content repository URL cannot be empty!");
|
|
rl.close();
|
|
return;
|
|
}
|
|
|
|
// 确认信息
|
|
console.log("\nConfiguration:");
|
|
console.log(" Mode: Independent Repository");
|
|
console.log(` Repository: ${repoUrl.trim()}`);
|
|
|
|
const confirm = await question("\nConfirm initialization? (y/n): ");
|
|
|
|
if (confirm.toLowerCase() !== "y") {
|
|
console.log("Initialization cancelled");
|
|
rl.close();
|
|
return;
|
|
}
|
|
|
|
console.log("\nStarting initialization...\n");
|
|
|
|
// 创建 .env 文件
|
|
const envPath = path.join(rootDir, ".env");
|
|
const envContent = `# Mizuki Content Repository Configuration
|
|
# Auto-generated by initialization script
|
|
|
|
CONTENT_REPO_URL=${repoUrl.trim()}
|
|
CONTENT_DIR=./content
|
|
|
|
# Umami configuration (optional)
|
|
# UMAMI_API_KEY=your_api_key_here
|
|
|
|
# bcrypt configuration
|
|
BCRYPT_SALT_ROUNDS=12
|
|
`;
|
|
|
|
fs.writeFileSync(envPath, envContent);
|
|
console.log("Created .env file");
|
|
|
|
// 同步内容
|
|
console.log("Synchronizing content repository...");
|
|
try {
|
|
exec("pnpm run sync-content", {
|
|
cwd: rootDir,
|
|
env: {
|
|
...process.env,
|
|
CONTENT_REPO_URL: repoUrl.trim(),
|
|
},
|
|
});
|
|
console.log("Content synchronized successfully");
|
|
} catch (error) {
|
|
console.error(
|
|
"Content synchronization failed. Run manually: pnpm run sync-content",
|
|
);
|
|
}
|
|
|
|
// 提示后续步骤
|
|
console.log("\nInitialization completed\n");
|
|
console.log("\nDocumentation:");
|
|
console.log("- Content repository: docs/CONTENT_REPOSITORY.md");
|
|
console.log("- Migration guide: docs/MIGRATION_GUIDE.md");
|
|
|
|
rl.close();
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error("Initialization failed:", error);
|
|
rl.close();
|
|
process.exit(1);
|
|
});
|