qreator 9.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +92 -0
- package/lib/browser/encode.d.ts +2 -0
- package/lib/browser/errorcode.d.ts +1 -0
- package/lib/browser/matrix.d.ts +9 -0
- package/lib/browser/pdf.d.ts +2 -0
- package/lib/browser/pdf.umd.js +26816 -0
- package/lib/browser/pdf.umd.js.map +1 -0
- package/lib/browser/png.d.ts +6 -0
- package/lib/browser/png.umd.js +1540 -0
- package/lib/browser/png.umd.js.map +1 -0
- package/lib/browser/png_browser.d.ts +5 -0
- package/lib/browser/qr-base.d.ts +4 -0
- package/lib/browser/qr.d.ts +2 -0
- package/lib/browser/svg.d.ts +7 -0
- package/lib/browser/svg.umd.js +1536 -0
- package/lib/browser/svg.umd.js.map +1 -0
- package/lib/browser/tests/_common.d.ts +4 -0
- package/lib/browser/tests/browser.test.d.ts +1 -0
- package/lib/browser/tests/test.d.ts +1 -0
- package/lib/browser/typing/types.d.ts +28 -0
- package/lib/browser/utils.d.ts +17 -0
- package/lib/encode.d.ts +2 -0
- package/lib/encode.js +137 -0
- package/lib/encode.js.map +1 -0
- package/lib/errorcode.d.ts +1 -0
- package/lib/errorcode.js +62 -0
- package/lib/errorcode.js.map +1 -0
- package/lib/matrix.d.ts +9 -0
- package/lib/matrix.js +347 -0
- package/lib/matrix.js.map +1 -0
- package/lib/pdf.d.ts +2 -0
- package/lib/pdf.js +64 -0
- package/lib/pdf.js.map +1 -0
- package/lib/png.d.ts +6 -0
- package/lib/png.js +30 -0
- package/lib/png.js.map +1 -0
- package/lib/png_browser.d.ts +5 -0
- package/lib/png_browser.js +53 -0
- package/lib/png_browser.js.map +1 -0
- package/lib/qr-base.d.ts +4 -0
- package/lib/qr-base.js +151 -0
- package/lib/qr-base.js.map +1 -0
- package/lib/qr.d.ts +2 -0
- package/lib/qr.js +2 -0
- package/lib/qr.js.map +1 -0
- package/lib/svg.d.ts +7 -0
- package/lib/svg.js +49 -0
- package/lib/svg.js.map +1 -0
- package/lib/tests/_common.d.ts +4 -0
- package/lib/tests/_common.js +36 -0
- package/lib/tests/_common.js.map +1 -0
- package/lib/tests/browser.test.d.ts +1 -0
- package/lib/tests/browser.test.js +193 -0
- package/lib/tests/browser.test.js.map +1 -0
- package/lib/tests/test.d.ts +1 -0
- package/lib/tests/test.js +238 -0
- package/lib/tests/test.js.map +1 -0
- package/lib/typing/types.d.ts +28 -0
- package/lib/typing/types.js +2 -0
- package/lib/typing/types.js.map +1 -0
- package/lib/utils.d.ts +17 -0
- package/lib/utils.js +68 -0
- package/lib/utils.js.map +1 -0
- package/package.json +105 -0
- package/src/encode.ts +176 -0
- package/src/errorcode.ts +75 -0
- package/src/matrix.ts +393 -0
- package/src/pdf.ts +80 -0
- package/src/png.ts +42 -0
- package/src/png_browser.ts +73 -0
- package/src/qr-base.ts +180 -0
- package/src/qr.ts +2 -0
- package/src/svg.ts +89 -0
- package/src/tests/_common.ts +40 -0
- package/src/tests/browser.test.ts +209 -0
- package/src/tests/test.ts +250 -0
- package/src/typing/index.d.ts +5 -0
- package/src/typing/types.ts +99 -0
- package/src/utils.ts +86 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import test from "ava";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { getPNG } from "../png.js";
|
|
4
|
+
import { getSVG } from "../svg.js";
|
|
5
|
+
import { getPDF } from "../pdf.js";
|
|
6
|
+
import { assertEqual, generatedImageDir, goldenDir } from "./_common.js";
|
|
7
|
+
const text = "I \u2764\uFE0F QR code!";
|
|
8
|
+
const defaultParams = {
|
|
9
|
+
ec_level: "Q",
|
|
10
|
+
margin: 1,
|
|
11
|
+
parse_url: true,
|
|
12
|
+
};
|
|
13
|
+
[
|
|
14
|
+
{
|
|
15
|
+
name: "PNG",
|
|
16
|
+
fn: getPNG,
|
|
17
|
+
filename: "qr.png",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "PNG with empty options",
|
|
21
|
+
fn: getPNG,
|
|
22
|
+
filename: "qr_with_empty_options.png",
|
|
23
|
+
options: {},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "PNG with undefined size",
|
|
27
|
+
fn: getPNG,
|
|
28
|
+
filename: "qr_with_undefined_size.png",
|
|
29
|
+
options: {
|
|
30
|
+
size: undefined,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "PNG with size",
|
|
35
|
+
fn: getPNG,
|
|
36
|
+
filename: "qr_with_size.png",
|
|
37
|
+
params: {
|
|
38
|
+
size: 9,
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "PNG with margin",
|
|
43
|
+
fn: getPNG,
|
|
44
|
+
filename: "qr_with_margin.png",
|
|
45
|
+
params: {
|
|
46
|
+
size: 9,
|
|
47
|
+
margin: 3,
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "PNG with border radius",
|
|
52
|
+
fn: getPNG,
|
|
53
|
+
filename: "qr_with_border_radius.png",
|
|
54
|
+
params: {
|
|
55
|
+
borderRadius: 1,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "PNG with colors",
|
|
60
|
+
fn: getPNG,
|
|
61
|
+
filename: "qr_with_colors.png",
|
|
62
|
+
params: {
|
|
63
|
+
color: 0x0000a0ff,
|
|
64
|
+
bgColor: 0xffa0ffff,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "PNG with colors (hex)",
|
|
69
|
+
fn: getPNG,
|
|
70
|
+
filename: "qr_with_colors.png",
|
|
71
|
+
params: {
|
|
72
|
+
color: '#0000a0',
|
|
73
|
+
bgColor: '#ffa0ff',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: "PNG with colors (rgba)",
|
|
78
|
+
fn: getPNG,
|
|
79
|
+
filename: "qr_with_colors_rgba.png",
|
|
80
|
+
params: {
|
|
81
|
+
color: 'rgba(255, 0, 0, 0.5)',
|
|
82
|
+
bgColor: 'rgba(255, 255, 255, 0.1)',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "PNG with logo",
|
|
87
|
+
fn: getPNG,
|
|
88
|
+
filename: "qr_with_logo.png",
|
|
89
|
+
params: { logo: await readFile(`${goldenDir}/logo.png`) },
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "PNG with logo (JPG)",
|
|
93
|
+
fn: getPNG,
|
|
94
|
+
filename: "qr_with_logo_jpg.png",
|
|
95
|
+
params: { logo: await readFile(`${goldenDir}/logo.jpg`) },
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "PNG with logo (arraybuffer)",
|
|
99
|
+
fn: getPNG,
|
|
100
|
+
filename: "qr_with_logo.png",
|
|
101
|
+
params: { logo: (await readFile(`${goldenDir}/logo.png`)).buffer },
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "SVG",
|
|
105
|
+
fn: getSVG,
|
|
106
|
+
filename: "qr.svg",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "SVG with border radius",
|
|
110
|
+
fn: getSVG,
|
|
111
|
+
filename: "qr_with_border_radius.svg",
|
|
112
|
+
params: {
|
|
113
|
+
borderRadius: 4,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: "SVG with EC level",
|
|
118
|
+
fn: getSVG,
|
|
119
|
+
filename: "qr_with_ec_level.svg",
|
|
120
|
+
params: {
|
|
121
|
+
ec_level: "H",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "SVG with size",
|
|
126
|
+
fn: getSVG,
|
|
127
|
+
filename: "qr_with_size.svg",
|
|
128
|
+
params: {
|
|
129
|
+
size: 6,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "SVG with colors (hex)",
|
|
134
|
+
fn: getSVG,
|
|
135
|
+
filename: "qr_with_colors_hex.svg",
|
|
136
|
+
params: {
|
|
137
|
+
color: '#ff0000',
|
|
138
|
+
bgColor: '#00ff00',
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "SVG with colors (rgba)",
|
|
143
|
+
fn: getSVG,
|
|
144
|
+
filename: "qr_with_colors_rgba.svg",
|
|
145
|
+
params: {
|
|
146
|
+
color: 'rgba(255, 0, 0, 0.5)',
|
|
147
|
+
bgColor: 'rgba(0, 255, 0, 0.2)',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: "SVG with colors",
|
|
152
|
+
fn: getSVG,
|
|
153
|
+
filename: "qr_with_colors.svg",
|
|
154
|
+
params: {
|
|
155
|
+
color: 0xff0000ff,
|
|
156
|
+
bgColor: 0x00ff00ff,
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: "SVG with logo as buffer",
|
|
161
|
+
fn: getSVG,
|
|
162
|
+
filename: "qr_with_logo.svg",
|
|
163
|
+
params: { logo: await readFile(`${goldenDir}/logo.png`) },
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: "SVG with logo as arraybuffer (PNG)",
|
|
167
|
+
fn: getSVG,
|
|
168
|
+
filename: "qr_with_logo_as_arraybuffer.svg",
|
|
169
|
+
params: {
|
|
170
|
+
logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: "SVG with logo as arraybuffer (JPG)",
|
|
175
|
+
fn: getSVG,
|
|
176
|
+
filename: "qr_with_logo_as_arraybuffer_jpg.svg",
|
|
177
|
+
params: {
|
|
178
|
+
logo: (await readFile(`${goldenDir}/logo.jpg`)).buffer,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: "PDF",
|
|
183
|
+
fn: getPDF,
|
|
184
|
+
filename: "qr.pdf",
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: "PDF with border radius",
|
|
188
|
+
fn: getPDF,
|
|
189
|
+
filename: "qr_with_border_radius.pdf",
|
|
190
|
+
params: {
|
|
191
|
+
borderRadius: 4,
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "PDF with colors",
|
|
196
|
+
fn: getPDF,
|
|
197
|
+
filename: "qr_with_colors.pdf",
|
|
198
|
+
params: { color: 0xff0000ff, bgColor: 0x00ff00ff },
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
name: "PDF with colors (hex)",
|
|
202
|
+
fn: getPDF,
|
|
203
|
+
filename: "qr_with_colors.pdf",
|
|
204
|
+
params: { color: '#ff0000', bgColor: '#00ff00' },
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: "PDF with arraybuffer",
|
|
208
|
+
fn: getPDF,
|
|
209
|
+
filename: "qr_logo_arraybuffer.pdf",
|
|
210
|
+
params: {
|
|
211
|
+
logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "PDF with arraybuffer (JPG)",
|
|
216
|
+
fn: getPDF,
|
|
217
|
+
filename: "qr_logo_arraybuffer_jpg.pdf",
|
|
218
|
+
params: {
|
|
219
|
+
logo: (await readFile(`${goldenDir}/logo.jpg`)).buffer,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: "PDF with logo",
|
|
224
|
+
fn: getPDF,
|
|
225
|
+
filename: "qr_with_logo.pdf",
|
|
226
|
+
params: { logo: await readFile(`${goldenDir}/logo.png`) },
|
|
227
|
+
},
|
|
228
|
+
].forEach((testData) => {
|
|
229
|
+
test.serial(testData.name, async (t) => {
|
|
230
|
+
const image = await testData.fn(text, {
|
|
231
|
+
...defaultParams,
|
|
232
|
+
...testData.params,
|
|
233
|
+
});
|
|
234
|
+
await writeFile(`${generatedImageDir}/${testData.filename}`, image);
|
|
235
|
+
await assertEqual(t, testData.filename);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/tests/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export type Matrix = number[][];
|
|
3
|
+
export interface Data {
|
|
4
|
+
blocks: number[][];
|
|
5
|
+
ec: number[][];
|
|
6
|
+
ec_len: number;
|
|
7
|
+
ec_level: EcLevel;
|
|
8
|
+
version: number;
|
|
9
|
+
data_len: number;
|
|
10
|
+
}
|
|
11
|
+
export interface NumberData {
|
|
12
|
+
[key: string]: number[];
|
|
13
|
+
}
|
|
14
|
+
export type EcLevel = "L" | "M" | "Q" | "H";
|
|
15
|
+
export type ImageType = "png" | "svg" | "pdf";
|
|
16
|
+
export interface ImageOptions {
|
|
17
|
+
ec_level?: EcLevel;
|
|
18
|
+
type?: ImageType;
|
|
19
|
+
size?: number;
|
|
20
|
+
margin?: number;
|
|
21
|
+
parse_url?: boolean;
|
|
22
|
+
logo?: ArrayBufferLike | Buffer;
|
|
23
|
+
logoWidth?: number;
|
|
24
|
+
logoHeight?: number;
|
|
25
|
+
color?: number | string;
|
|
26
|
+
bgColor?: number | string;
|
|
27
|
+
borderRadius?: number;
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/typing/types.ts"],"names":[],"mappings":""}
|
package/lib/utils.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ImageOptions, ImageType, Matrix } from "./typing/types";
|
|
3
|
+
export declare function getOptions(inOptions: ImageOptions): {
|
|
4
|
+
ec_level?: import("./typing/types").EcLevel;
|
|
5
|
+
type?: ImageType;
|
|
6
|
+
size?: number;
|
|
7
|
+
margin?: number;
|
|
8
|
+
parse_url?: boolean;
|
|
9
|
+
logo?: ArrayBufferLike | Buffer;
|
|
10
|
+
logoWidth?: number;
|
|
11
|
+
logoHeight?: number;
|
|
12
|
+
color?: string | number;
|
|
13
|
+
bgColor?: string | number;
|
|
14
|
+
borderRadius?: number;
|
|
15
|
+
};
|
|
16
|
+
export declare function colorToHex(color: number | string): string;
|
|
17
|
+
export declare function getSVGPath(matrix: Matrix, size: number, margin?: number, borderRadius?: number): string;
|
package/lib/utils.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import colorString from "color-string";
|
|
2
|
+
export function getOptions(inOptions) {
|
|
3
|
+
const type = inOptions?.type ?? "png";
|
|
4
|
+
const defaults = type === "png" ? BITMAP_OPTIONS : VECTOR_OPTIONS;
|
|
5
|
+
return { ...defaults, ...inOptions };
|
|
6
|
+
}
|
|
7
|
+
export function colorToHex(color) {
|
|
8
|
+
if (typeof color === "string") {
|
|
9
|
+
return colorString.to.hex(colorString.get.rgb(color));
|
|
10
|
+
}
|
|
11
|
+
return `#${(color >>> 8).toString(16).padStart(6, "0")}`;
|
|
12
|
+
}
|
|
13
|
+
export function getSVGPath(matrix, size, margin = 0, borderRadius = 0) {
|
|
14
|
+
let rectangles = [];
|
|
15
|
+
for (let x = 0; x < matrix.length; x++) {
|
|
16
|
+
const column = matrix[x];
|
|
17
|
+
for (let y = 0; y < column.length; y++) {
|
|
18
|
+
if (column[y]) {
|
|
19
|
+
const leftX = x * size + margin;
|
|
20
|
+
const rightX = (x + 1) * size + margin;
|
|
21
|
+
const topY = y * size + margin;
|
|
22
|
+
const bottomY = (y + 1) * size + margin;
|
|
23
|
+
const rectangle = [];
|
|
24
|
+
rectangle.push(`M ${leftX} ${topY + borderRadius}`);
|
|
25
|
+
rectangle.push(`L ${leftX} ${bottomY - borderRadius}`);
|
|
26
|
+
if (borderRadius > 0) {
|
|
27
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX + borderRadius} ${bottomY} `);
|
|
28
|
+
}
|
|
29
|
+
rectangle.push(`L ${rightX - borderRadius} ${bottomY}`);
|
|
30
|
+
if (borderRadius > 0) {
|
|
31
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX} ${bottomY - borderRadius}`);
|
|
32
|
+
}
|
|
33
|
+
rectangle.push(`L ${rightX} ${topY + borderRadius}`);
|
|
34
|
+
if (borderRadius > 0) {
|
|
35
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX - borderRadius} ${topY}`);
|
|
36
|
+
}
|
|
37
|
+
rectangle.push(`L ${leftX + borderRadius} ${topY}`);
|
|
38
|
+
if (borderRadius > 0) {
|
|
39
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX} ${topY + borderRadius}`);
|
|
40
|
+
}
|
|
41
|
+
rectangle.push(`z`);
|
|
42
|
+
rectangles.push(rectangle.join(" "));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return rectangles.join(" ");
|
|
47
|
+
}
|
|
48
|
+
const commonOptions = {
|
|
49
|
+
type: "png",
|
|
50
|
+
parse_url: false,
|
|
51
|
+
ec_level: "M",
|
|
52
|
+
logo: undefined,
|
|
53
|
+
logoWidth: 20,
|
|
54
|
+
logoHeight: 20,
|
|
55
|
+
bgColor: 0xffffffff,
|
|
56
|
+
color: 0x000000ff,
|
|
57
|
+
};
|
|
58
|
+
const BITMAP_OPTIONS = {
|
|
59
|
+
...commonOptions,
|
|
60
|
+
margin: 1,
|
|
61
|
+
size: 5,
|
|
62
|
+
};
|
|
63
|
+
const VECTOR_OPTIONS = {
|
|
64
|
+
...commonOptions,
|
|
65
|
+
margin: 1,
|
|
66
|
+
size: 0,
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "qreator",
|
|
3
|
+
"version": "9.0.6",
|
|
4
|
+
"description": "QR Code generator for browser and node.js with tree shaking and logo support",
|
|
5
|
+
"homepage": "https://github.com/Short-io/qr-image",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"qrcode",
|
|
8
|
+
"qr code",
|
|
9
|
+
"qr",
|
|
10
|
+
"png",
|
|
11
|
+
"svg",
|
|
12
|
+
"pdf",
|
|
13
|
+
"image"
|
|
14
|
+
],
|
|
15
|
+
"author": {
|
|
16
|
+
"name": "Andrii Kostenko",
|
|
17
|
+
"url": "http://git.io/gugu"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/Short-io/qreator.git"
|
|
23
|
+
},
|
|
24
|
+
"bugs": "https://github.com/Short-io/qreator/issues",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"main": "lib/qr.js",
|
|
27
|
+
"exports": {
|
|
28
|
+
"./lib/png": {
|
|
29
|
+
"node": "./lib/png.js",
|
|
30
|
+
"types": "./lib/png.d.ts",
|
|
31
|
+
"default": "./lib/png_browser.js"
|
|
32
|
+
},
|
|
33
|
+
"./lib/svg": {
|
|
34
|
+
"types": "./lib/svg.d.ts",
|
|
35
|
+
"default": "./lib/svg.js"
|
|
36
|
+
},
|
|
37
|
+
"./lib/pdf": {
|
|
38
|
+
"types": "./lib/pdf.d.ts",
|
|
39
|
+
"default": "./lib/pdf.js"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"test": "ava",
|
|
44
|
+
"prepare": "tsc && rollup -c",
|
|
45
|
+
"release": "release-it"
|
|
46
|
+
},
|
|
47
|
+
"size-limit": [
|
|
48
|
+
{
|
|
49
|
+
"path": "lib/qr.js"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"files": [
|
|
53
|
+
"lib",
|
|
54
|
+
"src",
|
|
55
|
+
"LICENSE"
|
|
56
|
+
],
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@ava/typescript": "^4.1.0",
|
|
59
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
60
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
61
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
62
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
63
|
+
"@size-limit/preset-small-lib": "^11.0.2",
|
|
64
|
+
"@types/color-string": "^1.5.5",
|
|
65
|
+
"@types/diff": "^5.0.9",
|
|
66
|
+
"@types/jsdom": "^21.1.6",
|
|
67
|
+
"@types/pixelmatch": "^5.2.6",
|
|
68
|
+
"@types/sharp": "^0.31.1",
|
|
69
|
+
"@types/svg-path-parser": "^1.1.6",
|
|
70
|
+
"ava": "^6.1.1",
|
|
71
|
+
"benchmark": "^2.1.4",
|
|
72
|
+
"chalk": "^5.3.0",
|
|
73
|
+
"diff": "^5.2.0",
|
|
74
|
+
"eslint": "^8.56.0",
|
|
75
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
76
|
+
"eslint-plugin-import": "^2.29.1",
|
|
77
|
+
"jsdom": "^24.0.0",
|
|
78
|
+
"looks-same": "^9.0.0",
|
|
79
|
+
"microtime": "^3.1.1",
|
|
80
|
+
"path2d-polyfill": "^2.0.1",
|
|
81
|
+
"pixelmatch": "^5.3.0",
|
|
82
|
+
"release-it": "^17.0.3",
|
|
83
|
+
"rollup": "^4.10.0",
|
|
84
|
+
"size-limit": "^11.0.2",
|
|
85
|
+
"svg-path-parser": "^1.1.0",
|
|
86
|
+
"typescript": "^5.3.3",
|
|
87
|
+
"xml-formatter": "^3.6.2",
|
|
88
|
+
"canvas": "npm:@napi-rs/canvas@^0.1.51"
|
|
89
|
+
},
|
|
90
|
+
"dependencies": {
|
|
91
|
+
"color-string": "^1.9.1",
|
|
92
|
+
"js-base64": "^3.7.6",
|
|
93
|
+
"pdf-lib": "^1.17.1",
|
|
94
|
+
"sharp": "^0.33.2"
|
|
95
|
+
},
|
|
96
|
+
"overrides": {
|
|
97
|
+
"jsdom": {
|
|
98
|
+
"canvas": "^0.1.50"
|
|
99
|
+
},
|
|
100
|
+
"sharp": "$sharp"
|
|
101
|
+
},
|
|
102
|
+
"engines": {
|
|
103
|
+
"node": ">=18"
|
|
104
|
+
}
|
|
105
|
+
}
|
package/src/encode.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { NumberData } from "./typing/types";
|
|
2
|
+
const enc = new TextEncoder();
|
|
3
|
+
const dec = new TextDecoder();
|
|
4
|
+
// {{{1 Choose encode mode and generates struct with data for different version
|
|
5
|
+
export function encode(inData: string | number | ArrayBuffer, parse_url: boolean) {
|
|
6
|
+
let str: string;
|
|
7
|
+
let data: ArrayBufferLike;
|
|
8
|
+
if (typeof inData === "string" || typeof inData === "number") {
|
|
9
|
+
str = `${inData}`;
|
|
10
|
+
data = enc.encode(str);
|
|
11
|
+
} else if (typeof Buffer !== "undefined" && Buffer.isBuffer(data)) {
|
|
12
|
+
str = inData.toString();
|
|
13
|
+
} else if (Array.isArray(inData)) {
|
|
14
|
+
data = new Uint8Array(inData);
|
|
15
|
+
str = dec.decode(inData);
|
|
16
|
+
} else {
|
|
17
|
+
throw new Error("Bad data: " + typeof inData);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (/^[0-9]+$/.test(str)) {
|
|
21
|
+
if (data.byteLength > 7089) {
|
|
22
|
+
throw new Error("Too much data");
|
|
23
|
+
}
|
|
24
|
+
return encode_numeric(str);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (/^[0-9A-Z \$%\*\+\.\/\:\-]+$/.test(str)) {
|
|
28
|
+
if (data.byteLength > 4296) {
|
|
29
|
+
throw new Error("Too much data");
|
|
30
|
+
}
|
|
31
|
+
return encode_alphanum(str);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (parse_url && /^https?:/i.test(str)) {
|
|
35
|
+
return encode_url(str);
|
|
36
|
+
}
|
|
37
|
+
if (data.byteLength > 2953) {
|
|
38
|
+
throw new Error("Too much data");
|
|
39
|
+
}
|
|
40
|
+
return encode_8bit(new Uint8Array(data));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* eslint-disable no-bitwise */
|
|
44
|
+
function pushBits(arr: number[], n: number, value: number) {
|
|
45
|
+
for (let bit = 1 << (n - 1); bit; bit >>>= 1) {
|
|
46
|
+
arr.push(bit & value ? 1 : 0);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// {{{1 8bit encode
|
|
51
|
+
function encode_8bit(data: Uint8Array): NumberData {
|
|
52
|
+
const len = data.byteLength;
|
|
53
|
+
const bits: number[] = [];
|
|
54
|
+
|
|
55
|
+
for (let i = 0; i < len; i++) {
|
|
56
|
+
pushBits(bits, 8, data[i]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const res: {
|
|
60
|
+
data1?: number[];
|
|
61
|
+
data10?: number[];
|
|
62
|
+
data27?: number[];
|
|
63
|
+
} = {};
|
|
64
|
+
|
|
65
|
+
let d = [0, 1, 0, 0];
|
|
66
|
+
pushBits(d, 16, len);
|
|
67
|
+
res.data10 = res.data27 = d.concat(bits);
|
|
68
|
+
|
|
69
|
+
if (len < 256) {
|
|
70
|
+
let d = [0, 1, 0, 0];
|
|
71
|
+
pushBits(d, 8, len);
|
|
72
|
+
res.data1 = d.concat(bits);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return res;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// {{{1 alphanumeric encode
|
|
79
|
+
const ALPHANUM = (function (s: string) {
|
|
80
|
+
const res: { [key: string]: number } = {};
|
|
81
|
+
for (let i = 0; i < s.length; i++) {
|
|
82
|
+
res[s[i]] = i;
|
|
83
|
+
}
|
|
84
|
+
return res;
|
|
85
|
+
})("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:");
|
|
86
|
+
|
|
87
|
+
function encode_alphanum(str: string) {
|
|
88
|
+
const len = str.length;
|
|
89
|
+
const bits: number[] = [];
|
|
90
|
+
|
|
91
|
+
for (let i = 0; i < len; i += 2) {
|
|
92
|
+
let b = 6;
|
|
93
|
+
let n = ALPHANUM[str[i]];
|
|
94
|
+
if (str[i + 1]) {
|
|
95
|
+
b = 11;
|
|
96
|
+
n = n * 45 + ALPHANUM[str[i + 1]];
|
|
97
|
+
}
|
|
98
|
+
pushBits(bits, b, n);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const res: NumberData = {};
|
|
102
|
+
|
|
103
|
+
let d = [0, 0, 1, 0];
|
|
104
|
+
pushBits(d, 13, len);
|
|
105
|
+
res.data27 = d.concat(bits);
|
|
106
|
+
|
|
107
|
+
if (len < 2048) {
|
|
108
|
+
let d = [0, 0, 1, 0];
|
|
109
|
+
pushBits(d, 11, len);
|
|
110
|
+
res.data10 = d.concat(bits);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (len < 512) {
|
|
114
|
+
let d = [0, 0, 1, 0];
|
|
115
|
+
pushBits(d, 9, len);
|
|
116
|
+
res.data1 = d.concat(bits);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return res;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// {{{1 numeric encode
|
|
123
|
+
function encode_numeric(str: string) {
|
|
124
|
+
const len = str.length;
|
|
125
|
+
const bits: number[] = [];
|
|
126
|
+
|
|
127
|
+
for (let i = 0; i < len; i += 3) {
|
|
128
|
+
const s = str.substr(i, 3);
|
|
129
|
+
const b = Math.ceil((s.length * 10) / 3);
|
|
130
|
+
pushBits(bits, b, parseInt(s, 10));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const res: NumberData = {};
|
|
134
|
+
|
|
135
|
+
let d = [0, 0, 0, 1];
|
|
136
|
+
pushBits(d, 14, len);
|
|
137
|
+
res.data27 = d.concat(bits);
|
|
138
|
+
|
|
139
|
+
if (len < 4096) {
|
|
140
|
+
let d = [0, 0, 0, 1];
|
|
141
|
+
pushBits(d, 12, len);
|
|
142
|
+
res.data10 = d.concat(bits);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (len < 1024) {
|
|
146
|
+
let d = [0, 0, 0, 1];
|
|
147
|
+
pushBits(d, 10, len);
|
|
148
|
+
res.data1 = d.concat(bits);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return res;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// {{{1 url encode
|
|
155
|
+
function encode_url(str: string): NumberData {
|
|
156
|
+
const slash = str.indexOf("/", 8) + 1 || str.length;
|
|
157
|
+
const res = encode(str.slice(0, slash).toUpperCase(), false);
|
|
158
|
+
|
|
159
|
+
if (slash >= str.length) {
|
|
160
|
+
return res;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const path_res = encode(str.slice(slash), false);
|
|
164
|
+
|
|
165
|
+
res.data27 = res.data27.concat(path_res.data27);
|
|
166
|
+
|
|
167
|
+
if (res.data10 && path_res.data10) {
|
|
168
|
+
res.data10 = res.data10.concat(path_res.data10);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (res.data1 && path_res.data1) {
|
|
172
|
+
res.data1 = res.data1.concat(path_res.data1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return res;
|
|
176
|
+
}
|