@cellajs/create-cella 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +3 -3
- package/package.json +4 -3
- package/src/utils/package-json.ts +1 -6
package/dist/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
import w,{resolve as h,basename as y,join as
|
|
2
|
+
import w,{resolve as h,basename as y,join as A,relative as O}from"node:path";import{existsSync as b}from"node:fs";import{input as _,confirm as B,select as L}from"@inquirer/prompts";import{Command as M,InvalidArgumentError as N}from"commander";import m,{readFile as P,readdir as R,mkdir as D}from"node:fs/promises";import z from"validate-npm-package-name";import u from"picocolors";import{downloadTemplate as Q}from"giget";import f from"yocto-spinner";import U from"cross-spawn";import{spawn as W}from"node:child_process";const V="@cellajs/create-cella",q="0.0.11",J="MIT",H="Create your own app in seconds with Cella: a TypeScript template for local-first web apps.",K={access:"public"},Y={type:"git",url:"https://github.com/cellajs/cella",directory:"cli/create-cella"},X="https://cellajs.com",Z="CellaJS <info@cellajs.com>",ee={node:">=20.14.0"},te="module",ne="./src/index.ts",oe={"create-cella":"index.js"},ae={start:"tsx ./src/index.ts",clean:"rimraf ./dist",build:"unbuild","test-build":"pnpm run build && node index.js",prepare:"pnpm run build"},ie="pnpm@9.11.0",re={"@inquirer/prompts":"^6.0.1",commander:"^12.1.0","cross-spawn":"^7.0.3",giget:"^1.2.3",picocolors:"^1.1.0","validate-npm-package-name":"^5.0.1","yocto-spinner":"^0.1.0"},se={tsx:"^4.19.2",unbuild:"^2.0.0"},v={name:V,version:q,private:!1,license:J,description:H,publishConfig:K,repository:Y,homepage:X,author:Z,engines:ee,type:te,main:ne,bin:oe,scripts:ae,packageManager:ie,dependencies:re,devDependencies:se},E="create-cella",ce="github:cellajs/cella",le="git@github.com:cellajs/cella.git",pe=v.version,de=v.author,me=v.homepage,ue=["info","./cli/create-cella"],ge=["./backend/drizzle"],fe={"./backend/.env.example":"./backend/.env","./frontend/.env.example":"./frontend/.env","./tus/.env.example":"./tus/.env","./info/QUICKSTART.md":"README.md"},we=`
|
|
3
3
|
_ _
|
|
4
4
|
\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2593\u2592 ___ ___| | | __ _
|
|
5
5
|
\u2592\u2593\u2588 \u2588\u2593\u2592 / __/ _ \\ | |/ _\` |
|
|
6
6
|
\u2592\u2593\u2588 \u2588\u2593\u2592 | (_| __/ | | (_| |
|
|
7
7
|
\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2593\u2592 \\___\\___|_|_|\\__,_|
|
|
8
|
-
`;async function
|
|
9
|
-
${u.yellow("\u26A0")} Source file "${e}" does not exist > Skip copy`);else throw a}}function
|
|
8
|
+
`;async function he(){const e=h(process.cwd(),"package.json"),t=await P(e,"utf-8");return JSON.parse(t)}const ye=await he();function k(e){const t=z(e);return t.validForNewPackages?{valid:!0}:{valid:!1,problems:[...t.errors||[],...t.warnings||[]]}}let S=null,x=null,F=null;const ke="pnpm",C=new M(E).version(ye.version,"-v, --version",`Output the current version of ${E}.`).argument("[directory]","The directory name for the new project.").usage("[directory] [options]").helpOption("-h, --help","Display this help message.").option("--skip-new-branch","Skip creating a new branch during initialization.",!1).option("--skip-install","Skip the installation of packages.",!1).option("--skip-generate","Skip generating SQL files.",!1).option("--skip-clean","Skip cleaning the `cella` template.",!1).option("--skip-git","Skip initializing a git repository.",!1).option("--new-branch-name <name>","Specify a new branch name to create and use.",e=>{if(typeof e=="string"&&(e=e.trim()),e){const t=k(y(h(e)));if(!t.valid)throw new N(`Invalid branch name: ${t.problems[0]}`);F=!0,x=e}}).action(e=>{if(typeof e=="string"&&(e=e.trim()),e){const t=k(y(h(e)));if(!t.valid)throw new N(`Invalid project name: ${t.problems[0]}`);S=e}}).parse(),ve=C.opts({skipNewBranch:!1,skipClean:!1,skipGit:!1,skipInstall:!1,skipGenerate:!1}),o={options:ve,args:C.args,directory:S,newBranchName:x,createNewBranch:F,packageManager:ke};async function $e(e){const t=await R(e);return t.length===0||t.length===1&&t[0]===".git"}async function j(e,t,a={}){return new Promise((i,n)=>{const r=U(e,t,{env:{...process.env,...a},stdio:["pipe","pipe","pipe"]});let p="",l="";r.stderr?.on("data",s=>{p+=s.toString()}),r.stdout?.on("data",s=>{l+=s.toString()}),r.on("close",s=>{if(s!==0){n(`"${e} ${t.join(" ")}" failed ${l} ${p}`);return}i()})})}async function be(e){return j(e,["install"],{NODE_ENV:"development"})}async function _e(e){return j(e,["generate"],{NODE_ENV:"development"})}async function Ne({targetFolder:e,projectName:t}){return process.cwd()!==e&&process.chdir(e),new Promise(async(a,i)=>{try{for(const[n,r]of Object.entries(fe)){const p=w.resolve(e,n),l=w.resolve(e,r);await xe(p,l)}await Promise.all(ge.map(n=>{const r=w.resolve(e,n);return Ee(r)})),await Promise.all(ue.map(n=>{const r=w.resolve(e,n);return Se(r)})),a()}catch(n){i(`Error during the cleaning process: ${n}`)}})}async function Ee(e){const t=await m.readdir(e);await Promise.all(t.map(async a=>{const i=w.join(e,a);(await m.lstat(i)).isDirectory()?await m.rm(i,{recursive:!0,force:!0}):await m.rm(i)}))}async function Se(e){await m.rm(e,{recursive:!0,force:!0})}async function xe(e,t){try{await m.access(e),await m.mkdir(w.dirname(t),{recursive:!0}),await m.copyFile(e,t)}catch(a){if(a.code==="ENOENT")console.info(`
|
|
9
|
+
${u.yellow("\u26A0")} Source file "${e}" does not exist > Skip copy`);else throw a}}function Fe(e){return e.startsWith("merge")?"merge":e.startsWith("diff")?"diff":"other"}function Ce(e,t,a){return e==="merge"?t===0||t===1&&!a:e==="diff"?t===0||t===2&&!a:t===0}async function d({targetFolder:e,command:t}){return new Promise((a,i)=>{const n=Fe(t),r=W(`git ${t}`,[],{cwd:e,shell:!0,timeout:6e4});let p="",l="";r.on("error",s=>{i(s)}),r.on("exit",s=>{Ce(n,s,l)?a(p.trim()):i(`Git ${n} command failed with exit code ${s}, stderr: "${l.trim()}", stdout: "${p.trim()}"`)}),r.stdout.on("data",s=>{p+=s.toString()}),r.stderr.on("data",s=>{l+=s.toString()})})}async function je({targetFolder:e,remoteUrl:t=le,remoteName:a="upstream"}){const i=f({text:"Adding remote"}).start();try{let n=null;try{n=await d({targetFolder:e,command:`remote get-url ${a}`})}catch(r){if((typeof r=="string"?r:r?.message||"").includes("fatal: No such remote"))n=null;else throw r}n?n!==t?(await d({targetFolder:e,command:`remote remove ${a}`}),await d({targetFolder:e,command:`remote add ${a} ${t}`}),i.success("Remote updated successfully.")):i.success("Remote is already configured correctly."):(await d({targetFolder:e,command:`remote add ${a} ${t}`}),i.success("Remote added successfully."))}catch(n){console.error(n),i.error("Failed to add remote."),process.exit(1)}}async function Ge({projectName:e,targetFolder:t,newBranchName:a,skipInstall:i,skipGit:n,skipClean:r,skipGenerate:p,packageManager:l}){const s=process.cwd();console.info();const G=f({text:"Creating project folder"}).start();await D(t,{recursive:!0}),process.chdir(t),G.success("Project folder created");const I=f({text:"Downloading `cella` template"}).start();if(await Q(ce,{cwd:process.cwd(),dir:t,force:!0,provider:"github"}),I.success("`cella` template downloaded"),r)console.info(`${u.yellow("\u26A0")} --skip-clean > Skip cleaning \`cella\` template`);else{const c=f({text:"cleaning `cella` template"}).start();try{await Ne({targetFolder:t,projectName:e}),c.success("`cella` template cleaned")}catch(g){console.error(g),c.error("Failed to clean `cella` template"),process.exit(1)}}if(i)console.info(`${u.yellow("\u26A0")} --skip-install > Skip installing dependencies`);else{const c=f({text:"installing dependencies"}).start();try{await be(l),c.success("Dependencies installed")}catch(g){console.error(g),c.error("Failed to install dependencies"),process.exit(1)}}if(p)console.info(`${u.yellow("\u26A0")} --skip-generate > Skip generating SQL files`);else{const c=f({text:"generating SQL files"}).start();try{await _e(l),c.success("SQL files generated")}catch(g){console.error(g),c.error("Failed to generate SQL files"),process.exit(1)}}if(n)console.info(`${u.yellow("\u26A0")} --skip-git > Skip git init`);else{const c=f({text:"initializing git repository"}).start(),g=A(t,".git");if(b(g))c.warning("Git repository already initialized > Skip git init");else try{await d({targetFolder:t,command:"init"}),await d({targetFolder:t,command:"add ."}),await d({targetFolder:t,command:'commit -m "Initial commit"'}),a?(await d({targetFolder:t,command:`branch ${a}`}),await d({targetFolder:t,command:`checkout ${a}`}),c.success(`Git repository initialized, initial commit created, and new branch ${a} created`)):c.success("Git repository initialized and initial commit created")}catch(T){console.error(T),c.error("Failed to initialize Git repository or create branch"),process.exit(1)}}await je({targetFolder:t}),console.info(),console.info(`${u.green("Success")} Created ${e} at ${t}`),console.info();const $=s!==t;if($){const c=O(s,t);console.info("now go to your project using:"),console.info(u.cyan(` cd ${c}`)),console.info()}console.info(`${$?"then ":""}quick start with:`),console.info(u.cyan(` ${l} quick`)),console.info(),console.info("Check out the readme to get started: /README.md"),console.info(`Enjoy building ${e} using cella! \u{1F389}`),console.info()}async function Ie(){console.info(we),console.info(),console.info(`Cella CLI: ${pe}`),console.info(`Created by: ${de}`),console.info(`Website: ${me}`),console.info(),(o.options.skipNewBranch||o.options.skipGit)&&(o.createNewBranch=!1,o.newBranchName=null),o.options.skipGenerate===!0&&(o.options.skipGenerate=!0),o.options.skipInstall===!0&&(o.options.skipInstall=!0),o.options.skipClean===!0&&(o.options.skipClean=!0),o.options.skipGit===!0&&(o.options.skipGit=!0),o.directory||(o.directory=await _({message:"Enter your project name",default:"my-cella-app",validate:i=>{const n=k(y(h(i)));return n.valid?!0:`Invalid project name: ${n.problems[0]}`}})),o.createNewBranch===null&&(o.createNewBranch=await B({message:'Would you like to create a new branch (besides "main")?',default:!0})),!o.newBranchName&&o.createNewBranch&&(o.newBranchName=await _({message:"Enter the new branch name",default:"development",validate:i=>{const n=k(y(h(i)));return n.valid?!0:`Invalid branch name: ${n.problems[0]}`}}));const e=h(o.directory),t=y(e);if(b(e)&&!await $e(e)){const i=`${o.directory==="."?"Current directory":`Target directory "${e}"`} is not empty. Please choose how you would like to proceed:`;await L({message:i,choices:[{name:"Cancel and exit",value:"cancel"},{name:"Ignore existing files and continue",value:"ignore"}]})==="cancel"&&process.exit(1)}const a={projectName:t,targetFolder:e,newBranchName:o.newBranchName,skipInstall:o.options.skipInstall,skipGit:o.options.skipGit,skipClean:o.options.skipClean,skipGenerate:o.options.skipGenerate,packageManager:o.packageManager};await Ge(a)}Ie().catch(console.error);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cellajs/create-cella",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Create your own app in seconds with Cella: a TypeScript template for local-first web apps.",
|
|
@@ -23,10 +23,11 @@
|
|
|
23
23
|
"create-cella": "index.js"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
-
"
|
|
26
|
+
"start": "tsx ./src/index.ts",
|
|
27
27
|
"clean": "rimraf ./dist",
|
|
28
28
|
"build": "unbuild",
|
|
29
|
-
"
|
|
29
|
+
"test-build": "pnpm run build && node index.js",
|
|
30
|
+
"prepare": "pnpm run build"
|
|
30
31
|
},
|
|
31
32
|
"packageManager": "pnpm@9.11.0",
|
|
32
33
|
"dependencies": {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
3
|
|
|
5
4
|
interface PackageJson {
|
|
6
5
|
name?: string;
|
|
@@ -12,11 +11,7 @@ interface PackageJson {
|
|
|
12
11
|
|
|
13
12
|
// Helper function to read and parse package.json
|
|
14
13
|
async function readPackageJson(): Promise<PackageJson> {
|
|
15
|
-
const PACKAGE_JSON_FILE = resolve(
|
|
16
|
-
fileURLToPath(import.meta.url),
|
|
17
|
-
'../../../package.json'
|
|
18
|
-
);
|
|
19
|
-
|
|
14
|
+
const PACKAGE_JSON_FILE = resolve(process.cwd(), 'package.json');
|
|
20
15
|
const packageJsonContent = await readFile(PACKAGE_JSON_FILE, 'utf-8');
|
|
21
16
|
return JSON.parse(packageJsonContent) as PackageJson;
|
|
22
17
|
}
|