Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: better frameworks like cli #115

Merged
merged 44 commits into from
Sep 11, 2023
Merged
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a78b815
better cli
vasucp1207 Aug 3, 2023
abc2096
playground
vasucp1207 Aug 3, 2023
04cdc5c
build project
vasucp1207 Aug 3, 2023
c81c506
build project
vasucp1207 Aug 3, 2023
78551d2
remove esbuild templates
vasucp1207 Aug 4, 2023
51df8a4
remove esbuild templates
vasucp1207 Aug 4, 2023
1bdaba8
update test
vasucp1207 Aug 4, 2023
1d36e1e
trying building the package
vasucp1207 Aug 5, 2023
c387dcd
trying building the package
vasucp1207 Aug 5, 2023
82cd7ac
move files to scr/ folder
vasucp1207 Aug 6, 2023
5459f1b
move files to scr/ folder
vasucp1207 Aug 6, 2023
0499830
deepMerge fix
vasucp1207 Aug 6, 2023
2884f69
adding file to package.json
vasucp1207 Aug 6, 2023
26cb8db
adding template/ to package
vasucp1207 Aug 7, 2023
a0e0890
build change
vasucp1207 Aug 7, 2023
58b4e46
remove emptyDir and renderDir
vasucp1207 Aug 8, 2023
91da4bf
replace with cross-spawn
vasucp1207 Aug 9, 2023
ac5536a
replace with cross-spawn
vasucp1207 Aug 9, 2023
c375ed7
remove cross-spawn
vasucp1207 Aug 10, 2023
f027c6c
remove cross-spawn
vasucp1207 Aug 10, 2023
e01c429
Update contrib/create-waku/src/cli.ts
vasucp1207 Aug 12, 2023
c8e8b96
Update contrib/create-waku/src/cli.ts
vasucp1207 Aug 12, 2023
5ffbd5e
Update contrib/create-waku/src/cli.ts
vasucp1207 Aug 12, 2023
0713dc4
relative to the script location
vasucp1207 Aug 14, 2023
045d405
remove test file
vasucp1207 Aug 16, 2023
6cffde3
Update contrib/create-waku/src/cli.ts
vasucp1207 Aug 16, 2023
2a98e6a
Update contrib/create-waku/src/cli.ts
vasucp1207 Aug 16, 2023
2fc635b
refactor
vasucp1207 Aug 16, 2023
5fa654c
packageJson write
vasucp1207 Aug 16, 2023
00bc21f
packageJson write
vasucp1207 Aug 16, 2023
ef34f61
remove render
vasucp1207 Aug 17, 2023
6b1ede3
remove render
vasucp1207 Aug 17, 2023
c65f424
rebase
vasucp1207 Aug 30, 2023
9dff783
new monorepo structure
vasucp1207 Aug 30, 2023
b7f030c
new monorepo structure
vasucp1207 Aug 30, 2023
f025623
update dir structure
vasucp1207 Aug 30, 2023
6b990b3
Update package.json
vasucp1207 Aug 30, 2023
472d830
update pnpm yaml
vasucp1207 Sep 2, 2023
31792f0
Update packages/create-waku/package.json
dai-shi Sep 3, 2023
2a52aac
types for fs-extra
vasucp1207 Sep 3, 2023
81a54d0
Update types.d.ts
vasucp1207 Sep 3, 2023
016f005
fix prettier issue
vasucp1207 Sep 4, 2023
47e71fa
Update .gitignore
vasucp1207 Sep 5, 2023
4c549d9
Update packages/create-waku/src/cli.ts
dai-shi Sep 5, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 0 additions & 49 deletions packages/create-waku/cli.js

This file was deleted.

