UNPKG

create-blade

Version:

Create a new Blade project

155 lines (150 loc) 3.62 kB
#!/usr/bin/env node import { existsSync } from "node:fs"; import { cp, writeFile } from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { parseArgs } from "node:util"; import chalk from "chalk"; import gradient from "gradient-string"; import ora from "ora"; //#region package.json var name = "create-blade"; var version = "3.21.4"; var type = "module"; var description = "Create a new Blade project"; var repository = { "directory": "packages/create-blade", "url": "ronin-co/blade", "type": "git" }; var publishConfig = { "access": "public" }; var bin = { "create-blade": "./dist/index.js" }; var files = ["dist", "templates/**/*"]; var scripts = { "build": "tsdown", "dev": "tsdown --watch", "typecheck": "tsc --pretty" }; var keywords = [ "blade", "cli", "create", "react" ]; var author = "ronin"; var license = "Apache-2.0"; var dependencies = { "chalk": "5.4.1", "gradient-string": "3.0.0", "ora": "8.2.0" }; var devDependencies = { "@types/gradient-string": "1.1.6", "tsdown": "0.15.5", "typescript": "5.8.3" }; var package_default = { name, version, type, description, repository, publishConfig, bin, files, scripts, keywords, author, license, dependencies, devDependencies }; //#endregion //#region src/index.ts const TEMPLATES = ["advanced", "basic"]; const LOG_PREFIX = { info: `${chalk.bold(gradient([ "#473b7b", "#3584a7", "#30d2be" ])("BLADE"))} `, error: `${chalk.bold(gradient(["#930024", "#d4143e"])("ERROR"))} ` }; const logSpinner = (text) => ora({ discardStdin: false, prefixText: LOG_PREFIX.info, text }); const HELP_MESSAGE = ` Usage: create-blade [name] [options] Options: -h, --help Display this help message. -T, --template <name> Specify the template to use (default: basic). -v, --version Output the current version of create-blade. `; async function main() { const { positionals, values } = parseArgs({ allowPositionals: true, args: process.argv, options: { help: { default: false, short: "h", type: "boolean" }, template: { default: "basic", short: "T", type: "string" }, version: { default: false, short: "v", type: "boolean" } }, strict: true }); if (values.version) { console.log(package_default.version); process.exit(0); } if (values.help) { console.log(HELP_MESSAGE); process.exit(0); } if (!TEMPLATES.includes(values.template)) { console.error(LOG_PREFIX.error, `Invalid template "${values.template}"`); console.error(LOG_PREFIX.error, "Available templates:", TEMPLATES.join(", ")); process.exit(1); } const projectName = positionals.slice(2).at(-1) ?? "blade-example"; if (existsSync(path.join(process.cwd(), projectName))) { logSpinner(`Failed to create example app. A directory named \`${projectName}\` already exists`).fail(); process.exit(1); } const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const directory = { origin: path.join(__dirname, "..", "templates", values.template), target: path.join(process.cwd(), projectName) }; try { await cp(directory.origin, directory.target, { errorOnExist: true, recursive: true }); await writeFile(path.join(directory.target, ".gitignore"), `# Build output .blade/dist/ # Dependencies node_modules`); logSpinner("Successfully created example app").succeed(); } catch (error) { logSpinner("Failed to create example app").fail(); console.error(error); process.exit(1); } } main().catch(console.error); //#endregion export { };