@sythos/js_barcode_universal 1.5.8 → 1.5.9
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 +5 -4
- package/NOTICE.md +2 -2
- package/README.md +17 -13
- package/bundle/sythos-barcode.esm.js +11658 -11244
- package/bundle/sythos-barcode.js +11658 -11244
- package/package.json +10 -3
- package/src/index.d.ts +1 -1
- package/src/index.js +508 -516
- package/src/js/aztec/decoder.js +208 -199
- package/src/js/aztec/detector.js +153 -126
- package/src/js/aztec/encoder.js +172 -153
- package/src/js/aztec/high-level.js +106 -101
- package/src/js/aztec/index.js +1 -12
- package/src/js/aztec/tables.js +106 -120
- package/src/js/aztecrune/decoder.js +76 -85
- package/src/js/aztecrune/detector.js +107 -93
- package/src/js/aztecrune/encoder.js +50 -68
- package/src/js/aztecrune/index.js +1 -16
- package/src/js/aztecrune/tables.js +59 -54
- package/src/js/compactpdf417/decoder.js +69 -74
- package/src/js/compactpdf417/detector.js +74 -75
- package/src/js/compactpdf417/encoder.js +68 -81
- package/src/js/compactpdf417/index.js +1 -13
- package/src/js/compactpdf417/tables.js +71 -80
- package/src/js/core/bit-buffer.js +106 -122
- package/src/js/core/bit-matrix.js +196 -194
- package/src/js/core/errors.js +13 -15
- package/src/js/core/galois-field.js +119 -133
- package/src/js/core/index.js +2 -19
- package/src/js/core/reed-solomon.js +195 -204
- package/src/js/databar/codec.js +93 -108
- package/src/js/databar/decoder.js +149 -140
- package/src/js/databar/encoder.js +47 -55
- package/src/js/databar/gs1.js +122 -123
- package/src/js/databar/index.js +4 -36
- package/src/js/databar/patterns.js +81 -85
- package/src/js/databar/tables.js +51 -52
- package/src/js/datamatrix/decoder.js +216 -182
- package/src/js/datamatrix/detector.js +161 -132
- package/src/js/datamatrix/encoder.js +192 -133
- package/src/js/datamatrix/index.js +1 -9
- package/src/js/datamatrix/tables.js +68 -69
- package/src/js/frameqr/decoder.js +102 -125
- package/src/js/frameqr/detector.js +101 -94
- package/src/js/frameqr/encoder.js +67 -80
- package/src/js/frameqr/index.js +1 -10
- package/src/js/frameqr/tables.js +145 -163
- package/src/js/image/binarizer.js +146 -162
- package/src/js/image/grid-sampler.js +63 -79
- package/src/js/image/index.js +0 -2
- package/src/js/image/luminance.js +129 -140
- package/src/js/image/perspective.js +112 -149
- package/src/js/micropdf417/compaction.js +64 -65
- package/src/js/micropdf417/decoder.js +106 -109
- package/src/js/micropdf417/detector.js +73 -70
- package/src/js/micropdf417/encoder.js +129 -154
- package/src/js/micropdf417/error-correction.js +6 -11
- package/src/js/micropdf417/index.js +2 -16
- package/src/js/micropdf417/tables.js +112 -99
- package/src/js/microqr/decoder.js +177 -182
- package/src/js/microqr/detector.js +240 -256
- package/src/js/microqr/encoder.js +239 -194
- package/src/js/microqr/index.js +0 -2
- package/src/js/microqr/tables.js +208 -200
- package/src/js/oned/addons.js +167 -191
- package/src/js/oned/index.js +27 -58
- package/src/js/oned/patterns.js +194 -213
- package/src/js/oned/reader.js +1003 -984
- package/src/js/oned/writers.js +411 -466
- package/src/js/pdf417/compaction.js +315 -222
- package/src/js/pdf417/decoder.js +71 -36
- package/src/js/pdf417/detector.js +377 -361
- package/src/js/pdf417/encoder.js +57 -46
- package/src/js/pdf417/error-correction.js +5 -8
- package/src/js/pdf417/tables.js +248 -250
- package/src/js/qr/decoder.js +311 -347
- package/src/js/qr/detector.js +378 -395
- package/src/js/qr/encoder.js +514 -599
- package/src/js/qr/index.js +0 -2
- package/src/js/qr/tables.js +375 -422
- package/src/js/render/image-data.js +57 -62
- package/src/js/render/index.js +21 -23
- package/src/js/render/options.js +82 -90
- package/src/js/render/png.js +144 -169
- package/src/js/render/svg.js +41 -44
- package/src/js/render/webgl.js +103 -109
- package/src/js/render/webgpu.js +205 -217
- package/src/js/rmqr/decoder.js +161 -53
- package/src/js/rmqr/detector.js +73 -41
- package/src/js/rmqr/encoder.js +253 -104
- package/src/js/rmqr/index.js +1 -5
- package/src/js/rmqr/tables.js +108 -85
- package/src/ts/aztec/decoder.ts +317 -0
- package/src/ts/aztec/detector.ts +224 -0
- package/src/ts/aztec/encoder.ts +257 -0
- package/src/ts/aztec/high-level.ts +211 -0
- package/src/ts/aztec/index.ts +45 -0
- package/src/ts/aztec/tables.ts +210 -0
- package/src/ts/aztecrune/decoder.ts +155 -0
- package/src/ts/aztecrune/detector.ts +166 -0
- package/src/ts/aztecrune/encoder.ts +121 -0
- package/src/ts/aztecrune/index.ts +49 -0
- package/src/ts/aztecrune/tables.ts +137 -0
- package/src/ts/compactpdf417/decoder.ts +128 -0
- package/src/ts/compactpdf417/detector.ts +139 -0
- package/src/ts/compactpdf417/encoder.ts +140 -0
- package/src/ts/compactpdf417/index.ts +17 -0
- package/src/ts/compactpdf417/tables.ts +173 -0
- package/src/ts/core/bit-buffer.ts +174 -0
- package/src/ts/core/bit-matrix.ts +241 -0
- package/src/ts/core/errors.ts +61 -0
- package/src/ts/core/galois-field.ts +207 -0
- package/src/ts/core/index.ts +56 -0
- package/src/ts/core/reed-solomon.ts +327 -0
- package/src/ts/databar/codec.ts +181 -0
- package/src/ts/databar/decoder.ts +215 -0
- package/src/ts/databar/encoder.ts +96 -0
- package/src/ts/databar/gs1.ts +177 -0
- package/src/ts/databar/index.ts +68 -0
- package/src/ts/databar/patterns.ts +143 -0
- package/src/ts/databar/tables.ts +124 -0
- package/src/ts/datamatrix/decoder.ts +262 -0
- package/src/ts/datamatrix/detector.ts +225 -0
- package/src/ts/datamatrix/encoder.ts +191 -0
- package/src/ts/datamatrix/index.ts +42 -0
- package/src/ts/datamatrix/tables.ts +123 -0
- package/src/ts/frameqr/decoder.ts +239 -0
- package/src/ts/frameqr/detector.ts +192 -0
- package/src/ts/frameqr/encoder.ts +156 -0
- package/src/ts/frameqr/index.ts +42 -0
- package/src/ts/frameqr/tables.ts +270 -0
- package/src/ts/image/binarizer.ts +270 -0
- package/src/ts/image/grid-sampler.ts +164 -0
- package/src/ts/image/index.ts +40 -0
- package/src/ts/image/luminance.ts +196 -0
- package/src/ts/image/perspective.ts +195 -0
- package/src/ts/index.d.ts +1 -1
- package/src/ts/index.ts +790 -0
- package/src/ts/micropdf417/compaction.ts +116 -0
- package/src/ts/micropdf417/decoder.ts +183 -0
- package/src/ts/micropdf417/detector.ts +149 -0
- package/src/ts/micropdf417/encoder.ts +209 -0
- package/src/ts/micropdf417/error-correction.ts +55 -0
- package/src/ts/micropdf417/index.ts +49 -0
- package/src/ts/micropdf417/tables.ts +184 -0
- package/src/ts/microqr/decoder.ts +245 -0
- package/src/ts/microqr/detector.ts +355 -0
- package/src/ts/microqr/encoder.ts +269 -0
- package/src/ts/microqr/index.ts +36 -0
- package/src/ts/microqr/tables.ts +316 -0
- package/src/ts/oned/addons.ts +420 -0
- package/src/ts/oned/index.ts +106 -0
- package/src/ts/oned/patterns.ts +384 -0
- package/src/ts/oned/reader.ts +1364 -0
- package/src/ts/oned/writers.ts +746 -0
- package/src/ts/pdf417/compaction.ts +298 -0
- package/src/ts/pdf417/decoder.ts +75 -0
- package/src/ts/pdf417/detector.ts +468 -0
- package/src/ts/pdf417/encoder.ts +91 -0
- package/src/ts/pdf417/error-correction.ts +47 -0
- package/src/ts/pdf417/index.ts +6 -0
- package/src/ts/pdf417/tables.ts +317 -0
- package/src/ts/qr/decoder.ts +575 -0
- package/src/ts/qr/detector.ts +630 -0
- package/src/ts/qr/encoder.ts +958 -0
- package/src/ts/qr/index.ts +44 -0
- package/src/ts/qr/tables.ts +737 -0
- package/src/ts/render/image-data.ts +125 -0
- package/src/ts/render/index.ts +130 -0
- package/src/ts/render/options.ts +160 -0
- package/src/ts/render/png.ts +295 -0
- package/src/ts/render/svg.ts +120 -0
- package/src/ts/render/webgl.ts +206 -0
- package/src/ts/render/webgpu.ts +369 -0
- package/src/ts/rmqr/decoder.ts +101 -0
- package/src/ts/rmqr/detector.ts +90 -0
- package/src/ts/rmqr/encoder.ts +172 -0
- package/src/ts/rmqr/index.ts +37 -0
- package/src/ts/rmqr/tables.ts +154 -0
|
@@ -27,7 +27,6 @@
|
|
|
27
27
|
*
|
|
28
28
|
* Original work. No code from any other barcode implementation.
|
|
29
29
|
*/
|
|
30
|
-
|
|
31
30
|
/**
|
|
32
31
|
* Finite field arithmetic.
|
|
33
32
|
*
|
|
@@ -56,150 +55,137 @@
|
|
|
56
55
|
*
|
|
57
56
|
* @module core/galois-field
|
|
58
57
|
*/
|
|
59
|
-
|
|
60
58
|
export class GaloisField {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
59
|
+
/**
|
|
60
|
+
* @param {object} opts
|
|
61
|
+
* @param {number} opts.size Field order: 2^m for binary, p for prime.
|
|
62
|
+
* @param {boolean} [opts.prime] True for a prime field (mod arithmetic).
|
|
63
|
+
* @param {number} [opts.primitive] Primitive polynomial, binary fields only.
|
|
64
|
+
* @param {number} [opts.generator] Multiplicative generator. Defaults to 2
|
|
65
|
+
* for binary fields (x), and must be given explicitly for prime fields.
|
|
66
|
+
* @param {string} [opts.name]
|
|
67
|
+
*/
|
|
68
|
+
constructor({ size, prime = false, primitive = 0, generator = 2, name = '' }) {
|
|
69
|
+
this.size = size;
|
|
70
|
+
this.prime = prime;
|
|
71
|
+
this.primitive = primitive;
|
|
72
|
+
this.generator = generator;
|
|
73
|
+
this.name = name || (prime ? `GF(${size})` : `GF(2^${Math.log2(size)})`);
|
|
74
|
+
/** Multiplicative order: every non-zero element is generator^i for some i < order. */
|
|
75
|
+
this.order = size - 1;
|
|
76
|
+
const exp = new Int32Array(this.order * 2);
|
|
77
|
+
const log = new Int32Array(size).fill(-1);
|
|
78
|
+
let x = 1;
|
|
79
|
+
for (let i = 0; i < this.order; i++) {
|
|
80
|
+
exp[i] = x;
|
|
81
|
+
log[x] = i;
|
|
82
|
+
if (prime) {
|
|
83
|
+
x = (x * generator) % size;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
x <<= 1;
|
|
87
|
+
if (x >= size)
|
|
88
|
+
x ^= primitive;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Wrapped copy lets mul() skip a modulo on the common path.
|
|
92
|
+
for (let i = 0; i < this.order; i++)
|
|
93
|
+
exp[this.order + i] = exp[i];
|
|
94
|
+
// A short cycle still returns to 1 after `order` steps whenever its length
|
|
95
|
+
// divides `order`, so "did we end at 1" does not detect a bad generator.
|
|
96
|
+
// The reliable test is coverage: a true generator visits every non-zero
|
|
97
|
+
// element exactly once, leaving no -1 in the log table.
|
|
98
|
+
for (let v = 1; v < size; v++) {
|
|
99
|
+
if (log[v] === -1) {
|
|
100
|
+
throw new Error(`${this.name}: generator ${generator} does not generate the ` +
|
|
101
|
+
`multiplicative group (element ${v} is unreachable). ` +
|
|
102
|
+
(prime ? 'Choose a primitive root.' : 'Check the primitive polynomial.'));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this.expTable = exp;
|
|
106
|
+
this.logTable = log;
|
|
93
107
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
/** Additive identity is 0 and multiplicative identity is 1 in every field here. */
|
|
109
|
+
get zero() { return 0; }
|
|
110
|
+
get one() { return 1; }
|
|
111
|
+
/**
|
|
112
|
+
* a + b.
|
|
113
|
+
* @param {number} a @param {number} b @returns {number}
|
|
114
|
+
*/
|
|
115
|
+
add(a, b) {
|
|
116
|
+
return this.prime ? (a + b) % this.size : a ^ b;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* a - b. Distinct from add() in prime fields — see the module note.
|
|
120
|
+
* @param {number} a @param {number} b @returns {number}
|
|
121
|
+
*/
|
|
122
|
+
sub(a, b) {
|
|
123
|
+
return this.prime ? (a - b + this.size) % this.size : a ^ b;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* -a.
|
|
127
|
+
* @param {number} a @returns {number}
|
|
128
|
+
*/
|
|
129
|
+
neg(a) {
|
|
130
|
+
return this.prime ? (this.size - a) % this.size : a;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* a * b.
|
|
134
|
+
* @param {number} a @param {number} b @returns {number}
|
|
135
|
+
*/
|
|
136
|
+
mul(a, b) {
|
|
137
|
+
if (a === 0 || b === 0)
|
|
138
|
+
return 0;
|
|
139
|
+
return this.expTable[this.logTable[a] + this.logTable[b]];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* a / b.
|
|
143
|
+
* @param {number} a @param {number} b @returns {number}
|
|
144
|
+
*/
|
|
145
|
+
div(a, b) {
|
|
146
|
+
if (b === 0)
|
|
147
|
+
throw new Error(`${this.name}: division by zero`);
|
|
148
|
+
if (a === 0)
|
|
149
|
+
return 0;
|
|
150
|
+
return this.expTable[this.logTable[a] - this.logTable[b] + this.order];
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 1 / a.
|
|
154
|
+
* @param {number} a @returns {number}
|
|
155
|
+
*/
|
|
156
|
+
inv(a) {
|
|
157
|
+
if (a === 0)
|
|
158
|
+
throw new Error(`${this.name}: zero has no inverse`);
|
|
159
|
+
return this.expTable[this.order - this.logTable[a]];
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* generator^i, for any integer i (negative included).
|
|
163
|
+
* @param {number} i @returns {number}
|
|
164
|
+
*/
|
|
165
|
+
exp(i) {
|
|
166
|
+
let k = i % this.order;
|
|
167
|
+
if (k < 0)
|
|
168
|
+
k += this.order;
|
|
169
|
+
return this.expTable[k];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Discrete log base generator.
|
|
173
|
+
* @param {number} a @returns {number}
|
|
174
|
+
*/
|
|
175
|
+
log(a) {
|
|
176
|
+
if (a === 0)
|
|
177
|
+
throw new Error(`${this.name}: log of zero`);
|
|
178
|
+
return this.logTable[a];
|
|
109
179
|
}
|
|
110
|
-
|
|
111
|
-
this.expTable = exp;
|
|
112
|
-
this.logTable = log;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/** Additive identity is 0 and multiplicative identity is 1 in every field here. */
|
|
116
|
-
get zero() { return 0; }
|
|
117
|
-
get one() { return 1; }
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* a + b.
|
|
121
|
-
* @param {number} a @param {number} b @returns {number}
|
|
122
|
-
*/
|
|
123
|
-
add(a, b) {
|
|
124
|
-
return this.prime ? (a + b) % this.size : a ^ b;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* a - b. Distinct from add() in prime fields — see the module note.
|
|
129
|
-
* @param {number} a @param {number} b @returns {number}
|
|
130
|
-
*/
|
|
131
|
-
sub(a, b) {
|
|
132
|
-
return this.prime ? (a - b + this.size) % this.size : a ^ b;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* -a.
|
|
137
|
-
* @param {number} a @returns {number}
|
|
138
|
-
*/
|
|
139
|
-
neg(a) {
|
|
140
|
-
return this.prime ? (this.size - a) % this.size : a;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* a * b.
|
|
145
|
-
* @param {number} a @param {number} b @returns {number}
|
|
146
|
-
*/
|
|
147
|
-
mul(a, b) {
|
|
148
|
-
if (a === 0 || b === 0) return 0;
|
|
149
|
-
return this.expTable[this.logTable[a] + this.logTable[b]];
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* a / b.
|
|
154
|
-
* @param {number} a @param {number} b @returns {number}
|
|
155
|
-
*/
|
|
156
|
-
div(a, b) {
|
|
157
|
-
if (b === 0) throw new Error(`${this.name}: division by zero`);
|
|
158
|
-
if (a === 0) return 0;
|
|
159
|
-
return this.expTable[this.logTable[a] - this.logTable[b] + this.order];
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* 1 / a.
|
|
164
|
-
* @param {number} a @returns {number}
|
|
165
|
-
*/
|
|
166
|
-
inv(a) {
|
|
167
|
-
if (a === 0) throw new Error(`${this.name}: zero has no inverse`);
|
|
168
|
-
return this.expTable[this.order - this.logTable[a]];
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* generator^i, for any integer i (negative included).
|
|
173
|
-
* @param {number} i @returns {number}
|
|
174
|
-
*/
|
|
175
|
-
exp(i) {
|
|
176
|
-
let k = i % this.order;
|
|
177
|
-
if (k < 0) k += this.order;
|
|
178
|
-
return this.expTable[k];
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Discrete log base generator.
|
|
183
|
-
* @param {number} a @returns {number}
|
|
184
|
-
*/
|
|
185
|
-
log(a) {
|
|
186
|
-
if (a === 0) throw new Error(`${this.name}: log of zero`);
|
|
187
|
-
return this.logTable[a];
|
|
188
|
-
}
|
|
189
180
|
}
|
|
190
|
-
|
|
191
181
|
/** QR Code, Data Matrix uses its own — see below. x^8 + x^4 + x^3 + x^2 + 1 */
|
|
192
182
|
export const GF256_QR = new GaloisField({ size: 256, primitive: 0x011d, name: 'GF(256)/QR' });
|
|
193
|
-
|
|
194
183
|
/** Data Matrix ECC200. x^8 + x^5 + x^3 + x^2 + 1 */
|
|
195
184
|
export const GF256_DM = new GaloisField({ size: 256, primitive: 0x012d, name: 'GF(256)/DataMatrix' });
|
|
196
|
-
|
|
197
185
|
/** Aztec's eight-bit data field is algebraically identical to Data Matrix's. */
|
|
198
186
|
export const GF256_AZTEC = GF256_DM;
|
|
199
|
-
|
|
200
187
|
/** PDF417. Prime field; 3 is a primitive root modulo 929. */
|
|
201
188
|
export const GF929 = new GaloisField({ size: 929, prime: true, generator: 3, name: 'GF(929)' });
|
|
202
|
-
|
|
203
189
|
/** Aztec, by layer count. */
|
|
204
190
|
export const GF16 = new GaloisField({ size: 16, primitive: 0x13, name: 'GF(16)' });
|
|
205
191
|
export const GF64 = new GaloisField({ size: 64, primitive: 0x43, name: 'GF(64)' });
|
package/src/js/core/index.js
CHANGED
|
@@ -27,30 +27,13 @@
|
|
|
27
27
|
*
|
|
28
28
|
* Original work. No code from any other barcode implementation.
|
|
29
29
|
*/
|
|
30
|
-
|
|
31
30
|
/**
|
|
32
31
|
* Core primitives, re-exported.
|
|
33
32
|
*
|
|
34
33
|
* @module core
|
|
35
34
|
*/
|
|
36
|
-
|
|
37
35
|
export { BitMatrix } from './bit-matrix.js';
|
|
38
36
|
export { BitWriter, BitReader } from './bit-buffer.js';
|
|
39
|
-
export {
|
|
40
|
-
GaloisField,
|
|
41
|
-
GF256_QR,
|
|
42
|
-
GF256_DM,
|
|
43
|
-
GF929,
|
|
44
|
-
GF16,
|
|
45
|
-
GF64,
|
|
46
|
-
GF1024,
|
|
47
|
-
GF4096,
|
|
48
|
-
} from './galois-field.js';
|
|
37
|
+
export { GaloisField, GF256_QR, GF256_DM, GF929, GF16, GF64, GF1024, GF4096, } from './galois-field.js';
|
|
49
38
|
export { rsEncode, rsDecode, generatorPoly } from './reed-solomon.js';
|
|
50
|
-
export {
|
|
51
|
-
BarcodeError,
|
|
52
|
-
EncodeError,
|
|
53
|
-
NotFoundError,
|
|
54
|
-
FormatError,
|
|
55
|
-
ChecksumError,
|
|
56
|
-
} from './errors.js';
|
|
39
|
+
export { BarcodeError, EncodeError, NotFoundError, FormatError, ChecksumError, } from './errors.js';
|