@cellajs/create-cella 0.0.8 → 0.0.9

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.
@@ -0,0 +1,15 @@
1
+ import { defineBuildConfig } from 'unbuild'
2
+
3
+ export default defineBuildConfig({
4
+ entries: ['src/index'],
5
+ outDir: 'dist',
6
+ clean: true,
7
+ rollup: {
8
+ inlineDependencies: true,
9
+ esbuild: {
10
+ target: 'node18',
11
+ minify: true,
12
+ },
13
+ },
14
+ declaration: true, // Generate .d.ts files for TypeScript consumers
15
+ })
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.mjs ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env tsx
2
+ import w,{resolve as h,basename as y,join as O,relative as A}from"node:path";import{existsSync as b}from"node:fs";import{input as _,confirm as L,select as B}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{fileURLToPath as z}from"node:url";import Q from"validate-npm-package-name";import u from"picocolors";import{downloadTemplate as U}from"giget";import f from"yocto-spinner";import W from"cross-spawn";import{spawn as V}from"node:child_process";const q="@cellajs/create-cella",J="0.0.9",H="MIT",K="Create your own app in seconds with Cella: a TypeScript template for local-first web apps.",Y={access:"public"},X={type:"git",url:"https://github.com/cellajs/cella",directory:"cli/create-cella"},Z="https://cellajs.com",ee="CellaJS <info@cellajs.com>",te={node:">=20.14.0"},ne="module",oe="./src/index.ts",ae={"create-cella":"index.js"},ie={create:"tsx ./src/index.ts",clean:"rimraf ./dist",build:"unbuild",prepublishOnly:"pnpm run build"},re="pnpm@9.11.0",se={"@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"},ce={tsx:"^4.19.2",unbuild:"^2.0.0"},v={name:q,version:J,private:!1,license:H,description:K,publishConfig:Y,repository:X,homepage:Z,author:ee,engines:te,type:ne,main:oe,bin:ae,scripts:ie,packageManager:re,dependencies:se,devDependencies:ce},E="create-cella",le="github:cellajs/cella",pe="git@github.com:cellajs/cella.git",de=v.version,me=v.author,ue=v.homepage,ge=["info","./cli/create-cella"],fe=["./backend/drizzle"],we={"./backend/.env.example":"./backend/.env","./frontend/.env.example":"./frontend/.env","./tus/.env.example":"./tus/.env","./info/QUICKSTART.md":"README.md"},he=`
3
+ _ _
4
+ \u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2593\u2592 ___ ___| | | __ _
5
+ \u2592\u2593\u2588 \u2588\u2593\u2592 / __/ _ \\ | |/ _\` |
6
+ \u2592\u2593\u2588 \u2588\u2593\u2592 | (_| __/ | | (_| |
7
+ \u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2593\u2592 \\___\\___|_|_|\\__,_|
8
+ `;async function ye(){const e=h(z(import.meta.url),"../../../package.json"),t=await P(e,"utf-8");return JSON.parse(t)}const ke=await ye();function k(e){const t=Q(e);return t.validForNewPackages?{valid:!0}:{valid:!1,problems:[...t.errors||[],...t.warnings||[]]}}let S=null,F=null,x=null;const ve="pnpm",C=new M(E).version(ke.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]}`);x=!0,F=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(),$e=C.opts({skipNewBranch:!1,skipClean:!1,skipGit:!1,skipInstall:!1,skipGenerate:!1}),o={options:$e,args:C.args,directory:S,newBranchName:F,createNewBranch:x,packageManager:ve};async function be(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=W(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 _e(e){return j(e,["install"],{NODE_ENV:"development"})}async function Ne(e){return j(e,["generate"],{NODE_ENV:"development"})}async function Ee({targetFolder:e,projectName:t}){return process.cwd()!==e&&process.chdir(e),new Promise(async(a,i)=>{try{for(const[n,r]of Object.entries(we)){const p=w.resolve(e,n),l=w.resolve(e,r);await xe(p,l)}await Promise.all(fe.map(n=>{const r=w.resolve(e,n);return Se(r)})),await Promise.all(ge.map(n=>{const r=w.resolve(e,n);return Fe(r)})),a()}catch(n){i(`Error during the cleaning process: ${n}`)}})}async function Se(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 Fe(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 Ce(e){return e.startsWith("merge")?"merge":e.startsWith("diff")?"diff":"other"}function je(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=Ce(t),r=V(`git ${t}`,[],{cwd:e,shell:!0,timeout:6e4});let p="",l="";r.on("error",s=>{i(s)}),r.on("exit",s=>{je(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 Te({targetFolder:e,remoteUrl:t=pe,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 T=f({text:"Creating project folder"}).start();await D(t,{recursive:!0}),process.chdir(t),T.success("Project folder created");const G=f({text:"Downloading `cella` template"}).start();if(await U(le,{cwd:process.cwd(),dir:t,force:!0,provider:"github"}),G.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 Ee({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 _e(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 Ne(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=O(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(I){console.error(I),c.error("Failed to initialize Git repository or create branch"),process.exit(1)}}await Te({targetFolder:t}),console.info(),console.info(`${u.green("Success")} Created ${e} at ${t}`),console.info();const $=s!==t;if($){const c=A(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(he),console.info(),console.info(`Cella CLI: ${de}`),console.info(`Created by: ${me}`),console.info(`Website: ${ue}`),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 L({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 be(e)){const i=`${o.directory==="."?"Current directory":`Target directory "${e}"`} is not empty. Please choose how you would like to proceed:`;await B({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/index.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import './dist/index.mjs'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cellajs/create-cella",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
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.",
@@ -18,12 +18,15 @@
18
18
  "node": ">=20.14.0"
19
19
  },
20
20
  "type": "module",
21
- "main": "index.ts",
21
+ "main": "./src/index.ts",
22
22
  "bin": {
23
- "create-cella": "index.ts"
23
+ "create-cella": "index.js"
24
24
  },
25
25
  "scripts": {
26
- "create": "tsx index.ts"
26
+ "create": "tsx ./src/index.ts",
27
+ "clean": "rimraf ./dist",
28
+ "build": "unbuild",
29
+ "prepublishOnly": "pnpm run build"
27
30
  },
28
31
  "packageManager": "pnpm@9.11.0",
29
32
  "dependencies": {
@@ -33,7 +36,10 @@
33
36
  "giget": "^1.2.3",
34
37
  "picocolors": "^1.1.0",
35
38
  "validate-npm-package-name": "^5.0.1",
36
- "yocto-spinner": "^0.1.0",
37
- "tsx": "^4.19.2"
39
+ "yocto-spinner": "^0.1.0"
40
+ },
41
+ "devDependencies": {
42
+ "tsx": "^4.19.2",
43
+ "unbuild": "^2.0.0"
38
44
  }
39
45
  }
package/src/index.ts CHANGED
File without changes
package/tsconfig.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "jsx": "react-jsx",
5
+ "target": "ESNext",
6
+ "module": "ESNext",
7
+
8
+ "strict": false,
9
+ "incremental": false,
10
+ "declaration": true,
11
+ "composite": false,
12
+ },
13
+ "moduleResolution": "Bundler",
14
+ "include": ["src", "build.config.ts"]
15
+ }
package/index.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env tsx
2
-
3
- import './src/index.ts';