minimaz-cli 0.3.3 → 0.3.5
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/bin/cli.js +12 -8
- package/package.json +2 -2
- package/templates/default/public/assets/.gitkeep +0 -0
- package/templates/default/public/favicon.ico +0 -0
- package/templates/default/src/index.html +80 -0
- package/templates/default/src/pages/about.html +46 -0
- package/templates/default/src/script.js +1 -0
- package/templates/default/src/style.css +99 -0
- package/templates/simple/public/assets/.gitkeep +0 -0
- package/templates/simple/public/favicon.ico +0 -0
- package/templates/simple/src/index.html +15 -0
- package/templates/simple/src/pages/page.html +11 -0
- package/templates/simple/src/script.js +1 -0
- package/templates/simple/src/style.css +0 -0
package/bin/cli.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var ht=Object.defineProperty;var
|
|
2
|
+
var ht=Object.defineProperty;var d=(t,e)=>()=>(t&&(e=t(t=0)),e);var bt=(t,e)=>{for(var i in e)ht(t,i,{get:e[i],enumerable:!0})};import g from"fs-extra";import h from"path";import M from"clean-css";import{minify as xt}from"html-minifier-terser";import{minify as z}from"terser";import F from"typescript";async function I(){let t=await G(),e=u(),i=h.resolve(e,t.dist);if(await T(i),await g.ensureDir(i),!t.folders||Object.keys(t.folders).length===0){r("warn","No folders defined in config. Nothing to build.");return}for(let[n,s]of Object.entries(t.folders))r("debug",`Building folder: ${n} -> /${s}`),await vt(n,s,t,i);r("success",`Build completed. Output saved in /${t.dist}`)}async function vt(t,e,i,n){let s=u([t]),a=h.join(n,e);if(!await g.pathExists(s)){r("warn",`Folder not found: ${t}`);return}let o={css:[],js:[]};await V(s,a,i,o),t===i.src&&await zt(o,i,n),r("success",`Processed folder: ${t} -> /${e}`)}async function V(t,e,i,n){await g.ensureDir(e);for(let s of await g.readdir(t)){let a=h.join(t,s),o=h.join(e,s),l=await g.stat(a);if(r("debug",`Found ${l.isDirectory()?"DIRECTORY":"FILE"}: ${s}`),l.isDirectory()){await V(a,o,i,n);continue}await $t(a,o,i,n)}}async function $t(t,e,i,n){switch(r("debug",`Processing file: ${t}`),h.extname(t).toLowerCase()){case".html":await Ct(t,e,i);break;case".css":{await jt(t,e,i,n.css);break}case".js":{await Pt(t,e,i,n.js);break}case".ts":{await Et(t,e,i,n.js);break}default:await g.copy(t,e)}}async function Ct(t,e,i){let n=await S(t,i.replace),s=/<script([^>]*)>([\s\S]*?)<\/script>/gi,a=0,o="",l;for(;(l=s.exec(n))!==null;){let[c,x,v]=l;if(o+=n.slice(a,l.index),a=l.index+c.length,/src=/i.test(x)){o+=c;continue}let E=(x.match(/type=["']([^"']+)["']/i)?.[1]||"").toLowerCase(),Y=/module/i.test(E),yt=/nomodule/i.test(x);if(E==="application/json")try{let C=JSON.stringify(JSON.parse(v));o+=`<script${x}>${C}</script>`}catch(C){r("warn",`Invalid JSON in ${t}: ${C}`),o+=c}else if(E===""||E==="text/javascript"||Y||yt)try{let C=await z(v,{format:{semicolons:!0},module:Y});o+=`<script${x}>${C.code||""}</script>`}catch(C){r("warn",`JS minify error in ${t}: ${C}`),o+=c}else o+=c}o+=n.slice(a),i.minify?.html&&(o=await xt(o,{collapseWhitespace:!0,removeComments:!0,minifyCSS:i.minify.css,minifyJS:!1})),await g.outputFile(e,o)}async function jt(t,e,i,n){let s=await S(t,i.replace);if(i.bundling?.css)n.push(s);else{let a=s;if(i.minify?.css){let o=new M().minify(s);o.warnings.length&&o.warnings.forEach(l=>r("warn",l)),a=o.styles}await g.outputFile(e,a)}}async function Pt(t,e,i,n){let s=await S(t,i.replace);if(i.bundling?.js)n.push(s);else{let a=s;i.minify?.js&&(a=(await z(s)).code??""),await g.outputFile(e,a)}}async function Et(t,e,i,n){let s=await S(t,i.replace),o=F.transpileModule(s,{compilerOptions:{module:F.ModuleKind.ESNext,target:F.ScriptTarget.ES2020,sourceMap:!1,strict:!0}}).outputText;if(i.bundling?.js)n.push(o);else{let l=o;i.minify?.js&&(l=(await z(l)).code??""),await g.outputFile(e.replace(/\.ts$/,".js"),l)}}async function zt(t,e,i){await K(e.styles,t.css,e,"css",!!e.bundling?.css,i),await K(e.scripts,t.js,e,"js",!!e.bundling?.js,i),e.bundling?.css&&await St(t.css,e,i),e.bundling?.js&&await Tt(t.js,e,i)}async function K(t,e,i,n,s,a){if(t?.length)for(let o of t){let l=u([o]);if(!await g.pathExists(l)){r("warn",`File not found: ${o} `);continue}let c=await g.readFile(l,"utf-8");if(c=k(c,i.replace),s)e.push(c);else{if(n==="css"&&i.minify?.css){let v=new M().minify(c);v.warnings.length&&v.warnings.forEach(E=>r("warn",E)),c=v.styles}else if(n==="js"&&i.minify?.js)try{c=(await z(c)).code??""}catch(v){r("warn",`JS minify failed for external file ${o}: ${v} `)}let x=h.basename(o);await g.outputFile(h.join(a,x),c),r("info",`Copied external ${n} file: ${x} `)}}}async function St(t,e,i){if(!t.length)return;let n=t.join("");if(e.minify?.css){let s=new M().minify(n);s.warnings.length&&s.warnings.forEach(a=>r("warn",a)),n=s.styles}await g.outputFile(h.join(i,"style.css"),n)}async function Tt(t,e,i){if(!t.length)return;let n=t.join("");if(e.minify?.js)try{n=(await z(n)).code??""}catch(s){r("warn",`JS minify failed: ${s} `)}n&&await g.outputFile(h.join(i,"script.js"),n)}var Q=d(()=>{"use strict";f()});import L from"fs-extra";async function B(t,e){let i=await X(e.template),n=u([t]);if(!await L.pathExists(i))throw new Error(`Template '${e.template}' not found.`);if(await L.pathExists(n))throw new Error(`Target directory '${n}' already exists.`);r("debug",`Copying template from '${i}' to '${n}'`),await L.copy(i,n),r("debug","Initializing minimaz.config.json..."),await R(D,[n,"minimaz.config.json"]),(e.npm!==void 0?!!e.npm:(await y("Init NPM? [Y/n]:","y")).toLowerCase().startsWith("y"))&&await Ot(n,t),(e.git!==void 0?!!e.git:(await y("Init Git repository? [Y/n]:","y")).toLowerCase().startsWith("y"))&&await Rt(t,n,e.gitprovider),r("success",`Project '${t}' created using template '${e.template}'.`)}async function Rt(t,e,i,n="origin"){i||(i=(await y("Select a provider or paste a url to connect your existing repo (cli tools needed) [LOCAL/github/gitlab]:","local")).toLowerCase().trim()),r("info","Initializing Git repository..."),r("debug","Initializing gitignore..."),await R(tt,[e,".gitignore"]),r("debug","Running git init..."),await j("git",["init"],e),i?(await Dt(t,e,i,n),r("success","Git repository initialized.")):r("info","Git repository initialized locally (no remote).")}async function Dt(t,e,i,n="origin"){if(/^https?:\/\//.test(i)||i.startsWith("git@")){r("info",`Connecting existing remote '${i}'`),await j("git",["remote","add",n,i],e);return}if(i==="github"){r("info",`Creating GitHub repository '${t}'`),await j("gh",["repo","create",t,"--private","--source=.","--remote",n],e);return}if(i==="gitlab"){r("info",`Creating GitLab repository '${t}'`);let s=process.env.GITLAB_USER;if(!s)throw new Error("GITLAB_USER environment variable not set");await j("glab",["repo","create",t,"--source=."],e),await j("git",["remote","add",n,`git@gitlab.com:${s}/${t}.git`],e);return}throw new Error(`Unsupported git provider or remote: '${i}'`)}async function Ot(t,e){r("info","Initializing NPM..."),await R({name:e,...Z},[t,"package.json"]),r("debug","Running npm install..."),await j("npm",["i"],t)}var q=d(()=>{"use strict";f()});function O(t){if(t){let e=A[t];if(!e){console.log(`No help found for command: ${t}
|
|
3
3
|
`);return}if(console.log(e.usage,`
|
|
4
4
|
${e.description}`),e.options){console.log(" Options:");for(let[i,n]of Object.entries(e.options))console.log(` ${i} ${n}`)}console.log("");return}console.log(`Usage:
|
|
5
|
-
`);for(let e of Object.values(
|
|
6
|
-
${e.description}`),e.options){console.log(" Options:");for(let[i,n]of Object.entries(e.options))console.log(` ${i} ${n}`)}console.log("")}}var
|
|
5
|
+
`);for(let e of Object.values(A)){if(console.log(e.usage,`
|
|
6
|
+
${e.description}`),e.options){console.log(" Options:");for(let[i,n]of Object.entries(e.options))console.log(` ${i} ${n}`)}console.log("")}}var et=d(()=>{"use strict";f()});import w from"fs-extra";import P from"path";async function J(t,e){let i=await U();if(t.list)return await Gt(i);if(t.delete)return await It(i,t.delete);if(await kt(i,e),t.update)return typeof t.update=="string"&&t.update.trim()?await Ft(i,t.update.trim()):await Mt(i)}async function Ft(t,e){let i=u([]),n=P.join(t,e);if(!await w.pathExists(n))throw new Error(`Template '${e}' not found in ~/.minimaz/templates`);if(!(await y(`Update '${e}' with current directory? [Y/n]:`,"y")).startsWith("y")){r("info","Update cancelled.");return}try{await w.copy(i,n,{overwrite:!0}),r("success",`Template '${e}' updated from current directory.`)}catch{throw new Error(`Failed to update '${e}'`)}}async function Mt(t){let e=await _(),i=await w.readdir(e);if(!(await y("Update local templates overwriting them with defaults? [Y/n]:","y")).startsWith("y")){r("info","Update cancelled.");return}try{for(let n of i){let s=P.join(e,n),a=P.join(t,n);await w.copy(s,a,{overwrite:!0}),r("success",`Updated '${n}'`)}r("info","\u2728 All templates and files updated successfully.")}catch(n){throw new Error(`Update failed: ${n.message}`)}}async function It(t,e){let i=P.join(t,e);if(!await w.pathExists(i))throw new Error(`Template not found: ${e}`);if(!(await y(`Confirm delete '${e}'? [Y/n]:`,"y")).startsWith("y")){r("info","Delete cancelled.");return}try{await w.remove(i),r("success",`Template '${e}' deleted.`)}catch(n){throw new Error(`Delete error: ${n.message}`)}}async function kt(t,e){let i=u(e?[e]:[]);if(!await w.pathExists(i))if(r("warn",`Path not found: ${i}`),(await y("Use current directory instead? [Y/n]:","y")).startsWith("y"))i=process.cwd();else throw new Error("Operation cancelled.");try{await w.ensureDir(t);let n=P.join(t,P.basename(i));if(await w.pathExists(n)&&!(await y(`Template '${P.basename(n)}' already exists. Overwrite? [y/N]:`,"n")).startsWith("y")){r("info","Save cancelled.");return}await w.copy(i,n,{overwrite:!0}),r("success",`Template saved to ${n}`)}catch(n){throw new Error(`Failed to save template: ${n.message}`)}}async function Gt(t){let e=await w.readdir(t);if(e.length===0){r("info","No global templates available.");return}r("info","Available global templates:");for(let i=0;i<e.length;i++)console.log(`${i} - ${e[i]}`)}var it=d(()=>{"use strict";f()});async function W(){T()}var nt=d(()=>{"use strict";f()});async function N(){let t=u(["package.json"]),{version:e}=await rt(t);if(typeof e!="string")throw new Error("Invalid or missing version in package.json");console.log("==========================================",`
|
|
7
7
|
`,`minimaz-cli version: ${e}`,`
|
|
8
|
-
`,"==========================================")}var
|
|
9
|
-
`)?t
|
|
10
|
-
|
|
11
|
-
`;
|
|
8
|
+
`,"==========================================")}var st=d(()=>{"use strict";f()});var ot=d(()=>{"use strict"});import Lt from"readline";import p from"fs-extra";import m from"path";import Bt from"cross-spawn";import{homedir as at}from"os";import{execSync as At}from"child_process";function lt(t){let e={_:[]};for(let i=0;i<t.length;i++){let n=t[i].toLowerCase();if(!n.startsWith("-")){e._.push(n);continue}if(n.startsWith("--")&&n.includes("=")){let[o,l]=n.slice(2).split("=");e[o]=l;continue}let s=n.replace(/^-+/,""),a=t[i+1];a&&!a.startsWith("-")?(e[s]=a,i++):e[s]=!0}return e}function y(t,e=""){return new Promise(i=>{let n=Lt.createInterface({input:process.stdin,output:process.stdout}),s=setTimeout(()=>{n.close(),i(e)},6e4);n.question(`\u2753 ${t} `,a=>{clearTimeout(s),n.close(),i(a.trim()||e)}),n.on("SIGINT",()=>{clearTimeout(s),n.close(),process.exit(130)})})}function k(t,e={}){return Object.entries(e).reduce((i,[n,s])=>{let a=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(a,"gi");return i.replace(o,s)},t)}async function S(t,e){try{let i=await p.readFile(t,"utf8");return e&&(i=k(i,e)),i}catch(i){return r("error",`Failed to read file ${t}: ${i.message}`),""}}async function ct(){try{let t=At("npm config get prefix",{encoding:"utf8"}).trim();if(!t)throw new Error("Empty npm prefix");return process.platform==="win32"?m.join(t,"node_modules","minimaz-cli"):m.join(t,"lib","node_modules","minimaz-cli")}catch{return process.platform==="win32"?m.join(process.env.APPDATA||"","npm","node_modules","minimaz-cli"):"/usr/local/lib/node_modules/minimaz-cli"}}async function Jt(){return await H(),m.join(at(),".minimaz")}async function U(){return m.join(await Jt(),"templates")}async function X(t){return m.join(await U(),t)}async function _(){return m.join(await ct(),"templates")}async function H(){let t=m.join(at(),".minimaz"),e=m.join(t,"templates"),i=await _(),n=m.join(t,"settings.json");try{await p.ensureDir(t),await p.pathExists(n)||(await p.outputJson(n,{createdAt:new Date().toISOString(),templatesPath:e,npmGlobalPath:await ct()},{spaces:2}),r("success",`Created settings.json at ${n}`));let s=await p.pathExists(e),a=s?(await p.readdir(e)).length===0:!0;if(s||(await p.ensureDir(e),r("success","Created global templates directory.")),!a){r("debug","Global templates directory not empty. Skipping copy.");return}if(await p.pathExists(i))for(let o of await p.readdir(i))await p.copy(m.join(i,o),m.join(e,o)),r("success",`Copied template '${o}'.`);else r("warn","Default templates directory not found.");r("success","Default templates setup completed.")}catch(s){throw r("error",`Failed to create global templates directory: ${s.message}`),s}}function j(t,e,i){return new Promise((n,s)=>{r("debug",`Running: ${t} ${e.join(" ")}`);let a=Bt(t,e,{cwd:i,stdio:"inherit"});a.on("error",s),a.on("close",o=>o===0?n():s(new Error(`${t} exited with code ${o}`)))})}async function R(t,e){let i=m.resolve(...e),n="";if(t!==void 0)if(typeof t=="string")n=t.endsWith(`
|
|
9
|
+
`)?t:`${t}
|
|
10
|
+
`;else if(typeof t=="object"&&t!==null)n=`${JSON.stringify(t,null,2)}
|
|
11
|
+
`;else throw new Error("Unsupported template type. Must be string or object.");try{await p.outputFile(i,n)}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Failed to create file at '${i}': ${a}`)}}async function T(t){let e=t?m.isAbsolute(t)?t:u([t]):m.resolve(process.cwd(),(await G()).dist??"dist"),i=process.cwd();if(e===i||e.length<=i.length)throw new Error(`Refusing to delete unsafe directory: ${e}`);if(!await p.pathExists(e)){r("debug",`No dist folder found: ${e}`);return}await p.remove(e),r("success",`Cleared ${e}`)}async function G(){let t=u(["minimaz.config.json"]),e;return await p.pathExists(t)?(e=await p.readJson(t),r("success","Loaded config from minimaz.config.json")):(e=JSON.parse(JSON.stringify(D)),r("warn","No minimaz.config.json found. Using default config")),e}function pt(t){process.env.VERBOSE=t?"true":"false",r("debug",`VERBOSE = ${process.env.VERBOSE}`),process.env.CLI_WORKDIR=process.cwd(),r("debug",`CLI_WORKDIR = ${process.env.CLI_WORKDIR}`)}function u(t=[]){return m.resolve(process.env.CLI_WORKDIR??process.cwd(),...t)}async function rt(t){return await p.readJson(t)}function $(t,e){return`${e}${t}${b.reset}`}var mt=d(()=>{"use strict";f()});var Z,tt,D,A,b,gt,ut=d(()=>{"use strict";f();Z={version:"0.0.1",license:"ISC",type:"commonjs",scripts:{build:"npx mz b",start:"npx mz b && npx serve dist/"},devDependencies:{"minimaz-cli":"latest",serve:"latest"}},tt=`
|
|
12
|
+
node_modules
|
|
13
|
+
dist
|
|
14
|
+
.env
|
|
12
15
|
.vscode
|
|
13
|
-
|
|
16
|
+
.DS_Store
|
|
17
|
+
`.trim(),D={src:"src",dist:"dist",public:"public",bundling:{css:!0,js:!0},minify:{html:!0,css:!0,js:!0},replace:{"../public/":"public/"},styles:["style.css","style-2.css"],scripts:["script.js","script-2.js"],folders:{src:"",public:"public"}},A={init:{usage:"minimaz init | i <project-name>",description:'Create a new project (default: "minimaz-site")',options:{"--template | -t <template-name>":'Use a global template (default: "default")'}},build:{usage:"minimaz build | b",description:"Build and minify files into the dist folder"},template:{usage:"minimaz template | t [path]",description:"Save current folder as a template (no path = current folder)",options:{"--list | -l":"List available global templates","--delete | -d <template-name>":"Delete a global template"}},help:{usage:"minimaz help | h",description:"Show this help message"},clear:{usage:"minimaz clear | c",description:"Clear the dist folder"},version:{usage:"minimaz version | v",description:"Show Minimaz version"}},b={reset:"\x1B[0m",red:"\x1B[31m",yellow:"\x1B[33m",green:"\x1B[32m",blue:"\x1B[34m",gray:"\x1B[90m"},gt={error:$("[ --- ERROR ----- ] ",b.red),warn:$("[ --- WARN ------ ] ",b.yellow),success:$("[ --- SUCCESS --- ] ",b.green),info:$("[ --- INFO ------ ] ",b.blue),debug:$("[ --- DEBUG ----- ] ",b.gray)}});function r(t="info",e){let i=process.env.VERBOSE==="true";if(t==="debug"&&!i)return;let s=`${i?$(`[${Ut()}] `,b.gray):""}${gt[t]} ${e}`;switch(t){case"error":console.error(s);break;case"warn":console.warn(s);break;default:console.log(s);break}}function Ut(t=new Date){let e=c=>c.toString().padStart(2,"0"),i=t.getFullYear(),n=e(t.getMonth()+1),s=e(t.getDate()),a=e(t.getHours()),o=e(t.getMinutes()),l=e(t.getSeconds());return`${i}-${n}-${s} ${a}:${o}:${l}`}var dt=d(()=>{"use strict";f()});var f=d(()=>{"use strict";Q();q();et();it();nt();st();ot();mt();ut();dt()});var ft={};bt(ft,{postInstall:()=>_t});async function _t(){try{r("info","Running Post Install..."),await H(),r("success","Postinstall: Global templates setup completed")}catch(t){r("error",`Postinstall setup failed: ${t.message}`)}}var wt=d(()=>{"use strict";f()});f();process.env.npm_lifecycle_event==="postinstall"&&(Promise.resolve().then(()=>(wt(),ft)).then(({postInstall:t})=>t()),process.exit(0));async function Wt(){let t=lt(process.argv.slice(2)),e=t._[0]||"",i=t._[1];pt(!!t.v),(e==="help"||t.h||t.help)&&(O(i||(t.h||t.help?e:void 0)),process.exit(0));let n={build:async()=>I(),clear:()=>W(),init:async()=>{await B(i||"minimaz-project",{template:t.template||t.t||"default",npm:t.npm,git:t.git,gitremote:t.gitremote,gitprovider:t.gitprovider})},template:async()=>{await J({list:t.l||t.list,delete:t.d||t.delete,update:t.u||t.update})},version:()=>N(),b:()=>n.build(),c:()=>n.clear(),i:()=>n.init(),t:()=>n.template(),v:()=>n.version()};try{n[e]?(r("info",`Executing command '${e}'...`),await n[e]()):(r("error",`Unknown command '${e}'. Use 'minimaz help' to see available commands.`),O())}catch(s){r("error",s instanceof Error?process.env.DEBUG?s.stack??s.message:s.message:String(s)),process.exit(1)}}Wt();
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "minimaz-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Minimal project initializer and builder CLI",
|
|
5
5
|
"author": "MrZeller",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"files": [
|
|
9
9
|
"bin",
|
|
10
|
-
"
|
|
10
|
+
"templates",
|
|
11
11
|
"LICENSE",
|
|
12
12
|
"README.md",
|
|
13
13
|
"package.json"
|
|
File without changes
|
|
Binary file
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Welcome to Minimaz</title>
|
|
7
|
+
<link rel="stylesheet" href="style.css" />
|
|
8
|
+
<link rel="icon" href="../public/favicon.ico" type="image/x-icon" />
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<header>
|
|
12
|
+
<nav>
|
|
13
|
+
<a class="btn active" href="#">Home</a>
|
|
14
|
+
<a class="btn" href="pages/about.html">About</a>
|
|
15
|
+
<a class="btn" href="https://github.com/zeller-dev/minimaz" target="_blank">GitHub</a>
|
|
16
|
+
</nav>
|
|
17
|
+
</header>
|
|
18
|
+
|
|
19
|
+
<main class="container">
|
|
20
|
+
<h1>🚀 Welcome to Minimaz</h1>
|
|
21
|
+
<p><strong>Minimaz</strong> is a minimal static site builder designed for speed and simplicity. It helps you:</p>
|
|
22
|
+
<ul>
|
|
23
|
+
<li>💡 Organize your files with a simple structure</li>
|
|
24
|
+
<li>⚙️ Automatically build and minify HTML, CSS, JS, and TS</li>
|
|
25
|
+
<li>🔄 Customize file inclusion order using <code>minimaz.config.json</code></li>
|
|
26
|
+
</ul>
|
|
27
|
+
|
|
28
|
+
<h2>🔧 Getting Started</h2>
|
|
29
|
+
<p>Install and use Minimaz with the following commands:</p>
|
|
30
|
+
<pre><code># 🔨 Initialize a new project
|
|
31
|
+
npx minimaz init my-site
|
|
32
|
+
|
|
33
|
+
# 🏗️ Build the site
|
|
34
|
+
npx minimaz build
|
|
35
|
+
|
|
36
|
+
# 📦 Save template or list/delete existing ones
|
|
37
|
+
npx minimaz template <path> [--list|-l] [--delete|-d]
|
|
38
|
+
|
|
39
|
+
# 💬 Show help guide
|
|
40
|
+
npx minimaz help</code></pre>
|
|
41
|
+
|
|
42
|
+
<h2>📁 Project Structure</h2>
|
|
43
|
+
<pre><code>my-site/
|
|
44
|
+
├── src/ # Source files (HTML, CSS, JS, TS)
|
|
45
|
+
├── public/ # Static assets (images, fonts, etc.)
|
|
46
|
+
├── dist/ # Output directory (auto-generated)
|
|
47
|
+
└── minimaz.config.json # Configuration file</code></pre>
|
|
48
|
+
|
|
49
|
+
<h2>⚙️ Configuration</h2>
|
|
50
|
+
<pre><code>{
|
|
51
|
+
"src": "src",
|
|
52
|
+
"dist": "dist",
|
|
53
|
+
"public": "public",
|
|
54
|
+
"minify": { "html": true, "css": true, "js": true, "ts": true },
|
|
55
|
+
"replace": { "../public/": "public/" },
|
|
56
|
+
"styles": [ "reset.css", "style.css", "theme.css" ],
|
|
57
|
+
"scripts": [ "libs/jquery.js", "utils.js", "script.js" ]
|
|
58
|
+
}</code></pre>
|
|
59
|
+
|
|
60
|
+
<h2>📤 Production</h2>
|
|
61
|
+
<p>The final output will be generated in the <code>dist/</code> folder, ready for deployment.</p>
|
|
62
|
+
|
|
63
|
+
<h2>❓ Available Commands</h2>
|
|
64
|
+
<ul>
|
|
65
|
+
<li><code>init</code> / <code>i</code> – Initialize a new project</li>
|
|
66
|
+
<li><code>build</code> / <code>b</code> – Build and minify the project</li>
|
|
67
|
+
<li><code>help</code> / <code>h</code> – Show the help message</li>
|
|
68
|
+
<li><code>template</code> / <code>t</code> – Manage templates (with <code>--list</code> and <code>--delete</code> options)</li>
|
|
69
|
+
</ul>
|
|
70
|
+
|
|
71
|
+
<p>You're ready to build fast and clean static websites. Happy coding! 🛠️</p>
|
|
72
|
+
</main>
|
|
73
|
+
|
|
74
|
+
<footer>
|
|
75
|
+
<p>© 2025 Minimaz. All rights reserved.</p>
|
|
76
|
+
</footer>
|
|
77
|
+
|
|
78
|
+
<script src="script.js"></script>
|
|
79
|
+
</body>
|
|
80
|
+
</html>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>Welcome to Minimaz</title>
|
|
8
|
+
<link rel="stylesheet" href="../style.css" />
|
|
9
|
+
<link rel="shortcut icon" href="../../public/favicon.ico" type="image/x-icon">
|
|
10
|
+
|
|
11
|
+
</head>
|
|
12
|
+
|
|
13
|
+
<body>
|
|
14
|
+
<header>
|
|
15
|
+
<nav>
|
|
16
|
+
<a class='btn' href="../index.html">Home</a>
|
|
17
|
+
<a class='btn active' href="pages/about.html">About</a>
|
|
18
|
+
<a class='btn' target="_blank" href="https://github.com/zeller-dev/minimaz">GitHub</a>
|
|
19
|
+
</nav>
|
|
20
|
+
</header>
|
|
21
|
+
<div class="container">
|
|
22
|
+
<h1>About Minimaz</h1>
|
|
23
|
+
<p><strong>Minimaz</strong> is a minimal build tool that helps you quickly scaffold and minify HTML, CSS, and
|
|
24
|
+
JavaScript projects.</p>
|
|
25
|
+
|
|
26
|
+
<h2>Features</h2>
|
|
27
|
+
<ul>
|
|
28
|
+
<li>Zero-config HTML/CSS/JS minification</li>
|
|
29
|
+
<li>Folder structure based on <code>src</code>, <code>public</code>, and <code>dist</code></li>
|
|
30
|
+
<li>Simple CLI with <code>init</code>, <code>build</code>, and <code>help</code> commands</li>
|
|
31
|
+
</ul>
|
|
32
|
+
|
|
33
|
+
<h2>Getting Started</h2>
|
|
34
|
+
<pre><code>$ minimaz init my-project
|
|
35
|
+
$ cd my-project
|
|
36
|
+
$ minimaz build</code></pre>
|
|
37
|
+
|
|
38
|
+
<p>Learn more or contribute on <a href="#">GitHub</a>.</p>
|
|
39
|
+
</div>
|
|
40
|
+
<footer>
|
|
41
|
+
<p>© 2023 Minimaz. All rights reserved.</p>
|
|
42
|
+
</footer>
|
|
43
|
+
<script src="../script.js"></script>
|
|
44
|
+
</body>
|
|
45
|
+
|
|
46
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
console.log('Minimaz is ready!')
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--primary-color: #338ca8;
|
|
3
|
+
--background-color: #222;
|
|
4
|
+
--foreground-color: #f5f5f5;
|
|
5
|
+
--code-bg: #333;
|
|
6
|
+
--code-text: #eeeeff;
|
|
7
|
+
font-size: 16px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
* {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
header,
|
|
15
|
+
footer {
|
|
16
|
+
background-color: var(--code-bg);
|
|
17
|
+
padding:1rem;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
body {
|
|
21
|
+
font-family: 'Segoe UI', sans-serif;
|
|
22
|
+
margin: 0;
|
|
23
|
+
background: var(--background-color);
|
|
24
|
+
color: var(--foreground-color);
|
|
25
|
+
line-height: 1.6;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.container {
|
|
29
|
+
max-width: 800px;
|
|
30
|
+
margin: auto;
|
|
31
|
+
padding: 1rem;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1,
|
|
35
|
+
h2,
|
|
36
|
+
h3 {
|
|
37
|
+
color: var(--primary-color);
|
|
38
|
+
margin-top: 2rem;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
p {
|
|
42
|
+
margin: 1rem 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
code {
|
|
46
|
+
background: var(--code-bg);
|
|
47
|
+
color: var(--code-text);
|
|
48
|
+
padding: 0.2rem 0.4rem;
|
|
49
|
+
border-radius: 4px;
|
|
50
|
+
font-family: monospace;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
pre {
|
|
54
|
+
background: var(--code-bg);
|
|
55
|
+
color: #ddd;
|
|
56
|
+
padding: 1rem;
|
|
57
|
+
overflow-x: auto;
|
|
58
|
+
border-radius: 6px;
|
|
59
|
+
font-family: monospace;
|
|
60
|
+
border-left: 4px solid var(--primary-color);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
a {
|
|
64
|
+
color: var(--primary-color);
|
|
65
|
+
text-decoration: none;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.btn {
|
|
69
|
+
transition: all 0.15s ease-in-out;
|
|
70
|
+
background-color: var(--primary-color);
|
|
71
|
+
border: none;
|
|
72
|
+
color: #fff;
|
|
73
|
+
padding: 10px 20px;
|
|
74
|
+
font-size: 1rem;
|
|
75
|
+
margin: .5rem .2rem;
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
border-radius: 5px;
|
|
78
|
+
display: inline-block;
|
|
79
|
+
text-align: center;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.btn:hover {
|
|
83
|
+
opacity: 0.85;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.btn.active {
|
|
87
|
+
background-color: var(--code-bg);
|
|
88
|
+
color: #fff;
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
header {
|
|
93
|
+
font-weight: 600;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
footer p {
|
|
97
|
+
text-align: center;
|
|
98
|
+
margin: 0;
|
|
99
|
+
}
|
|
File without changes
|
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>Welcome to Minimaz</title>
|
|
8
|
+
<link rel="stylesheet" href="style.css" />
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body>
|
|
12
|
+
<script src="script.js"></script>
|
|
13
|
+
</body>
|
|
14
|
+
|
|
15
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
console.log('Minimaz is ready!')
|
|
File without changes
|