create-questpie-app
Version:
Bootstrap a new QUESTPIE Studio application with your choice of template and packages
2 lines • 2.43 kB
JavaScript
import e from"node:path";import t from"fs-extra";import{fileURLToPath as n}from"node:url";const r=n(import.meta.url),i=e.dirname(r);async function a(e,n,r,i){switch(await t.ensureDir(e),n){case`monorepo`:await o(e,r,i);break;case`single-app`:await s(e,r,i);break;case`single-module`:await c(e,i);break;default:throw Error(`Unknown project type: ${n}`)}}async function o(n,r,a){let o=e.resolve(i,`../../templates/shared`);await t.pathExists(o)&&await l(o,n,a);let s=e.join(n,`apps`);await t.ensureDir(s);let c=a(`name`);if(!c)throw Error(`Project name is required`);let u=e.join(s,c);await t.ensureDir(u);let d=e.resolve(i,`../../templates`,r);if(!await t.pathExists(d))throw Error(`Template directory not found: ${d}`);await l(d,u,a);let f=e.join(n,`packages`);await t.ensureDir(f);let p=`${c}-module`,m=e.join(f,p);await t.ensureDir(m);let h=e.resolve(i,`../../templates/module`);await t.pathExists(h)&&await l(h,m,e=>e===`name`?p:a(e))}async function s(n,r,a){let o=e.resolve(i,`../../templates`,r);if(!await t.pathExists(o))throw Error(`Template directory not found: ${o}`);await l(o,n,a)}async function c(n,r){let a=e.resolve(i,`../../templates/module`);if(!await t.pathExists(a))throw Error(`Module template directory not found: ${a}`);await l(a,n,r)}async function l(n,r,i){let a=await t.readdir(n,{withFileTypes:!0});for(let o of a){let a=e.join(n,o.name),s=u(o.name,i);s.endsWith(`.txt`)&&!o.name.endsWith(`.example.txt`)&&(s=s.slice(0,-4));let c=e.join(r,s);if(o.isDirectory())await t.ensureDir(c),await l(a,c,i);else{let n=await t.readFile(a,`utf8`),r=u(n,i);await t.ensureDir(e.dirname(c)),await t.writeFile(c,r,`utf8`)}}}function u(e,t){return e.replace(/\{\{(\w+)\}\}/g,(e,n)=>{let r=t(n);if(r===null)throw Error(`Unresolved template variable: ${n}`);return r})}function d(e,t={}){return n=>{if(Object.prototype.hasOwnProperty.call(t,n))return t[n]||``;switch(n){case`name`:return e;case`name_capitalize`:return e.charAt(0).toUpperCase()+e.slice(1);case`name_camel_case`:return e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase());case`name_pascal_case`:return e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()).replace(/^\w/,e=>e.toUpperCase());case`name_kebab_case`:return e.toLowerCase().replace(/[^a-z0-9]/g,`-`);case`name_snake_case`:return e.toLowerCase().replace(/[^a-z0-9]/g,`_`);default:return null}}}export{a as createProjectFromTemplateDirectory,d as createVariableResolver};
//# sourceMappingURL=template-processor.js.map