29 changes: 24 additions & 5 deletions packages/create-waku/package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,29 @@
{
"name": "create-waku",
"version": "0.4.10",
"author": "Daishi Kato",
"repository": {
"type": "git",
"url": "https://github.com/dai-shi/waku.git"
"bin": "dist/cli.js",
dai-shi marked this conversation as resolved.
Show resolved Hide resolved
"files": [
"src",
"dist",
"template"
],
"type": "commonjs",
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Future TODO: make type=module and use swc instead of esbuild.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I will take look into this.

"scripts": {
"start": "node dist/cli.js",
"template": "cp -r ../../examples template/",
dai-shi marked this conversation as resolved.
Show resolved Hide resolved
"build": "esbuild src/* --bundle --platform=node --outdir=dist"
},
"bin": "./cli.js"
"dependencies": {
"fs-extra": "^11.1.1",
"kolorist": "^1.8.0",
"prompts": "^2.4.2"
},
"devDependencies": {
"@types/fs-extra": "^11.0.1",
"@types/node": "^20.4.7",
"@types/prompts": "^2.4.4",
"esbuild": "0.18.17",
"typescript": "^5.1.6"
},
"prettier": {}
dai-shi marked this conversation as resolved.
Show resolved Hide resolved
}
172 changes: 172 additions & 0 deletions packages/create-waku/src/cli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
#!/usr/bin/env node

// FIXME the following is temporarily and will remove it soon
/* eslint-disable */

dai-shi marked this conversation as resolved.
Show resolved Hide resolved
import fs from "node:fs";
import path from "node:path";
import prompts from "prompts";
import { red, green, bold } from "kolorist";
import fse from "fs-extra/esm";

function isValidPackageName(projectName: string) {
return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(
projectName,
);
}

function toValidPackageName(projectName: string) {
return projectName
.trim()
.toLowerCase()
.replace(/\s+/g, "-")
.replace(/^[._]/, "")
.replace(/[^a-z0-9-~]+/g, "-");
}

// if the dir is empty or not exist
function canSafelyOverwrite(dir: string) {
return !fs.existsSync(dir) || fs.readdirSync(dir).length === 0;
}

async function init() {
let targetDir = "";
const defaultProjectName = "waku-project";

const CHOICES = fs.readdirSync("template");
let result: {
packageName: string;
shouldOverwrite: string;
chooseProject: string;
};

try {
result = await prompts(
[
{
name: "projectName",
type: "text",
message: "Project Name",
initial: defaultProjectName,
onState: (state: any) =>
(targetDir = String(state.value).trim() || defaultProjectName),
},
{
name: "shouldOverwrite",
type: () => (canSafelyOverwrite(targetDir) ? null : "confirm"),
message: `${targetDir} is not empty. Remove existing files and continue?`,
},
{
name: "overwriteChecker",
type: (values: any) => {
if (values === false) {
throw new Error(red("✖") + " Operation cancelled");
}
return null;
},
},
{
name: "packageName",
type: () => (isValidPackageName(targetDir) ? null : "text"),
message: "Package name",
initial: () => toValidPackageName(targetDir),
validate: (dir: string) =>
isValidPackageName(dir) || "Invalid package.json name",
},
{
name: "chooseProject",
type: "select",
message: "Choose a starter template",
choices: [
{ title: "basic-template", value: CHOICES[0] },
{ title: "async-template", value: CHOICES[1] },
{ title: "promise-template", value: CHOICES[2] },
],
},
],
{
onCancel: () => {
throw new Error(red("✖") + " Operation cancelled");
},
},
);
} catch (cancelled) {
if (cancelled instanceof Error) {
console.log(cancelled.message);
}
process.exit(1);
}

const { packageName, shouldOverwrite, chooseProject } = result;

const root = path.resolve(targetDir);

if (shouldOverwrite) {
fse.emptyDirSync(root);
} else if (!fs.existsSync(root)) {
fs.mkdirSync(root);
dai-shi marked this conversation as resolved.
Show resolved Hide resolved
}

const pkg = {
name: packageName ?? toValidPackageName(targetDir),
version: "0.0.0",
};

console.log("Setting up project...");

const templateRoot = path.join(__dirname, "../template");
const templateDir = path.resolve(templateRoot, chooseProject);

// Read existing package.json from the root directory
const packageJsonPath = path.join(root, "package.json");

// Read new package.json from the template directory
const newPackageJsonPath = path.join(templateDir, "package.json");
const newPackageJson = JSON.parse(
fs.readFileSync(newPackageJsonPath, "utf-8"),
);

fse.copySync(templateDir, root);

fs.writeFileSync(
packageJsonPath,
JSON.stringify(
{
...newPackageJson,
...pkg,
},
null,
2,
),
);

const manager = process.env.npm_config_user_agent ?? "";
const packageManager = /pnpm/.test(manager)
? "pnpm"
: /yarn/.test(manager)
? "yarn"
: "npm";

const commandsMap = {
install: {
pnpm: "pnpm install",
yarn: "yarn",
npm: "npm install",
},
dev: {
pnpm: "pnpm dev",
yarn: "yarn dev",
npm: "npm run dev",
},
};

console.log(`\nDone. Now run:\n`);
console.log(`${bold(green(`cd ${targetDir}`))}`);
console.log(`${bold(green(commandsMap.install[packageManager]))}`);
console.log(`${bold(green(commandsMap.dev[packageManager]))}`);
console.log();
}

init().catch((e) => {
console.error(e);
});
Loading