UNPKG

create-gtk

Version:

npm initializer for gtk apps using gjs

135 lines (111 loc) 3.47 kB
import fs from "node:fs"; import process from "node:process"; import { mkdirpSync } from "mkdirp"; import { execSync } from "node:child_process"; import { dirname } from "path"; import { fileURLToPath } from "url"; const __dirname = dirname(fileURLToPath(import.meta.url)); const args = process.argv.slice(2); const name = args[0]; const updatePackageJSON = (projectDir) => { const packageJSON = JSON.parse(fs.readFileSync(`${projectDir}/package.json`)); packageJSON.type = "module"; packageJSON.main = "dist/index.js"; packageJSON.bin = `bin/${packageJSON.name}`; packageJSON.scripts = { check: "tsc --noEmit", build: "node esbuild.js", }; packageJSON.devDependencies = { "@girs/adw-1": "^1.7.0-4.0.0-beta.19", "@girs/gjs": "^4.0.0-beta.19", "@girs/gtk-4.0": "^4.16.3-4.0.0-beta.19", esbuild: "^0.24.2", eslint: "^9.17.0", prettier: "^3.4.2", typescript: "^5.7.2", }; fs.writeFileSync( `${projectDir}/package.json`, JSON.stringify(packageJSON, "", 2) ); }; const updateFileContent = (projectDir, fileName, projectName) => { const srcIndex = fs.readFileSync(`${projectDir}/${fileName}`, "utf-8"); const content = srcIndex .replaceAll("<user>", process.env.USER) .replaceAll("<project.name>", projectName) .replaceAll("<year>", new Date().getFullYear()); fs.writeFileSync(`${projectDir}/${fileName}`, content); }; export default function () { if (!name) { throw new Error("Name is required"); } // check folder with name exists mkdirpSync(name); const templateDir = `${__dirname}/template/`; const projectDir = `${process.cwd()}/${name}/`; mkdirpSync(projectDir + "/.vscode"); mkdirpSync(projectDir + "/src"); mkdirpSync(projectDir + "/bin"); mkdirpSync(projectDir + "/data/icons", { recursive: true }); mkdirpSync(projectDir + "/dist"); fs.copyFile( templateDir + "/.vscode/settings.json", projectDir + "/.vscode/settings.json", (err) => { if (err) throw err; } ); const altNames = { gitignore: ".gitignore", "bin/bin": `bin/${name}`, "dist/src.gresource.xml": `dist/com.${process.env.USER}.${name}.src.gresource.xml`, "dist/app_id.js": `dist/com.${process.env.USER}.${name}.js`, "data/metainfo.xml": `data/com.${process.env.USER}.${name}.metainfo.xml`, }; [ "README.md", "LICENSE", ".editorconfig", "gitignore", ".nvmrc", "esbuild.js", "tsconfig.json", "meson.build", "src/MainWindow.ts", "src/MenuButton.ts", "src/index.ts", "bin/bin", "dist/meson.build", "dist/src.gresource.xml", "dist/app_id.js", "dist/main.js", "data/meson.build", "data/metainfo.xml", ].forEach((fileName) => { const destFileName = altNames[fileName] || fileName; fs.copyFile(templateDir + fileName, projectDir + destFileName, (err) => { if (err) throw err; }); }); process.chdir(projectDir); execSync("npm init -y"); updatePackageJSON(projectDir); [ "meson.build", "LICENSE", "README.md", "src/MainWindow.ts", "src/index.ts", `dist/com.${process.env.USER}.${name}.src.gresource.xml`, `dist/com.${process.env.USER}.${name}.js`, `data/com.${process.env.USER}.${name}.metainfo.xml`, ].forEach((fileName) => { updateFileContent(projectDir, fileName, name); }); execSync("git init"); console.log(`${name} project created`); console.log(`Run chmod +x ./bin/${name}`); }