mirror of
https://github.com/robonen/tools.git
synced 2026-03-20 02:44:45 +00:00
feat(cli): update CLI tool for project creation with package.json and config generation
This commit is contained in:
@@ -1,16 +1,55 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
import { mkdir, writeFile } from 'node:fs/promises';
|
import { mkdir, writeFile } from 'node:fs/promises';
|
||||||
import { defineCommand, runMain } from 'citty';
|
import { defineCommand, runMain } from 'citty';
|
||||||
import { resolve } from 'pathe';
|
import { resolve } from 'node:path';
|
||||||
import { splitByCase } from 'scule';
|
import { splitByCase } from 'scule';
|
||||||
|
|
||||||
const PACKAGE_MANAGER = 'pnpm@9.11.0';
|
async function getLatestPackageVersion(packageName: string) {
|
||||||
const NODE_VERSION = '>=20.17.0';
|
try {
|
||||||
const VITE_VERSION = '^5.4.8';
|
const response = await fetch(`https://registry.npmjs.org/${packageName}`);
|
||||||
const VITE_DTS_VERSION = '^4.2.2';
|
const data = await response.json();
|
||||||
const PATHE_VERSION = '^1.1.2'
|
|
||||||
|
if (!response.ok) {
|
||||||
|
console.warn(`Failed to fetch latest version for ${packageName}, using fallback`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const latestVersion = data['dist-tags']?.latest as string | undefined;
|
||||||
|
|
||||||
|
if (!latestVersion)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
version: latestVersion,
|
||||||
|
versionRange: `^${latestVersion}`,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.warn(`Error fetching version for ${packageName}: ${error.message}`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const PACKAGE_MANAGER_DEFAULT = 'pnpm@10.10.0';
|
||||||
|
const NODE_VERSION = '>=22.15.0';
|
||||||
|
const VITE_VERSION_DEFAULT = '^5.4.8';
|
||||||
|
const VITE_DTS_VERSION_DEFAULT = '^4.2.2';
|
||||||
|
const PATHE_VERSION_DEFAULT = '^1.1.2';
|
||||||
const DEFAULT_DIR = 'packages';
|
const DEFAULT_DIR = 'packages';
|
||||||
|
|
||||||
const generatePackageJson = (name: string, path: string, hasVite: boolean) => {
|
const generatePackageJson = async (name: string, path: string, hasVite: boolean) => {
|
||||||
|
const [
|
||||||
|
packageManagerVersion,
|
||||||
|
viteVersion,
|
||||||
|
viteDtsVersion,
|
||||||
|
patheVersion,
|
||||||
|
] = await Promise.all([
|
||||||
|
getLatestPackageVersion('pnpm').then(v => v?.version || PACKAGE_MANAGER_DEFAULT),
|
||||||
|
hasVite ? getLatestPackageVersion('vite').then(v => v?.versionRange || VITE_VERSION_DEFAULT) : VITE_VERSION_DEFAULT,
|
||||||
|
hasVite ? getLatestPackageVersion('vite-plugin-dts').then(v => v?.versionRange || VITE_DTS_VERSION_DEFAULT) : VITE_DTS_VERSION_DEFAULT,
|
||||||
|
hasVite ? getLatestPackageVersion('pathe').then(v => v?.versionRange || PATHE_VERSION_DEFAULT) : PATHE_VERSION_DEFAULT,
|
||||||
|
]);
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
name,
|
name,
|
||||||
private: true,
|
private: true,
|
||||||
@@ -24,7 +63,7 @@ const generatePackageJson = (name: string, path: string, hasVite: boolean) => {
|
|||||||
url: 'git+https://github.com/robonen/tools.git',
|
url: 'git+https://github.com/robonen/tools.git',
|
||||||
directory: path,
|
directory: path,
|
||||||
},
|
},
|
||||||
packageManager: PACKAGE_MANAGER,
|
packageManager: `pnpm@${packageManagerVersion}`,
|
||||||
engines: {
|
engines: {
|
||||||
node: NODE_VERSION,
|
node: NODE_VERSION,
|
||||||
},
|
},
|
||||||
@@ -51,9 +90,9 @@ const generatePackageJson = (name: string, path: string, hasVite: boolean) => {
|
|||||||
devDependencies: {
|
devDependencies: {
|
||||||
'@robonen/tsconfig': 'workspace:*',
|
'@robonen/tsconfig': 'workspace:*',
|
||||||
...(hasVite && {
|
...(hasVite && {
|
||||||
vite: VITE_VERSION,
|
vite: viteVersion,
|
||||||
'vite-plugin-dts': VITE_DTS_VERSION,
|
'vite-plugin-dts': viteDtsVersion,
|
||||||
pathe: PATHE_VERSION,
|
pathe: patheVersion,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -132,14 +171,15 @@ const createCommand = defineCommand({
|
|||||||
|
|
||||||
await mkdir(resolvedPath, { recursive: true });
|
await mkdir(resolvedPath, { recursive: true });
|
||||||
|
|
||||||
writeFile(`${resolvedPath}/package.json`, generatePackageJson(args.name, path, hasVite));
|
const packageJson = await generatePackageJson(args.name, path, hasVite);
|
||||||
writeFile(`${resolvedPath}/jsr.json`, generateJsrJson(args.name));
|
await writeFile(`${resolvedPath}/package.json`, packageJson);
|
||||||
writeFile(`${resolvedPath}/tsconfig.json`, generateTsConfig());
|
await writeFile(`${resolvedPath}/jsr.json`, generateJsrJson(args.name));
|
||||||
writeFile(`${resolvedPath}/README.md`, generateReadme(args.name));
|
await writeFile(`${resolvedPath}/tsconfig.json`, generateTsConfig());
|
||||||
|
await writeFile(`${resolvedPath}/README.md`, generateReadme(args.name));
|
||||||
|
|
||||||
if (hasVite) {
|
if (hasVite) {
|
||||||
mkdir(`${resolvedPath}/src`, { recursive: true });
|
await mkdir(`${resolvedPath}/src`, { recursive: true });
|
||||||
writeFile(`${resolvedPath}/vite.config.ts`, generateViteConfig());
|
await writeFile(`${resolvedPath}/vite.config.ts`, generateViteConfig());
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`Project created successfully`);
|
console.log(`Project created successfully`);
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "tools",
|
"name": "tools",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"types": "module",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"description": "Set of useful tools for web development",
|
"description": "Set of useful tools for web development",
|
||||||
@@ -24,14 +25,13 @@
|
|||||||
"@types/node": "^22.15.17",
|
"@types/node": "^22.15.17",
|
||||||
"citty": "^0.1.6",
|
"citty": "^0.1.6",
|
||||||
"jiti": "^2.4.2",
|
"jiti": "^2.4.2",
|
||||||
"pathe": "^2.0.3",
|
|
||||||
"scule": "^1.3.0",
|
"scule": "^1.3.0",
|
||||||
"vitepress": "^1.6.3"
|
"vitepress": "^1.6.3"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"all:build": "pnpm -r build",
|
"all:build": "pnpm -r build",
|
||||||
"all:test": "pnpm -r test",
|
"all:test": "pnpm -r test",
|
||||||
"create": "jiti ./cli.ts",
|
"create": "jiti ./bin/cli.ts",
|
||||||
"docs:dev": "vitepress dev .",
|
"docs:dev": "vitepress dev .",
|
||||||
"docs:build": "vitepress build .",
|
"docs:build": "vitepress build .",
|
||||||
"docs:preview": "vitepress preview ."
|
"docs:preview": "vitepress preview ."
|
||||||
|
|||||||
Reference in New Issue
Block a user