create-blade
Version:
Create a new Blade project
155 lines (150 loc) • 3.62 kB
JavaScript
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 { };