create-moost
Version:
300 lines (291 loc) • 9.5 kB
JavaScript
//#region rolldown:runtime
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: ((k) => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
//#endregion
const __moostjs_event_cli = __toESM(require("@moostjs/event-cli"));
const __wooksjs_event_cli = __toESM(require("@wooksjs/event-cli"));
const fs = __toESM(require("fs"));
const prompts = __toESM(require("prompts"));
const __prostojs_rewrite = __toESM(require("@prostojs/rewrite"));
const path = __toESM(require("path"));
//#region packages/create-moost/src/prompts.ts
const defaultProjectName = "moost-app";
async function getPrompts(inputs) {
const predefined = {
targetDir: inputs.name || "",
projectName: inputs.name || "",
packageName: inputs.name || ""
};
try {
const results = await (0, prompts.default)([
{
name: "projectName",
type: predefined.targetDir ? null : "text",
message: "Project name:",
initial: defaultProjectName,
onState: (state) => predefined.targetDir = String(state.value).trim() || defaultProjectName
},
{
name: "overwrite",
type: () => canSkipEmptying(predefined.targetDir) || inputs.force ? null : "confirm",
message: () => {
const dirForPrompt = predefined.targetDir === "." ? "Current directory" : `Target directory "${predefined.targetDir}"`;
return `${dirForPrompt} is not empty. Remove existing files and continue?`;
}
},
{
name: "overwriteChecker",
type: (prev, values) => {
if (values.overwrite === false) throw new Error("Operation cancelled");
return null;
}
},
{
name: "type",
type: () => {
if (inputs.cli && !inputs.http) {
predefined.type = "cli";
return null;
}
if (!inputs.cli && inputs.http) {
predefined.type = "http";
return null;
}
return "select";
},
message: "Moost Adapter:",
choices: [{
title: "HTTP (Web) Application",
value: "http"
}, {
title: "CLI Application",
value: "cli"
}]
},
{
name: "packageName",
type: () => isValidPackageName(predefined.targetDir) ? null : "text",
message: "Package name:",
initial: () => toValidPackageName(predefined.targetDir),
validate: (dir) => isValidPackageName(dir) || "Invalid package.json name"
},
{
name: "wf",
type: (prev, values) => inputs.wf || values.type === "cli" || inputs.cli ? null : "toggle",
message: "Add Moost Workflows Example?",
initial: false,
active: "Yes",
inactive: "No"
},
{
name: "domelint",
type: () => inputs.domelint ? null : "toggle",
message: "Add do-me-lint (smart eslint installer)?",
initial: false,
active: "Yes",
inactive: "No"
}
], { onCancel: () => {
throw new Error("Operation cancelled");
} });
return {
...predefined,
...results,
packageName: results.packageName || results.targetDir || predefined.targetDir
};
} catch (error) {
console.log(error.message);
process.exit(1);
}
}
function canSkipEmptying(dir) {
if (!(0, fs.existsSync)(dir)) return true;
const files = (0, fs.readdirSync)(dir);
if (files.length === 0) return true;
if (files.length === 1 && files[0] === ".git") return true;
return false;
}
function isValidPackageName(projectName) {
return /^(?:@[\d*a-z~-][\d*._a-z~-]*\/)?[\da-z~-][\d._a-z~-]*$/.test(projectName);
}
function toValidPackageName(projectName) {
return projectName.trim().toLowerCase().replace(/\s+/g, "-").replace(/^[._]/, "").replace(/[^\da-z~-]+/g, "-");
}
//#endregion
//#region packages/create-moost/src/scaffold.ts
const rw = new __prostojs_rewrite.ProstoRewrite({ textPattern: [
"*.{js,jsx,ts,tsx,txt,json,jsonc,yml,yaml,md,ini,css,html}",
"Dockerfile",
"*config",
".gitignore",
".eslintrc.json",
".prettierignore",
".prettierrc"
] });
const root = process.cwd();
const { version } = JSON.parse((0, fs.readFileSync)((0, path.join)(__dirname, "../package.json")).toString());
async function scaffold(data) {
const projectDir = (0, path.join)(root, data.targetDir);
if ((0, fs.existsSync)(projectDir)) {
if (data.overwrite) emptyDirectorySync(projectDir);
} else (0, fs.mkdirSync)(projectDir);
const templatePath = (0, path.join)(__dirname, "../templates", data.type);
const commonPath = (0, path.join)(__dirname, "../templates/common");
const wfPath = (0, path.join)(__dirname, "../templates/wf");
const context = {
...data,
version
};
const excludeCommon = [];
if (!data.domelint) excludeCommon.push(".domelintrc.yml");
await rw.rewriteDir({
baseDir: templatePath,
output: projectDir,
renameFile(filename) {
if (filename.endsWith(".jsonc")) return filename.replace(/c$/, "");
return filename;
}
}, context);
await rw.rewriteDir({
baseDir: commonPath,
output: projectDir,
exclude: excludeCommon,
renameFile(filename) {
if (filename.endsWith(".jsonc")) return filename.replace(/c$/, "");
return filename;
}
}, context);
if (data.wf) await rw.rewriteDir({
baseDir: wfPath,
output: projectDir,
renameFile(filename) {
if (filename.endsWith(".jsonc")) return filename.replace(/c$/, "");
return filename;
}
}, context);
}
function emptyDirectorySync(directory) {
if ((0, fs.existsSync)(directory)) (0, fs.readdirSync)(directory).forEach((file) => {
const currentPath = (0, path.join)(directory, file);
if ((0, fs.lstatSync)(currentPath).isDirectory()) {
emptyDirectorySync(currentPath);
(0, fs.rmdirSync)(currentPath);
} else (0, fs.unlinkSync)(currentPath);
});
}
//#endregion
//#region packages/create-moost/src/index.ts
function _ts_decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function _ts_metadata(k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
}
function _ts_param(paramIndex, decorator) {
return function(target, key) {
decorator(target, key, paramIndex);
};
}
let Commands = class Commands$1 extends __moostjs_event_cli.CliApp {
root() {
return this.execute();
}
withName(name) {
return this.execute(name);
}
async execute(name) {
(0, __wooksjs_event_cli.useAutoHelp)() && process.exit(0);
const prompts$2 = await getPrompts({
name,
http: !!(0, __wooksjs_event_cli.useCliOption)("http"),
cli: !!(0, __wooksjs_event_cli.useCliOption)("cli"),
wf: !!(0, __wooksjs_event_cli.useCliOption)("wf"),
domelint: !!(0, __wooksjs_event_cli.useCliOption)("domelint"),
force: !!(0, __wooksjs_event_cli.useCliOption)("force")
});
console.log("\nScaffolding a new project...");
await scaffold(prompts$2);
const cli = prompts$2.type === "cli";
return `
[97m[1mSuccess! [22mYour new "${prompts$2.projectName}" project has been created successfully. [39m
Follow these next steps to start your development server:
1. Navigate to your new project:
[36mcd ${prompts$2.targetDir} [39m
2. Install the dependencies:
[36mnpm install [39m
${cli ? `
3. Make bin.js executable:
[36mchmod +x ./bin.js [39m
` : ""}
${cli ? "4" : "3"}. Start the development server:
[36mnpm run dev${cli ? " -- hello World" : ""}[39m
[32mYou're all set! The development server will help you in building your application.
Enjoy coding, and build something amazing![39m
`;
}
};
_ts_decorate([
(0, __moostjs_event_cli.Cli)(""),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", []),
_ts_metadata("design:returntype", void 0)
], Commands.prototype, "root", null);
_ts_decorate([
(0, __moostjs_event_cli.Cli)(":name"),
_ts_param(0, (0, __moostjs_event_cli.Param)("name")),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [String]),
_ts_metadata("design:returntype", void 0)
], Commands.prototype, "withName", null);
function run() {
new Commands().useOptions([
{
keys: ["http"],
description: "Use Moost HTTP",
type: Boolean
},
{
keys: ["cli"],
description: "Use Moost CLI",
type: Boolean
},
{
keys: ["wf"],
description: "Add Workflow Adapter",
type: Boolean
},
{
keys: ["domelint"],
description: "Add do-me-lint (smart eslint installer)",
type: Boolean
},
{
keys: ["force"],
description: "Force Overwrite",
type: Boolean
}
]).start();
}
//#endregion
exports.run = run;