@solution-lib/space 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
 
10
10
  <div align="center">
11
- <img src="https://img.shields.io/badge/v-0.0.1-black"/>
11
+ <img src="https://img.shields.io/badge/v-0.0.3-black"/>
12
12
  <a href="https://github.com/maysara-elshewehy">
13
13
  </a>
14
14
  <a href="https://github.com/solution-lib"><img src="https://img.shields.io/badge/🔥-@solution--lib-black"/></a>
@@ -29,8 +29,7 @@
29
29
 
30
30
  ```bash
31
31
  # install via bun or npm
32
- bun install @solution-lib/space
33
- bun link @sulotion-lib/space
32
+ bun install -g @solution-lib/space
34
33
 
35
34
  # Now use 'space' anywhere
36
35
  space --help
package/dist/main.cjs CHANGED
@@ -9,7 +9,7 @@
9
9
  `+r.repeat(e)+"}"}};var R=class{constructor(t=process.cwd()){this.basePath=t;}async createSpace(t,e){let r=e||T__namespace.join(this.basePath,t.repo.name);if(u__namespace.existsSync(r))throw new Error(`Space path "${r}" already exists!`);let s=false;try{u__namespace.existsSync(r)||(u__namespace.mkdirSync(r,{recursive:!0}),s=!0),await this.cloneTemplate(t.type,r,t,t.template),this.createSpaceConfig(r,t);}catch(a){if(s&&u__namespace.existsSync(r))try{await this.safeDeleteDirectory(r);}catch{console.warn(`Warning: Could not clean up directory at "${r}"`);}throw a}}loadSpaceConfig(t){let e=t||this.basePath,r=T__namespace.join(e,".space");if(!u__namespace.existsSync(r))return null;let s=u__namespace.readFileSync(r,"utf-8");return JSON.parse(s)}isSpace(t){let e=t||this.basePath;return u__namespace.existsSync(T__namespace.join(e,".space"))}async cloneTemplate(t,e,r,s){let i=`https://github.com/solution-dist/${S.getRepoName(t,s)}.git`;try{let{execSync:n}=await import('child_process');n(`git clone --quiet --depth 1 ${i} "${e}"`,{stdio:"pipe"});let p=T__namespace.join(e,".git");u__namespace.existsSync(p)&&await this.safeDeleteDirectory(p),await this.updateTemplateFiles(e,r);}catch(n){throw n.message&&n.message.includes("Repository not found")?new Error(`Template repository not found: ${i}
10
10
  This template is not yet available. Please mark it as ready: false in templateRegistry.ts`):new Error(`Failed to clone template from ${i}: ${n.message||n}`)}}async updateTemplateFiles(t,e){let r=e.repo.org&&e.repo.org.trim()!=="",s=e.author.id&&e.author.id.trim()!=="",a=r?e.repo.org:s?e.author.id:"",i=a?`git+https://github.com/${a}/${e.repo.name}.git`:"",n=a?`https://github.com/${a}/${e.repo.name}#readme`:"",p=a?`https://github.com/${a}/${e.repo.name}/issues`:"",d=r?`@${e.repo.org}/${e.repo.name}`:e.repo.name,m="\u{1F525}-";r?m+=`@${(e.repo.org.replace(/-/g,"--")+"/"+e.repo.name.replace(/-/g,"--")).replace(/ /g,"_")}`:e.author.name?m+=(e.author.name.replace(/-/g,"--")+"/"+e.repo.name.replace(/-/g,"--")).replace(/ /g,"_"):m+=e.repo.name.replace(/-/g,"--").replace(/ /g,"_");let f=s?`https://github.com/${e.author.id}`:e.author.url||"",v=e.repo.kw&&e.repo.kw.length>0?JSON.stringify(e.repo.kw):"[]",c=this.getAllFiles(t);for(let y of c)if(!(y.includes("node_modules")||y.includes(".git")))try{let g=u__namespace.readFileSync(y,"utf-8"),b=!1;if(g.includes("{{")&&(b=!0,g=g.replace(/\{\{tag\}\}/g,d).replace(/\{\{tag-badge\}\}/g,m).replace(/\{\{name\}\}/g,e.repo.name).replace(/\{\{repo\}\}/g,e.repo.name).replace(/\{\{org\}\}/g,e.repo.org||"").replace(/\{\{desc\}\}/g,e.repo.desc||`A ${e.type} space`).replace(/\{\{description\}\}/g,e.repo.desc||`A ${e.type} space`).replace(/\{\{version\}\}/g,e.repo.version).replace(/\{\{license\}\}/g,e.repo.license||"MIT").replace(/\{\{kw\}\}/g,v).replace(/\{\{keywords\}\}/g,v).replace(/\{\{url\}\}/g,i).replace(/\{\{repo_url\}\}/g,i).replace(/\{\{git_url\}\}/g,i).replace(/\{\{homepage\}\}/g,n).replace(/\{\{issues\}\}/g,p).replace(/\{\{type\}\}/g,e.type).replace(/\{\{template\}\}/g,e.template||"clean").replace(/\{\{pm\}\}/g,e.pm).replace(/\{\{author\}\}/g,e.author.name||"").replace(/\{\{author_name\}\}/g,e.author.name||"").replace(/\{\{author_id\}\}/g,e.author.id||"").replace(/\{\{author_email\}\}/g,e.author.email||"").replace(/\{\{author_url\}\}/g,f),u__namespace.writeFileSync(y,g,"utf-8")),y.endsWith("package.json")){let l=JSON.parse(g);if(l.name=d,l.version=e.repo.version,l.description=e.repo.desc||`A ${e.type} space`,l.license=e.repo.license||"MIT",e.repo.kw&&e.repo.kw.length>0?l.keywords=e.repo.kw:l.keywords=[],n&&(l.homepage=n),p&&(l.bugs||(l.bugs={}),l.bugs.url=p),e.author.name&&(e.author.email?l.author={name:e.author.name,email:e.author.email,url:f||void 0}:l.author={name:e.author.name,url:f||void 0}),i&&(l.repository={type:"git",url:i}),e.type==="cli"&&l.bin){let E=Object.keys(l.bin)[0],N=l.bin[E];delete l.bin[E],l.bin[e.repo.name]=N;}l.engines||(l.engines={}),l.engines.bun||(l.engines.bun=">=1.0.0"),g=P.format(l,{keyOrder:I}),u__namespace.writeFileSync(y,g+`
11
11
  `,"utf-8");continue}}catch{continue}}getAllFiles(t,e=[]){return u__namespace.readdirSync(t).forEach(s=>{let a=T__namespace.join(t,s);u__namespace.statSync(a).isDirectory()?e=this.getAllFiles(a,e):e.push(a);}),e}createSpaceConfig(t,e){let r=T__namespace.join(t,".space"),s=e.repo.org&&e.repo.org.trim()!=="",a=e.author.id&&e.author.id.trim()!=="",i=s?e.repo.org:a?e.author.id:"",n=i?`git+https://github.com/${i}/${e.repo.name}.git`:"",p=i?`https://github.com/${i}/${e.repo.name}#readme`:"",d=i?`https://github.com/${i}/${e.repo.name}/issues`:"",m=a?`https://github.com/${e.author.id}`:e.author.url||"",f={type:e.type,template:e.template||"clean",pm:e.pm,repo:{org:e.repo.org||"",name:e.repo.name,version:e.repo.version,desc:e.repo.desc||`A ${e.type} space`,kw:e.repo.kw||[],license:e.repo.license||"MIT",issues:d,homepage:p,git_url:n},author:{id:e.author.id||"",name:e.author.name||"",email:e.author.email||"",url:m},createdAt:new Date().toISOString()},v=P.format(f,{keyOrder:L});u__namespace.writeFileSync(r,v+`
12
- `,"utf-8");}async safeDeleteDirectory(t,e=3){for(let r=0;r<e;r++)try{if(u__namespace.rmSync(t,{recursive:!0,force:!0,maxRetries:3,retryDelay:100}),!u__namespace.existsSync(t))return}catch(s){if(r===e-1)throw s;await new Promise(a=>setTimeout(a,300*(r+1)));}}};var O=class{constructor(){this.pm="bun";this.DEFAULT_SCRIPTS={build:"tsup",test:"test"};}install(t,e){let r=["install"];t&&t.length>0&&r.push(...t),e?.dev&&r.push("--dev"),e?.global&&r.push("--global"),console.log(`\u{1F4E6} Installing${t?` ${t.join(", ")}`:" dependencies"}...`),this.execute(r),this.format();}remove(t,e){let r=["remove"];r.push(...t),e?.global&&r.push("--global"),console.log(`\u{1F5D1}\uFE0F Removing ${t.join(", ")}...`),this.execute(r),this.format();}link(){console.log("\u{1F517} Linking package globally..."),this.execute(["link"]);}unlink(){console.log("\u{1F513} Unlinking package..."),this.execute(["unlink"]);}run(t,e){let r=this.getScriptCommand(t);if(r||(console.error(`\u2718 Script "${t}" not found in package.json and no default available`),process.exit(1)),this.isUsingDefaultScript(t)){let a=[...r.split(" ")];e&&e.length>0&&a.push(...e),this.execute(a);}else {let s=["run",t];e&&e.length>0&&s.push("--",...e),this.execute(s);}}runSilent(t,e){let r=this.getScriptCommand(t);if(!r)throw new Error(`Script "${t}" not found in package.json and no default available`);if(this.isUsingDefaultScript(t)){let a=[...r.split(" ")];e&&e.length>0&&a.push(...e),this.executeSilent(a);}else {let s=["run",t];e&&e.length>0&&s.push("--",...e),this.executeSilent(s);}}update(t){console.log(`\u{1F504} Updating${t?` ${t.join(", ")}`:" all packages"}...`);let e=["update"];t&&t.length>0&&e.push(...t),this.execute(e),this.format();}list(t){let e=["pm","ls"];t?.global&&e.push("--global"),this.execute(e);}init(){console.log("\u{1F4DD} Initializing package.json..."),this.execute(["init","-y"]),this.format();}publish(t,e){let r=["publish"];t?.tag&&r.push("--tag",t.tag);let s=t?.access||"public";r.push("--access",s);let a=Bun.spawnSync(["bun",...r],{stdout:"pipe",stderr:"pipe"});if(a.exitCode===0){let n=new TextDecoder().decode(a.stdout).match(/\+ (.+@[\d.]+)/);e?n?e.stop(`\u2714 Published ${n[1]} successfully!`):e.stop("\u2714 Published successfully!"):console.log(n?`\u2714 Published ${n[1]} successfully!`:"\u2714 Published successfully!");}else {let i=new TextDecoder().decode(a.stderr);e?e.stopWithError("Publish failed!"):console.error("Publish failed!"),i&&console.error(i),process.exit(1);}}execute(t){Bun.spawnSync(["bun",...t],{stdout:"inherit",stderr:"inherit"}).exitCode!==0&&(console.error(`\u2718 Command failed: bun ${t.join(" ")}`),process.exit(1));}executeSilent(t){let e=Bun.spawnSync(["bun",...t],{stdout:"pipe",stderr:"pipe"});if(e.exitCode!==0){let r=new TextDecoder().decode(e.stderr);console.error(`\u2718 Command failed: bun ${t.join(" ")}`),r&&console.error(r),process.exit(1);}}getName(){return "bun"}getEmoji(){return "\u{1F95F}"}format(){try{let t=T__namespace.join(process.cwd(),"package.json");u__namespace.existsSync(t)&&P.formatFile(t,{keyOrder:I});}catch{}}getScriptCommand(t){let e=T__namespace.join(process.cwd(),"package.json");if(u__namespace.existsSync(e))try{let r=JSON.parse(u__namespace.readFileSync(e,"utf-8"));if(r.scripts&&r.scripts[t])return r.scripts[t]}catch{}return t in this.DEFAULT_SCRIPTS?this.DEFAULT_SCRIPTS[t]:null}isUsingDefaultScript(t){let e=T__namespace.join(process.cwd(),"package.json");if(u__namespace.existsSync(e))try{let r=JSON.parse(u__namespace.readFileSync(e,"utf-8"));if(r.scripts&&r.scripts[t])return !1}catch{}return t in this.DEFAULT_SCRIPTS}};D();var o=class{static async promptInit(t){let e=t.name,r=t.type,s=t.template,a=t.desc,i="";if((!e||e==="my-space")&&(e=await prompts.input({message:"name:",default:"my-space",validate:c=>{if(!c||c.trim()==="")return "Space name is required";let y=/^@([a-z0-9-_]+)\/([a-z0-9-_]+)$/,g=/^[a-z0-9-_]+$/;return !y.test(c)&&!g.test(c)?'Name must be either "package-name" or "@org/package-name" (lowercase, numbers, hyphens, underscores only)':true}})),!r){let c=S.getTemplatesForType("lib",false).length>0,y=S.getTemplatesForType("cli",false).length>0,g=S.getTemplatesForType("server",false).length>0;r=await prompts.select({message:"type:",choices:[{name:`\u{1F4DA} Library - TypeScript library for npm${c?"":" (Coming Soon)"}`,value:"lib",disabled:c?false:"No templates ready yet"},{name:`\u26A1 CLI - Command-line tool${y?"":" (Coming Soon)"}`,value:"cli",disabled:y?false:"No templates ready yet"},{name:`\u{1F5A5}\uFE0F Server - Backend server application${g?"":" (Coming Soon)"}`,value:"server",disabled:g?false:"No templates ready yet"}]});}if(!s){let c=S.getTemplatesForType(r,true);if(c.filter(b=>b.ready).length===0)throw new Error(`No templates are ready yet for "${r}" spaces. This space type is coming soon!`);let g=c.map(b=>{let l=b.ready?"\u2714":"\u{1F6A7}",E=b.ready?"":" (Coming Soon)";return {name:`${l} ${b.label}${E} - ${b.description}`,value:b.name,short:b.label,disabled:b.ready?false:"Not ready yet"}});s=await prompts.select({message:"template:",choices:g,default:S.getDefaultTemplate(r)});}a||(a=await prompts.input({message:"desc:",default:r==="lib"?"A TypeScript library":r==="cli"?"A command-line tool":"A backend server"}));let n="bun";i=await prompts.input({message:"author name:",default:""});let p=await prompts.input({message:"author email:",default:"",validate:c=>c&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(c)?"Please enter a valid email address or leave empty":true}),d=await prompts.input({message:"github username:",default:"",validate:c=>c&&!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i.test(c)?"Please enter a valid GitHub username or leave empty":true}),m=await prompts.input({message:"keywords (comma-separated):",default:""}),f=m?m.split(",").map(c=>c.trim()).filter(c=>c):[],v=await prompts.input({message:"license:",default:"MIT"});return {name:e,type:r,template:s,description:a,packageManager:n,author:i,authorEmail:p,githubId:d,keywords:f,license:v}}static async promptPublish(t){if(!await prompts.confirm({message:`Are you sure you want to publish "${t}" to npm?`,default:false}))return {confirm:false};let r=await prompts.input({message:"Publish with a tag (e.g., beta, next) or leave empty for latest:",default:""}),s=await prompts.select({message:"\u{1F510} Access level:",choices:[{name:"Public - Anyone can install",value:"public"},{name:"Restricted - Requires authentication",value:"restricted"}],default:"public"});return {confirm:true,tag:r||void 0,access:s}}static async promptRemove(t){let e=await prompts.confirm({message:`Remove ${t.join(", ")}?`,default:true});return {packages:t,confirm:e}}static async promptConfirm(t,e=false){let s=(await import('readline')).createInterface({input:process.stdin,output:process.stdout}),a=e?" (Y/n)":" (y/N)";return new Promise(i=>{s.question(`${t}${a} `,n=>{s.close(),n.trim()===""?i(e):i(n.trim().toLowerCase()==="y"||n.trim().toLowerCase()==="yes");});})}static async promptInstall(t){let e=await prompts.input({message:"Enter package names (space-separated):",default:t||"",validate:s=>!s||s.trim()===""?"Please enter at least one package name":true}),r=await prompts.confirm({message:"\u{1F6E0}\uFE0F Install as dev dependency?",default:false});return {packages:e.split(" ").filter(s=>s.trim()),isDev:r}}static async promptUpdate(){return await prompts.select({message:"What do you want to update?",choices:[{name:"All packages",value:"all"},{name:"Specific packages",value:"specific"}]})==="all"?{updateAll:true}:{updateAll:false,packages:(await prompts.input({message:"\u{1F4E6} Enter package names (space-separated):",validate:r=>!r||r.trim()===""?"Please enter at least one package name":true})).split(" ").filter(r=>r.trim())}}static async promptUseCurrentDir(t){return await prompts.confirm({message:`Use current directory "${t}" as the space root?`,default:true})}static async promptDeleteExistingDir(t){return await prompts.confirm({message:`\u26A0\uFE0F Directory already exists at "${t}". Delete and recreate?`,default:false})}static showSuccess(t,e){console.log(""),e.forEach((r,s)=>{console.log(`\u2192 ${r}`);}),console.log("");}static showError(t,e){console.log(`
12
+ `,"utf-8");}async safeDeleteDirectory(t,e=3){for(let r=0;r<e;r++)try{if(u__namespace.rmSync(t,{recursive:!0,force:!0,maxRetries:3,retryDelay:100}),!u__namespace.existsSync(t))return}catch(s){if(r===e-1)throw s;await new Promise(a=>setTimeout(a,300*(r+1)));}}};var O=class{constructor(){this.pm="bun";this.DEFAULT_SCRIPTS={build:"tsup",test:"test"};}install(t,e){let r=["install"];t&&t.length>0&&r.push(...t),e?.dev&&r.push("--dev"),e?.global&&r.push("--global"),console.log(`\u2192 Installing${t?` ${t.join(", ")}`:" dependencies"}...`),this.execute(r),this.format();}remove(t,e){let r=["remove"];r.push(...t),e?.global&&r.push("--global"),console.log(`\u{1F5D1}\uFE0F Removing ${t.join(", ")}...`),this.execute(r),this.format();}link(){console.log("\u{1F517} Linking package globally..."),this.execute(["link"]);}unlink(){console.log("\u{1F513} Unlinking package..."),this.execute(["unlink"]);}run(t,e){let r=this.getScriptCommand(t);if(r||(console.error(`\u2718 Script "${t}" not found in package.json and no default available`),process.exit(1)),this.isUsingDefaultScript(t)){let a=[...r.split(" ")];e&&e.length>0&&a.push(...e),this.execute(a);}else {let s=["run",t];e&&e.length>0&&s.push("--",...e),this.execute(s);}}runSilent(t,e){let r=this.getScriptCommand(t);if(!r)throw new Error(`Script "${t}" not found in package.json and no default available`);if(this.isUsingDefaultScript(t)){let a=[...r.split(" ")];e&&e.length>0&&a.push(...e),this.executeSilent(a);}else {let s=["run",t];e&&e.length>0&&s.push("--",...e),this.executeSilent(s);}}update(t){console.log(`\u{1F504} Updating${t?` ${t.join(", ")}`:" all packages"}...`);let e=["update"];t&&t.length>0&&e.push(...t),this.execute(e),this.format();}list(t){let e=["pm","ls"];t?.global&&e.push("--global"),this.execute(e);}init(){console.log("\u{1F4DD} Initializing package.json..."),this.execute(["init","-y"]),this.format();}publish(t,e){let r=["publish"];t?.tag&&r.push("--tag",t.tag);let s=t?.access||"public";r.push("--access",s);let a=Bun.spawnSync(["bun",...r],{stdout:"pipe",stderr:"pipe"});if(a.exitCode===0){let n=new TextDecoder().decode(a.stdout).match(/\+ (.+@[\d.]+)/);e?n?e.stop(`\u2714 Published ${n[1]} successfully!`):e.stop("\u2714 Published successfully!"):console.log(n?`\u2714 Published ${n[1]} successfully!`:"\u2714 Published successfully!");}else {let i=new TextDecoder().decode(a.stderr);e?e.stopWithError("Publish failed!"):console.error("Publish failed!"),i&&console.error(i),process.exit(1);}}execute(t){Bun.spawnSync(["bun",...t],{stdout:"inherit",stderr:"inherit"}).exitCode!==0&&(console.error(`\u2718 Command failed: bun ${t.join(" ")}`),process.exit(1));}executeSilent(t){let e=Bun.spawnSync(["bun",...t],{stdout:"pipe",stderr:"pipe"});if(e.exitCode!==0){let r=new TextDecoder().decode(e.stderr);console.error(`\u2718 Command failed: bun ${t.join(" ")}`),r&&console.error(r),process.exit(1);}}getName(){return "bun"}getEmoji(){return "\u{1F95F}"}format(){try{let t=T__namespace.join(process.cwd(),"package.json");u__namespace.existsSync(t)&&P.formatFile(t,{keyOrder:I});}catch{}}getScriptCommand(t){let e=T__namespace.join(process.cwd(),"package.json");if(u__namespace.existsSync(e))try{let r=JSON.parse(u__namespace.readFileSync(e,"utf-8"));if(r.scripts&&r.scripts[t])return r.scripts[t]}catch{}return t in this.DEFAULT_SCRIPTS?this.DEFAULT_SCRIPTS[t]:null}isUsingDefaultScript(t){let e=T__namespace.join(process.cwd(),"package.json");if(u__namespace.existsSync(e))try{let r=JSON.parse(u__namespace.readFileSync(e,"utf-8"));if(r.scripts&&r.scripts[t])return !1}catch{}return t in this.DEFAULT_SCRIPTS}};D();var o=class{static async promptInit(t){let e=t.name,r=t.type,s=t.template,a=t.desc,i="";if((!e||e==="my-space")&&(e=await prompts.input({message:"name:",default:"my-space",validate:c=>{if(!c||c.trim()==="")return "Space name is required";let y=/^@([a-z0-9-_]+)\/([a-z0-9-_]+)$/,g=/^[a-z0-9-_]+$/;return !y.test(c)&&!g.test(c)?'Name must be either "package-name" or "@org/package-name" (lowercase, numbers, hyphens, underscores only)':true}})),!r){let c=S.getTemplatesForType("lib",false).length>0,y=S.getTemplatesForType("cli",false).length>0,g=S.getTemplatesForType("server",false).length>0;r=await prompts.select({message:"type:",choices:[{name:`\u2192 Library - TypeScript library for npm${c?"":" (Coming Soon)"}`,value:"lib",disabled:c?false:"No templates ready yet"},{name:`\u2192 CLI - Command-line tool${y?"":" (Coming Soon)"}`,value:"cli",disabled:y?false:"No templates ready yet"},{name:`\u2192 Server - Backend server application${g?"":" (Coming Soon)"}`,value:"server",disabled:g?false:"No templates ready yet"}]});}if(!s){let c=S.getTemplatesForType(r,true);if(c.filter(b=>b.ready).length===0)throw new Error(`No templates are ready yet for "${r}" spaces. This space type is coming soon!`);let g=c.map(b=>{let l=b.ready?"\u2714":"\u{1F6A7}",E=b.ready?"":" (Coming Soon)";return {name:`${l} ${b.label}${E} - ${b.description}`,value:b.name,short:b.label,disabled:b.ready?false:"Not ready yet"}});s=await prompts.select({message:"template:",choices:g,default:S.getDefaultTemplate(r)});}a||(a=await prompts.input({message:"desc:",default:r==="lib"?"A TypeScript library":r==="cli"?"A command-line tool":"A backend server"}));let n="bun";i=await prompts.input({message:"author name:",default:""});let p=await prompts.input({message:"author email:",default:"",validate:c=>c&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(c)?"Please enter a valid email address or leave empty":true}),d=await prompts.input({message:"github username:",default:"",validate:c=>c&&!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i.test(c)?"Please enter a valid GitHub username or leave empty":true}),m=await prompts.input({message:"keywords (comma-separated):",default:""}),f=m?m.split(",").map(c=>c.trim()).filter(c=>c):[],v=await prompts.input({message:"license:",default:"MIT"});return {name:e,type:r,template:s,description:a,packageManager:n,author:i,authorEmail:p,githubId:d,keywords:f,license:v}}static async promptPublish(t){if(!await prompts.confirm({message:`Are you sure you want to publish "${t}" to npm?`,default:false}))return {confirm:false};let r=await prompts.input({message:"Publish with a tag (e.g., beta, next) or leave empty for latest:",default:""}),s=await prompts.select({message:"\u{1F510} Access level:",choices:[{name:"Public - Anyone can install",value:"public"},{name:"Restricted - Requires authentication",value:"restricted"}],default:"public"});return {confirm:true,tag:r||void 0,access:s}}static async promptRemove(t){let e=await prompts.confirm({message:`Remove ${t.join(", ")}?`,default:true});return {packages:t,confirm:e}}static async promptConfirm(t,e=false){let s=(await import('readline')).createInterface({input:process.stdin,output:process.stdout}),a=e?" (Y/n)":" (y/N)";return new Promise(i=>{s.question(`${t}${a} `,n=>{s.close(),n.trim()===""?i(e):i(n.trim().toLowerCase()==="y"||n.trim().toLowerCase()==="yes");});})}static async promptInstall(t){let e=await prompts.input({message:"Enter package names (space-separated):",default:t||"",validate:s=>!s||s.trim()===""?"Please enter at least one package name":true}),r=await prompts.confirm({message:"\u{1F6E0}\uFE0F Install as dev dependency?",default:false});return {packages:e.split(" ").filter(s=>s.trim()),isDev:r}}static async promptUpdate(){return await prompts.select({message:"What do you want to update?",choices:[{name:"All packages",value:"all"},{name:"Specific packages",value:"specific"}]})==="all"?{updateAll:true}:{updateAll:false,packages:(await prompts.input({message:"\u{1F4E6} Enter package names (space-separated):",validate:r=>!r||r.trim()===""?"Please enter at least one package name":true})).split(" ").filter(r=>r.trim())}}static async promptUseCurrentDir(t){return await prompts.confirm({message:`Use current directory "${t}" as the space root?`,default:true})}static async promptDeleteExistingDir(t){return await prompts.confirm({message:`\u26A0\uFE0F Directory already exists at "${t}". Delete and recreate?`,default:false})}static showSuccess(t,e){console.log(""),e.forEach((r,s)=>{console.log(`\u2192 ${r}`);}),console.log("");}static showError(t,e){console.log(`
13
13
  \u2718 Error:`,t),e&&e.message&&console.log(` ${e.message}`),console.log("");}static showWarning(t){console.log(`
14
14
  \u26A0\uFE0F Warning:`,t),console.log("");}static showInfo(t){console.log(`
15
15
  \u2139\uFE0F `,t),console.log("");}};var $=class{constructor(){this.frames=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];this.currentFrame=0;this.interval=null;}start(t){process.stdout.write(`
@@ -25,5 +25,5 @@ Please try:
25
25
  3. Run PowerShell/Terminal as Administrator
26
26
  4. Wait a few seconds and try again`):o.showError("Failed to delete existing directory.",f),process.exit(1);}}r&&(console.log(`\u{1F4E6} Detected organization: @${r}`),console.log(`\u{1F4DD} Package name: ${s}`));let p=a.getTemplate(e.type,e.template);p?.deps&&console.log(`\u{1F4E6} Includes: ${p.deps.join(", ")}`),await this.spaceManager.createSpace({type:e.type,template:e.template,pm:"bun",repo:{org:r,name:s,version:"0.0.1",desc:e.description,kw:e.keywords.length>0?e.keywords:[],license:e.license||"MIT"},author:{id:e.githubId,name:e.author,email:e.authorEmail,url:""},createdAt:new Date().toISOString()},i),o.showSuccess(s,[i===process.cwd()?"space install":`cd ${s}`,"space install","space build"]);}catch(e){o.showError("Failed to create space",e),process.exit(1);}}showSpaceInfo(){if(!this.ensureSpace())return;let t=this.spaceManager.loadSpaceConfig();if(!t){console.error("\u2718 Could not load space configuration.");return}console.log("");let r=t.repo?.org&&t.repo.org.trim()!==""?`${t.repo.org}/${t.repo.name}`:t.repo.name;if(console.log(`Name: ${r}`),console.log(`Type: ${t.type}`),console.log(`Version: ${t.repo.version}`),t.repo.desc&&t.repo.desc!=="{{desc}}"&&t.repo.desc!=="{{description}}"&&console.log(`Description: ${t.repo.desc}`),t.repo.kw){let s=[];if(Array.isArray(t.repo.kw))s=t.repo.kw.filter(a=>a&&typeof a=="string"&&a.trim()!==""&&a!=="{{kw}}"&&a!=="{{keywords}}");else if(typeof t.repo.kw=="string"){let a=t.repo.kw;a!=="{{kw}}"&&a!=="{{keywords}}"&&a.trim()!==""&&(s=a.split(",").map(i=>i.trim()).filter(i=>i!==""));}s.length>0&&console.log(`Keywords: ${s.join(", ")}`);}t.repo.license&&t.repo.license!=="{{license}}"&&console.log(`License: ${t.repo.license}`),console.log("PackageManager: bun"),t.author?.name&&t.author.name!=="{{author}}"&&t.author.name!=="{{author_name}}"&&console.log(`Author: ${t.author.name}`),console.log(`Created: ${new Date(t.createdAt).toLocaleDateString()}`),console.log("");}async installPackages(t){if(this.ensureSpace()){this.pm||this.initPackageManager();try{let e=t.args.packages?t.args.packages.split(" ").filter(s=>s.trim()):void 0,r=t.options.dev||!1;if((!e||e.length===0)&&!await o.promptConfirm("No packages specified. Install all dependencies from package.json?",!0)){let a=await o.promptInstall();e=a.packages,r=a.isDev;}this.pm.install(e,{dev:r,global:t.options.global});}catch(e){o.showError("\u2718 Installation failed",e),process.exit(1);}}}async removePackages(t){if(this.ensureSpace()){this.pm||this.initPackageManager();try{let e=t.args.packages.split(" ").filter(s=>s.trim());if(e.length===0){o.showError("Please specify packages to remove");return}if(!(await o.promptRemove(e)).confirm){o.showInfo("Removal cancelled");return}this.pm.remove(e,{global:t.options.global});}catch(e){o.showError("\u2718 Removal failed",e),process.exit(1);}}}async updatePackages(t){if(this.ensureSpace()){this.pm||this.initPackageManager();try{let e=t.args.packages?t.args.packages.split(" ").filter(r=>r.trim()):void 0;if(!e||e.length===0){let r=await o.promptUpdate();e=r.updateAll?void 0:r.packages;}this.pm.update(e);}catch(e){o.showError("\u2718 Update failed",e),process.exit(1);}}}linkPackage(){this.ensureSpace()&&(this.pm||this.initPackageManager(),this.pm.link());}unlinkPackage(){this.ensureSpace()&&(this.pm||this.initPackageManager(),this.pm.unlink());}listPackages(t){this.ensureSpace()&&(this.pm||this.initPackageManager(),this.pm.list({global:t.options.global}));}runScript(t){if(!this.ensureSpace())return;this.pm||this.initPackageManager();let e=t?.args?.script;if(!e){o.showError("Please specify a script name");return}try{let r=[];if(t?.dynamicArgs&&Array.isArray(t.dynamicArgs)&&r.push(...t.dynamicArgs),t?.dynamicOptions&&typeof t.dynamicOptions=="object")for(let[s,a]of Object.entries(t.dynamicOptions))r.push(`--${s}`),a!==!0&&a!==!1&&r.push(String(a));this.pm.run(e,r.length>0?r:void 0);}catch(r){o.showError(`Failed to run script "${e}"`,r),process.exit(1);}}buildSpace(t){if(!this.ensureSpace())return;this.pm||this.initPackageManager();let e=new $;e.start("Building space...");try{this.pm.runSilent("build"),e.stop(t?"":"\u2714 Build succeeded");}catch{e.stopWithError("\u2718 Build failed"),process.exit(1);}}buildSpaceBool(t){if(!this.ensureSpace())return false;this.pm||this.initPackageManager();let e=new $;e.start("Building space...");try{return this.pm.runSilent("build"),e.stop(t?"":"\u2714 Build succeeded"),!0}catch{return e.stopWithError("\u2718 Build failed!"),false}}runTests(t){if(!this.ensureSpace())return;this.pm||this.initPackageManager();let e=t?.args?.path||null;e?this.pm.run("test",[e]):this.pm.run("test");}clean(){if(!this.ensureSpace())return;this.pm||this.initPackageManager();let t=new $;t.start("Cleaning build artifacts...");try{this.pm.run("clean"),t.stop("\u2714 Clean complete!");}catch{t.stopWithError("\u2718 Clean failed!"),process.exit(1);}}startMain(t){if(this.buildSpaceBool(true))try{let e=this.findBuiltMainFile();e||(o.showError(`Could not find built entry point.
27
27
  Expected to find dist/main.js or dist/index.js after build.`),process.exit(1));let r=[];if(t?.dynamicArgs&&Array.isArray(t.dynamicArgs)&&r.push(...t.dynamicArgs),t?.dynamicOptions&&typeof t.dynamicOptions=="object")for(let[a,i]of Object.entries(t.dynamicOptions))r.push(`--${a}`),i!==!0&&i!==!1&&r.push(String(i));r.length>0;let s=child_process.spawnSync("bun",[e,...r],{stdio:"inherit",cwd:process.cwd()});s.error&&(o.showError("Failed to start process",s.error),process.exit(1)),s.status!==0&&s.status!==null&&(console.error(`
28
- \u2718 Process exited with error`),process.exit(s.status));}catch(e){o.showError("Failed to start",e),process.exit(1);}}findBuiltMainFile(){let t=["dist/main.js","dist/index.js","dist/app.js"];for(let e of t)if(u__namespace.existsSync(T__namespace.join(process.cwd(),e)))return e;try{let e=T__namespace.join(process.cwd(),"package.json");if(u__namespace.existsSync(e)){let r=JSON.parse(u__namespace.readFileSync(e,"utf-8"));if(r.main&&u__namespace.existsSync(r.main))return r.main}}catch{}return null}async publish(t){if(this.buildSpaceBool(true))try{let e=this.spaceManager.loadSpaceConfig();if(!e){o.showError("Could not load space configuration");return}let r=e.repo.org?`@${e.repo.org}/${e.repo.name}`:e.repo.name,s=t.options.tag,a=t.options.access;if(!s&&!a){let n=await o.promptPublish(r);if(!n.confirm){o.showInfo("Publish cancelled");return}s=n.tag,a=n.access;}let i=new $;i.start("Publishing package..."),this.pm.publish({tag:s,access:a},i);}catch(e){o.showError("Publish failed",e),process.exit(1);}}};var W=M.create({name:"Space",version:"0.0.1",desc:"Build flexible spaces for any platform"});W.run();//# sourceMappingURL=main.cjs.map
28
+ \u2718 Process exited with error`),process.exit(s.status));}catch(e){o.showError("Failed to start",e),process.exit(1);}}findBuiltMainFile(){let t=["dist/main.js","dist/index.js","dist/app.js"];for(let e of t)if(u__namespace.existsSync(T__namespace.join(process.cwd(),e)))return e;try{let e=T__namespace.join(process.cwd(),"package.json");if(u__namespace.existsSync(e)){let r=JSON.parse(u__namespace.readFileSync(e,"utf-8"));if(r.main&&u__namespace.existsSync(r.main))return r.main}}catch{}return null}async publish(t){if(this.buildSpaceBool(true))try{let e=this.spaceManager.loadSpaceConfig();if(!e){o.showError("Could not load space configuration");return}let r=e.repo.org?`@${e.repo.org}/${e.repo.name}`:e.repo.name,s=t.options.tag,a=t.options.access;if(!s&&!a){let n=await o.promptPublish(r);if(!n.confirm){o.showInfo("Publish cancelled");return}s=n.tag,a=n.access;}let i=new $;i.start("Publishing package..."),this.pm.publish({tag:s,access:a},i);}catch(e){o.showError("Publish failed",e),process.exit(1);}}};var W=M.create({name:"Space",version:"0.0.2",desc:"Build flexible spaces for any platform"});W.run();//# sourceMappingURL=main.cjs.map
29
29
  //# sourceMappingURL=main.cjs.map