@nolly-cafe/distill 0.1.2 → 0.1.4
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/distill.js +2 -0
- package/package.json +1 -1
- package/bin/distfill.js +0 -2
package/bin/distill.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import u from"process";import V from"yargs";import{hideBin as N}from"yargs/helpers";import{build as F,defineConfig as H}from"vite";import{createHtmlPlugin as M}from"vite-plugin-html";import c from"fs";import m from"path";import $ from"imagemin";import B from"imagemin-pngquant";import E from"imagemin-mozjpeg";import W from"imagemin-gifsicle";import Q from"imagemin-svgo";import C from"sharp";var b=e=>t=>`\x1B[${e}m${t}\x1B[0m`;var r={info:e=>console.log(b(36)("[distill]"),e),success:e=>console.log(b(32)("[distill]"),e),warn:e=>console.warn(b(33)("[distill]"),e),error:e=>console.error(b(31)("[distill]"),e)};var G=Q;var L=/\.(png|jpe?g|gif|svg|webp|avif|bmp|tiff?|ico)$/i;async function I(e){if(!c.existsSync(e.src)){r.warn(`image directory not found: ${e.src}`);return}const t=c.readdirSync(e.src).filter(i=>L.test(i));if(!t.length){r.warn("no images found");return}c.mkdirSync(e.out,{recursive:true});const s=[];if(e.optimize.png)s.push(B({quality:[.65,.8]}));if(e.optimize.jpeg)s.push(E({quality:e.jpegQuality}));if(e.optimize.gif)s.push(W({optimizationLevel:3}));if(e.optimize.svg){s.push(G({plugins:e.svgPreset==="aggressive"?[]:[{name:"removeViewBox",active:false}]}))}const n=t.filter(i=>/\.(png|jpe?g|gif|svg)$/i.test(i));if(n.length&&s.length){await $(n.map(i=>m.join(e.src,i)),{destination:e.out,plugins:s})}for(const i of t){const l=m.join(e.src,i);const f=m.parse(i).name;const d=C(l);const y=e.resize?d.resize(e.resize.width,e.resize.height):d;if(e.convert.webp){await y.clone().webp({quality:e.convert.webp.quality}).toFile(m.join(e.out,`${f}.webp`))}if(e.convert.avif){await y.clone().avif({quality:e.convert.avif.quality,effort:e.convert.avif.effort}).toFile(m.join(e.out,`${f}.avif`))}}for(const i of t){const l=m.join(e.out,i);if(!c.existsSync(l)){c.copyFileSync(m.join(e.src,i),l)}}r.success("image processing complete")}import k from"fs";import g from"path";function P(e){const{cwd:t,sourceArg:s,outArg:n,imagesArg:i,imagesOutArg:l,noImages:f,imagePreset:d="balanced",noWebp:y,noAvif:O,resize:w,svgPreset:S="safe",jpegQuality:q}=e;let p;if(s){p=g.resolve(t,s)}else{const a=g.join(t,"src");p=k.existsSync(a)?a:t}const v=n?g.resolve(t,n):g.join(t,"dist");if(f){return{sourceRoot:p,outDir:v}}const D={fast:{webp:{quality:60},avif:{quality:45,effort:3}},balanced:{webp:{quality:75},avif:{quality:50,effort:5}},aggressive:{webp:{quality:85},avif:{quality:60,effort:8}}};let x;if(w){const a=w.match(/^(\d+)?x(\d+)?$/);if(a){x={width:a[1]?Number(a[1]):void 0,height:a[2]?Number(a[2]):void 0}}}const R=i?g.resolve(t,i):g.join(p,"img");const T=l?g.resolve(t,l):g.join(v,"img");const h={...D[d]};if(y)delete h.webp;if(O)delete h.avif;return{sourceRoot:p,outDir:v,images:{enabled:true,src:R,out:T,optimize:{png:true,jpeg:true,gif:true,svg:true},jpegQuality:q??75,svgPreset:S,convert:h,resize:x}}}async function j(e){const t=P(e);const{sourceRoot:s,outDir:n,images:i}=t;r.info(`building from ${s}`);r.info(`output directory ${n}`);await F(H({base:"./",root:s,build:{outDir:n,emptyOutDir:true,assetsDir:"assets",minify:"terser"},plugins:[M({minify:true}),...i?[{name:"distill-images",apply:"build",async closeBundle(){await I(i)}}]:[]]}));if(!i){r.warn("image processing disabled")}r.success("build complete")}var z=["distill \u2014 zero-config static site distiller","","distill is a Vite-powered CLI designed for people who want production-ready","static builds without maintaining tooling, configuration files, or local","dependencies.","","It is built for ephemeral execution (pnpm dlx) and opinionated output.","","Author"," Nolly \u2014 independent developer"," https://github.com/thenolly","","Philosophy",' "Take this folder and give me a clean, production-ready dist/ in my current directory."',"","License"," MIT License \xA9 2025 NollyCafe LLC"].join("\n");var A=["Usage:"," distill [path] [options]","","Arguments:"," path Source directory (defaults to current directory)","","Options:"," --out <dir> Output directory"," --images <dir> Image source directory"," --images-out <dir> Image output directory"," --no-images Disable all image processing","","Image optimization:"," --image-preset <name> fast | balanced | aggressive"," --jpeg-quality <num> JPEG quality (0\u2013100)"," --svg-preset <name> safe | aggressive"," --resize <WxH> Resize images (e.g. 1200x630)"," --no-webp Disable WebP generation"," --no-avif Disable AVIF generation","","Other:"," --about Show information about distill"," --help Show this help message","","Behavior:"," - Explicit path disables automatic ./src detection"," - --out always takes priority"," - Output defaults to ./dist relative to the current working directory"," - Images default to <source>/img"," - Image output defaults to <dist>/img"," - Unsupported formats are copied verbatim","","Examples:"," pnpm dlx @nolly-cafe/distill"," pnpm dlx @nolly-cafe/distill ./site"," pnpm dlx @nolly-cafe/distill ./site --out ./build"," pnpm dlx @nolly-cafe/distill ./site --image-preset aggressive"," pnpm dlx @nolly-cafe/distill ./site --resize 1200x630 --no-avif"].join("\n");var o=V(N(u.argv)).help(false).version(false).option("about",{type:"boolean"}).option("help",{type:"boolean"}).option("out",{type:"string",describe:"Output directory"}).option("images",{type:"string",describe:"Image source directory"}).option("images-out",{type:"string",describe:"Image output directory"}).option("no-images",{type:"boolean",describe:"Disable image processing"}).option("image-preset",{choices:["fast","balanced","aggressive"],describe:"Image optimization preset"}).option("no-webp",{type:"boolean",describe:"Disable WebP output"}).option("no-avif",{type:"boolean",describe:"Disable AVIF output"}).option("resize",{type:"string",describe:"Resize images (WIDTHxHEIGHT)"}).option("svg-preset",{choices:["safe","aggressive"],describe:"SVG optimization preset"}).option("jpeg-quality",{type:"number",describe:"JPEG quality (1\u2013100)"}).parseSync();if(o.help){console.log(A);u.exit(0)}if(o.about){console.log(z);u.exit(0)}j({cwd:u.cwd(),sourceArg:o._[0]?String(o._[0]):void 0,outArg:o.out,imagesArg:o.images,imagesOutArg:o["images-out"],noImages:o["no-images"],imagePreset:o["image-preset"],noWebp:o["no-webp"],noAvif:o["no-avif"],resize:o.resize,svgPreset:o["svg-preset"],jpegQuality:o["jpeg-quality"]}).catch(e=>{r.error(e instanceof Error?e.message:String(e));u.exit(1)});
|
package/package.json
CHANGED
package/bin/distfill.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import f from"process";import V from"yargs";import{hideBin as N}from"yargs/helpers";import{build as F,defineConfig as H}from"vite";import{createHtmlPlugin as M}from"vite-plugin-html";import u from"fs";import m from"path";import $ from"imagemin";import B from"imagemin-pngquant";import E from"imagemin-mozjpeg";import W from"imagemin-gifsicle";import Q from"imagemin-svgo";import C from"sharp";var y=e=>t=>`\x1B[${e}m${t}\x1B[0m`;var s={info:e=>console.log(y(36)("[distill]"),e),success:e=>console.log(y(32)("[distill]"),e),warn:e=>console.warn(y(33)("[distill]"),e),error:e=>console.error(y(31)("[distill]"),e)};var G=Q;var L=/\.(png|jpe?g|gif|svg|webp|avif|bmp|tiff?|ico)$/i;async function x(e){if(!u.existsSync(e.src)){s.warn(`image directory not found: ${e.src}`);return}const t=u.readdirSync(e.src).filter(i=>L.test(i));if(!t.length){s.warn("no images found");return}u.mkdirSync(e.out,{recursive:true});const r=[];if(e.optimize.png)r.push(B({quality:[.65,.8]}));if(e.optimize.jpeg)r.push(E({quality:e.jpegQuality}));if(e.optimize.gif)r.push(W({optimizationLevel:3}));if(e.optimize.svg){r.push(G({plugins:e.svgPreset==="aggressive"?[]:[{name:"removeViewBox",active:false}]}))}const n=t.filter(i=>/\.(png|jpe?g|gif|svg)$/i.test(i));if(n.length&&r.length){await $(n.map(i=>m.join(e.src,i)),{destination:e.out,plugins:r})}for(const i of t){const l=m.join(e.src,i);const d=m.parse(i).name;let p=C(l);if(e.resize){p=p.resize(e.resize.width,e.resize.height)}if(e.convert.webp){await p.webp({quality:e.convert.webp.quality}).toFile(m.join(e.out,`${d}.webp`))}if(e.convert.avif){await p.avif({quality:e.convert.avif.quality,effort:e.convert.avif.effort}).toFile(m.join(e.out,`${d}.avif`))}}for(const i of t){const l=m.join(e.out,i);if(!u.existsSync(l)){u.copyFileSync(m.join(e.src,i),l)}}s.success("image processing complete")}import k from"fs";import g from"path";function I(e){const{cwd:t,sourceArg:r,outArg:n,imagesArg:i,imagesOutArg:l,noImages:d,imagePreset:p="balanced",noWebp:A,noAvif:O,resize:h,svgPreset:S="safe",jpegQuality:q}=e;let c;if(r){c=g.resolve(t,r)}else{const a=g.join(t,"src");c=k.existsSync(a)?a:t}const b=n?g.resolve(t,n):g.join(t,"dist");if(d){return{sourceRoot:c,outDir:b}}const D={fast:{webp:{quality:60},avif:{quality:45,effort:3}},balanced:{webp:{quality:75},avif:{quality:50,effort:5}},aggressive:{webp:{quality:85},avif:{quality:60,effort:8}}};let w;if(h){const a=h.match(/^(\d+)?x(\d+)?$/);if(a){w={width:a[1]?Number(a[1]):void 0,height:a[2]?Number(a[2]):void 0}}}const R=i?g.resolve(t,i):g.join(c,"img");const T=l?g.resolve(t,l):g.join(b,"img");const v={...D[p]};if(A)delete v.webp;if(O)delete v.avif;return{sourceRoot:c,outDir:b,images:{enabled:true,src:R,out:T,optimize:{png:true,jpeg:true,gif:true,svg:true},jpegQuality:q??75,svgPreset:S,convert:v,resize:w}}}async function P(e){const t=I(e);const{sourceRoot:r,outDir:n,images:i}=t;s.info(`building from ${r}`);s.info(`output directory ${n}`);await F(H({base:"./",root:r,build:{outDir:n,emptyOutDir:true,assetsDir:"assets",minify:"terser"},plugins:[M({minify:true}),...i?[{name:"distill-images",apply:"build",async closeBundle(){await x(i)}}]:[]]}));if(!i){s.warn("image processing disabled")}s.success("build complete")}var j=["distill \u2014 zero-config static site distiller","","distill is a Vite-powered CLI designed for people who want production-ready","static builds without maintaining tooling, configuration files, or local","dependencies.","","It is built for ephemeral execution (pnpm dlx) and opinionated output.","","Author"," Nolly \u2014 independent developer"," https://github.com/thenolly","","Philosophy",' "Take this folder and give me a clean, production-ready dist/ in my current directory."',"","License"," MIT License \xA9 2025 NollyCafe LLC"].join("\n");var z=["Usage:"," distill [path] [options]","","Arguments:"," path Source directory (defaults to current directory)","","Options:"," --out <dir> Output directory"," --images <dir> Image source directory"," --images-out <dir> Image output directory"," --no-images Disable all image processing","","Image optimization:"," --image-preset <name> fast | balanced | aggressive"," --jpeg-quality <num> JPEG quality (0\u2013100)"," --svg-preset <name> safe | aggressive"," --resize <WxH> Resize images (e.g. 1200x630)"," --no-webp Disable WebP generation"," --no-avif Disable AVIF generation","","Other:"," --about Show information about distill"," --help Show this help message","","Behavior:"," - Explicit path disables automatic ./src detection"," - --out always takes priority"," - Output defaults to ./dist relative to the current working directory"," - Images default to <source>/img"," - Image output defaults to <dist>/img"," - Unsupported formats are copied verbatim","","Examples:"," pnpm dlx @nolly-cafe/distill"," pnpm dlx @nolly-cafe/distill ./site"," pnpm dlx @nolly-cafe/distill ./site --out ./build"," pnpm dlx @nolly-cafe/distill ./site --image-preset aggressive"," pnpm dlx @nolly-cafe/distill ./site --resize 1200x630 --no-avif"].join("\n");var o=V(N(f.argv)).help(false).version(false).option("about",{type:"boolean"}).option("help",{type:"boolean"}).option("out",{type:"string",describe:"Output directory"}).option("images",{type:"string",describe:"Image source directory"}).option("images-out",{type:"string",describe:"Image output directory"}).option("no-images",{type:"boolean",describe:"Disable image processing"}).option("image-preset",{choices:["fast","balanced","aggressive"],describe:"Image optimization preset"}).option("no-webp",{type:"boolean",describe:"Disable WebP output"}).option("no-avif",{type:"boolean",describe:"Disable AVIF output"}).option("resize",{type:"string",describe:"Resize images (WIDTHxHEIGHT)"}).option("svg-preset",{choices:["safe","aggressive"],describe:"SVG optimization preset"}).option("jpeg-quality",{type:"number",describe:"JPEG quality (1\u2013100)"}).parseSync();if(o.help){console.log(z);f.exit(0)}if(o.about){console.log(j);f.exit(0)}P({cwd:f.cwd(),sourceArg:o._[0]?String(o._[0]):void 0,outArg:o.out,imagesArg:o.images,imagesOutArg:o["images-out"],noImages:o["no-images"],imagePreset:o["image-preset"],noWebp:o["no-webp"],noAvif:o["no-avif"],resize:o.resize,svgPreset:o["svg-preset"],jpegQuality:o["jpeg-quality"]}).catch(e=>{s.error(e instanceof Error?e.message:String(e));f.exit(1)});
|