create-xeikit-app 1.0.0 → 1.1.0

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.cjs CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";const citty=require("citty"),e=require("consola"),utils=require("consola/utils"),pathe=require("pathe"),stdEnv=require("std-env"),node_fs=require("node:fs"),tinyexec=require("tinyexec"),nypm=require("nypm"),giget=require("giget");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const e__default=_interopDefaultCompat(e),name="create-xeikit-app",version="1.0.0",description="CLI tool for scaffolding projects with xeikit/starter templates.",handleError=t=>{e__default.error(t.toString()),process.exit(1)},verifyDirectoryDoesNotExist=t=>{node_fs.existsSync(t)&&(e__default.error(`The directory ${utils.colors.cyan(pathe.relative(process.cwd(),t)||t)} already exists. Please choose a different directory.`),process.exit(1))},resolvePath=(t,n)=>pathe.resolve(t,n),initializeGitIfRequested=async(t,n)=>{if(t===void 0?await e__default.prompt("Initialize git repository?",{type:"confirm",cancel:"reject"}).catch(()=>process.exit(1)):t){e__default.info(`Initializing git repository...
2
- `);try{await tinyexec.x("git",["init",n],{throwOnError:!0,nodeOptions:{stdio:"inherit"}})}catch(i){e__default.warn(`Failed to initialize git repository: ${i}`)}}},DEFAULT_REGISTRY="https://raw.githubusercontent.com/xeikit/starter/templates/templates",DEFAULT_TEMPLATE_NAME="nuxt3",PACKAGE_MANAGERS={npm:void 0,yarn:void 0,pnpm:void 0,bun:void 0,deno:void 0},PACKAGE_MANAGER_OPTIONS=Object.keys(PACKAGE_MANAGERS),TEMPLATE_OPTIONS=[{label:"Nuxt3",value:"nuxt3"}],detectCurrentPackageManager=()=>{const t=process.env.npm_config_user_agent;if(!t)return;const[n]=t.split("/");return PACKAGE_MANAGER_OPTIONS.includes(n)?n:void 0},selectPackageManager=async t=>{const n=detectCurrentPackageManager();if(t&&PACKAGE_MANAGER_OPTIONS.includes(t))return t;const i=PACKAGE_MANAGER_OPTIONS.map(r=>({label:r,value:r,hint:n===r?"current":void 0}));return e__default.prompt("Which package manager would you like to use?",{type:"select",options:i,initial:n,cancel:"reject"}).catch(()=>process.exit(1))},confirmDependenciesInstallation=async t=>{const n=await e__default.prompt("Do you want to install dependencies?",{type:"confirm",initial:t,cancel:"reject"}).catch(()=>process.exit(1));return typeof n!="boolean"&&(e__default.error("Please specify whether to install dependencies."),process.exit(1)),n},installDependenciesIfRequested=async(t,n,i)=>{if(t===!1){e__default.info("Skipping dependency installation.");return}e__default.start("Installing dependencies...");try{await nypm.installDependencies({cwd:n,packageManager:{name:i,command:i}}),e__default.success("Installation completed.")}catch(r){handleError(r)}},selectTemplate=async t=>{if(t)return t;const n=await e__default.prompt("Choose a template",{type:"select",options:TEMPLATE_OPTIONS,cancel:"reject"}).catch(()=>process.exit(1));return typeof n!="string"&&(e__default.error("Please specify a template name."),process.exit(1)),n||DEFAULT_TEMPLATE_NAME},downloadTemplateAndHandleErrors=async(t,n)=>{try{return await giget.downloadTemplate(t,{dir:n,registry:DEFAULT_REGISTRY})}catch(i){return handleError(i)}},getProjectDirectory=async t=>t!==""?t:e__default.prompt("Where would you like to create your project?",{placeholder:"./my-project",type:"text",default:"./my-project",cancel:"reject"}).catch(()=>process.exit(1)),mainCommand=citty.defineCommand({meta:{name,version,description},args:{cwd:{type:"string",description:"Specify the working directory",valueHint:"directory",default:"."},dir:{type:"positional",description:"Project directory",default:""},template:{type:"string",alias:"t",description:"Template name"},install:{type:"boolean",description:"Install dependencies"},gitInit:{type:"boolean",description:"Initialize git repository"},packageManager:{type:"string",description:"Package manager choice (npm, pnpm, yarn, bun, deno)"}},run:async({args:t})=>{stdEnv.hasTTY&&process.stdout.write(`Loading...
3
- `),e__default.info(utils.colors.bold("\u{1F389} Hello xeikit app!"));const n=await getProjectDirectory(t.dir),i=resolvePath(t.cwd,""),r=resolvePath(i,n);e__default.info(`Creating a new project in ${utils.colors.cyan(pathe.relative(i,r)||r)}.`),verifyDirectoryDoesNotExist(r);const s=await selectTemplate(t.template),o=await downloadTemplateAndHandleErrors(s,r),a=await selectPackageManager(t.packageManager),c=await confirmDependenciesInstallation(t.install);await installDependenciesIfRequested(c,o.dir,a),await initializeGitIfRequested(t.gitInit,o.dir),e__default.log(`
4
- \u{1F389} Starter project has been created with the \`${o.source}\` template.`),e__default.log(`
1
+ "use strict";const citty=require("citty"),r=require("consola"),utils=require("consola/utils"),pathe=require("pathe"),stdEnv=require("std-env"),node_fs=require("node:fs"),tinyexec=require("tinyexec"),nypm=require("nypm"),giget=require("giget");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const r__default=_interopDefaultCompat(r),name="create-xeikit-app",version="1.0.0",description="CLI tool for scaffolding projects with xeikit/starter templates.",Ok=e=>({success:!0,data:e}),Err=e=>({success:!1,error:e}),isOk=e=>e.success,createDirectoryExistsMessage=e=>{const t=pathe.relative(process.cwd(),e)||e;return`The directory ${utils.colors.cyan(t)} already exists. Please choose a different directory.`},checkDirectoryExists=e=>node_fs.existsSync(e),handleError=e=>{r__default.error(e.toString()),process.exit(1)},validateDirectoryDoesNotExist=e=>checkDirectoryExists(e)?Err(createDirectoryExistsMessage(e)):Ok(e),verifyDirectoryDoesNotExist=e=>{const t=validateDirectoryDoesNotExist(e);t.success||(r__default.error(t.error),process.exit(1))},resolvePath=(e,t)=>pathe.resolve(e,t),validateGitInitParam=e=>e===void 0?Err("Git initialization parameter is undefined"):Ok(e),promptForGitInitialization=async()=>{try{const e=await r__default.prompt("Initialize git repository?",{type:"confirm",cancel:"reject"});return Ok(e)}catch(e){return Err(e instanceof Error?e:new Error("Git initialization prompt cancelled"))}},determineGitInitialization=async e=>{const t=validateGitInitParam(e);return isOk(t)?Ok(t.data):await promptForGitInitialization()},createGitInitArgs=e=>["init",e],executeGitInit=async e=>{try{return await tinyexec.x("git",createGitInitArgs(e),{throwOnError:!0,nodeOptions:{stdio:"inherit"}}),Ok(void 0)}catch(t){return Err(t instanceof Error?t:new Error("Git initialization failed"))}},initializeGitIfRequested=async(e,t)=>{const a=await determineGitInitialization(e);if(isOk(a)||process.exit(1),!a.data)return;r__default.info(`Initializing git repository...
2
+ `);const n=await executeGitInit(t);isOk(n)||r__default.warn(`Failed to initialize git repository: ${n.error.message}`)},DEFAULT_REGISTRY="https://raw.githubusercontent.com/xeikit/starter/templates/templates",DEFAULT_TEMPLATE_NAME="nuxt3",PACKAGE_MANAGERS={npm:void 0,yarn:void 0,pnpm:void 0,bun:void 0,deno:void 0},PACKAGE_MANAGER_OPTIONS=Object.keys(PACKAGE_MANAGERS),TEMPLATE_OPTIONS=[{label:"Nuxt3",value:"nuxt3"},{label:"React Router (framework)",value:"react-router"}],parsePackageManagerFromUserAgent=e=>{const[t]=e.split("/");return PACKAGE_MANAGER_OPTIONS.includes(t)?t:void 0},detectCurrentPackageManager=()=>{const e=process.env.npm_config_user_agent;return e?parsePackageManagerFromUserAgent(e):void 0},validatePackageManagerArg=e=>e?PACKAGE_MANAGER_OPTIONS.includes(e)?Ok(e):Err(`Invalid package manager: ${e}`):Err("Package manager argument is empty"),createPackageManagerSelectOptions=e=>PACKAGE_MANAGER_OPTIONS.map(t=>({label:t,value:t,hint:e===t?"current":void 0})),promptForPackageManager=async e=>{try{const t=await r__default.prompt("Which package manager would you like to use?",{type:"select",options:createPackageManagerSelectOptions(e),initial:e,cancel:"reject"});return Ok(t)}catch(t){return Err(t instanceof Error?t:new Error("Package manager selection cancelled"))}},selectPackageManager=async e=>{const t=validatePackageManagerArg(e);if(isOk(t))return t.data;const a=detectCurrentPackageManager(),n=await promptForPackageManager(a);if(isOk(n))return n.data;process.exit(1)},validateInstallationPromptResult=e=>typeof e!="boolean"?Err("Please specify whether to install dependencies."):Ok(e),promptForDependenciesInstallation=async e=>{try{const t=await r__default.prompt("Do you want to install dependencies?",{type:"confirm",initial:e,cancel:"reject"}),a=validateInstallationPromptResult(t);return isOk(a)?a:Err(new Error(a.error))}catch(t){return Err(t instanceof Error?t:new Error("Dependencies installation prompt cancelled"))}},confirmDependenciesInstallation=async e=>{const t=await promptForDependenciesInstallation(e);if(isOk(t))return t.data;const a=t.error instanceof Error?t.error.message:String(t.error);a?.includes("Please specify")&&r__default.error(a),process.exit(1)},createInstallationConfig=(e,t)=>({cwd:e,packageManager:{name:t,command:t}}),installDependenciesWithResult=async(e,t)=>{try{return await nypm.installDependencies(createInstallationConfig(e,t)),Ok(void 0)}catch(a){return Err(a instanceof Error?a:new Error("Dependencies installation failed"))}},installDependenciesIfRequested=async(e,t,a)=>{if(e===!1){r__default.info("Skipping dependency installation.");return}r__default.start("Installing dependencies...");const n=await installDependenciesWithResult(t,a);if(isOk(n)){r__default.success("Installation completed.");return}handleError(n.error)},validateTemplateArg=e=>!e||e.trim()===""?Err("Template argument is empty or undefined"):Ok(e),validateTemplatePromptResult=e=>typeof e!="string"?Err("Please specify a template name."):Ok(e||DEFAULT_TEMPLATE_NAME),promptForTemplate=async()=>{try{const e=await r__default.prompt("Choose a template",{type:"select",options:TEMPLATE_OPTIONS,cancel:"reject"}),t=validateTemplatePromptResult(e);return isOk(t)?t:Err(new Error(t.error))}catch(e){return Err(e instanceof Error?e:new Error("Template selection cancelled"))}},selectTemplate=async e=>{const t=validateTemplateArg(e);if(isOk(t))return t.data;const a=await promptForTemplate();if(isOk(a))return a.data;r__default.error(a.error.message||"Template selection cancelled"),process.exit(1)},downloadTemplateWithResult=async(e,t)=>{try{const a=await giget.downloadTemplate(e,{dir:t,registry:DEFAULT_REGISTRY});return Ok(a)}catch(a){return Err(a instanceof Error?a:new Error("Template download failed"))}},downloadTemplateAndHandleErrors=async(e,t)=>{const a=await downloadTemplateWithResult(e,t);return isOk(a)?a.data:handleError(a.error)},validateDirectoryArg=e=>!e||e.trim()===""?Err("Directory argument is empty"):Ok(e.trim()),createProjectDirectoryPromptConfig=()=>({placeholder:"./my-project",type:"text",default:"./my-project",cancel:"reject"}),promptForProjectDirectory=async()=>{try{const e=await r__default.prompt("Where would you like to create your project?",createProjectDirectoryPromptConfig());return Ok(e)}catch(e){return Err(e instanceof Error?e:new Error("Project directory prompt cancelled"))}},getProjectDirectory=async e=>{const t=validateDirectoryArg(e);if(isOk(t))return t.data;const a=await promptForProjectDirectory();if(isOk(a))return a.data;process.exit(1)},createProjectConfig=(e,t)=>({projectDir:t,templateDownloadPath:resolvePath(e,t),cwd:resolvePath(e,"")}),displayProjectCreationInfo=e=>{const t=pathe.relative(e.cwd,e.templateDownloadPath)||e.templateDownloadPath;r__default.info(`Creating a new project in ${utils.colors.cyan(t)}.`)},createFinalInstructions=(e,t,a,n)=>({successMessage:`
3
+ \u{1F389} Starter project has been created with the \`${n}\` template.`,nextStepsTitle:`
5
4
  \u{1F680} Next steps:
6
- `),e__default.log(`cd ${utils.colors.cyan(n)}`),c||e__default.log(`${utils.colors.cyan(a)} install`),e__default.log(`${utils.colors.cyan(a)} run dev`),e__default.log(`
7
- \u{1F3AE} Happy coding! ${utils.colors.dim("(Press Ctrl+C to stop the dev server)")}`)}}),runMain=()=>citty.runMain(mainCommand);exports.runMain=runMain;
5
+ `,changeDirectory:`cd ${utils.colors.cyan(e)}`,installCommand:t?null:`${utils.colors.cyan(a)} install`,devCommand:`${utils.colors.cyan(a)} run dev`,happyCoding:`
6
+ \u{1F3AE} Happy coding! ${utils.colors.dim("(Press Ctrl+C to stop the dev server)")}`}),displayFinalInstructions=(e,t,a,n)=>{const o=createFinalInstructions(e,t,a,n);r__default.log(o.successMessage),r__default.log(o.nextStepsTitle),r__default.log(o.changeDirectory),o.installCommand&&r__default.log(o.installCommand),r__default.log(o.devCommand),r__default.log(o.happyCoding)},executeProjectCreationWorkflow=async e=>{try{const t=await getProjectDirectory(e.dir),a=createProjectConfig(e.cwd,t);displayProjectCreationInfo(a),verifyDirectoryDoesNotExist(a.templateDownloadPath);const n=await selectTemplate(e.template),o=await downloadTemplateAndHandleErrors(n,a.templateDownloadPath),i=await selectPackageManager(e.packageManager),c=await confirmDependenciesInstallation(e.install);return await installDependenciesIfRequested(c,o.dir,i),await initializeGitIfRequested(e.gitInit,o.dir),displayFinalInstructions(t,c,i,o.source),Ok(void 0)}catch(t){return Err(t instanceof Error?t:new Error("Project creation workflow failed"))}},mainCommand=citty.defineCommand({meta:{name,version,description},args:{cwd:{type:"string",description:"Specify the working directory",valueHint:"directory",default:"."},dir:{type:"positional",description:"Project directory",default:""},template:{type:"string",alias:"t",description:"Template name"},install:{type:"boolean",description:"Install dependencies"},gitInit:{type:"boolean",description:"Initialize git repository"},packageManager:{type:"string",description:"Package manager choice (npm, pnpm, yarn, bun, deno)"}},run:async({args:e})=>{stdEnv.hasTTY&&process.stdout.write(`Loading...
7
+ `),r__default.info(utils.colors.bold("\u{1F389} Hello xeikit app!"));const t=await executeProjectCreationWorkflow(e);if(!t.success)throw t.error}}),runMain=()=>citty.runMain(mainCommand);exports.runMain=runMain;
package/dist/index.d.cts CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Initializes and runs the main command-line interface.
3
+ * This function sets up the CLI using the citty framework and executes the main command.
4
+ * It serves as the entry point for the command-line application.
5
+ */
1
6
  declare const runMain: () => Promise<void>;
2
7
 
3
8
  export { runMain };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Initializes and runs the main command-line interface.
3
+ * This function sets up the CLI using the citty framework and executes the main command.
4
+ * It serves as the entry point for the command-line application.
5
+ */
1
6
  declare const runMain: () => Promise<void>;
2
7
 
3
8
  export { runMain };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Initializes and runs the main command-line interface.
3
+ * This function sets up the CLI using the citty framework and executes the main command.
4
+ * It serves as the entry point for the command-line application.
5
+ */
1
6
  declare const runMain: () => Promise<void>;
2
7
 
3
8
  export { runMain };
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import{defineCommand as u,runMain as g}from"citty";import i from"consola";import{colors as o}from"consola/utils";import{resolve as f,relative as l}from"pathe";import{hasTTY as h}from"std-env";import{existsSync as w}from"node:fs";import{x}from"tinyexec";import{installDependencies as v}from"nypm";import{downloadTemplate as E}from"giget";const k="create-xeikit-app",P="1.0.0",T="CLI tool for scaffolding projects with xeikit/starter templates.",d=e=>{i.error(e.toString()),process.exit(1)},A=e=>{w(e)&&(i.error(`The directory ${o.cyan(l(process.cwd(),e)||e)} already exists. Please choose a different directory.`),process.exit(1))},m=(e,t)=>f(e,t),I=async(e,t)=>{if(e===void 0?await i.prompt("Initialize git repository?",{type:"confirm",cancel:"reject"}).catch(()=>process.exit(1)):e){i.info(`Initializing git repository...
2
- `);try{await x("git",["init",t],{throwOnError:!0,nodeOptions:{stdio:"inherit"}})}catch(r){i.warn(`Failed to initialize git repository: ${r}`)}}},j="https://raw.githubusercontent.com/xeikit/starter/templates/templates",M="nuxt3",b={npm:void 0,yarn:void 0,pnpm:void 0,bun:void 0,deno:void 0},s=Object.keys(b),C=[{label:"Nuxt3",value:"nuxt3"}],_=()=>{const e=process.env.npm_config_user_agent;if(!e)return;const[t]=e.split("/");return s.includes(t)?t:void 0},D=async e=>{const t=_();if(e&&s.includes(e))return e;const r=s.map(n=>({label:n,value:n,hint:t===n?"current":void 0}));return i.prompt("Which package manager would you like to use?",{type:"select",options:r,initial:t,cancel:"reject"}).catch(()=>process.exit(1))},S=async e=>{const t=await i.prompt("Do you want to install dependencies?",{type:"confirm",initial:e,cancel:"reject"}).catch(()=>process.exit(1));return typeof t!="boolean"&&(i.error("Please specify whether to install dependencies."),process.exit(1)),t},N=async(e,t,r)=>{if(e===!1){i.info("Skipping dependency installation.");return}i.start("Installing dependencies...");try{await v({cwd:t,packageManager:{name:r,command:r}}),i.success("Installation completed.")}catch(n){d(n)}},F=async e=>{if(e)return e;const t=await i.prompt("Choose a template",{type:"select",options:C,cancel:"reject"}).catch(()=>process.exit(1));return typeof t!="string"&&(i.error("Please specify a template name."),process.exit(1)),t||M},O=async(e,t)=>{try{return await E(e,{dir:t,registry:j})}catch(r){return d(r)}},G=async e=>e!==""?e:i.prompt("Where would you like to create your project?",{placeholder:"./my-project",type:"text",default:"./my-project",cancel:"reject"}).catch(()=>process.exit(1)),L=u({meta:{name:k,version:P,description:T},args:{cwd:{type:"string",description:"Specify the working directory",valueHint:"directory",default:"."},dir:{type:"positional",description:"Project directory",default:""},template:{type:"string",alias:"t",description:"Template name"},install:{type:"boolean",description:"Install dependencies"},gitInit:{type:"boolean",description:"Initialize git repository"},packageManager:{type:"string",description:"Package manager choice (npm, pnpm, yarn, bun, deno)"}},run:async({args:e})=>{h&&process.stdout.write(`Loading...
3
- `),i.info(o.bold("\u{1F389} Hello xeikit app!"));const t=await G(e.dir),r=m(e.cwd,""),n=m(r,t);i.info(`Creating a new project in ${o.cyan(l(r,n)||n)}.`),A(n);const y=await F(e.template),a=await O(y,n),c=await D(e.packageManager),p=await S(e.install);await N(p,a.dir,c),await I(e.gitInit,a.dir),i.log(`
4
- \u{1F389} Starter project has been created with the \`${a.source}\` template.`),i.log(`
1
+ import{defineCommand as f,runMain as w}from"citty";import a from"consola";import{colors as l}from"consola/utils";import{resolve as h,relative as u}from"pathe";import{hasTTY as E}from"std-env";import{existsSync as P}from"node:fs";import{x as v}from"tinyexec";import{installDependencies as k}from"nypm";import{downloadTemplate as D}from"giget";const x="create-xeikit-app",I="1.0.0",T="CLI tool for scaffolding projects with xeikit/starter templates.",o=e=>({success:!0,data:e}),n=e=>({success:!1,error:e}),c=e=>e.success,j=e=>{const t=u(process.cwd(),e)||e;return`The directory ${l.cyan(t)} already exists. Please choose a different directory.`},C=e=>P(e),y=e=>{a.error(e.toString()),process.exit(1)},A=e=>C(e)?n(j(e)):o(e),M=e=>{const t=A(e);t.success||(a.error(t.error),process.exit(1))},g=(e,t)=>h(e,t),F=e=>e===void 0?n("Git initialization parameter is undefined"):o(e),G=async()=>{try{const e=await a.prompt("Initialize git repository?",{type:"confirm",cancel:"reject"});return o(e)}catch(e){return n(e instanceof Error?e:new Error("Git initialization prompt cancelled"))}},S=async e=>{const t=F(e);return c(t)?o(t.data):await G()},b=e=>["init",e],R=async e=>{try{return await v("git",b(e),{throwOnError:!0,nodeOptions:{stdio:"inherit"}}),o(void 0)}catch(t){return n(t instanceof Error?t:new Error("Git initialization failed"))}},$=async(e,t)=>{const r=await S(e);if(c(r)||process.exit(1),!r.data)return;a.info(`Initializing git repository...
2
+ `);const i=await R(t);c(i)||a.warn(`Failed to initialize git repository: ${i.error.message}`)},z="https://raw.githubusercontent.com/xeikit/starter/templates/templates",O="nuxt3",_={npm:void 0,yarn:void 0,pnpm:void 0,bun:void 0,deno:void 0},p=Object.keys(_),N=[{label:"Nuxt3",value:"nuxt3"},{label:"React Router (framework)",value:"react-router"}],L=e=>{const[t]=e.split("/");return p.includes(t)?t:void 0},W=()=>{const e=process.env.npm_config_user_agent;return e?L(e):void 0},H=e=>e?p.includes(e)?o(e):n(`Invalid package manager: ${e}`):n("Package manager argument is empty"),U=e=>p.map(t=>({label:t,value:t,hint:e===t?"current":void 0})),q=async e=>{try{const t=await a.prompt("Which package manager would you like to use?",{type:"select",options:U(e),initial:e,cancel:"reject"});return o(t)}catch(t){return n(t instanceof Error?t:new Error("Package manager selection cancelled"))}},K=async e=>{const t=H(e);if(c(t))return t.data;const r=W(),i=await q(r);if(c(i))return i.data;process.exit(1)},Y=e=>typeof e!="boolean"?n("Please specify whether to install dependencies."):o(e),B=async e=>{try{const t=await a.prompt("Do you want to install dependencies?",{type:"confirm",initial:e,cancel:"reject"}),r=Y(t);return c(r)?r:n(new Error(r.error))}catch(t){return n(t instanceof Error?t:new Error("Dependencies installation prompt cancelled"))}},J=async e=>{const t=await B(e);if(c(t))return t.data;const r=t.error instanceof Error?t.error.message:String(t.error);r?.includes("Please specify")&&a.error(r),process.exit(1)},Q=(e,t)=>({cwd:e,packageManager:{name:t,command:t}}),V=async(e,t)=>{try{return await k(Q(e,t)),o(void 0)}catch(r){return n(r instanceof Error?r:new Error("Dependencies installation failed"))}},X=async(e,t,r)=>{if(e===!1){a.info("Skipping dependency installation.");return}a.start("Installing dependencies...");const i=await V(t,r);if(c(i)){a.success("Installation completed.");return}y(i.error)},Z=e=>!e||e.trim()===""?n("Template argument is empty or undefined"):o(e),ee=e=>typeof e!="string"?n("Please specify a template name."):o(e||O),te=async()=>{try{const e=await a.prompt("Choose a template",{type:"select",options:N,cancel:"reject"}),t=ee(e);return c(t)?t:n(new Error(t.error))}catch(e){return n(e instanceof Error?e:new Error("Template selection cancelled"))}},re=async e=>{const t=Z(e);if(c(t))return t.data;const r=await te();if(c(r))return r.data;a.error(r.error.message||"Template selection cancelled"),process.exit(1)},ae=async(e,t)=>{try{const r=await D(e,{dir:t,registry:z});return o(r)}catch(r){return n(r instanceof Error?r:new Error("Template download failed"))}},ne=async(e,t)=>{const r=await ae(e,t);return c(r)?r.data:y(r.error)},oe=e=>!e||e.trim()===""?n("Directory argument is empty"):o(e.trim()),ie=()=>({placeholder:"./my-project",type:"text",default:"./my-project",cancel:"reject"}),ce=async()=>{try{const e=await a.prompt("Where would you like to create your project?",ie());return o(e)}catch(e){return n(e instanceof Error?e:new Error("Project directory prompt cancelled"))}},se=async e=>{const t=oe(e);if(c(t))return t.data;const r=await ce();if(c(r))return r.data;process.exit(1)},le=(e,t)=>({projectDir:t,templateDownloadPath:g(e,t),cwd:g(e,"")}),pe=e=>{const t=u(e.cwd,e.templateDownloadPath)||e.templateDownloadPath;a.info(`Creating a new project in ${l.cyan(t)}.`)},de=(e,t,r,i)=>({successMessage:`
3
+ \u{1F389} Starter project has been created with the \`${i}\` template.`,nextStepsTitle:`
5
4
  \u{1F680} Next steps:
6
- `),i.log(`cd ${o.cyan(t)}`),p||i.log(`${o.cyan(c)} install`),i.log(`${o.cyan(c)} run dev`),i.log(`
7
- \u{1F3AE} Happy coding! ${o.dim("(Press Ctrl+C to stop the dev server)")}`)}}),R=()=>g(L);export{R as runMain};
5
+ `,changeDirectory:`cd ${l.cyan(e)}`,installCommand:t?null:`${l.cyan(r)} install`,devCommand:`${l.cyan(r)} run dev`,happyCoding:`
6
+ \u{1F3AE} Happy coding! ${l.dim("(Press Ctrl+C to stop the dev server)")}`}),me=(e,t,r,i)=>{const s=de(e,t,r,i);a.log(s.successMessage),a.log(s.nextStepsTitle),a.log(s.changeDirectory),s.installCommand&&a.log(s.installCommand),a.log(s.devCommand),a.log(s.happyCoding)},ue=async e=>{try{const t=await se(e.dir),r=le(e.cwd,t);pe(r),M(r.templateDownloadPath);const i=await re(e.template),s=await ne(i,r.templateDownloadPath),d=await K(e.packageManager),m=await J(e.install);return await X(m,s.dir,d),await $(e.gitInit,s.dir),me(t,m,d,s.source),o(void 0)}catch(t){return n(t instanceof Error?t:new Error("Project creation workflow failed"))}},ye=f({meta:{name:x,version:I,description:T},args:{cwd:{type:"string",description:"Specify the working directory",valueHint:"directory",default:"."},dir:{type:"positional",description:"Project directory",default:""},template:{type:"string",alias:"t",description:"Template name"},install:{type:"boolean",description:"Install dependencies"},gitInit:{type:"boolean",description:"Initialize git repository"},packageManager:{type:"string",description:"Package manager choice (npm, pnpm, yarn, bun, deno)"}},run:async({args:e})=>{E&&process.stdout.write(`Loading...
7
+ `),a.info(l.bold("\u{1F389} Hello xeikit app!"));const t=await ue(e);if(!t.success)throw t.error}}),ge=()=>w(ye);export{ge as runMain};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-xeikit-app",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.1.0",
5
5
  "author": "XeicuLy",
6
6
  "description": "CLI tool for scaffolding projects with xeikit/starter templates.",
7
7
  "keywords": [
@@ -47,20 +47,27 @@
47
47
  },
48
48
  "devDependencies": {
49
49
  "@biomejs/biome": "1.9.4",
50
+ "@commitlint/cli": "19.8.1",
51
+ "@commitlint/types": "19.8.1",
50
52
  "@types/node": "22.15.18",
53
+ "@vitest/coverage-v8": "3.1.4",
54
+ "@vitest/ui": "3.1.4",
51
55
  "changelogen": "0.6.1",
56
+ "commitlint-config-gitmoji": "2.3.1",
52
57
  "husky": "9.1.7",
53
58
  "jiti": "2.4.2",
54
59
  "lint-staged": "16.0.0",
55
60
  "prettier": "3.5.3",
56
61
  "typescript": "5.8.3",
57
- "unbuild": "3.5.0"
62
+ "unbuild": "3.5.0",
63
+ "vite-tsconfig-paths": "5.1.4",
64
+ "vitest": "3.1.4"
58
65
  },
59
66
  "lint-staged": {
60
- "**/*.{css,js,ts,cjs,mjs,cts,mts,jsx,tsx,json,jsonc}": [
67
+ "**/*.{css,js,ts,cjs,mjs,cts,mts,jsx,tsx}": [
61
68
  "biome check --write --no-errors-on-unmatched"
62
69
  ],
63
- "**/*.{md,html,yaml,yml}": [
70
+ "**/*.{md,html,yaml,yml,json,jsonc}": [
64
71
  "prettier --write"
65
72
  ]
66
73
  },
@@ -81,6 +88,10 @@
81
88
  "prettier:ci": "prettier --check --log-level warn .",
82
89
  "typecheck": "tsc --noEmit",
83
90
  "lint": "pnpm biome && pnpm prettier && pnpm typecheck",
84
- "lint:fix": "pnpm biome:fix && pnpm prettier:fix && pnpm typecheck"
91
+ "lint:fix": "pnpm biome:fix && pnpm prettier:fix && pnpm typecheck",
92
+ "test": "vitest",
93
+ "test:ui": "vitest --ui --coverage",
94
+ "test:coverage": "vitest --coverage",
95
+ "test:ci": "vitest --run --coverage"
85
96
  }
86
97
  }