lean-qr
Version:
minimal QR code generation
3 lines (2 loc) • 6.15 kB
JavaScript
import{mode as e,correction as n,generate as r}from"./index.mjs";import{toSvgSource as o,toSvgDataURL as t}from"./extras/svg.mjs";import{toPngBuffer as s,toPngDataURL as i}from"./extras/node_export.mjs";import{readError as a}from"./extras/errors.mjs";function m(e,n){return"0x"+e.toString(16).padStart(n.length,"0").toUpperCase()}function c(e,n){switch(e.type){case"string":return n;case"enum":if(!e.values.includes(n))throw new Error(`Unknown value ${n} for ${e.name}; expected: ${e.values.join(", ")}`);return n;case"int":{const r=Number.parseInt(n,10);if(String(r)!==n)throw new Error(`Value for ${e.name} must be an integer`);if(void 0!==e.min&&r<e.min)throw new Error(`Value for ${e.name} must be >= ${e.min}`);if(void 0!==e.max&&r>e.max)throw new Error(`Value for ${e.name} must be <= ${e.max}`);return r}case"hex":{let r=16;n.startsWith("0b")?(r=2,n=n.substring(2)):n.startsWith("0x")?n=n.substring(2):n.length===4*e.length&&(r=2);const o=Number.parseInt(n,r);if(o.toString(r).padStart(e.length*(2===r?4:1),"0")!==n.toLowerCase())throw new Error(`Value for ${e.name} must be a ${4*e.length}-bit integer in base 2 or 16`);if(void 0!==e.min&&o<e.min)throw new Error(`Value for ${e.name} must be >= ${m(e.min,e)}`);if(void 0!==e.max&&o>e.max)throw new Error(`Value for ${e.name} must be <= ${m(e.max,e)}`);return o}default:throw new Error(`Internal error parsing ${e.name}`)}}const f=new Map;f.set("auto",e.auto),f.set("numeric",e.numeric),f.set("alphanumeric",e.alphaNumeric),f.set("ascii",e.ascii),f.set("iso-8859-1",e.iso8859_1),f.set("shift-jis",e.shift_jis),f.set("utf8",e.utf8);const p=new Map;p.set("text-ansi-invert",{on:"\x1b[7m \x1b[0m"}),p.set("text-ansi-bw",{on:"\x1b[40m ",off:"\x1b[107m ",lf:"\x1b[0m\n"}),p.set("text-ansi-wb",{on:"\x1b[107m ",off:"\x1b[40m ",lf:"\x1b[0m\n"}),p.set("text-box",{on:"\u2588\u2588"}),p.set("text-ascii",{});const d=[{id:"encoding",name:"encoding",short:"e",type:"enum",values:[...f.keys()],def:"auto",info:"Set the encoding type for the content"},{id:"minCor",name:"min-correction",short:"c",type:"enum",values:[...Object.keys(n)],def:"min",info:"Set the minimum error correction level"},{id:"maxCor",name:"max-correction",short:"C",type:"enum",values:[...Object.keys(n)],def:"max",info:"Set the maximum error correction level"},{id:"minVer",name:"min-version",short:"v",type:"int",min:1,max:40,def:1,info:"Set the minimum version (size)"},{id:"maxVer",name:"max-version",short:"V",type:"int",min:1,max:40,def:40,info:"Set the maximum version (size)"},{id:"padding",name:"padding",short:"p",type:"int",min:0,def:4,info:"Set the edge padding size"},{id:"mask",name:"mask",short:"m",type:"enum",values:["auto","0","1","2","3","4","5","6","7"],def:"auto",info:"Set the masking type (advanced usage)"},{id:"trailer",name:"trailer",short:"t",type:"hex",length:4,min:0,max:65535,def:60433,info:"Set the trailer data (advanced usage)"},{id:"format",name:"format",short:"f",type:"enum",values:[...p.keys(),"svg","svg-data-url","png","png-data-url"],def:"text-ansi-invert",info:"Set the output format"},{id:"scale",name:"scale",short:"s",type:"int",min:1,def:8,info:"Set the image scale for PNG exports (ignored if not using PNG)"},{id:"info",name:"info",short:"i",type:"presence",info:"Print meta information to stderr"},{id:"help",name:"help",short:"?",type:"presence",info:"Print documentation"}],u={on:"black",off:"white",xmlDeclaration:!0},l={on:[0,0,0],off:[255,255,255]};try{const e=function(e,n){let r=2;const o={};for(e.forEach((({id:e,def:n})=>{o[e]=n}));r<n.length;++r){const t=n[r];if("--"===t){++r;break}if(t.startsWith("--")){let s=t.indexOf("=");-1===s&&(s=t.length);const i=t.slice(2,s),a=e.find((({name:e})=>e===i));if(!a)throw new Error(`Unknown option ${i}`);"presence"===a.type?o[a.id]=!0:o[a.id]=c(a,s<t.length?t.slice(s):n[++r])}else{if(!t.startsWith("-"))break;for(let s=1;s<t.length;++s){const i=t[s],a=e.find((({short:e})=>e===i));if(!a)throw new Error(`Unknown shorthand option ${i}`);if("presence"!==a.type){if("="===t[s+1]){o[a.id]=c(a,t.slice(s+2));break}o[a.id]=c(a,s<t.length-1?t.slice(s+1):n[++r]);break}o[a.id]=!0}}}return o.rest=n.slice(r).join(" "),o}(d,process.argv);e.help&&(h="lean-qr",w="CLI for generating a QR code",g=d,v="content",process.stdout.write(`${w}\n\n`),process.stdout.write(`Usage: ${h} [flags] [--] ${v}\n\n`),g.forEach((e=>{switch(process.stdout.write(`--${e.name} / -${e.short}\n\n`),process.stdout.write(` ${e.info}\n`),e.type){case"enum":process.stdout.write(`\n One of: ${e.values.join(", ")}\n`);break;case"int":process.stdout.write("\n Integer"),void 0!==e.min&&process.stdout.write(` >=${e.min}`),void 0!==e.max&&process.stdout.write(` <=${e.max}`),process.stdout.write("\n");break;case"hex":process.stdout.write("\n Hexadecimal value"),void 0!==e.min&&process.stdout.write(` >=${m(e.min,e)}`),void 0!==e.max&&process.stdout.write(` <=${m(e.max,e)}`),process.stdout.write("\n")}void 0!==e.def&&("hex"===e.type?process.stdout.write(` Default: ${m(e.def,e)}\n`):process.stdout.write(` Default: ${e.def}\n`)),process.stdout.write("\n\n")})),process.stdout.write("\n"),process.exit(0));const a=f.get(e.encoding.toLowerCase());if(!a)throw new Error("Unknown encoding type");let x;if("svg"===e.format)x=(e,n)=>o(e,{...u,...n})+"\n";else if("svg-data-url"===e.format)x=(e,n)=>t(e,{...u,...n})+"\n";else if("png"===e.format)x=(n,r)=>s(n,{...l,scale:e.scale,...r});else if("png-data-url"===e.format)x=(n,r)=>i(n,{...l,scale:e.scale,...r})+"\n";else{if(!p.has(e.format))throw new Error("Unknown output format");x=(n,r)=>n.toString({...p.get(e.format),...r})}const $=e.rest,b=Date.now(),k=a($),y=Date.now(),E=r(k,{minCorrectionLevel:n[e.minCor],maxCorrectionLevel:n[e.maxCor],minVersion:e.minVer,maxVersion:e.maxVer,mask:"auto"===e.mask?null:Number(e.mask),trailer:e.trailer}),S=Date.now(),V=x(E,{padX:e.padding,padY:e.padding}),j=Date.now();process.stdout.write(V),e.info&&(process.stderr.write("Time taken:\n"),process.stderr.write(` encode: ${y-b}ms\n`),process.stderr.write(` generate: ${S-y}ms\n`),process.stderr.write(` format: ${j-S}ms\n`))}catch(e){process.stderr.write(`${a(e)}\n\n`),process.exit(1)}var h,w,g,v;