From 4e73f8b1a019f7e7b8782d5067912b4bdfeb4108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roger=20Sch=C3=B6nb=C3=A4chler?= <42278642+Rogerrrrrrrs@users.noreply.github.com> Date: Wed, 9 Dec 2020 10:21:42 +0100 Subject: [PATCH] Fix UF-8 BOM issue (#169) * [Webpack] Added polyfills * Fixed trailing newlines * Release v2.0.3 --- CHANGELOG.md | 3 + package-lock.json | 184 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 15 +++- src/swissqrbill.ts | 72 +++++++++--------- webpack.config.js | 6 +- 5 files changed, 233 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fdd911..3b35576 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Change Log +# [v2.0.3](https://github.com/rogerrrrrrrs/swissqrbill/compare/v2.0.2...v2.0.3) - 09.12.2020 + * Fixed a problem with QR Code encoding that caused QR Code scanning to fail at certain banks. + # [v2.0.2](https://github.com/rogerrrrrrrs/swissqrbill/compare/v2.0.1...v2.0.2) - 19.08.2020 * Fixed an issue that caused reference to render incorrectly. * Fixed "Compte / Payable à" to display correctly in french QR bills. diff --git a/package-lock.json b/package-lock.json index 0d8824a..5e5c861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "swissqrbill", - "version": "2.0.2", + "version": "2.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -24,6 +24,11 @@ "js-tokens": "^4.0.0" } }, + "@rogerrrrrrrs/qrcode-svg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rogerrrrrrrs/qrcode-svg/-/qrcode-svg-1.2.1.tgz", + "integrity": "sha512-XVeLApD/T8bpBZuDpm/YHx5U00T5znntnE1Dgb97ZO9djS8CUhnybmXZZ44cddbK4cmorg4oRN8c32sHnjxsGA==" + }, "@types/blob-stream": { "version": "0.1.30", "resolved": "https://registry.npmjs.org/@types/blob-stream/-/blob-stream-0.1.30.tgz", @@ -478,6 +483,12 @@ "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", "dev": true }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -541,6 +552,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -645,6 +665,16 @@ "node-releases": "^1.1.67" } }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-equal": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", @@ -655,6 +685,16 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1514,6 +1554,17 @@ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1606,6 +1657,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -1791,6 +1848,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "dev": true + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -1834,6 +1897,18 @@ "has-symbols": "^1.0.1" } }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2374,11 +2449,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "qrcode-svg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz", - "integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==" - }, "quote-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", @@ -2713,6 +2783,16 @@ } } }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -2731,6 +2811,16 @@ "function-bind": "^1.1.1" } }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3025,6 +3115,20 @@ "punycode": "^2.1.0" } }, + "util": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3243,6 +3347,74 @@ "isexe": "^2.0.0" } }, + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index e2c81b3..d540b41 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "swissqrbill", - "version": "2.0.2", + "version": "2.0.3", "description": "Swiss QR Bill generation in Node.js and browsers ", "main": "./lib/node", "browser": "./lib/browser", @@ -19,12 +19,17 @@ }, "keywords": [ "swiss", - "switzerland", "schweiz", + "switzerland", "qr", "bill", "invoice", - "rechnung" + "rechnung", + "swiss-qr-invoice", + "swiss-qr-bill", + "qr-invoice", + "qr-rechnung", + "fattura" ], "author": "Roger Schönbächler", "license": "MIT", @@ -41,18 +46,20 @@ "@types/svg-parser": "^2.0.1", "@typescript-eslint/eslint-plugin": "^2.24.0", "@typescript-eslint/parser": "^2.24.0", + "buffer": "^6.0.3", "eslint": "^6.8.0", "stream-browserify": "^3.0.0", "ts-loader": "^8.0.0", "typescript": "^4.0.2", + "util": "^0.12.3", "webpack": "^5.0.0", "webpack-cli": "^4.0.0" }, "dependencies": { + "@rogerrrrrrrs/qrcode-svg": "^1.2.1", "blob-stream": "^0.1.3", "iban": "0.0.14", "pdfkit": "^0.11.0", - "qrcode-svg": "^1.1.0", "svg-parser": "^2.0.4", "svgpath": "^2.2.3" } diff --git a/src/swissqrbill.ts b/src/swissqrbill.ts index 5dda1b0..af1cc9b 100644 --- a/src/swissqrbill.ts +++ b/src/swissqrbill.ts @@ -1,5 +1,5 @@ import { parse } from "svg-parser"; -import QRCode from "qrcode-svg"; +import QRCode from "@rogerrrrrrrs/qrcode-svg"; import IBAN from "iban"; import ExtendedPDF from "./extended-pdf"; @@ -780,22 +780,22 @@ export class PDF extends ExtendedPDF.PDF { //-- Swiss Payments Code - qrString += "SPC\n"; + qrString += "SPC"; //-- Version - qrString += "0200\n"; + qrString += "\n0200"; //-- Coding Type UTF-8 - qrString += "1\n"; + qrString += "\n1"; //-- IBAN - qrString += this._data.creditor.account.replace(/ /g, "")+ "\n" ?? "\n"; + qrString += "\n" + this._data.creditor.account.replace(/ /g, "") ?? "\n"; //-- Creditor @@ -803,37 +803,37 @@ export class PDF extends ExtendedPDF.PDF { if(this._data.creditor.houseNumber !== undefined){ // Address Type - qrString += "S\n"; + qrString += "\nS"; // Name - qrString += this._data.creditor.name + "\n"; + qrString += "\n" + this._data.creditor.name; // Address - qrString += this._data.creditor.address + "\n"; + qrString += "\n" + this._data.creditor.address; // House number - qrString += this._data.creditor.houseNumber + "\n"; + qrString += "\n" + this._data.creditor.houseNumber; // Zip - qrString += this._data.creditor.zip + "\n"; + qrString += "\n" + this._data.creditor.zip; // City - qrString += this._data.creditor.city + "\n"; + qrString += "\n" + this._data.creditor.city; } else { // Address Type - qrString += "K\n"; + qrString += "\nK"; // Name - qrString += this._data.creditor.name + "\n"; + qrString += "\n" + this._data.creditor.name; // Address - qrString += this._data.creditor.address + "\n"; + qrString += "\n" + this._data.creditor.address; // Zip + city if((this._data.creditor.zip + " " + this._data.creditor.city).length > 70){ throw new Error("Creditor zip plus city must be a maximum of 70 characters."); } - qrString += this._data.creditor.zip + " " + this._data.creditor.city + "\n"; + qrString += "\n" + this._data.creditor.zip + " " + this._data.creditor.city; // Empty zip field qrString += "\n"; @@ -843,7 +843,7 @@ export class PDF extends ExtendedPDF.PDF { } - qrString += this._data.creditor.country + "\n"; + qrString += "\n" + this._data.creditor.country; //-- 7 x empty @@ -860,7 +860,7 @@ export class PDF extends ExtendedPDF.PDF { //-- Amount if(this._data.amount !== undefined){ - qrString += this._data.amount.toFixed(2) + "\n"; + qrString += "\n" + this._data.amount.toFixed(2); } else { qrString += "\n"; } @@ -868,7 +868,7 @@ export class PDF extends ExtendedPDF.PDF { //-- Currency - qrString += this._data.currency + "\n"; + qrString += "\n" + this._data.currency; //-- Debtor @@ -877,37 +877,37 @@ export class PDF extends ExtendedPDF.PDF { if(this._data.debtor.houseNumber !== undefined){ // Address type - qrString += "S\n"; + qrString += "\nS"; // Name - qrString += this._data.debtor.name + "\n"; + qrString += "\n" + this._data.debtor.name; // Address - qrString += this._data.debtor.address + "\n"; + qrString += "\n" + this._data.debtor.address; // House number - qrString += this._data.debtor.houseNumber + "\n"; + qrString += "\n" + this._data.debtor.houseNumber; // Zip - qrString += this._data.debtor.zip + "\n"; + qrString += "\n" + this._data.debtor.zip; // City - qrString += this._data.debtor.city + "\n"; + qrString += "\n" + this._data.debtor.city; } else { // Address type - qrString += "K\n"; + qrString += "\nK"; // Name - qrString += this._data.debtor.name + "\n"; + qrString += "\n" + this._data.debtor.name; // Address - qrString += this._data.debtor.address + "\n"; + qrString += "\n" + this._data.debtor.address; // Zip + city if((this._data.debtor.zip + " " + this._data.debtor.city).length > 70){ throw new Error("Debtor zip plus city must be a maximum of 70 characters."); } - qrString += this._data.debtor.zip + " " + this._data.debtor.city + "\n"; + qrString += "\n" + this._data.debtor.zip + " " + this._data.debtor.city; // Empty field zip qrString += "\n"; @@ -918,7 +918,7 @@ export class PDF extends ExtendedPDF.PDF { } // Country - qrString += this._data.debtor.country + "\n"; + qrString += "\n" + this._data.debtor.country; } else { @@ -949,13 +949,13 @@ export class PDF extends ExtendedPDF.PDF { //-- Reference type - qrString += this._referenceType + "\n"; + qrString += "\n" + this._referenceType; //-- Reference if(this._data.reference !== undefined){ - qrString += this._data.reference.replace(/ /g, "") + "\n"; + qrString += "\n" + this._data.reference.replace(/ /g, ""); } else { qrString += "\n"; } @@ -964,7 +964,7 @@ export class PDF extends ExtendedPDF.PDF { //-- Unstructured message if(this._data.message !== undefined){ - qrString += this._data.message + "\n"; + qrString += "\n" + this._data.message; } else { qrString += "\n"; } @@ -972,13 +972,13 @@ export class PDF extends ExtendedPDF.PDF { //-- End Payment Data - qrString += "EPD" + "\n"; + qrString += "\n" + "EPD"; //-- Additional information if(this._data.additionalInformation !== undefined){ - qrString += this._data.additionalInformation + "\n"; + qrString += "\n" + this._data.additionalInformation; } else { qrString += "\n"; } @@ -987,11 +987,11 @@ export class PDF extends ExtendedPDF.PDF { //-- AV1 if(this._data.av1 !== undefined){ - qrString += this._data.av1 + "\n"; + qrString += "\n" + this._data.av1; } if(this._data.av2 !== undefined){ - qrString += this._data.av2; + qrString += "\n" + this._data.av2; } diff --git a/webpack.config.js b/webpack.config.js index f43c531..b9e4291 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -12,7 +12,11 @@ module.exports = { devtool: "inline-source-map", resolve: { extensions: [ ".tsx", ".ts", ".js" ], - fallback: { "stream": require.resolve("stream-browserify") } + fallback: { + "stream": require.resolve("stream-browserify"), + "util": require.resolve("util"), + "buffer": require.resolve("buffer") + } }, output: { filename: "browser.js",