@minejs/hmm 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.
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.8-black"/>
11
+ <img src="https://img.shields.io/badge/v-0.0.9-black"/>
12
12
  <a href="https://github.com/minejs-org"> <img src="https://img.shields.io/badge/🔥-@minejs-black"/> </a>
13
13
  <br>
14
14
  <img src="https://img.shields.io/badge/coverage---%25-brightgreen" alt="Test Coverage" />
@@ -164,7 +164,7 @@
164
164
  >
165
165
  > Perfect for publishing reusable packages
166
166
  >
167
- > Example: [hmm-repos/lib](https://github.com/hmm-repos/lib)
167
+ > Example: [repo-example/lib](https://github.com/repo-example/lib)
168
168
 
169
169
  - **`cli`** - Command-line tool
170
170
 
@@ -172,7 +172,7 @@
172
172
  >
173
173
  > Built-in argument parsing and command handling
174
174
  >
175
- > Example: [hmm-repos/cli](https://github.com/hmm-repos/cli)
175
+ > Example: [repo-example/cli](https://github.com/repo-example/cli)
176
176
 
177
177
  - **`server`** - Backend server application
178
178
 
@@ -180,7 +180,7 @@
180
180
  >
181
181
  > Ready for API and backend services
182
182
  >
183
- > Example: [hmm-repos/server](https://github.com/hmm-repos/server)
183
+ > Example: [repo-example/server](https://github.com/repo-example/server)
184
184
 
185
185
  - **`app`** - Full-stack web application
186
186
 
@@ -188,7 +188,7 @@
188
188
  >
189
189
  > Complete web application stack
190
190
  >
191
- > Example: [hmm-repos/app](https://github.com/hmm-repos/app)
191
+ > Example: [repo-example/app](https://github.com/repo-example/app)
192
192
 
193
193
  <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
194
194
 
package/dist/index.cjs CHANGED
@@ -6,7 +6,7 @@
6
6
  `+r.repeat(t)+"]"}static formatObject(e,t,r,s,a,i,n,u,h){if(Object.keys(e).length===0)return "{}";let p=Object.keys(e);p=this.sortKeys(p,h,a);let y=r.repeat(t+1),k=(t+1)*(r===" "?u:r.length);return `{
7
7
  `+p.map(d=>{let c=JSON.stringify(d),f=this.formatValue(e[d],t+1,r,s,a,i,n,u,h),C=e[d]!==null&&typeof e[d]=="object"&&!Array.isArray(e[d]);if(s&&!C){let _=n-k,U=i-c.length,V=" ".repeat(_+U);return `${y}${c}${V} : ${f}`}else return `${y}${c}: ${f}`}).join(`,
8
8
  `)+`
9
- `+r.repeat(t)+"}"}};if(q.main===module){let m=process.argv[2]||process.cwd();A__namespace.isAbsolute(m)||(m=A__namespace.resolve(process.cwd(),m));let e=v.formatDirectory(m,{alignColons:true,sortKeys:false});e.success.length>0,e.failed.length>0,e.success.length===0&&e.failed.length;}var F=class{constructor(e=process.cwd()){this.basePath=e;}async createSpace(e,t){let r=t||A__namespace.join(this.basePath,e.repo.name);if(g__namespace.existsSync(r))throw new Error(`Space path "${r}" already exists!`);let s=false;try{g__namespace.existsSync(r)||(g__namespace.mkdirSync(r,{recursive:!0}),s=!0),await this.cloneTemplate(e.type,r,e,e.template),this.createSpaceConfig(r,e);}catch(a){if(s&&g__namespace.existsSync(r))try{await this.safeDeleteDirectory(r);}catch{console.warn(`Warning: Could not clean up directory at "${r}"`);}throw a}}loadSpaceConfig(e){let t=e||this.basePath,r=A__namespace.join(t,".hmm");if(!g__namespace.existsSync(r))return null;let s=g__namespace.readFileSync(r,"utf-8");return JSON.parse(s)}isSpace(e){let t=e||this.basePath;return g__namespace.existsSync(A__namespace.join(t,".hmm"))}async cloneTemplate(e,t,r,s){let i=`https://github.com/hmm-repos/${b.getRepoName(e,s)}.git`;try{let{execSync:n}=await import('child_process');n(`git clone --quiet --depth 1 ${i} "${t}"`,{stdio:"pipe"});let u=A__namespace.join(t,".git");g__namespace.existsSync(u)&&await this.safeDeleteDirectory(u),await this.updateTemplateFiles(t,r);}catch(n){throw n instanceof Error?n.message&&n.message.includes("Repository not found")?new Error(`Template repository not found: ${i}
9
+ `+r.repeat(t)+"}"}};if(q.main===module){let m=process.argv[2]||process.cwd();A__namespace.isAbsolute(m)||(m=A__namespace.resolve(process.cwd(),m));let e=v.formatDirectory(m,{alignColons:true,sortKeys:false});e.success.length>0,e.failed.length>0,e.success.length===0&&e.failed.length;}var F=class{constructor(e=process.cwd()){this.basePath=e;}async createSpace(e,t){let r=t||A__namespace.join(this.basePath,e.repo.name);if(g__namespace.existsSync(r))throw new Error(`Space path "${r}" already exists!`);let s=false;try{g__namespace.existsSync(r)||(g__namespace.mkdirSync(r,{recursive:!0}),s=!0),await this.cloneTemplate(e.type,r,e,e.template),this.createSpaceConfig(r,e);}catch(a){if(s&&g__namespace.existsSync(r))try{await this.safeDeleteDirectory(r);}catch{console.warn(`Warning: Could not clean up directory at "${r}"`);}throw a}}loadSpaceConfig(e){let t=e||this.basePath,r=A__namespace.join(t,".hmm");if(!g__namespace.existsSync(r))return null;let s=g__namespace.readFileSync(r,"utf-8");return JSON.parse(s)}isSpace(e){let t=e||this.basePath;return g__namespace.existsSync(A__namespace.join(t,".hmm"))}async cloneTemplate(e,t,r,s){let i=`https://github.com/repo-example/${b.getRepoName(e,s)}.git`;try{let{execSync:n}=await import('child_process');n(`git clone --quiet --depth 1 ${i} "${t}"`,{stdio:"pipe"});let u=A__namespace.join(t,".git");g__namespace.existsSync(u)&&await this.safeDeleteDirectory(u),await this.updateTemplateFiles(t,r);}catch(n){throw n instanceof Error?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}`):new Error(`Failed to clone template from ${i}: ${n}`)}}async updateTemplateFiles(e,t){let r=t.repo.org&&t.repo.org.trim()!=="",s=t.author.id&&t.author.id.trim()!=="",a=r?t.repo.org:s?t.author.id:"",i=a?`git+https://github.com/${a}/${t.repo.name}.git`:"",n=a?`https://github.com/${a}/${t.repo.name}#readme`:"",u=a?`https://github.com/${a}/${t.repo.name}/issues`:"",h=r?`@${t.repo.org}/${t.repo.name}`:t.repo.name,p="\u{1F525}-";r?p+=`@${(t.repo.org.replace(/-/g,"--")+"/"+t.repo.name.replace(/-/g,"--")).replace(/ /g,"_")}`:t.author.name?p+=(t.author.name.replace(/-/g,"--")+"/"+t.repo.name.replace(/-/g,"--")).replace(/ /g,"_"):p+=t.repo.name.replace(/-/g,"--").replace(/ /g,"_");let y=s?`https://github.com/${t.author.id}`:t.author.url||"",k=this.getAllFiles(e);for(let o of k)if(!(o.includes("node_modules")||o.includes(".git")))try{let d=g__namespace.readFileSync(o,"utf-8");if(d.includes("{{")&&(d=d.replace(/\{\{tag\}\}/g,h).replace(/\{\{tag-badge\}\}/g,p).replace(/\{\{name\}\}/g,t.repo.name).replace(/\{\{repo\}\}/g,t.repo.name).replace(/\{\{org\}\}/g,t.repo.org||"").replace(/\{\{desc\}\}/g,t.repo.desc||`A ${t.type} space`).replace(/\{\{description\}\}/g,t.repo.desc||`A ${t.type} space`).replace(/\{\{version\}\}/g,t.repo.version).replace(/\{\{license\}\}/g,t.repo.license||"MIT").replace(/\{\{url\}\}/g,i).replace(/\{\{repo_url\}\}/g,i).replace(/\{\{git_url\}\}/g,i).replace(/\{\{homepage\}\}/g,n).replace(/\{\{issues\}\}/g,u).replace(/\{\{type\}\}/g,t.type).replace(/\{\{template\}\}/g,t.template||"clean").replace(/\{\{pm\}\}/g,t.pm).replace(/\{\{author\}\}/g,t.author.name||"").replace(/\{\{author_name\}\}/g,t.author.name||"").replace(/\{\{author_id\}\}/g,t.author.id||"").replace(/\{\{author_email\}\}/g,t.author.email||"").replace(/\{\{author_url\}\}/g,y),g__namespace.writeFileSync(o,d,"utf-8")),o.endsWith("package.json")){let c=JSON.parse(d);if(c.name=h,c.version=t.repo.version,c.description=t.repo.desc||`A ${t.type} space`,c.license=t.repo.license||"MIT",t.repo.kw&&t.repo.kw.length>0?c.keywords=t.repo.kw:c.keywords=[],n&&(c.homepage=n),u&&(c.bugs||(c.bugs={}),c.bugs.url=u),t.author.name&&(t.author.email?c.author={name:t.author.name,email:t.author.email,url:y||void 0}:c.author={name:t.author.name,url:y||void 0}),i&&(c.repository={type:"git",url:i}),t.type==="cli"&&c.bin){let f=Object.keys(c.bin)[0],C=c.bin[f];delete c.bin[f],c.bin[t.repo.name]=C;}c.engines||(c.engines={}),c.engines.bun||(c.engines.bun=">=1.0.0"),d=v.format(c,{keyOrder:R}),g__namespace.writeFileSync(o,d+`
11
11
  `,"utf-8");continue}}catch{continue}}getAllFiles(e,t=[]){return g__namespace.readdirSync(e).forEach(s=>{let a=A__namespace.join(e,s);g__namespace.statSync(a).isDirectory()?t=this.getAllFiles(a,t):t.push(a);}),t}createSpaceConfig(e,t){let r=A__namespace.join(e,".hmm"),s=t.repo.org&&t.repo.org.trim()!=="",a=t.author.id&&t.author.id.trim()!=="",i=s?t.repo.org:a?t.author.id:"",n=i?`git+https://github.com/${i}/${t.repo.name}.git`:"",u=i?`https://github.com/${i}/${t.repo.name}#readme`:"",h=i?`https://github.com/${i}/${t.repo.name}/issues`:"",p=a?`https://github.com/${t.author.id}`:t.author.url||"",y={type:t.type,template:t.template||"clean",pm:t.pm,repo:{org:t.repo.org||"",name:t.repo.name,version:t.repo.version,desc:t.repo.desc||`A ${t.type} space`,kw:t.repo.kw||[],license:t.repo.license||"MIT",issues:h,homepage:u,git_url:n},author:{id:t.author.id||"",name:t.author.name||"",email:t.author.email||"",url:p},createdAt:new Date().toISOString()},k=v.format(y,{keyOrder:J});g__namespace.writeFileSync(r,k+`
12
12
  `,"utf-8");}async safeDeleteDirectory(e,t=3){for(let r=0;r<t;r++)try{if(g__namespace.rmSync(e,{recursive:!0,force:!0,maxRetries:3,retryDelay:100}),!g__namespace.existsSync(e))return}catch(s){if(r===t-1)throw s;await new Promise(a=>setTimeout(a,300*(r+1)));}}};var O=class{constructor(){this.DEFAULT_SCRIPTS={build:"tsup",test:"test",lint:"eslint src --ext .ts"};}install(e,t){let r=[];t?.global?(r.push("install","--global"),e&&e.length>0?r.push(...e):(console.error("\u2718 Please specify packages to install globally"),process.exit(1))):(r.push("install"),e&&e.length>0&&r.push(...e),t?.dev&&r.push("--dev")),console.log(`\u2192 Installing${e?` ${e.join(", ")}`:" dependencies"}${t?.global?" globally":""}...`),this.execute(r),t?.global||this.format();}remove(e,t){let r=["remove"];t?.global&&r.push("--global"),r.push(...e),console.log(`\u{1F5D1}\uFE0F Removing ${e.join(", ")}${t?.global?" globally":""}...`),this.execute(r),t?.global||this.format();}link(e){if(e){let t=Array.isArray(e)?e:[e],r=t.join(", ");console.log(`\u{1F517} Linking global package${t.length>1?"s":""} "${r}" to current project...`),this.execute(["link",...t]);}else console.log("\u{1F517} Linking current package globally..."),this.execute(["link"]);}unlink(e){if(e){let t=Array.isArray(e)?e:[e],r=t.join(", ");console.log(`\u{1F513} Unlinking global package${t.length>1?"s":""} "${r}" from current project...`),this.execute(["unlink",...t]);}else console.log("\u{1F513} Unlinking current package globally..."),this.execute(["unlink"]);}run(e,t){let r=this.getScriptCommand(e);if(r||(console.error(`\u2718 Script "${e}" not found in package.json and no default available`),process.exit(1)),this.isUsingDefaultScript(e)){let a=[...r.split(" ")];t&&t.length>0&&a.push(...t),this.execute(a);}else {let s=["run",e];t&&t.length>0&&s.push("--",...t),this.execute(s);}}runSilent(e,t){let r=this.getScriptCommand(e);if(!r)throw new Error(`Script "${e}" not found in package.json and no default available`);if(this.isUsingDefaultScript(e)){let a=[...r.split(" ")];t&&t.length>0&&a.push(...t),this.executeSilent(a);}else {let s=["run",e];t&&t.length>0&&s.push("--",...t),this.executeSilent(s);}}update(e){console.log(`\u{1F504} Updating${e?` ${e.join(", ")}`:" all packages"}...`);let t=["update"];e&&e.length>0&&t.push(...e),this.execute(t),this.format();}list(e){let t=["pm","ls"];e?.global&&t.push("--global"),this.execute(t);}init(){console.log("\u{1F4DD} Initializing package.json..."),this.execute(["init","-y"]),this.format();}publish(e,t){let r=["publish"];e?.tag&&r.push("--tag",e.tag);let s=e?.access||"public";r.push("--access",s),t&&t.stop(""),Bun.spawnSync(["bun",...r],{stdout:"inherit",stderr:"inherit",stdin:"inherit"}).exitCode===0?console.log("\u2714 Published successfully!"):(console.error("\u2718 Publish failed!"),process.exit(1));}execute(e){Bun.spawnSync(["bun",...e],{stdout:"inherit",stderr:"inherit"}).exitCode!==0&&(console.error(`\u2718 Command failed: bun ${e.join(" ")}`),process.exit(1));}executeSilent(e){let t=Bun.spawnSync(["bun",...e],{stdout:"pipe",stderr:"pipe"});if(t.exitCode!==0){let r=new TextDecoder().decode(t.stderr);console.error(`\u2718 Command failed: bun ${e.join(" ")}`),r&&console.error(r),process.exit(1);}}getName(){return "bun"}getEmoji(){return "\u{1F95F}"}format(){try{let e=A__namespace.join(process.cwd(),"package.json");g__namespace.existsSync(e)&&v.formatFile(e,{keyOrder:R});}catch{}}getScriptCommand(e){let t=A__namespace.join(process.cwd(),"package.json");if(g__namespace.existsSync(t))try{let r=JSON.parse(g__namespace.readFileSync(t,"utf-8"));if(r.scripts&&r.scripts[e])return r.scripts[e]}catch{}return e in this.DEFAULT_SCRIPTS?this.DEFAULT_SCRIPTS[e]:null}isUsingDefaultScript(e){let t=A__namespace.join(process.cwd(),"package.json");if(g__namespace.existsSync(t))try{let r=JSON.parse(g__namespace.readFileSync(t,"utf-8"));if(r.scripts&&r.scripts[e])return !1}catch{}return e in this.DEFAULT_SCRIPTS}};j();var l=class{static async promptInit(e){let t=e.name,r=e.type,s=e.template,a=e.desc,i="";if((!t||t==="my-space")&&(t=await prompts.input({message:"name:",default:"my-space",validate:o=>{if(!o||o.trim()==="")return "Space name is required";let d=/^@([a-z0-9-_]+)\/([a-z0-9-_]+)$/,c=/^[a-z0-9-_]+$/;return !d.test(o)&&!c.test(o)?'Name must be either "package-name" or "@org/package-name" (lowercase, numbers, hyphens, underscores only)':true}})),!r){let o=b.getTemplatesForType("lib",false).length>0,d=b.getTemplatesForType("cli",false).length>0,c=b.getTemplatesForType("server",false).length>0,f=b.getTemplatesForType("app",false).length>0;r=await prompts.select({message:"type:",choices:[{name:`\u2192 Library - TypeScript library for npm${o?"":" (Coming Soon)"}`,value:"lib",disabled:o?false:"No templates ready yet"},{name:`\u2192 CLI - Command-line tool${d?"":" (Coming Soon)"}`,value:"cli",disabled:d?false:"No templates ready yet"},{name:`\u2192 Server - Backend server application${c?"":" (Coming Soon)"}`,value:"server",disabled:c?false:"No templates ready yet"},{name:`\u2192 Web App - Full-stack web application${f?"":" (Coming Soon)"}`,value:"web",disabled:f?false:"No templates ready yet"}]});}if(!s){let o=b.getTemplatesForType(r,true);if(o.filter(f=>f.ready).length===0)throw new Error(`No templates are ready yet for "${r}" spaces. This space type is coming soon!`);let c=o.map(f=>{let C=f.ready?"\u2714":"\u{1F6A7}",_=f.ready?"":" (Coming Soon)";return {name:`${C} ${f.label}${_} - ${f.description}`,value:f.name,short:f.label,disabled:f.ready?false:"Not ready yet"}});s=await prompts.select({message:"template:",choices:c,default:b.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 u=await prompts.input({message:"author email:",default:"",validate:o=>o&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o)?"Please enter a valid email address or leave empty":true}),h=await prompts.input({message:"github username:",default:"",validate:o=>o&&!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i.test(o)?"Please enter a valid GitHub username or leave empty":true}),p=await prompts.input({message:"keywords (comma-separated):",default:""}),y=p?p.split(",").map(o=>o.trim()).filter(o=>o):[],k=await prompts.input({message:"license:",default:"MIT"});return {name:t,type:r,template:s,description:a,packageManager:n,author:i,authorEmail:u,githubId:h,keywords:y,license:k}}static async promptPublish(e){if(!await prompts.confirm({message:`Are you sure you want to publish "${e}" 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(e){let t=await prompts.confirm({message:`Remove ${e.join(", ")}?`,default:true});return {packages:e,confirm:t}}static async promptConfirm(e,t=false){let s=(await import('readline')).createInterface({input:process.stdin,output:process.stdout}),a=t?" (Y/n)":" (y/N)";return new Promise(i=>{s.question(`${e}${a} `,n=>{s.close(),n.trim()===""?i(t):i(n.trim().toLowerCase()==="y"||n.trim().toLowerCase()==="yes");});})}static async promptInstall(e){let t=await prompts.input({message:"Enter package names (space-separated):",default:e||"",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:t.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(e){return await prompts.confirm({message:`Use current directory "${e}" as the space root?`,default:true})}static async promptDeleteExistingDir(e){return await prompts.confirm({message:`\u26A0\uFE0F Directory already exists at "${e}". Delete and recreate?`,default:false})}static showSuccess(e,t){console.log(""),t.forEach(r=>{console.log(`\u2192 ${r}`);}),console.log("");}static showError(e,t){console.log(`