UNPKG

v3mt

Version:

A CLI toolkit for managing and deploying Victoria 3 mods, including sending mod files to the game, launching the game, and more.

88 lines (87 loc) 3.3 kB
import fs from "fs"; import path from "path"; import * as jsonc from "jsonc-parser"; import { vsc_presentation, vsc_tasks } from "./vsc-source.js"; import ensureDirSync from "../../utils/filesystem/tools/ensureDirSync.js"; const command = "create-vsc-tasks"; const use = (program) => { return program .command(command) .description("Create tasks within Visual Studio Code") .action(task); }; const createVSCTasks = { use, command, task }; export default createVSCTasks; async function task() { const vscodeDir = ensureDirSync(path.resolve(process.cwd(), ".vscode")); const tasksFile = path.join(vscodeDir, "tasks.json"); if (!fs.existsSync(tasksFile)) { createTasksFile(tasksFile); } else { updateTasksFile(tasksFile); } } function createTasksFile(tasksFile) { const newContent = { version: "2.0.0", presentation: vsc_presentation, tasks: vsc_tasks, }; fs.writeFileSync(tasksFile, JSON.stringify(newContent, null, 2), "utf8"); console.log(`Created new tasks.json at ${tasksFile}`); } function updateTasksFile(tasksFile) { let content = fs.readFileSync(tasksFile, "utf8"); const parsed = jsonc.parse(content); if (!parsed || typeof parsed !== "object") { console.error("Invalid tasks.json format, aborting update."); process.exit(1); } const formattingOptions = { insertSpaces: true, tabSize: 2 }; try { if (!parsed.version) { const edits = jsonc.modify(content, ["version"], "2.0.0", { formattingOptions, }); content = jsonc.applyEdits(content, edits); } if (!parsed.presentation) { const edits = jsonc.modify(content, ["presentation"], vsc_presentation, { formattingOptions, }); content = jsonc.applyEdits(content, edits); } else { for (const key in vsc_presentation) { if (parsed.presentation[key] === undefined) { const edits = jsonc.modify(content, ["presentation", key], vsc_presentation[key], { formattingOptions, }); content = jsonc.applyEdits(content, edits); } } } if (!Array.isArray(parsed.tasks)) { const edits = jsonc.modify(content, ["tasks"], [], { formattingOptions }); content = jsonc.applyEdits(content, edits); } const currentTasks = parsed.tasks ?? []; const tasksToAdd = vsc_tasks.filter((newTask) => !currentTasks.some((t) => t.label === newTask.label)); if (tasksToAdd.length > 0) { for (const newTask of tasksToAdd) { const edits = jsonc.modify(content, ["tasks", -1], newTask, { formattingOptions, isArrayInsertion: true, }); content = jsonc.applyEdits(content, edits); } } fs.writeFileSync(tasksFile, content, "utf8"); console.log(`Updated tasks.json at ${tasksFile}`); } catch (err) { console.error("Failed to modify tasks.json:", err instanceof Error ? err.message : String(err)); process.exit(1); } }