UNPKG

qrcode-generator-sabai

Version:

qrcode-generator-sabai is a Node.js package designed to simplify QR code generation from various payloads to images. It offers ease of use and extensive customization options.

351 lines (348 loc) 12.3 kB
var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/lib/util.ts import fs from "fs"; import QRCode from "qrcode"; import sharp from "sharp"; var _Util = class _Util { }; _Util.generatePngQR = (payload, size = 400, ecl = "H", fileName, filePath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); const result = new Promise((resolve, reject) => { QRCode.toFile( `${filePath}/${fileName}.png`, [{ data: payload }], { width: size, margin: 0.5, type: "png", errorCorrectionLevel: ecl }, (err, url) => { if (err) { reject(err); } else { resolve(url); } } ); }); return true; } catch (error) { throw new Error(error); } }); _Util.generatePngQRWithLogo = (payload, size = 400, ecl = "H", fileName, filePath, logoPath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); const qrBuffer = yield QRCode.toBuffer( [{ data: payload }], { width: size, margin: 0.5, type: "png", errorCorrectionLevel: ecl } ); const qrImage = sharp(qrBuffer).resize(size, size); const logoImage = sharp(logoPath).resize(Math.floor(size / 4), Math.floor(size / 4), { fit: "contain", background: { r: 255, g: 255, b: 255, alpha: 0 } }).toFormat("png"); const compositeImage = yield qrImage.composite([{ input: yield logoImage.toBuffer(), gravity: "center" }]).png().toBuffer(); fs.writeFileSync(`${filePath}/${fileName}.png`, compositeImage); return true; } catch (error) { throw new Error(error); } }); _Util.generateSvgQR = (payload, size = 400, ecl = "H", fileName, filePath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); if (filePath && fileName) { const result = new Promise((resolve, reject) => { QRCode.toFile( `${filePath}/${fileName}.svg`, [{ data: payload }], { width: size, margin: 0.5, type: "svg", errorCorrectionLevel: ecl }, (err, url) => { if (err) { reject(err); } else { resolve(url); } } ); }); return true; } else { const result = new Promise((resolve, reject) => { QRCode.toString([{ data: payload }], { type: "svg", width: size, margin: 0.5, errorCorrectionLevel: ecl }, (err, url) => { if (err) { reject(err); } else { if (url) { resolve(url); } else { reject(new Error("QRCode generation failed")); } } }); }); return result; } } catch (error) { throw new Error(error); } }); _Util.generateSvgQRWithLogo = (payload, size = 400, ecl = "H", fileName, filePath, logoPath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); const qrBuffer = yield QRCode.toBuffer(payload, { width: size, margin: 0.5, errorCorrectionLevel: ecl }); const qrImage = sharp(qrBuffer).resize(size, size); const logoSize = Math.floor(size / 4); const logoImage = sharp(logoPath).resize(logoSize, logoSize, { fit: "contain", background: { r: 255, g: 255, b: 255, alpha: 0 } }).toFormat("png"); const compositeImage = yield qrImage.composite([{ input: yield logoImage.toBuffer(), gravity: "center" }]).png().toBuffer(); const base64Data = `data:image/png;base64,${compositeImage.toString("base64")}`; const svgData = `<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400"> <image href="${base64Data}" width="400" height="400"/> </svg>`; if (filePath && fileName) { fs.writeFileSync(`${filePath}/${fileName}.svg`, svgData, "utf-8"); return true; } return svgData; } catch (error) { throw new Error(error); } }); _Util.generateSvgQRFile = (payload, size = 400, ecl = "H", fileName, filePath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); const result = new Promise((resolve, reject) => { QRCode.toFile( `${filePath}/${fileName}.svg`, [{ data: payload }], { width: size, margin: 0.5, type: "svg", errorCorrectionLevel: ecl }, (err, url) => { if (err) { reject(err); } else { resolve(url); } } ); }); return true; } catch (error) { throw new Error(error); } }); _Util.generateSvgQRWithLogoFile = (payload, size = 400, ecl = "H", fileName, filePath, logoPath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); const qrBuffer = yield QRCode.toBuffer(payload, { width: size, margin: 0.5, errorCorrectionLevel: ecl }); const qrImage = sharp(qrBuffer).resize(size, size); const logoSize = Math.floor(size / 4); const logoImage = sharp(logoPath).resize(logoSize, logoSize, { fit: "contain", background: { r: 255, g: 255, b: 255, alpha: 0 } }).toFormat("png"); const compositeImage = yield qrImage.composite([{ input: yield logoImage.toBuffer(), gravity: "center" }]).png().toBuffer(); const base64Data = `data:image/png;base64,${compositeImage.toString("base64")}`; const svgData = `<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400"> <image href="${base64Data}" width="400" height="400"/> </svg>`; fs.writeFileSync(`${filePath}/${fileName}.svg`, svgData, "utf-8"); return true; } catch (error) { throw new Error(error); } }); _Util.generateBase64QR = (payload, size = 400, ecl = "H") => __async(_Util, null, function* () { try { size = parseInt(String(size)); const result = new Promise((resolve, reject) => { QRCode.toDataURL([{ data: payload }], { width: size, margin: 0.5, errorCorrectionLevel: ecl }, (err, url) => { if (err) { reject(err); } else { if (url) { resolve(url); } else { reject(new Error("QRCode generation failed")); } } }); }); return result; } catch (error) { throw new Error(error); } }); _Util.generateBase64QrWithLogo = (payload, size = 400, ecl = "H", logoPath) => __async(_Util, null, function* () { try { size = parseInt(String(size)); const qrBuffer = yield QRCode.toBuffer(payload, { width: size, margin: 0.5, errorCorrectionLevel: ecl }); const qrImage = sharp(qrBuffer).resize(size, size); const logoSize = Math.floor(size / 4); const logoImage = sharp(logoPath).resize(logoSize, logoSize, { fit: "contain", background: { r: 255, g: 255, b: 255, alpha: 0 } }).toFormat("png"); const compositeImage = yield qrImage.composite([{ input: yield logoImage.toBuffer(), gravity: "center" }]).png().toBuffer(); return `data:image/png;base64,${compositeImage.toString("base64")}`; } catch (error) { throw new Error(error); } }); _Util.base64ToImage = (base64Data, fileName, filePath) => __async(_Util, null, function* () { try { const data = base64Data.replace(/^data:image\/\w+;base64,/, ""); const buf = Buffer.from(data, "base64"); fs.writeFileSync(`${filePath}/${fileName}`, buf); return true; } catch (error) { throw new Error(error); } }); _Util.base64ToSvg = (base64Data, fileName, filePath) => __async(_Util, null, function* () { try { const svgData = `<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400"> <image href="${base64Data}" width="400" height="400"/> </svg>`; fs.writeFileSync(`${filePath}/${fileName}`, svgData, "utf-8"); return true; } catch (error) { throw new Error(error); } }); var Util = _Util; // src/lib/init.ts var Init = class { static png(payload, size = 400, ecl, fileName, filePath) { return __async(this, null, function* () { try { const result = yield Util.generatePngQR(payload, size, ecl, fileName, filePath); return result; } catch (error) { throw new Error(error); } }); } static pngWithLogo(payload, size = 400, ecl, fileName, filePath, logoPath) { return __async(this, null, function* () { try { const result = yield Util.generatePngQRWithLogo(payload, size, ecl, fileName, filePath, logoPath); return result; } catch (error) { throw new Error(error); } }); } static base64(payload, size = 400, ecl) { return __async(this, null, function* () { try { const result = yield Util.generateBase64QR(payload, size, ecl); return result; } catch (error) { throw new Error(error); } }); } static base64WithLogo(payload, size = 400, ecl, logoPath) { return __async(this, null, function* () { try { const result = yield Util.generateBase64QrWithLogo(payload, size, ecl, logoPath); return result; } catch (error) { throw new Error(error); } }); } static svg(payload, size = 400, ecl, fileName, filePath) { return __async(this, null, function* () { try { const result = yield Util.generateSvgQR(payload, size, ecl, fileName, filePath); return result; } catch (error) { throw new Error(error); } }); } static svgWithLogo(payload, size = 400, ecl, fileName, filePath, logoPath) { return __async(this, null, function* () { try { const result = yield Util.generateSvgQRWithLogo(payload, size, ecl, fileName, filePath, logoPath); return result; } catch (error) { throw new Error(error); } }); } static svgFile(payload, size = 400, ecl, fileName, filePath) { return __async(this, null, function* () { try { const result = yield Util.generateSvgQRFile(payload, size, ecl, fileName, filePath); return result; } catch (error) { throw new Error(error); } }); } static svgWithLogoFile(payload, size = 400, ecl, fileName, filePath, logoPath) { return __async(this, null, function* () { try { const result = yield Util.generateSvgQRWithLogoFile(payload, size, ecl, fileName, filePath, logoPath); return result; } catch (error) { throw new Error(error); } }); } }; // src/index.ts var QR = class { constructor() { } static validateLogoPath(logoPath) { if (!logoPath) return null; if (!/\.(png|svg)$/i.test(logoPath)) { throw new Error(`Invalid logo file type "${logoPath}". Only .png or .svg files are allowed.`); } return logoPath; } static generate(payload, options) { const { format = "png", size = 400, errorCorrection = "M", filePath, fileName, logoPath } = options; const validLogoPath = this.validateLogoPath(logoPath != null ? logoPath : ""); switch (format) { case "png": return logoPath ? Init.pngWithLogo(payload, size, errorCorrection, fileName, filePath, validLogoPath) : Init.png(payload, size, errorCorrection, fileName, filePath); case "svg": return logoPath ? Init.svgWithLogo(payload, size, errorCorrection, fileName, filePath, validLogoPath) : Init.svg(payload, size, errorCorrection, fileName, filePath); case "base64": return logoPath ? Init.base64WithLogo(payload, size, errorCorrection, validLogoPath) : Init.base64(payload, size, errorCorrection); default: throw new Error("Invalid format. Supported formats: png, svg, base64."); } } }; var src_default = QR; export { QR, src_default as default }; //# sourceMappingURL=index.mjs.map