minimaz-cli 0.5.0 → 0.5.1

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.
Files changed (2) hide show
  1. package/bin/cli.js +1 -0
  2. package/package.json +2 -2
package/bin/cli.js CHANGED
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  import{transform as fe}from"esbuild";import{cp as Vt,lstat as Yt,mkdir as ot,readdir as Kt,readFile as it,rm as Qt,stat as qt,writeFile as Xt}from"node:fs/promises";import{dirname as Zt}from"node:path";var Bt={error:"\x1B[31m[ --- ERROR ----- ] \x1B[0m",warn:"\x1B[33m[ --- WARN ------ ] \x1B[0m",success:"\x1B[32m[ --- SUCCESS --- ] \x1B[0m",info:"\x1B[34m[ --- INFO ------ ] \x1B[0m",debug:"\x1B[90m[ --- DEBUG ----- ] \x1B[0m"};function Nt(t=new Date){let e=p=>p<10?"0"+p:""+p,r=t.getFullYear(),o=e(t.getMonth()+1),n=e(t.getDate()),a=e(t.getHours()),s=e(t.getMinutes()),c=e(t.getSeconds());return`${r}-${o}-${n} ${a}:${s}:${c}`}var rt=()=>process.env.VERBOSE==="true";function _t(t){return Array.isArray(t)?t:[t]}function Ht(t,e){let r=Bt[t]+e;if(t==="error"){console.error(r);return}if(t==="warn"){console.warn(r);return}console.log(r)}function Jt(){return rt()?`[${Nt()}] `:""}function E(t,e,r=!1,o=!1){let n=rt();if(o&&!n)return;let a=_t(e);for(let s=0;s<a.length;s++){let c=a[s];if(r){console.log(n?`${Jt()}${c}`:c);continue}Ht(t,c)}}var i={debug(t){E("debug",t,!1,!0)},default(t){E("info",t,!0)},error(t){E("error",t)},info(t){E("info",t)},success(t){E("success",t,!1)},verbose(t){E("info",t,!0,!0)},warn(t){E("warn",t)}};async function m(t){try{return await qt(t),!0}catch{return!1}}async function L(t){if(!await m(t))throw new Error(`NOT FOUND: "${t}" does not exist`);try{let r=await it(t,"utf8");return JSON.parse(r)}catch(r){let o=r instanceof Error?r.message:String(r);throw new Error(`PARSE ERROR: Failed to parse JSON in "${t}" - ${o}`,{cause:r})}}async function y(t){return i.debug(`Reading directory: ${t}`),await m(t)?await Kt(t):(i.warn(`Directory does not exist: ${t}`),[])}async function I(t){await Qt(t,{recursive:!0,force:!0})}async function P(t){await ot(t,{recursive:!0})}async function $(t,e,r=!1){await Vt(t,e,{recursive:!0,force:r,errorOnExist:!r})}async function x(t,e,r){let o=Zt(t);await ot(o,{recursive:!0}),await Xt(t,e,r||"utf8")}async function T(t){return Yt(t).then(e=>e.isDirectory()).catch(()=>!1)}async function F(t){try{return await it(t,"utf8")}catch(e){let r=e instanceof Error?e.message:String(e);return i.error(`Failed to read file at "${t}": ${r}`),""}}import{basename as R,dirname as V,extname as S,isAbsolute as A,join as l,normalize as b,resolve as d}from"node:path";var g={globalDir:".minimaz",inputDir:"./src",outputDir:"./dist"},G={input:{dir:g.inputDir,mapping:{pages:"",scripts:"",styles:"",public:""},externals:{"./node_modules/example/fonts":"assets/fonts","https://example.com/library.js":"js/vendor/vue.js"},exclude:["**/test/**","**dev**"]},output:{dir:g.outputDir,replace:{"../public/":"/"},css:{bundling:!0,minify:!0},html:{minify:!0},js:{bundling:!0,minify:!0}}};var U=new Map;import{spawn as re}from"cross-spawn";import{execSync as oe}from"node:child_process";import{homedir as ie}from"node:os";import{createInterface as ne}from"node:readline";import{transform as te}from"esbuild";import{minify as ee}from"html-minifier-terser";async function nt(t,e,r){try{let o=r===".css"?"css":r.includes("ts")?"ts":"js";await te(e,{loader:o,format:"esm",logLevel:"silent"}),i.success(`${o.toUpperCase()} Valid: ${t}`)}catch(o){i.error(`Syntax Error in ${t}:`);let n=o;n.errors&&Array.isArray(n.errors)&&n.errors.forEach(a=>{let s=a.location?.line??"??";i.error(` -> Line ${s}: ${a.text}`)})}}async function st(t,e){try{await ee(e,{continueOnParseError:!1,caseSensitive:!0}),i.success(`HTML Valid: ${t}`)}catch(r){let o=r instanceof Error?r.message:String(r);i.error(`HTML Error [${t}]: ${o}`)}}var W=class extends Error{errors;constructor(e){super("Config validation error"),this.name="ConfigValidationError",this.errors=e}};function Y(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)&&Object.values(t).every(e=>typeof e=="string")}function B(t,e){try{let r=JSON.parse(e);if(typeof r!="object"||r===null)throw new Error("Invalid config root object");let o=r,n=[];if(!o.input)n.push("Missing 'input' section");else{let{input:s}=o;typeof s.dir!="string"&&n.push("input.dir must be a string"),Y(s.mapping)||n.push("input.mapping must be a valid key-value record of strings"),s.externals!==void 0&&!Y(s.externals)&&n.push("input.externals must be a valid key-value record of strings"),s.exclude!==void 0&&!Array.isArray(s.exclude)&&n.push("input.exclude must be an array of strings")}if(!o.output)n.push("Missing 'output' section");else{let{output:s}=o;typeof s.dir!="string"&&n.push("output.dir must be a string"),s.replace!==void 0&&!Y(s.replace)&&n.push("output.replace must be a valid key-value record of strings"),["css","js"].forEach(p=>{let u=s[p];(!u||typeof u.bundling!="boolean"||typeof u.minify!="boolean")&&n.push(`output.${p} must contain 'bundling' (boolean) and 'minify' (boolean)`)}),(!s.html||typeof s.html.minify!="boolean")&&n.push("output.html must contain 'minify' (boolean)")}let a=Object.keys(G);if(Object.keys(o).forEach(s=>{a.includes(s)||i.warn(`Unknown configuration key: '${s}' in ${t}`)}),n.length>0)throw new W(n);i.success("Config: valid")}catch(r){i.error(`Config Error in ${t}:`),r instanceof W?r.errors.forEach(o=>{i.error(` -> ${o}`)}):r instanceof SyntaxError?i.error(` -> Invalid JSON syntax: ${r.message}`):r instanceof Error?i.error(` -> ${r.message}`):i.error(" -> Unknown error")}}function h(t,e=""){return new Promise(r=>{let o=ne({input:process.stdin,output:process.stdout}),n=setTimeout(()=>{o.close(),r(e)},6e4);o.question(`[QUESTION] ${t}`,a=>{clearTimeout(n),o.close(),r(a.trim()||e)}),o.on("SIGINT",()=>{clearTimeout(n),o.close(),process.exit(130)})})}function O(t,e={}){return Object.entries(e).reduce((r,[o,n])=>{let a=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(a,"g");return r.replace(s,n)},t)}async function D(t,e){try{let r=b(t),o;return U.has(r)?(o=U.get(r),i.debug(`Cache hit: ${r}`)):(o=await F(r),U.set(r,o),i.debug(`Cache miss (Disk read): ${r}`)),e&&(o=O(o,e)),o}catch(r){let o=r instanceof Error?r.message:String(r);return i.error(`Failed to read file ${t}: ${o}`),""}}function at(){i.debug("Getting global node modules");try{let t=oe("npm config get prefix",{encoding:"utf8"}).trim();if(!t)throw new Error("Empty npm prefix");return process.platform==="win32"?l(t,"node_modules","minimaz-cli"):l(t,"lib","node_modules","minimaz-cli")}catch{return process.platform==="win32"?l(process.env.APPDATA||"","npm","node_modules","minimaz-cli"):"/usr/local/lib/node_modules/minimaz-cli"}}async function se(){i.debug("Checking existence of global Minimaz directory");let t=l(ie(),g.globalDir);if(!await m(t))throw new Error('Global Minimaz folder does not exist.Run "minimaz config" to generate it');return t}async function K(){i.debug("Getting global templates directory");let t=l(await se(),"templates");if(!await m(t))throw new Error("Template directory not found in global directory");return t}async function ct(t){i.debug(`Getting template "${t}"directory`);let e=l(await K(),t);if(!await m(e))throw new Error(`Template "${t}" not found`);return e}async function N(){i.debug("Getting default templates directory");let t=l(at(),"templates");if(!await m(t))throw new Error("Default template folder not found");return t}function j(t,e,r){return i.debug(`Running: ${t} ${e.join(" ")}`),new Promise((o,n)=>{let a=re(t,e,{cwd:r,stdio:"inherit"});a.on("error",n),a.on("close",s=>s===0?o():n(new Error(`${t} exited with code ${s}`)))})}async function C(t,e,r=!0){i.debug("Creating file from template");let o=d(...e),n="";if(t!==void 0)if(typeof t=="string")n=t.endsWith(`
2
3
  `)?t:`${t}
3
4
  `;else if(typeof t=="object"&&t!==null)n=`${JSON.stringify(t,null,2)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minimaz-cli",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Minimal project initializer and builder CLI",
5
5
  "author": "MrZeller",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "esbuild": "^0.25.12",
34
34
  "html-minifier-terser": "^7.2.0"
35
35
  },
36
- "postinstall": "node dist/bin/cli.js",
36
+ "postinstall": "node bin/cli.js",
37
37
  "bin": {
38
38
  "minimaz": "bin/cli.js",
39
39
  "mz": "bin/cli.js"