noshift.js
Version:
Joke language.
182 lines (149 loc) โข 4.85 kB
JavaScript
import { execSync } from "child_process";
import fs from "fs/promises";
import path from "path";
import { fileURLToPath } from "url";
import inquirer from "inquirer";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const DEFAULT_BUILD_DIR = "build";
export default async function create(projectNameArg) {
const cwd = process.cwd();
// ๐ ่จ่ช้ธๆ
const { lang } = await inquirer.prompt([
{
type: "list",
name: "lang",
message: "Select language / ่จ่ชใ้ธใใงใใ ใใ",
choices: [
{ name: "English", value: "en" },
{ name: "ๆฅๆฌ่ช", value: "ja" },
],
},
]);
const t = (key) => {
const messages = {
projectName: {
en: "Enter project name:",
ja: "ใใญใธใงใฏใๅใๅ
ฅๅใใฆใใ ใใ:",
},
creatingDir: {
en: "๐ Creating project directory:",
ja: "๐ ใใญใธใงใฏใใใฃใฌใฏใใชใไฝๆ:",
},
initializingNpm: {
en: "๐ฆ Initializing npm...",
ja: "๐ฆ npm ๅๆๅไธญ...",
},
creatingConfig: {
en: "โ๏ธ Creating nsjs.config.js",
ja: "โ๏ธ nsjs.config.js ใไฝๆ",
},
usePrettier: {
en: "Do you want to format compiled code with Prettier?",
ja: "ใณใณใใคใซๅพใฎใณใผใใ Prettier ใงๆดๅฝขใใพใใ๏ผ",
},
installingPrettier: {
en: "๐ฆ Installing Prettier...",
ja: "๐ฆ Prettier ใใคใณในใใผใซไธญ...",
},
installingNoshift: {
en: "๐ฆ Installing noshift.js...",
ja: "๐ฆ noshift.js ใใคใณในใใผใซไธญ...",
},
success: {
en: "๐ Project created successfully!",
ja: "๐ ใใญใธใงใฏใไฝๆใๅฎไบใใพใใ!",
},
nextSteps: {
en: "๐ cd {name} && npm run dev",
ja: "๐ cd {name} && npm run dev",
},
};
return messages[key][lang];
};
// ใใญใธใงใฏใๅๅๅพ
let projectName = projectNameArg;
if (!projectName) {
const answer = await inquirer.prompt([
{
type: "input",
name: "projectName",
message: t("projectName"),
default: "my-noshift-app",
},
]);
projectName = answer.projectName;
}
const projectPath = path.join(cwd, projectName);
await fs.mkdir(projectPath, { recursive: true });
console.log(`\n${t("creatingDir")} ${projectPath}`);
process.chdir(projectPath);
console.log(t("initializingNpm"));
execSync("npm init -y", { stdio: "inherit" });
// package.json ใซ scripts.dev / scripts.build ใ่ฟฝๅ
const pkgPath = path.join(projectPath, "package.json");
const pkgRaw = await fs.readFile(pkgPath, "utf-8");
const pkg = JSON.parse(pkgRaw);
pkg.scripts.dev = "node ./node_modules/noshift.js/commands/dev.js";
pkg.scripts.build = "node ./node_modules/noshift.js/commands/build.js";
await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2));
// nsjs.config.js ใไฝๆ
const configContent = `export default {
build: "", // ็ฉบใชใ ./build ใซใใซใใใใพใ
};
`;
await fs.writeFile("nsjs.config.js", configContent);
console.log(t("creatingConfig"));
// Prettier ใฎไฝฟ็จ
const { usePrettier } = await inquirer.prompt([
{
type: "confirm",
name: "usePrettier",
message: t("usePrettier"),
default: true,
},
]);
if (usePrettier) {
console.log(t("installingPrettier"));
execSync("npm install --save-dev prettier", { stdio: "inherit" });
const prettierIgnore = `build/\nnode_modules/\n`;
await fs.writeFile(".prettierignore", prettierIgnore);
const prettierConfig = `{
"semi": true,
"singleQuote": false,
"trailingComma": "es5"
}`;
await fs.writeFile(".prettierrc", prettierConfig);
}
console.log(t("installingNoshift"));
execSync("npm install noshift.js", { stdio: "inherit" });
await fs.mkdir("src", { recursive: true });
await fs.writeFile("src/index.nsjs", "console.log^8^2Hello World!^2^9;");
// README.md
const readme =
lang === "ja"
? `# ${projectName}
ใใใฏ [noshift.js](https://github.com/otoneko1102/NoShift.js) ใใญใธใงใฏใใงใใ
## ้็บ
\`\`\`bash
npm run dev
\`\`\`
## ใใซใ
\`\`\`bash
npm run build
\`\`\`
`
: `# ${projectName}
This is a [NoShift.js](https://github.com/otoneko1102/NoShift.js) project.
## Development
\`\`\`bash
npm run dev
\`\`\`
## Build
\`\`\`bash
npm run build
\`\`\`
`;
await fs.writeFile("README.md", readme);
console.log(`\n${t("success")}`);
console.log("\n" + t("nextSteps").replace("{name}", projectName));
}