diff --git a/uds-auth/README.zh.md b/uds-auth/README.zh.md
index 680b8c69..6ecc668c 100644
--- a/uds-auth/README.zh.md
+++ b/uds-auth/README.zh.md
@@ -48,6 +48,11 @@ originSystemCode: ''
仅设置环境变量、不知道口令 → **无法登录**。旧变量 `UDS_AUTH_LOCAL_ADMIN_KEY` 已忽略。
- **ACL / 侧栏**:未登录与普通用户看不到设置齿轮;**仅超管/应急**可见设置。`admin` 无设置齿轮,但可看渠道/系统会话。`super_admin` / 兜底默认可见全部会话(可关)。布局:设置在左、登录在右。
+## Desktop 离线 tgz(无 npm 外网)
+
+**≥0.2.20**:`qrcode` 已打进 `lib/qrcode-bundled.cjs`,`dependencies` 为空。
+打包机:`npm pack`(会跑 `prepack` 重打 bundle)。现场 Desktop「添加插件」填 **绝对路径** `D:\…\uds-auth-0.2.20.tgz`,装包日志不应再出现 `registry.npmjs.org/qrcode`。
+
## Skill 认证(给他人改造 skill 时)
发整个 **uds-auth 插件** 即可,内含:
diff --git a/uds-auth/lib/index.js b/uds-auth/lib/index.js
index 37d9d42c..ded5c869 100644
--- a/uds-auth/lib/index.js
+++ b/uds-auth/lib/index.js
@@ -175,22 +175,24 @@ function buildVerifyUrl(uacBaseUrl, uacQrVerifyPath) {
return (uacBaseUrl.replace(/\/$/, '') + '/' + uacQrVerifyPath.replace(/^\//, ''))
}
-// Prefer npm `qrcode`; fall back to vendored copy if present.
+// Prefer offline bundle (shipped in tgz); fall back to npm / legacy vendored tree.
async function loadQRCodeLib() {
if (_qrcodeLib) return _qrcodeLib
- try {
- _qrcodeLib = require('qrcode')
- return _qrcodeLib
- } catch {
+ const candidates = [
+ resolve(__dirname, 'qrcode-bundled.cjs'),
+ 'qrcode',
+ resolve(__dirname, 'qrcode-lib', 'lib', 'browser.js'),
+ ]
+ for (const candidate of candidates) {
try {
- const libPath = resolve(__dirname, 'qrcode-lib', 'lib', 'browser.js')
- _qrcodeLib = require(libPath)
+ _qrcodeLib = require(candidate)
return _qrcodeLib
- } catch (e) {
- _logger.error?.('[uds-auth] Failed to load qrcode library:', e)
- return null
+ } catch {
+ // try next
}
}
+ _logger.error?.('[uds-auth] Failed to load qrcode library (no bundled/npm/vendored copy)')
+ return null
}
/** Start a UAC TwoDIMAuth QR challenge (no browser jQuery plugins required). */
diff --git a/uds-auth/lib/qrcode-bundled.cjs b/uds-auth/lib/qrcode-bundled.cjs
new file mode 100644
index 00000000..0633918e
--- /dev/null
+++ b/uds-auth/lib/qrcode-bundled.cjs
@@ -0,0 +1,2040 @@
+var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
+
+// node_modules/qrcode/lib/can-promise.js
+var require_can_promise = __commonJS((exports2, module2) => {
+ module2.exports = function() {
+ return typeof Promise === "function" && Promise.prototype && Promise.prototype.then;
+ };
+});
+
+// node_modules/qrcode/lib/core/utils.js
+var require_utils = __commonJS((exports2) => {
+ var toSJISFunction;
+ var CODEWORDS_COUNT = [
+ 0,
+ 26,
+ 44,
+ 70,
+ 100,
+ 134,
+ 172,
+ 196,
+ 242,
+ 292,
+ 346,
+ 404,
+ 466,
+ 532,
+ 581,
+ 655,
+ 733,
+ 815,
+ 901,
+ 991,
+ 1085,
+ 1156,
+ 1258,
+ 1364,
+ 1474,
+ 1588,
+ 1706,
+ 1828,
+ 1921,
+ 2051,
+ 2185,
+ 2323,
+ 2465,
+ 2611,
+ 2761,
+ 2876,
+ 3034,
+ 3196,
+ 3362,
+ 3532,
+ 3706
+ ];
+ exports2.getSymbolSize = function getSymbolSize(version) {
+ if (!version)
+ throw new Error('"version" cannot be null or undefined');
+ if (version < 1 || version > 40)
+ throw new Error('"version" should be in range from 1 to 40');
+ return version * 4 + 17;
+ };
+ exports2.getSymbolTotalCodewords = function getSymbolTotalCodewords(version) {
+ return CODEWORDS_COUNT[version];
+ };
+ exports2.getBCHDigit = function(data) {
+ let digit = 0;
+ while (data !== 0) {
+ digit++;
+ data >>>= 1;
+ }
+ return digit;
+ };
+ exports2.setToSJISFunction = function setToSJISFunction(f) {
+ if (typeof f !== "function") {
+ throw new Error('"toSJISFunc" is not a valid function.');
+ }
+ toSJISFunction = f;
+ };
+ exports2.isKanjiModeEnabled = function() {
+ return typeof toSJISFunction !== "undefined";
+ };
+ exports2.toSJIS = function toSJIS(kanji) {
+ return toSJISFunction(kanji);
+ };
+});
+
+// node_modules/qrcode/lib/core/error-correction-level.js
+var require_error_correction_level = __commonJS((exports2) => {
+ exports2.L = { bit: 1 };
+ exports2.M = { bit: 0 };
+ exports2.Q = { bit: 3 };
+ exports2.H = { bit: 2 };
+ function fromString(string) {
+ if (typeof string !== "string") {
+ throw new Error("Param is not a string");
+ }
+ const lcStr = string.toLowerCase();
+ switch (lcStr) {
+ case "l":
+ case "low":
+ return exports2.L;
+ case "m":
+ case "medium":
+ return exports2.M;
+ case "q":
+ case "quartile":
+ return exports2.Q;
+ case "h":
+ case "high":
+ return exports2.H;
+ default:
+ throw new Error("Unknown EC Level: " + string);
+ }
+ }
+ exports2.isValid = function isValid(level) {
+ return level && typeof level.bit !== "undefined" && level.bit >= 0 && level.bit < 4;
+ };
+ exports2.from = function from(value, defaultValue) {
+ if (exports2.isValid(value)) {
+ return value;
+ }
+ try {
+ return fromString(value);
+ } catch (e) {
+ return defaultValue;
+ }
+ };
+});
+
+// node_modules/qrcode/lib/core/bit-buffer.js
+var require_bit_buffer = __commonJS((exports2, module2) => {
+ function BitBuffer() {
+ this.buffer = [];
+ this.length = 0;
+ }
+ BitBuffer.prototype = {
+ get: function(index) {
+ const bufIndex = Math.floor(index / 8);
+ return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) === 1;
+ },
+ put: function(num, length) {
+ for (let i = 0;i < length; i++) {
+ this.putBit((num >>> length - i - 1 & 1) === 1);
+ }
+ },
+ getLengthInBits: function() {
+ return this.length;
+ },
+ putBit: function(bit) {
+ const bufIndex = Math.floor(this.length / 8);
+ if (this.buffer.length <= bufIndex) {
+ this.buffer.push(0);
+ }
+ if (bit) {
+ this.buffer[bufIndex] |= 128 >>> this.length % 8;
+ }
+ this.length++;
+ }
+ };
+ module2.exports = BitBuffer;
+});
+
+// node_modules/qrcode/lib/core/bit-matrix.js
+var require_bit_matrix = __commonJS((exports2, module2) => {
+ function BitMatrix(size) {
+ if (!size || size < 1) {
+ throw new Error("BitMatrix size must be defined and greater than 0");
+ }
+ this.size = size;
+ this.data = new Uint8Array(size * size);
+ this.reservedBit = new Uint8Array(size * size);
+ }
+ BitMatrix.prototype.set = function(row, col, value, reserved) {
+ const index = row * this.size + col;
+ this.data[index] = value;
+ if (reserved)
+ this.reservedBit[index] = true;
+ };
+ BitMatrix.prototype.get = function(row, col) {
+ return this.data[row * this.size + col];
+ };
+ BitMatrix.prototype.xor = function(row, col, value) {
+ this.data[row * this.size + col] ^= value;
+ };
+ BitMatrix.prototype.isReserved = function(row, col) {
+ return this.reservedBit[row * this.size + col];
+ };
+ module2.exports = BitMatrix;
+});
+
+// node_modules/qrcode/lib/core/alignment-pattern.js
+var require_alignment_pattern = __commonJS((exports2) => {
+ var getSymbolSize = require_utils().getSymbolSize;
+ exports2.getRowColCoords = function getRowColCoords(version) {
+ if (version === 1)
+ return [];
+ const posCount = Math.floor(version / 7) + 2;
+ const size = getSymbolSize(version);
+ const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2;
+ const positions = [size - 7];
+ for (let i = 1;i < posCount - 1; i++) {
+ positions[i] = positions[i - 1] - intervals;
+ }
+ positions.push(6);
+ return positions.reverse();
+ };
+ exports2.getPositions = function getPositions(version) {
+ const coords = [];
+ const pos = exports2.getRowColCoords(version);
+ const posLength = pos.length;
+ for (let i = 0;i < posLength; i++) {
+ for (let j = 0;j < posLength; j++) {
+ if (i === 0 && j === 0 || i === 0 && j === posLength - 1 || i === posLength - 1 && j === 0) {
+ continue;
+ }
+ coords.push([pos[i], pos[j]]);
+ }
+ }
+ return coords;
+ };
+});
+
+// node_modules/qrcode/lib/core/finder-pattern.js
+var require_finder_pattern = __commonJS((exports2) => {
+ var getSymbolSize = require_utils().getSymbolSize;
+ var FINDER_PATTERN_SIZE = 7;
+ exports2.getPositions = function getPositions(version) {
+ const size = getSymbolSize(version);
+ return [
+ [0, 0],
+ [size - FINDER_PATTERN_SIZE, 0],
+ [0, size - FINDER_PATTERN_SIZE]
+ ];
+ };
+});
+
+// node_modules/qrcode/lib/core/mask-pattern.js
+var require_mask_pattern = __commonJS((exports2) => {
+ exports2.Patterns = {
+ PATTERN000: 0,
+ PATTERN001: 1,
+ PATTERN010: 2,
+ PATTERN011: 3,
+ PATTERN100: 4,
+ PATTERN101: 5,
+ PATTERN110: 6,
+ PATTERN111: 7
+ };
+ var PenaltyScores = {
+ N1: 3,
+ N2: 3,
+ N3: 40,
+ N4: 10
+ };
+ exports2.isValid = function isValid(mask) {
+ return mask != null && mask !== "" && !isNaN(mask) && mask >= 0 && mask <= 7;
+ };
+ exports2.from = function from(value) {
+ return exports2.isValid(value) ? parseInt(value, 10) : undefined;
+ };
+ exports2.getPenaltyN1 = function getPenaltyN1(data) {
+ const size = data.size;
+ let points = 0;
+ let sameCountCol = 0;
+ let sameCountRow = 0;
+ let lastCol = null;
+ let lastRow = null;
+ for (let row = 0;row < size; row++) {
+ sameCountCol = sameCountRow = 0;
+ lastCol = lastRow = null;
+ for (let col = 0;col < size; col++) {
+ let module3 = data.get(row, col);
+ if (module3 === lastCol) {
+ sameCountCol++;
+ } else {
+ if (sameCountCol >= 5)
+ points += PenaltyScores.N1 + (sameCountCol - 5);
+ lastCol = module3;
+ sameCountCol = 1;
+ }
+ module3 = data.get(col, row);
+ if (module3 === lastRow) {
+ sameCountRow++;
+ } else {
+ if (sameCountRow >= 5)
+ points += PenaltyScores.N1 + (sameCountRow - 5);
+ lastRow = module3;
+ sameCountRow = 1;
+ }
+ }
+ if (sameCountCol >= 5)
+ points += PenaltyScores.N1 + (sameCountCol - 5);
+ if (sameCountRow >= 5)
+ points += PenaltyScores.N1 + (sameCountRow - 5);
+ }
+ return points;
+ };
+ exports2.getPenaltyN2 = function getPenaltyN2(data) {
+ const size = data.size;
+ let points = 0;
+ for (let row = 0;row < size - 1; row++) {
+ for (let col = 0;col < size - 1; col++) {
+ const last = data.get(row, col) + data.get(row, col + 1) + data.get(row + 1, col) + data.get(row + 1, col + 1);
+ if (last === 4 || last === 0)
+ points++;
+ }
+ }
+ return points * PenaltyScores.N2;
+ };
+ exports2.getPenaltyN3 = function getPenaltyN3(data) {
+ const size = data.size;
+ let points = 0;
+ let bitsCol = 0;
+ let bitsRow = 0;
+ for (let row = 0;row < size; row++) {
+ bitsCol = bitsRow = 0;
+ for (let col = 0;col < size; col++) {
+ bitsCol = bitsCol << 1 & 2047 | data.get(row, col);
+ if (col >= 10 && (bitsCol === 1488 || bitsCol === 93))
+ points++;
+ bitsRow = bitsRow << 1 & 2047 | data.get(col, row);
+ if (col >= 10 && (bitsRow === 1488 || bitsRow === 93))
+ points++;
+ }
+ }
+ return points * PenaltyScores.N3;
+ };
+ exports2.getPenaltyN4 = function getPenaltyN4(data) {
+ let darkCount = 0;
+ const modulesCount = data.data.length;
+ for (let i = 0;i < modulesCount; i++)
+ darkCount += data.data[i];
+ const k = Math.abs(Math.ceil(darkCount * 100 / modulesCount / 5) - 10);
+ return k * PenaltyScores.N4;
+ };
+ function getMaskAt(maskPattern, i, j) {
+ switch (maskPattern) {
+ case exports2.Patterns.PATTERN000:
+ return (i + j) % 2 === 0;
+ case exports2.Patterns.PATTERN001:
+ return i % 2 === 0;
+ case exports2.Patterns.PATTERN010:
+ return j % 3 === 0;
+ case exports2.Patterns.PATTERN011:
+ return (i + j) % 3 === 0;
+ case exports2.Patterns.PATTERN100:
+ return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0;
+ case exports2.Patterns.PATTERN101:
+ return i * j % 2 + i * j % 3 === 0;
+ case exports2.Patterns.PATTERN110:
+ return (i * j % 2 + i * j % 3) % 2 === 0;
+ case exports2.Patterns.PATTERN111:
+ return (i * j % 3 + (i + j) % 2) % 2 === 0;
+ default:
+ throw new Error("bad maskPattern:" + maskPattern);
+ }
+ }
+ exports2.applyMask = function applyMask(pattern, data) {
+ const size = data.size;
+ for (let col = 0;col < size; col++) {
+ for (let row = 0;row < size; row++) {
+ if (data.isReserved(row, col))
+ continue;
+ data.xor(row, col, getMaskAt(pattern, row, col));
+ }
+ }
+ };
+ exports2.getBestMask = function getBestMask(data, setupFormatFunc) {
+ const numPatterns = Object.keys(exports2.Patterns).length;
+ let bestPattern = 0;
+ let lowerPenalty = Infinity;
+ for (let p = 0;p < numPatterns; p++) {
+ setupFormatFunc(p);
+ exports2.applyMask(p, data);
+ const penalty = exports2.getPenaltyN1(data) + exports2.getPenaltyN2(data) + exports2.getPenaltyN3(data) + exports2.getPenaltyN4(data);
+ exports2.applyMask(p, data);
+ if (penalty < lowerPenalty) {
+ lowerPenalty = penalty;
+ bestPattern = p;
+ }
+ }
+ return bestPattern;
+ };
+});
+
+// node_modules/qrcode/lib/core/error-correction-code.js
+var require_error_correction_code = __commonJS((exports2) => {
+ var ECLevel = require_error_correction_level();
+ var EC_BLOCKS_TABLE = [
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 4,
+ 1,
+ 2,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 4,
+ 2,
+ 4,
+ 6,
+ 5,
+ 2,
+ 4,
+ 6,
+ 6,
+ 2,
+ 5,
+ 8,
+ 8,
+ 4,
+ 5,
+ 8,
+ 8,
+ 4,
+ 5,
+ 8,
+ 11,
+ 4,
+ 8,
+ 10,
+ 11,
+ 4,
+ 9,
+ 12,
+ 16,
+ 4,
+ 9,
+ 16,
+ 16,
+ 6,
+ 10,
+ 12,
+ 18,
+ 6,
+ 10,
+ 17,
+ 16,
+ 6,
+ 11,
+ 16,
+ 19,
+ 6,
+ 13,
+ 18,
+ 21,
+ 7,
+ 14,
+ 21,
+ 25,
+ 8,
+ 16,
+ 20,
+ 25,
+ 8,
+ 17,
+ 23,
+ 25,
+ 9,
+ 17,
+ 23,
+ 34,
+ 9,
+ 18,
+ 25,
+ 30,
+ 10,
+ 20,
+ 27,
+ 32,
+ 12,
+ 21,
+ 29,
+ 35,
+ 12,
+ 23,
+ 34,
+ 37,
+ 12,
+ 25,
+ 34,
+ 40,
+ 13,
+ 26,
+ 35,
+ 42,
+ 14,
+ 28,
+ 38,
+ 45,
+ 15,
+ 29,
+ 40,
+ 48,
+ 16,
+ 31,
+ 43,
+ 51,
+ 17,
+ 33,
+ 45,
+ 54,
+ 18,
+ 35,
+ 48,
+ 57,
+ 19,
+ 37,
+ 51,
+ 60,
+ 19,
+ 38,
+ 53,
+ 63,
+ 20,
+ 40,
+ 56,
+ 66,
+ 21,
+ 43,
+ 59,
+ 70,
+ 22,
+ 45,
+ 62,
+ 74,
+ 24,
+ 47,
+ 65,
+ 77,
+ 25,
+ 49,
+ 68,
+ 81
+ ];
+ var EC_CODEWORDS_TABLE = [
+ 7,
+ 10,
+ 13,
+ 17,
+ 10,
+ 16,
+ 22,
+ 28,
+ 15,
+ 26,
+ 36,
+ 44,
+ 20,
+ 36,
+ 52,
+ 64,
+ 26,
+ 48,
+ 72,
+ 88,
+ 36,
+ 64,
+ 96,
+ 112,
+ 40,
+ 72,
+ 108,
+ 130,
+ 48,
+ 88,
+ 132,
+ 156,
+ 60,
+ 110,
+ 160,
+ 192,
+ 72,
+ 130,
+ 192,
+ 224,
+ 80,
+ 150,
+ 224,
+ 264,
+ 96,
+ 176,
+ 260,
+ 308,
+ 104,
+ 198,
+ 288,
+ 352,
+ 120,
+ 216,
+ 320,
+ 384,
+ 132,
+ 240,
+ 360,
+ 432,
+ 144,
+ 280,
+ 408,
+ 480,
+ 168,
+ 308,
+ 448,
+ 532,
+ 180,
+ 338,
+ 504,
+ 588,
+ 196,
+ 364,
+ 546,
+ 650,
+ 224,
+ 416,
+ 600,
+ 700,
+ 224,
+ 442,
+ 644,
+ 750,
+ 252,
+ 476,
+ 690,
+ 816,
+ 270,
+ 504,
+ 750,
+ 900,
+ 300,
+ 560,
+ 810,
+ 960,
+ 312,
+ 588,
+ 870,
+ 1050,
+ 336,
+ 644,
+ 952,
+ 1110,
+ 360,
+ 700,
+ 1020,
+ 1200,
+ 390,
+ 728,
+ 1050,
+ 1260,
+ 420,
+ 784,
+ 1140,
+ 1350,
+ 450,
+ 812,
+ 1200,
+ 1440,
+ 480,
+ 868,
+ 1290,
+ 1530,
+ 510,
+ 924,
+ 1350,
+ 1620,
+ 540,
+ 980,
+ 1440,
+ 1710,
+ 570,
+ 1036,
+ 1530,
+ 1800,
+ 570,
+ 1064,
+ 1590,
+ 1890,
+ 600,
+ 1120,
+ 1680,
+ 1980,
+ 630,
+ 1204,
+ 1770,
+ 2100,
+ 660,
+ 1260,
+ 1860,
+ 2220,
+ 720,
+ 1316,
+ 1950,
+ 2310,
+ 750,
+ 1372,
+ 2040,
+ 2430
+ ];
+ exports2.getBlocksCount = function getBlocksCount(version, errorCorrectionLevel) {
+ switch (errorCorrectionLevel) {
+ case ECLevel.L:
+ return EC_BLOCKS_TABLE[(version - 1) * 4 + 0];
+ case ECLevel.M:
+ return EC_BLOCKS_TABLE[(version - 1) * 4 + 1];
+ case ECLevel.Q:
+ return EC_BLOCKS_TABLE[(version - 1) * 4 + 2];
+ case ECLevel.H:
+ return EC_BLOCKS_TABLE[(version - 1) * 4 + 3];
+ default:
+ return;
+ }
+ };
+ exports2.getTotalCodewordsCount = function getTotalCodewordsCount(version, errorCorrectionLevel) {
+ switch (errorCorrectionLevel) {
+ case ECLevel.L:
+ return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0];
+ case ECLevel.M:
+ return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1];
+ case ECLevel.Q:
+ return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2];
+ case ECLevel.H:
+ return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3];
+ default:
+ return;
+ }
+ };
+});
+
+// node_modules/qrcode/lib/core/galois-field.js
+var require_galois_field = __commonJS((exports2) => {
+ var EXP_TABLE = new Uint8Array(512);
+ var LOG_TABLE = new Uint8Array(256);
+ (function initTables() {
+ let x = 1;
+ for (let i = 0;i < 255; i++) {
+ EXP_TABLE[i] = x;
+ LOG_TABLE[x] = i;
+ x <<= 1;
+ if (x & 256) {
+ x ^= 285;
+ }
+ }
+ for (let i = 255;i < 512; i++) {
+ EXP_TABLE[i] = EXP_TABLE[i - 255];
+ }
+ })();
+ exports2.log = function log(n) {
+ if (n < 1)
+ throw new Error("log(" + n + ")");
+ return LOG_TABLE[n];
+ };
+ exports2.exp = function exp(n) {
+ return EXP_TABLE[n];
+ };
+ exports2.mul = function mul(x, y) {
+ if (x === 0 || y === 0)
+ return 0;
+ return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]];
+ };
+});
+
+// node_modules/qrcode/lib/core/polynomial.js
+var require_polynomial = __commonJS((exports2) => {
+ var GF = require_galois_field();
+ exports2.mul = function mul(p1, p2) {
+ const coeff = new Uint8Array(p1.length + p2.length - 1);
+ for (let i = 0;i < p1.length; i++) {
+ for (let j = 0;j < p2.length; j++) {
+ coeff[i + j] ^= GF.mul(p1[i], p2[j]);
+ }
+ }
+ return coeff;
+ };
+ exports2.mod = function mod(divident, divisor) {
+ let result = new Uint8Array(divident);
+ while (result.length - divisor.length >= 0) {
+ const coeff = result[0];
+ for (let i = 0;i < divisor.length; i++) {
+ result[i] ^= GF.mul(divisor[i], coeff);
+ }
+ let offset = 0;
+ while (offset < result.length && result[offset] === 0)
+ offset++;
+ result = result.slice(offset);
+ }
+ return result;
+ };
+ exports2.generateECPolynomial = function generateECPolynomial(degree) {
+ let poly = new Uint8Array([1]);
+ for (let i = 0;i < degree; i++) {
+ poly = exports2.mul(poly, new Uint8Array([1, GF.exp(i)]));
+ }
+ return poly;
+ };
+});
+
+// node_modules/qrcode/lib/core/reed-solomon-encoder.js
+var require_reed_solomon_encoder = __commonJS((exports2, module2) => {
+ var Polynomial = require_polynomial();
+ function ReedSolomonEncoder(degree) {
+ this.genPoly = undefined;
+ this.degree = degree;
+ if (this.degree)
+ this.initialize(this.degree);
+ }
+ ReedSolomonEncoder.prototype.initialize = function initialize(degree) {
+ this.degree = degree;
+ this.genPoly = Polynomial.generateECPolynomial(this.degree);
+ };
+ ReedSolomonEncoder.prototype.encode = function encode(data) {
+ if (!this.genPoly) {
+ throw new Error("Encoder not initialized");
+ }
+ const paddedData = new Uint8Array(data.length + this.degree);
+ paddedData.set(data);
+ const remainder = Polynomial.mod(paddedData, this.genPoly);
+ const start = this.degree - remainder.length;
+ if (start > 0) {
+ const buff = new Uint8Array(this.degree);
+ buff.set(remainder, start);
+ return buff;
+ }
+ return remainder;
+ };
+ module2.exports = ReedSolomonEncoder;
+});
+
+// node_modules/qrcode/lib/core/version-check.js
+var require_version_check = __commonJS((exports2) => {
+ exports2.isValid = function isValid(version) {
+ return !isNaN(version) && version >= 1 && version <= 40;
+ };
+});
+
+// node_modules/qrcode/lib/core/regex.js
+var require_regex = __commonJS((exports2) => {
+ var numeric = "[0-9]+";
+ var alphanumeric = "[A-Z $%*+\\-./:]+";
+ var kanji = "(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|" + "[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|" + "[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|" + "[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";
+ kanji = kanji.replace(/u/g, "\\u");
+ var byte = "(?:(?![A-Z0-9 $%*+\\-./:]|" + kanji + `)(?:.|[\r
+]))+`;
+ exports2.KANJI = new RegExp(kanji, "g");
+ exports2.BYTE_KANJI = new RegExp("[^A-Z0-9 $%*+\\-./:]+", "g");
+ exports2.BYTE = new RegExp(byte, "g");
+ exports2.NUMERIC = new RegExp(numeric, "g");
+ exports2.ALPHANUMERIC = new RegExp(alphanumeric, "g");
+ var TEST_KANJI = new RegExp("^" + kanji + "$");
+ var TEST_NUMERIC = new RegExp("^" + numeric + "$");
+ var TEST_ALPHANUMERIC = new RegExp("^[A-Z0-9 $%*+\\-./:]+$");
+ exports2.testKanji = function testKanji(str) {
+ return TEST_KANJI.test(str);
+ };
+ exports2.testNumeric = function testNumeric(str) {
+ return TEST_NUMERIC.test(str);
+ };
+ exports2.testAlphanumeric = function testAlphanumeric(str) {
+ return TEST_ALPHANUMERIC.test(str);
+ };
+});
+
+// node_modules/qrcode/lib/core/mode.js
+var require_mode = __commonJS((exports2) => {
+ var VersionCheck = require_version_check();
+ var Regex = require_regex();
+ exports2.NUMERIC = {
+ id: "Numeric",
+ bit: 1 << 0,
+ ccBits: [10, 12, 14]
+ };
+ exports2.ALPHANUMERIC = {
+ id: "Alphanumeric",
+ bit: 1 << 1,
+ ccBits: [9, 11, 13]
+ };
+ exports2.BYTE = {
+ id: "Byte",
+ bit: 1 << 2,
+ ccBits: [8, 16, 16]
+ };
+ exports2.KANJI = {
+ id: "Kanji",
+ bit: 1 << 3,
+ ccBits: [8, 10, 12]
+ };
+ exports2.MIXED = {
+ bit: -1
+ };
+ exports2.getCharCountIndicator = function getCharCountIndicator(mode, version) {
+ if (!mode.ccBits)
+ throw new Error("Invalid mode: " + mode);
+ if (!VersionCheck.isValid(version)) {
+ throw new Error("Invalid version: " + version);
+ }
+ if (version >= 1 && version < 10)
+ return mode.ccBits[0];
+ else if (version < 27)
+ return mode.ccBits[1];
+ return mode.ccBits[2];
+ };
+ exports2.getBestModeForData = function getBestModeForData(dataStr) {
+ if (Regex.testNumeric(dataStr))
+ return exports2.NUMERIC;
+ else if (Regex.testAlphanumeric(dataStr))
+ return exports2.ALPHANUMERIC;
+ else if (Regex.testKanji(dataStr))
+ return exports2.KANJI;
+ else
+ return exports2.BYTE;
+ };
+ exports2.toString = function toString(mode) {
+ if (mode && mode.id)
+ return mode.id;
+ throw new Error("Invalid mode");
+ };
+ exports2.isValid = function isValid(mode) {
+ return mode && mode.bit && mode.ccBits;
+ };
+ function fromString(string) {
+ if (typeof string !== "string") {
+ throw new Error("Param is not a string");
+ }
+ const lcStr = string.toLowerCase();
+ switch (lcStr) {
+ case "numeric":
+ return exports2.NUMERIC;
+ case "alphanumeric":
+ return exports2.ALPHANUMERIC;
+ case "kanji":
+ return exports2.KANJI;
+ case "byte":
+ return exports2.BYTE;
+ default:
+ throw new Error("Unknown mode: " + string);
+ }
+ }
+ exports2.from = function from(value, defaultValue) {
+ if (exports2.isValid(value)) {
+ return value;
+ }
+ try {
+ return fromString(value);
+ } catch (e) {
+ return defaultValue;
+ }
+ };
+});
+
+// node_modules/qrcode/lib/core/version.js
+var require_version = __commonJS((exports2) => {
+ var Utils = require_utils();
+ var ECCode = require_error_correction_code();
+ var ECLevel = require_error_correction_level();
+ var Mode = require_mode();
+ var VersionCheck = require_version_check();
+ var G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0;
+ var G18_BCH = Utils.getBCHDigit(G18);
+ function getBestVersionForDataLength(mode, length, errorCorrectionLevel) {
+ for (let currentVersion = 1;currentVersion <= 40; currentVersion++) {
+ if (length <= exports2.getCapacity(currentVersion, errorCorrectionLevel, mode)) {
+ return currentVersion;
+ }
+ }
+ return;
+ }
+ function getReservedBitsCount(mode, version) {
+ return Mode.getCharCountIndicator(mode, version) + 4;
+ }
+ function getTotalBitsFromDataArray(segments, version) {
+ let totalBits = 0;
+ segments.forEach(function(data) {
+ const reservedBits = getReservedBitsCount(data.mode, version);
+ totalBits += reservedBits + data.getBitsLength();
+ });
+ return totalBits;
+ }
+ function getBestVersionForMixedData(segments, errorCorrectionLevel) {
+ for (let currentVersion = 1;currentVersion <= 40; currentVersion++) {
+ const length = getTotalBitsFromDataArray(segments, currentVersion);
+ if (length <= exports2.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {
+ return currentVersion;
+ }
+ }
+ return;
+ }
+ exports2.from = function from(value, defaultValue) {
+ if (VersionCheck.isValid(value)) {
+ return parseInt(value, 10);
+ }
+ return defaultValue;
+ };
+ exports2.getCapacity = function getCapacity(version, errorCorrectionLevel, mode) {
+ if (!VersionCheck.isValid(version)) {
+ throw new Error("Invalid QR Code version");
+ }
+ if (typeof mode === "undefined")
+ mode = Mode.BYTE;
+ const totalCodewords = Utils.getSymbolTotalCodewords(version);
+ const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel);
+ const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8;
+ if (mode === Mode.MIXED)
+ return dataTotalCodewordsBits;
+ const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version);
+ switch (mode) {
+ case Mode.NUMERIC:
+ return Math.floor(usableBits / 10 * 3);
+ case Mode.ALPHANUMERIC:
+ return Math.floor(usableBits / 11 * 2);
+ case Mode.KANJI:
+ return Math.floor(usableBits / 13);
+ case Mode.BYTE:
+ default:
+ return Math.floor(usableBits / 8);
+ }
+ };
+ exports2.getBestVersionForData = function getBestVersionForData(data, errorCorrectionLevel) {
+ let seg;
+ const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M);
+ if (Array.isArray(data)) {
+ if (data.length > 1) {
+ return getBestVersionForMixedData(data, ecl);
+ }
+ if (data.length === 0) {
+ return 1;
+ }
+ seg = data[0];
+ } else {
+ seg = data;
+ }
+ return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl);
+ };
+ exports2.getEncodedBits = function getEncodedBits(version) {
+ if (!VersionCheck.isValid(version) || version < 7) {
+ throw new Error("Invalid QR Code version");
+ }
+ let d = version << 12;
+ while (Utils.getBCHDigit(d) - G18_BCH >= 0) {
+ d ^= G18 << Utils.getBCHDigit(d) - G18_BCH;
+ }
+ return version << 12 | d;
+ };
+});
+
+// node_modules/qrcode/lib/core/format-info.js
+var require_format_info = __commonJS((exports2) => {
+ var Utils = require_utils();
+ var G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
+ var G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
+ var G15_BCH = Utils.getBCHDigit(G15);
+ exports2.getEncodedBits = function getEncodedBits(errorCorrectionLevel, mask) {
+ const data = errorCorrectionLevel.bit << 3 | mask;
+ let d = data << 10;
+ while (Utils.getBCHDigit(d) - G15_BCH >= 0) {
+ d ^= G15 << Utils.getBCHDigit(d) - G15_BCH;
+ }
+ return (data << 10 | d) ^ G15_MASK;
+ };
+});
+
+// node_modules/qrcode/lib/core/numeric-data.js
+var require_numeric_data = __commonJS((exports2, module2) => {
+ var Mode = require_mode();
+ function NumericData(data) {
+ this.mode = Mode.NUMERIC;
+ this.data = data.toString();
+ }
+ NumericData.getBitsLength = function getBitsLength(length) {
+ return 10 * Math.floor(length / 3) + (length % 3 ? length % 3 * 3 + 1 : 0);
+ };
+ NumericData.prototype.getLength = function getLength() {
+ return this.data.length;
+ };
+ NumericData.prototype.getBitsLength = function getBitsLength() {
+ return NumericData.getBitsLength(this.data.length);
+ };
+ NumericData.prototype.write = function write(bitBuffer) {
+ let i, group, value;
+ for (i = 0;i + 3 <= this.data.length; i += 3) {
+ group = this.data.substr(i, 3);
+ value = parseInt(group, 10);
+ bitBuffer.put(value, 10);
+ }
+ const remainingNum = this.data.length - i;
+ if (remainingNum > 0) {
+ group = this.data.substr(i);
+ value = parseInt(group, 10);
+ bitBuffer.put(value, remainingNum * 3 + 1);
+ }
+ };
+ module2.exports = NumericData;
+});
+
+// node_modules/qrcode/lib/core/alphanumeric-data.js
+var require_alphanumeric_data = __commonJS((exports2, module2) => {
+ var Mode = require_mode();
+ var ALPHA_NUM_CHARS = [
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ " ",
+ "$",
+ "%",
+ "*",
+ "+",
+ "-",
+ ".",
+ "/",
+ ":"
+ ];
+ function AlphanumericData(data) {
+ this.mode = Mode.ALPHANUMERIC;
+ this.data = data;
+ }
+ AlphanumericData.getBitsLength = function getBitsLength(length) {
+ return 11 * Math.floor(length / 2) + 6 * (length % 2);
+ };
+ AlphanumericData.prototype.getLength = function getLength() {
+ return this.data.length;
+ };
+ AlphanumericData.prototype.getBitsLength = function getBitsLength() {
+ return AlphanumericData.getBitsLength(this.data.length);
+ };
+ AlphanumericData.prototype.write = function write(bitBuffer) {
+ let i;
+ for (i = 0;i + 2 <= this.data.length; i += 2) {
+ let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45;
+ value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1]);
+ bitBuffer.put(value, 11);
+ }
+ if (this.data.length % 2) {
+ bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6);
+ }
+ };
+ module2.exports = AlphanumericData;
+});
+
+// node_modules/qrcode/lib/core/byte-data.js
+var require_byte_data = __commonJS((exports2, module2) => {
+ var Mode = require_mode();
+ function ByteData(data) {
+ this.mode = Mode.BYTE;
+ if (typeof data === "string") {
+ this.data = new TextEncoder().encode(data);
+ } else {
+ this.data = new Uint8Array(data);
+ }
+ }
+ ByteData.getBitsLength = function getBitsLength(length) {
+ return length * 8;
+ };
+ ByteData.prototype.getLength = function getLength() {
+ return this.data.length;
+ };
+ ByteData.prototype.getBitsLength = function getBitsLength() {
+ return ByteData.getBitsLength(this.data.length);
+ };
+ ByteData.prototype.write = function(bitBuffer) {
+ for (let i = 0, l = this.data.length;i < l; i++) {
+ bitBuffer.put(this.data[i], 8);
+ }
+ };
+ module2.exports = ByteData;
+});
+
+// node_modules/qrcode/lib/core/kanji-data.js
+var require_kanji_data = __commonJS((exports2, module2) => {
+ var Mode = require_mode();
+ var Utils = require_utils();
+ function KanjiData(data) {
+ this.mode = Mode.KANJI;
+ this.data = data;
+ }
+ KanjiData.getBitsLength = function getBitsLength(length) {
+ return length * 13;
+ };
+ KanjiData.prototype.getLength = function getLength() {
+ return this.data.length;
+ };
+ KanjiData.prototype.getBitsLength = function getBitsLength() {
+ return KanjiData.getBitsLength(this.data.length);
+ };
+ KanjiData.prototype.write = function(bitBuffer) {
+ let i;
+ for (i = 0;i < this.data.length; i++) {
+ let value = Utils.toSJIS(this.data[i]);
+ if (value >= 33088 && value <= 40956) {
+ value -= 33088;
+ } else if (value >= 57408 && value <= 60351) {
+ value -= 49472;
+ } else {
+ throw new Error("Invalid SJIS character: " + this.data[i] + `
+` + "Make sure your charset is UTF-8");
+ }
+ value = (value >>> 8 & 255) * 192 + (value & 255);
+ bitBuffer.put(value, 13);
+ }
+ };
+ module2.exports = KanjiData;
+});
+
+// node_modules/dijkstrajs/dijkstra.js
+var require_dijkstra = __commonJS((exports2, module2) => {
+ var dijkstra = {
+ single_source_shortest_paths: function(graph, s, d) {
+ var predecessors = {};
+ var costs = {};
+ costs[s] = 0;
+ var open = dijkstra.PriorityQueue.make();
+ open.push(s, 0);
+ var closest, u, v, cost_of_s_to_u, adjacent_nodes, cost_of_e, cost_of_s_to_u_plus_cost_of_e, cost_of_s_to_v, first_visit;
+ while (!open.empty()) {
+ closest = open.pop();
+ u = closest.value;
+ cost_of_s_to_u = closest.cost;
+ adjacent_nodes = graph[u] || {};
+ for (v in adjacent_nodes) {
+ if (adjacent_nodes.hasOwnProperty(v)) {
+ cost_of_e = adjacent_nodes[v];
+ cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;
+ cost_of_s_to_v = costs[v];
+ first_visit = typeof costs[v] === "undefined";
+ if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {
+ costs[v] = cost_of_s_to_u_plus_cost_of_e;
+ open.push(v, cost_of_s_to_u_plus_cost_of_e);
+ predecessors[v] = u;
+ }
+ }
+ }
+ }
+ if (typeof d !== "undefined" && typeof costs[d] === "undefined") {
+ var msg = ["Could not find a path from ", s, " to ", d, "."].join("");
+ throw new Error(msg);
+ }
+ return predecessors;
+ },
+ extract_shortest_path_from_predecessor_list: function(predecessors, d) {
+ var nodes = [];
+ var u = d;
+ var predecessor;
+ while (u) {
+ nodes.push(u);
+ predecessor = predecessors[u];
+ u = predecessors[u];
+ }
+ nodes.reverse();
+ return nodes;
+ },
+ find_path: function(graph, s, d) {
+ var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);
+ return dijkstra.extract_shortest_path_from_predecessor_list(predecessors, d);
+ },
+ PriorityQueue: {
+ make: function(opts) {
+ var T = dijkstra.PriorityQueue, t = {}, key;
+ opts = opts || {};
+ for (key in T) {
+ if (T.hasOwnProperty(key)) {
+ t[key] = T[key];
+ }
+ }
+ t.queue = [];
+ t.sorter = opts.sorter || T.default_sorter;
+ return t;
+ },
+ default_sorter: function(a, b) {
+ return a.cost - b.cost;
+ },
+ push: function(value, cost) {
+ var item = { value, cost };
+ this.queue.push(item);
+ this.queue.sort(this.sorter);
+ },
+ pop: function() {
+ return this.queue.shift();
+ },
+ empty: function() {
+ return this.queue.length === 0;
+ }
+ }
+ };
+ if (typeof module2 !== "undefined") {
+ module2.exports = dijkstra;
+ }
+});
+
+// node_modules/qrcode/lib/core/segments.js
+var require_segments = __commonJS((exports2) => {
+ var Mode = require_mode();
+ var NumericData = require_numeric_data();
+ var AlphanumericData = require_alphanumeric_data();
+ var ByteData = require_byte_data();
+ var KanjiData = require_kanji_data();
+ var Regex = require_regex();
+ var Utils = require_utils();
+ var dijkstra = require_dijkstra();
+ function getStringByteLength(str) {
+ return unescape(encodeURIComponent(str)).length;
+ }
+ function getSegments(regex, mode, str) {
+ const segments = [];
+ let result;
+ while ((result = regex.exec(str)) !== null) {
+ segments.push({
+ data: result[0],
+ index: result.index,
+ mode,
+ length: result[0].length
+ });
+ }
+ return segments;
+ }
+ function getSegmentsFromString(dataStr) {
+ const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr);
+ const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr);
+ let byteSegs;
+ let kanjiSegs;
+ if (Utils.isKanjiModeEnabled()) {
+ byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr);
+ kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr);
+ } else {
+ byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr);
+ kanjiSegs = [];
+ }
+ const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs);
+ return segs.sort(function(s1, s2) {
+ return s1.index - s2.index;
+ }).map(function(obj) {
+ return {
+ data: obj.data,
+ mode: obj.mode,
+ length: obj.length
+ };
+ });
+ }
+ function getSegmentBitsLength(length, mode) {
+ switch (mode) {
+ case Mode.NUMERIC:
+ return NumericData.getBitsLength(length);
+ case Mode.ALPHANUMERIC:
+ return AlphanumericData.getBitsLength(length);
+ case Mode.KANJI:
+ return KanjiData.getBitsLength(length);
+ case Mode.BYTE:
+ return ByteData.getBitsLength(length);
+ }
+ }
+ function mergeSegments(segs) {
+ return segs.reduce(function(acc, curr) {
+ const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null;
+ if (prevSeg && prevSeg.mode === curr.mode) {
+ acc[acc.length - 1].data += curr.data;
+ return acc;
+ }
+ acc.push(curr);
+ return acc;
+ }, []);
+ }
+ function buildNodes(segs) {
+ const nodes = [];
+ for (let i = 0;i < segs.length; i++) {
+ const seg = segs[i];
+ switch (seg.mode) {
+ case Mode.NUMERIC:
+ nodes.push([
+ seg,
+ { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },
+ { data: seg.data, mode: Mode.BYTE, length: seg.length }
+ ]);
+ break;
+ case Mode.ALPHANUMERIC:
+ nodes.push([
+ seg,
+ { data: seg.data, mode: Mode.BYTE, length: seg.length }
+ ]);
+ break;
+ case Mode.KANJI:
+ nodes.push([
+ seg,
+ { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }
+ ]);
+ break;
+ case Mode.BYTE:
+ nodes.push([
+ { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }
+ ]);
+ }
+ }
+ return nodes;
+ }
+ function buildGraph(nodes, version) {
+ const table = {};
+ const graph = { start: {} };
+ let prevNodeIds = ["start"];
+ for (let i = 0;i < nodes.length; i++) {
+ const nodeGroup = nodes[i];
+ const currentNodeIds = [];
+ for (let j = 0;j < nodeGroup.length; j++) {
+ const node = nodeGroup[j];
+ const key = "" + i + j;
+ currentNodeIds.push(key);
+ table[key] = { node, lastCount: 0 };
+ graph[key] = {};
+ for (let n = 0;n < prevNodeIds.length; n++) {
+ const prevNodeId = prevNodeIds[n];
+ if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {
+ graph[prevNodeId][key] = getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) - getSegmentBitsLength(table[prevNodeId].lastCount, node.mode);
+ table[prevNodeId].lastCount += node.length;
+ } else {
+ if (table[prevNodeId])
+ table[prevNodeId].lastCount = node.length;
+ graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) + 4 + Mode.getCharCountIndicator(node.mode, version);
+ }
+ }
+ }
+ prevNodeIds = currentNodeIds;
+ }
+ for (let n = 0;n < prevNodeIds.length; n++) {
+ graph[prevNodeIds[n]].end = 0;
+ }
+ return { map: graph, table };
+ }
+ function buildSingleSegment(data, modesHint) {
+ let mode;
+ const bestMode = Mode.getBestModeForData(data);
+ mode = Mode.from(modesHint, bestMode);
+ if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {
+ throw new Error('"' + data + '"' + " cannot be encoded with mode " + Mode.toString(mode) + `.
+ Suggested mode is: ` + Mode.toString(bestMode));
+ }
+ if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {
+ mode = Mode.BYTE;
+ }
+ switch (mode) {
+ case Mode.NUMERIC:
+ return new NumericData(data);
+ case Mode.ALPHANUMERIC:
+ return new AlphanumericData(data);
+ case Mode.KANJI:
+ return new KanjiData(data);
+ case Mode.BYTE:
+ return new ByteData(data);
+ }
+ }
+ exports2.fromArray = function fromArray(array) {
+ return array.reduce(function(acc, seg) {
+ if (typeof seg === "string") {
+ acc.push(buildSingleSegment(seg, null));
+ } else if (seg.data) {
+ acc.push(buildSingleSegment(seg.data, seg.mode));
+ }
+ return acc;
+ }, []);
+ };
+ exports2.fromString = function fromString(data, version) {
+ const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled());
+ const nodes = buildNodes(segs);
+ const graph = buildGraph(nodes, version);
+ const path = dijkstra.find_path(graph.map, "start", "end");
+ const optimizedSegs = [];
+ for (let i = 1;i < path.length - 1; i++) {
+ optimizedSegs.push(graph.table[path[i]].node);
+ }
+ return exports2.fromArray(mergeSegments(optimizedSegs));
+ };
+ exports2.rawSplit = function rawSplit(data) {
+ return exports2.fromArray(getSegmentsFromString(data, Utils.isKanjiModeEnabled()));
+ };
+});
+
+// node_modules/qrcode/lib/core/qrcode.js
+var require_qrcode = __commonJS((exports2) => {
+ var Utils = require_utils();
+ var ECLevel = require_error_correction_level();
+ var BitBuffer = require_bit_buffer();
+ var BitMatrix = require_bit_matrix();
+ var AlignmentPattern = require_alignment_pattern();
+ var FinderPattern = require_finder_pattern();
+ var MaskPattern = require_mask_pattern();
+ var ECCode = require_error_correction_code();
+ var ReedSolomonEncoder = require_reed_solomon_encoder();
+ var Version = require_version();
+ var FormatInfo = require_format_info();
+ var Mode = require_mode();
+ var Segments = require_segments();
+ function setupFinderPattern(matrix, version) {
+ const size = matrix.size;
+ const pos = FinderPattern.getPositions(version);
+ for (let i = 0;i < pos.length; i++) {
+ const row = pos[i][0];
+ const col = pos[i][1];
+ for (let r = -1;r <= 7; r++) {
+ if (row + r <= -1 || size <= row + r)
+ continue;
+ for (let c = -1;c <= 7; c++) {
+ if (col + c <= -1 || size <= col + c)
+ continue;
+ if (r >= 0 && r <= 6 && (c === 0 || c === 6) || c >= 0 && c <= 6 && (r === 0 || r === 6) || r >= 2 && r <= 4 && c >= 2 && c <= 4) {
+ matrix.set(row + r, col + c, true, true);
+ } else {
+ matrix.set(row + r, col + c, false, true);
+ }
+ }
+ }
+ }
+ }
+ function setupTimingPattern(matrix) {
+ const size = matrix.size;
+ for (let r = 8;r < size - 8; r++) {
+ const value = r % 2 === 0;
+ matrix.set(r, 6, value, true);
+ matrix.set(6, r, value, true);
+ }
+ }
+ function setupAlignmentPattern(matrix, version) {
+ const pos = AlignmentPattern.getPositions(version);
+ for (let i = 0;i < pos.length; i++) {
+ const row = pos[i][0];
+ const col = pos[i][1];
+ for (let r = -2;r <= 2; r++) {
+ for (let c = -2;c <= 2; c++) {
+ if (r === -2 || r === 2 || c === -2 || c === 2 || r === 0 && c === 0) {
+ matrix.set(row + r, col + c, true, true);
+ } else {
+ matrix.set(row + r, col + c, false, true);
+ }
+ }
+ }
+ }
+ }
+ function setupVersionInfo(matrix, version) {
+ const size = matrix.size;
+ const bits = Version.getEncodedBits(version);
+ let row, col, mod;
+ for (let i = 0;i < 18; i++) {
+ row = Math.floor(i / 3);
+ col = i % 3 + size - 8 - 3;
+ mod = (bits >> i & 1) === 1;
+ matrix.set(row, col, mod, true);
+ matrix.set(col, row, mod, true);
+ }
+ }
+ function setupFormatInfo(matrix, errorCorrectionLevel, maskPattern) {
+ const size = matrix.size;
+ const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern);
+ let i, mod;
+ for (i = 0;i < 15; i++) {
+ mod = (bits >> i & 1) === 1;
+ if (i < 6) {
+ matrix.set(i, 8, mod, true);
+ } else if (i < 8) {
+ matrix.set(i + 1, 8, mod, true);
+ } else {
+ matrix.set(size - 15 + i, 8, mod, true);
+ }
+ if (i < 8) {
+ matrix.set(8, size - i - 1, mod, true);
+ } else if (i < 9) {
+ matrix.set(8, 15 - i - 1 + 1, mod, true);
+ } else {
+ matrix.set(8, 15 - i - 1, mod, true);
+ }
+ }
+ matrix.set(size - 8, 8, 1, true);
+ }
+ function setupData(matrix, data) {
+ const size = matrix.size;
+ let inc = -1;
+ let row = size - 1;
+ let bitIndex = 7;
+ let byteIndex = 0;
+ for (let col = size - 1;col > 0; col -= 2) {
+ if (col === 6)
+ col--;
+ while (true) {
+ for (let c = 0;c < 2; c++) {
+ if (!matrix.isReserved(row, col - c)) {
+ let dark = false;
+ if (byteIndex < data.length) {
+ dark = (data[byteIndex] >>> bitIndex & 1) === 1;
+ }
+ matrix.set(row, col - c, dark);
+ bitIndex--;
+ if (bitIndex === -1) {
+ byteIndex++;
+ bitIndex = 7;
+ }
+ }
+ }
+ row += inc;
+ if (row < 0 || size <= row) {
+ row -= inc;
+ inc = -inc;
+ break;
+ }
+ }
+ }
+ }
+ function createData(version, errorCorrectionLevel, segments) {
+ const buffer = new BitBuffer;
+ segments.forEach(function(data) {
+ buffer.put(data.mode.bit, 4);
+ buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version));
+ data.write(buffer);
+ });
+ const totalCodewords = Utils.getSymbolTotalCodewords(version);
+ const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel);
+ const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8;
+ if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {
+ buffer.put(0, 4);
+ }
+ while (buffer.getLengthInBits() % 8 !== 0) {
+ buffer.putBit(0);
+ }
+ const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8;
+ for (let i = 0;i < remainingByte; i++) {
+ buffer.put(i % 2 ? 17 : 236, 8);
+ }
+ return createCodewords(buffer, version, errorCorrectionLevel);
+ }
+ function createCodewords(bitBuffer, version, errorCorrectionLevel) {
+ const totalCodewords = Utils.getSymbolTotalCodewords(version);
+ const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel);
+ const dataTotalCodewords = totalCodewords - ecTotalCodewords;
+ const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel);
+ const blocksInGroup2 = totalCodewords % ecTotalBlocks;
+ const blocksInGroup1 = ecTotalBlocks - blocksInGroup2;
+ const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks);
+ const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks);
+ const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1;
+ const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1;
+ const rs = new ReedSolomonEncoder(ecCount);
+ let offset = 0;
+ const dcData = new Array(ecTotalBlocks);
+ const ecData = new Array(ecTotalBlocks);
+ let maxDataSize = 0;
+ const buffer = new Uint8Array(bitBuffer.buffer);
+ for (let b = 0;b < ecTotalBlocks; b++) {
+ const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2;
+ dcData[b] = buffer.slice(offset, offset + dataSize);
+ ecData[b] = rs.encode(dcData[b]);
+ offset += dataSize;
+ maxDataSize = Math.max(maxDataSize, dataSize);
+ }
+ const data = new Uint8Array(totalCodewords);
+ let index = 0;
+ let i, r;
+ for (i = 0;i < maxDataSize; i++) {
+ for (r = 0;r < ecTotalBlocks; r++) {
+ if (i < dcData[r].length) {
+ data[index++] = dcData[r][i];
+ }
+ }
+ }
+ for (i = 0;i < ecCount; i++) {
+ for (r = 0;r < ecTotalBlocks; r++) {
+ data[index++] = ecData[r][i];
+ }
+ }
+ return data;
+ }
+ function createSymbol(data, version, errorCorrectionLevel, maskPattern) {
+ let segments;
+ if (Array.isArray(data)) {
+ segments = Segments.fromArray(data);
+ } else if (typeof data === "string") {
+ let estimatedVersion = version;
+ if (!estimatedVersion) {
+ const rawSegments = Segments.rawSplit(data);
+ estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel);
+ }
+ segments = Segments.fromString(data, estimatedVersion || 40);
+ } else {
+ throw new Error("Invalid data");
+ }
+ const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel);
+ if (!bestVersion) {
+ throw new Error("The amount of data is too big to be stored in a QR Code");
+ }
+ if (!version) {
+ version = bestVersion;
+ } else if (version < bestVersion) {
+ throw new Error(`
+` + `The chosen QR Code version cannot contain this amount of data.
+` + "Minimum version required to store current data is: " + bestVersion + `.
+`);
+ }
+ const dataBits = createData(version, errorCorrectionLevel, segments);
+ const moduleCount = Utils.getSymbolSize(version);
+ const modules = new BitMatrix(moduleCount);
+ setupFinderPattern(modules, version);
+ setupTimingPattern(modules);
+ setupAlignmentPattern(modules, version);
+ setupFormatInfo(modules, errorCorrectionLevel, 0);
+ if (version >= 7) {
+ setupVersionInfo(modules, version);
+ }
+ setupData(modules, dataBits);
+ if (isNaN(maskPattern)) {
+ maskPattern = MaskPattern.getBestMask(modules, setupFormatInfo.bind(null, modules, errorCorrectionLevel));
+ }
+ MaskPattern.applyMask(maskPattern, modules);
+ setupFormatInfo(modules, errorCorrectionLevel, maskPattern);
+ return {
+ modules,
+ version,
+ errorCorrectionLevel,
+ maskPattern,
+ segments
+ };
+ }
+ exports2.create = function create(data, options) {
+ if (typeof data === "undefined" || data === "") {
+ throw new Error("No input text");
+ }
+ let errorCorrectionLevel = ECLevel.M;
+ let version;
+ let mask;
+ if (typeof options !== "undefined") {
+ errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M);
+ version = Version.from(options.version);
+ mask = MaskPattern.from(options.maskPattern);
+ if (options.toSJISFunc) {
+ Utils.setToSJISFunction(options.toSJISFunc);
+ }
+ }
+ return createSymbol(data, version, errorCorrectionLevel, mask);
+ };
+});
+
+// node_modules/qrcode/lib/renderer/utils.js
+var require_utils2 = __commonJS((exports2) => {
+ function hex2rgba(hex) {
+ if (typeof hex === "number") {
+ hex = hex.toString();
+ }
+ if (typeof hex !== "string") {
+ throw new Error("Color should be defined as hex string");
+ }
+ let hexCode = hex.slice().replace("#", "").split("");
+ if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {
+ throw new Error("Invalid hex color: " + hex);
+ }
+ if (hexCode.length === 3 || hexCode.length === 4) {
+ hexCode = Array.prototype.concat.apply([], hexCode.map(function(c) {
+ return [c, c];
+ }));
+ }
+ if (hexCode.length === 6)
+ hexCode.push("F", "F");
+ const hexValue = parseInt(hexCode.join(""), 16);
+ return {
+ r: hexValue >> 24 & 255,
+ g: hexValue >> 16 & 255,
+ b: hexValue >> 8 & 255,
+ a: hexValue & 255,
+ hex: "#" + hexCode.slice(0, 6).join("")
+ };
+ }
+ exports2.getOptions = function getOptions(options) {
+ if (!options)
+ options = {};
+ if (!options.color)
+ options.color = {};
+ const margin = typeof options.margin === "undefined" || options.margin === null || options.margin < 0 ? 4 : options.margin;
+ const width = options.width && options.width >= 21 ? options.width : undefined;
+ const scale = options.scale || 4;
+ return {
+ width,
+ scale: width ? 4 : scale,
+ margin,
+ color: {
+ dark: hex2rgba(options.color.dark || "#000000ff"),
+ light: hex2rgba(options.color.light || "#ffffffff")
+ },
+ type: options.type,
+ rendererOpts: options.rendererOpts || {}
+ };
+ };
+ exports2.getScale = function getScale(qrSize, opts) {
+ return opts.width && opts.width >= qrSize + opts.margin * 2 ? opts.width / (qrSize + opts.margin * 2) : opts.scale;
+ };
+ exports2.getImageWidth = function getImageWidth(qrSize, opts) {
+ const scale = exports2.getScale(qrSize, opts);
+ return Math.floor((qrSize + opts.margin * 2) * scale);
+ };
+ exports2.qrToImageData = function qrToImageData(imgData, qr, opts) {
+ const size = qr.modules.size;
+ const data = qr.modules.data;
+ const scale = exports2.getScale(size, opts);
+ const symbolSize = Math.floor((size + opts.margin * 2) * scale);
+ const scaledMargin = opts.margin * scale;
+ const palette = [opts.color.light, opts.color.dark];
+ for (let i = 0;i < symbolSize; i++) {
+ for (let j = 0;j < symbolSize; j++) {
+ let posDst = (i * symbolSize + j) * 4;
+ let pxColor = opts.color.light;
+ if (i >= scaledMargin && j >= scaledMargin && i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {
+ const iSrc = Math.floor((i - scaledMargin) / scale);
+ const jSrc = Math.floor((j - scaledMargin) / scale);
+ pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0];
+ }
+ imgData[posDst++] = pxColor.r;
+ imgData[posDst++] = pxColor.g;
+ imgData[posDst++] = pxColor.b;
+ imgData[posDst] = pxColor.a;
+ }
+ }
+ };
+});
+
+// node_modules/qrcode/lib/renderer/canvas.js
+var require_canvas = __commonJS((exports2) => {
+ var Utils = require_utils2();
+ function clearCanvas(ctx, canvas, size) {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ if (!canvas.style)
+ canvas.style = {};
+ canvas.height = size;
+ canvas.width = size;
+ canvas.style.height = size + "px";
+ canvas.style.width = size + "px";
+ }
+ function getCanvasElement() {
+ try {
+ return document.createElement("canvas");
+ } catch (e) {
+ throw new Error("You need to specify a canvas element");
+ }
+ }
+ exports2.render = function render(qrData, canvas, options) {
+ let opts = options;
+ let canvasEl = canvas;
+ if (typeof opts === "undefined" && (!canvas || !canvas.getContext)) {
+ opts = canvas;
+ canvas = undefined;
+ }
+ if (!canvas) {
+ canvasEl = getCanvasElement();
+ }
+ opts = Utils.getOptions(opts);
+ const size = Utils.getImageWidth(qrData.modules.size, opts);
+ const ctx = canvasEl.getContext("2d");
+ const image = ctx.createImageData(size, size);
+ Utils.qrToImageData(image.data, qrData, opts);
+ clearCanvas(ctx, canvasEl, size);
+ ctx.putImageData(image, 0, 0);
+ return canvasEl;
+ };
+ exports2.renderToDataURL = function renderToDataURL(qrData, canvas, options) {
+ let opts = options;
+ if (typeof opts === "undefined" && (!canvas || !canvas.getContext)) {
+ opts = canvas;
+ canvas = undefined;
+ }
+ if (!opts)
+ opts = {};
+ const canvasEl = exports2.render(qrData, canvas, opts);
+ const type = opts.type || "image/png";
+ const rendererOpts = opts.rendererOpts || {};
+ return canvasEl.toDataURL(type, rendererOpts.quality);
+ };
+});
+
+// node_modules/qrcode/lib/renderer/svg-tag.js
+var require_svg_tag = __commonJS((exports2) => {
+ var Utils = require_utils2();
+ function getColorAttrib(color, attrib) {
+ const alpha = color.a / 255;
+ const str = attrib + '="' + color.hex + '"';
+ return alpha < 1 ? str + " " + attrib + '-opacity="' + alpha.toFixed(2).slice(1) + '"' : str;
+ }
+ function svgCmd(cmd, x, y) {
+ let str = cmd + x;
+ if (typeof y !== "undefined")
+ str += " " + y;
+ return str;
+ }
+ function qrToPath(data, size, margin) {
+ let path = "";
+ let moveBy = 0;
+ let newRow = false;
+ let lineLength = 0;
+ for (let i = 0;i < data.length; i++) {
+ const col = Math.floor(i % size);
+ const row = Math.floor(i / size);
+ if (!col && !newRow)
+ newRow = true;
+ if (data[i]) {
+ lineLength++;
+ if (!(i > 0 && col > 0 && data[i - 1])) {
+ path += newRow ? svgCmd("M", col + margin, 0.5 + row + margin) : svgCmd("m", moveBy, 0);
+ moveBy = 0;
+ newRow = false;
+ }
+ if (!(col + 1 < size && data[i + 1])) {
+ path += svgCmd("h", lineLength);
+ lineLength = 0;
+ }
+ } else {
+ moveBy++;
+ }
+ }
+ return path;
+ }
+ exports2.render = function render(qrData, options, cb) {
+ const opts = Utils.getOptions(options);
+ const size = qrData.modules.size;
+ const data = qrData.modules.data;
+ const qrcodesize = size + opts.margin * 2;
+ const bg = !opts.color.light.a ? "" : "';
+ const path = "';
+ const viewBox = 'viewBox="' + "0 0 " + qrcodesize + " " + qrcodesize + '"';
+ const width = !opts.width ? "" : 'width="' + opts.width + '" height="' + opts.width + '" ';
+ const svgTag = '
+`;
+ if (typeof cb === "function") {
+ cb(null, svgTag);
+ }
+ return svgTag;
+ };
+});
+
+// node_modules/qrcode/lib/browser.js
+var require_browser = __commonJS((exports2) => {
+ var canPromise = require_can_promise();
+ var QRCode = require_qrcode();
+ var CanvasRenderer = require_canvas();
+ var SvgRenderer = require_svg_tag();
+ function renderCanvas(renderFunc, canvas, text, opts, cb) {
+ const args = [].slice.call(arguments, 1);
+ const argsNum = args.length;
+ const isLastArgCb = typeof args[argsNum - 1] === "function";
+ if (!isLastArgCb && !canPromise()) {
+ throw new Error("Callback required as last argument");
+ }
+ if (isLastArgCb) {
+ if (argsNum < 2) {
+ throw new Error("Too few arguments provided");
+ }
+ if (argsNum === 2) {
+ cb = text;
+ text = canvas;
+ canvas = opts = undefined;
+ } else if (argsNum === 3) {
+ if (canvas.getContext && typeof cb === "undefined") {
+ cb = opts;
+ opts = undefined;
+ } else {
+ cb = opts;
+ opts = text;
+ text = canvas;
+ canvas = undefined;
+ }
+ }
+ } else {
+ if (argsNum < 1) {
+ throw new Error("Too few arguments provided");
+ }
+ if (argsNum === 1) {
+ text = canvas;
+ canvas = opts = undefined;
+ } else if (argsNum === 2 && !canvas.getContext) {
+ opts = text;
+ text = canvas;
+ canvas = undefined;
+ }
+ return new Promise(function(resolve, reject) {
+ try {
+ const data = QRCode.create(text, opts);
+ resolve(renderFunc(data, canvas, opts));
+ } catch (e) {
+ reject(e);
+ }
+ });
+ }
+ try {
+ const data = QRCode.create(text, opts);
+ cb(null, renderFunc(data, canvas, opts));
+ } catch (e) {
+ cb(e);
+ }
+ }
+ exports2.create = QRCode.create;
+ exports2.toCanvas = renderCanvas.bind(null, CanvasRenderer.render);
+ exports2.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL);
+ exports2.toString = renderCanvas.bind(null, function(data, _, opts) {
+ return SvgRenderer.render(data, opts);
+ });
+});
+
+// scripts/qrcode-entry.cjs
+module.exports = require_browser();
diff --git a/uds-auth/package-lock.json b/uds-auth/package-lock.json
index 4516ca46..9fbcec30 100644
--- a/uds-auth/package-lock.json
+++ b/uds-auth/package-lock.json
@@ -1,14 +1,14 @@
{
"name": "uds-auth",
- "version": "0.2.0",
+ "version": "0.2.20",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "uds-auth",
- "version": "0.2.0",
+ "version": "0.2.20",
"license": "MIT",
- "dependencies": {
+ "devDependencies": {
"qrcode": "1.5.4"
},
"engines": {
@@ -27,6 +27,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -36,6 +37,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -51,6 +53,7 @@
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -60,6 +63,7 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
@@ -71,6 +75,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -83,12 +88,14 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -98,18 +105,21 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
@@ -123,6 +133,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
@@ -132,6 +143,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -141,6 +153,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
@@ -153,6 +166,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
@@ -168,6 +182,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
@@ -180,6 +195,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -189,6 +205,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -198,6 +215,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
"integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10.13.0"
@@ -207,6 +225,7 @@
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz",
"integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"dijkstrajs": "^1.0.1",
@@ -224,6 +243,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -233,18 +253,21 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true,
"license": "ISC"
},
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true,
"license": "ISC"
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -259,6 +282,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -271,12 +295,14 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -291,12 +317,14 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^6.0.0",
@@ -319,6 +347,7 @@
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"camelcase": "^5.0.0",
diff --git a/uds-auth/package.json b/uds-auth/package.json
index 1d3f53a7..b593b044 100644
--- a/uds-auth/package.json
+++ b/uds-auth/package.json
@@ -1,6 +1,6 @@
{
"name": "uds-auth",
- "version": "0.2.19",
+ "version": "0.2.20",
"description": "UDS authentication plugin for DeepSeek Harness with multi-tenant session isolation",
"type": "module",
"main": "lib/index.js",
@@ -17,6 +17,8 @@
"./package.json": "./package.json"
},
"scripts": {
+ "bundle:qrcode": "bun run scripts/bundle-qrcode.mjs",
+ "prepack": "bun run scripts/bundle-qrcode.mjs",
"test": "node --test test/**/*.test.js"
},
"keywords": [
@@ -45,7 +47,8 @@
"engines": {
"node": ">=18.0.0"
},
- "dependencies": {
+ "dependencies": {},
+ "devDependencies": {
"qrcode": "1.5.4"
},
"peerDependencies": {
diff --git a/uds-auth/scripts/bundle-qrcode.mjs b/uds-auth/scripts/bundle-qrcode.mjs
new file mode 100644
index 00000000..586baf71
--- /dev/null
+++ b/uds-auth/scripts/bundle-qrcode.mjs
@@ -0,0 +1,35 @@
+/**
+ * Bundle `qrcode` (SVG path) into lib/qrcode-bundled.cjs so Desktop tgz
+ * installs need no npm registry fetch for dependencies.
+ *
+ * Usage: bun run scripts/bundle-qrcode.mjs
+ */
+import { mkdirSync, writeFileSync } from 'node:fs'
+import { dirname, join } from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const root = join(dirname(fileURLToPath(import.meta.url)), '..')
+const entry = join(root, 'scripts', 'qrcode-entry.cjs')
+const out = join(root, 'lib', 'qrcode-bundled.cjs')
+
+mkdirSync(dirname(out), { recursive: true })
+
+const result = await Bun.build({
+ entrypoints: [entry],
+ outfile: out,
+ target: 'node',
+ format: 'cjs',
+ sourcemap: 'none',
+ minify: false,
+})
+
+if (!result.success) {
+ console.error(result.logs)
+ throw new Error('bundle qrcode failed')
+}
+
+// Bun may write via outfile; also ensure content if outputs differ.
+if (result.outputs[0]) {
+ writeFileSync(out, await result.outputs[0].text(), 'utf8')
+}
+console.log(`wrote ${out}`)
diff --git a/uds-auth/scripts/qrcode-entry.cjs b/uds-auth/scripts/qrcode-entry.cjs
new file mode 100644
index 00000000..bbacfad7
--- /dev/null
+++ b/uds-auth/scripts/qrcode-entry.cjs
@@ -0,0 +1,2 @@
+/** Entry for offline bundling — SVG `toString` only (no pngjs/yargs). */
+module.exports = require('qrcode/lib/browser.js')