@20syldev/api 5.3.0 → 5.4.0-pre
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/README.md +3 -3
- package/dist/app.js +7 -2
- package/dist/app.js.map +1 -1
- package/dist/middleware/ratelimit.js +1 -1
- package/dist/middleware/ratelimit.js.map +1 -1
- package/dist/modules/v5/address.js +20 -0
- package/dist/modules/v5/address.js.map +1 -0
- package/dist/modules/v5/algorithms.js +39 -0
- package/dist/modules/v5/algorithms.js.map +1 -0
- package/dist/modules/v5/asymmetric.js +10 -3
- package/dist/modules/v5/asymmetric.js.map +1 -1
- package/dist/modules/v5/barcode.js +424 -0
- package/dist/modules/v5/barcode.js.map +1 -0
- package/dist/modules/v5/case.js +2 -0
- package/dist/modules/v5/case.js.map +1 -1
- package/dist/modules/v5/chart.js +16 -10
- package/dist/modules/v5/chart.js.map +1 -1
- package/dist/modules/v5/chat.js +107 -0
- package/dist/modules/v5/chat.js.map +1 -0
- package/dist/modules/v5/evaluate.js +8 -5
- package/dist/modules/v5/evaluate.js.map +1 -1
- package/dist/modules/v5/jwt.js +11 -4
- package/dist/modules/v5/jwt.js.map +1 -1
- package/dist/modules/v5/matrix.js +5 -4
- package/dist/modules/v5/matrix.js.map +1 -1
- package/dist/modules/v5/otp.js +16 -7
- package/dist/modules/v5/otp.js.map +1 -1
- package/dist/modules/v5/symmetric.js +36 -19
- package/dist/modules/v5/symmetric.js.map +1 -1
- package/dist/modules/v5/text.js +12 -0
- package/dist/modules/v5/text.js.map +1 -0
- package/dist/modules/v5/tic_tac_toe.js +226 -0
- package/dist/modules/v5/tic_tac_toe.js.map +1 -0
- package/dist/modules/v5.js +7 -1
- package/dist/modules/v5.js.map +1 -1
- package/dist/routes/get.js +64 -48
- package/dist/routes/get.js.map +1 -1
- package/dist/routes/index.js +4 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/post.js +1 -1
- package/dist/utils/helpers.js +6 -1
- package/dist/utils/helpers.js.map +1 -1
- package/package.json +1 -1
- package/dist/modules/v4/colors.js +0 -54
- package/dist/modules/v4/colors.js.map +0 -1
- package/dist/modules/v4/utils.js +0 -26
- package/dist/modules/v4/utils.js.map +0 -1
- package/dist/utils/version.js +0 -3
- package/dist/utils/version.js.map +0 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
# API Personnelle
|
|
5
5
|
|
|
6
|
-
[](https://github.com/20syldev/api/releases/latest)
|
|
7
7
|
|
|
8
8
|
</div>
|
|
9
9
|
|
|
@@ -41,10 +41,10 @@ $ npm run build && npm start
|
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
```console
|
|
44
|
-
> @20syldev/api@5.
|
|
44
|
+
> @20syldev/api@5.4.0 build
|
|
45
45
|
> tsc
|
|
46
46
|
|
|
47
|
-
> @20syldev/api@5.
|
|
47
|
+
> @20syldev/api@5.4.0 start
|
|
48
48
|
> node dist/app.js
|
|
49
49
|
|
|
50
50
|
API is running on
|
package/dist/app.js
CHANGED
|
@@ -11,6 +11,7 @@ import getRoutes from './routes/get.js';
|
|
|
11
11
|
import indexRoutes from './routes/index.js';
|
|
12
12
|
import patchRoutes from './routes/patch.js';
|
|
13
13
|
import postRoutes from './routes/post.js';
|
|
14
|
+
import { error } from './utils/response.js';
|
|
14
15
|
const app = express();
|
|
15
16
|
// Setup CORS, body parsing, static files
|
|
16
17
|
setupCors(app);
|
|
@@ -20,8 +21,6 @@ app.use(jsonResponseMiddleware);
|
|
|
20
21
|
app.use(rateLimitMiddleware);
|
|
21
22
|
// Request logging
|
|
22
23
|
app.use(loggerMiddleware);
|
|
23
|
-
// Error handling
|
|
24
|
-
app.use(errorHandler);
|
|
25
24
|
// Root routes (before version check)
|
|
26
25
|
app.use(indexRoutes);
|
|
27
26
|
// Version & endpoint validation
|
|
@@ -32,6 +31,12 @@ app.use(getRoutes);
|
|
|
32
31
|
app.use(postRoutes);
|
|
33
32
|
app.use(patchRoutes);
|
|
34
33
|
app.use(deleteRoutes);
|
|
34
|
+
// JSON 404 fallback
|
|
35
|
+
app.use((req, res) => {
|
|
36
|
+
error(res, 404, `Endpoint '${req.path}' does not exist.`);
|
|
37
|
+
});
|
|
38
|
+
// Error handling (after routes)
|
|
39
|
+
app.use(errorHandler);
|
|
35
40
|
// Start server
|
|
36
41
|
if (process.env.NODE_ENV !== 'test') {
|
|
37
42
|
app.listen(env.PORT, () => console.log(`API is running on\n - http://127.0.0.1:${env.PORT}\n - http://localhost:${env.PORT}`));
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAwC,MAAM,SAAS,CAAC;AAE/D,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,yCAAyC;AACzC,SAAS,CAAC,GAAG,CAAC,CAAC;AAEf,uBAAuB;AACvB,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEhC,gBAAgB;AAChB,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAE7B,kBAAkB;AAClB,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE1B,qCAAqC;AACrC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAErB,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAC7C,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;AAExD,mBAAmB;AACnB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACpB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACrB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEtB,oBAAoB;AACpB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACpC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,GAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEtB,eAAe;AACf,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;IAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,CAAC,6CAA6C,GAAG,CAAC,IAAI,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAC3G,CAAC;AACN,CAAC;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -20,7 +20,7 @@ setInterval(() => {
|
|
|
20
20
|
if (burstTracker[ip].length === 0)
|
|
21
21
|
delete burstTracker[ip];
|
|
22
22
|
}
|
|
23
|
-
}, SESSION_TTL);
|
|
23
|
+
}, SESSION_TTL).unref();
|
|
24
24
|
export function rateLimitMiddleware(req, res, next) {
|
|
25
25
|
const ip = req.ip || req.socket.remoteAddress || '';
|
|
26
26
|
const token = req.headers.authorization?.split(' ')[1] || '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;AAEzC,MAAM,YAAY,GAA6B,EAAE,CAAC;AAElD,+BAA+B;AAC/B,WAAW,CAAC,GAAG,EAAE;IACb,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC;YACzE,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;QAChF,IAAI,YAAY,CAAC,EAAE,CAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;AACL,CAAC,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;AAEzC,MAAM,YAAY,GAA6B,EAAE,CAAC;AAElD,+BAA+B;AAC/B,WAAW,CAAC,GAAG,EAAE;IACb,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC;YACzE,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;QAChF,IAAI,YAAY,CAAC,EAAE,CAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;AACL,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;AAExB,MAAM,UAAU,mBAAmB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC/E,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAClC,OAAO;IACX,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvB,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;QAClB,QAAQ,GAAG,CAAC,CAAC;QACb,SAAS,GAAG,GAAG,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC;QAC/C,OAAO;IACX,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACzD,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACvC,OAAO;IACX,CAAC;IAED,4BAA4B;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAAE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QAC7C,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;QAChF,YAAY,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,YAAY,CAAC,EAAE,CAAE,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,sCAAsC,CAAC,CAAC;YACxD,OAAO;QACX,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACnD,QAAQ,CAAC,EAAE,CAAE,CAAC,IAAI,CAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,IAAI,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,IAAI,CAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,kCAAkC,IAAI,CAAC,MAAM,qBAAqB,CAAC,CAAC;QACpF,OAAO;IACX,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import v4address from '../v4/address.js';
|
|
2
|
+
const NAME_THEN_TYPE = new Set(['US', 'UK', 'DE']);
|
|
3
|
+
/**
|
|
4
|
+
* Generates one or more fictional postal addresses.
|
|
5
|
+
*/
|
|
6
|
+
export default function address(countryCode, count = 1) {
|
|
7
|
+
const result = v4address(countryCode, count);
|
|
8
|
+
return {
|
|
9
|
+
addresses: result.addresses.map((a) => {
|
|
10
|
+
if (!NAME_THEN_TYPE.has(a.countryCode))
|
|
11
|
+
return a;
|
|
12
|
+
const parts = a.street.split(' ');
|
|
13
|
+
if (parts.length < 3)
|
|
14
|
+
return a;
|
|
15
|
+
const [num, type, ...nameParts] = parts;
|
|
16
|
+
return { ...a, street: `${num} ${nameParts.join(' ')} ${type}` };
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/modules/v5/address.ts"],"names":[],"mappings":"AAAA,OAAO,SAAiC,MAAM,kBAAkB,CAAC;AAEjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,WAAoB,EAAE,QAAgB,CAAC;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAE7C,OAAO;QACH,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;gBAAE,OAAO,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC;YACxC,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACrE,CAAC,CAAC;KACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { MAX_FACTORIAL, MAX_GCD_VALUE } from '../../constants.js';
|
|
2
|
+
export * from '../v4/algorithms.js';
|
|
3
|
+
/**
|
|
4
|
+
* Computes the factorial of a non-negative integer.
|
|
5
|
+
*/
|
|
6
|
+
export function factorial(value) {
|
|
7
|
+
const num = Number(value);
|
|
8
|
+
if (isNaN(num))
|
|
9
|
+
throw new Error('Value must be a number');
|
|
10
|
+
if (!Number.isInteger(num))
|
|
11
|
+
throw new Error('Value must be an integer');
|
|
12
|
+
if (num < 0)
|
|
13
|
+
throw new Error('Number must be positive');
|
|
14
|
+
if (num > MAX_FACTORIAL)
|
|
15
|
+
throw new Error('Number must be between 0 and 170');
|
|
16
|
+
return num <= 1 ? 1 : num * factorial(num - 1);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Determines whether a given number is prime.
|
|
20
|
+
*/
|
|
21
|
+
export function isprime(value) {
|
|
22
|
+
const num = Number(value);
|
|
23
|
+
if (isNaN(num))
|
|
24
|
+
throw new Error('Value must be a number');
|
|
25
|
+
if (!Number.isInteger(num))
|
|
26
|
+
throw new Error('Value must be an integer');
|
|
27
|
+
if (num < 1)
|
|
28
|
+
throw new Error('Number must be positive');
|
|
29
|
+
if (num > MAX_GCD_VALUE)
|
|
30
|
+
throw new Error('Number must be between 1 and 100000');
|
|
31
|
+
if (num < 2)
|
|
32
|
+
return false;
|
|
33
|
+
for (let i = 2; i <= Math.sqrt(num); i++) {
|
|
34
|
+
if (num % i === 0)
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=algorithms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorithms.js","sourceRoot":"","sources":["../../../src/modules/v5/algorithms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,cAAc,qBAAqB,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAsB;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACxE,IAAI,GAAG,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,GAAG,GAAG,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAE7E,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAsB;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACxE,IAAI,GAAG,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,GAAG,GAAG,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAChF,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { constants as cryptoConstants, generateKeyPairSync, privateDecrypt, publicEncrypt } from 'crypto';
|
|
1
|
+
import { constants as cryptoConstants, createPublicKey, generateKeyPairSync, privateDecrypt, publicEncrypt, } from 'crypto';
|
|
2
2
|
import { MAX_RSA_MODULUS } from '../../constants.js';
|
|
3
3
|
const ALGORITHMS = {
|
|
4
4
|
'rsa-oaep-sha256': { oaepHash: 'sha256', hashLength: 32 },
|
|
@@ -37,12 +37,19 @@ export default function asymmetric(action, options = {}) {
|
|
|
37
37
|
throw new Error('Public key is required');
|
|
38
38
|
if (!options.publicKey.startsWith('-----BEGIN PUBLIC KEY-----'))
|
|
39
39
|
throw new Error('Invalid public key format');
|
|
40
|
-
|
|
40
|
+
let keyObject;
|
|
41
|
+
try {
|
|
42
|
+
keyObject = createPublicKey(options.publicKey);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error('Invalid public key format');
|
|
46
|
+
}
|
|
47
|
+
const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength ?? 2048;
|
|
41
48
|
const maxBytes = modulusLength / 8 - 2 * algo.hashLength - 2;
|
|
42
49
|
if (Buffer.byteLength(options.text, 'utf8') > maxBytes)
|
|
43
50
|
throw new Error(`Text exceeds maximum length for this key size and algorithm (${maxBytes} bytes)`);
|
|
44
51
|
try {
|
|
45
|
-
const encrypted = publicEncrypt({ key:
|
|
52
|
+
const encrypted = publicEncrypt({ key: keyObject, oaepHash: algo.oaepHash, padding: cryptoConstants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(options.text, 'utf8'));
|
|
46
53
|
return { action, algorithm, result: encrypted.toString('base64') };
|
|
47
54
|
}
|
|
48
55
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asymmetric.js","sourceRoot":"","sources":["../../../src/modules/v5/asymmetric.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"asymmetric.js","sourceRoot":"","sources":["../../../src/modules/v5/asymmetric.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { createCanvas } from 'canvas';
|
|
2
|
+
import { normalizeColor } from '../../utils/colors.js';
|
|
3
|
+
const VALID_TYPES = ['code128', 'ean13', 'ean8', 'upca', 'code39'];
|
|
4
|
+
const VALID_FORMATS = ['svg', 'png'];
|
|
5
|
+
function clamp(val, min, max) {
|
|
6
|
+
return Math.max(min, Math.min(max, Math.round(val)));
|
|
7
|
+
}
|
|
8
|
+
const C128_PATTERNS = [
|
|
9
|
+
[2, 1, 2, 2, 2, 2],
|
|
10
|
+
[2, 2, 2, 1, 2, 2],
|
|
11
|
+
[2, 2, 2, 2, 2, 1],
|
|
12
|
+
[1, 2, 1, 2, 2, 3],
|
|
13
|
+
[1, 2, 1, 3, 2, 2],
|
|
14
|
+
[1, 3, 1, 2, 2, 2],
|
|
15
|
+
[1, 2, 2, 2, 1, 3],
|
|
16
|
+
[1, 2, 2, 3, 1, 2],
|
|
17
|
+
[1, 3, 2, 2, 1, 2],
|
|
18
|
+
[2, 2, 1, 2, 1, 3],
|
|
19
|
+
[2, 2, 1, 3, 1, 2],
|
|
20
|
+
[2, 3, 1, 2, 1, 2],
|
|
21
|
+
[1, 1, 2, 2, 3, 2],
|
|
22
|
+
[1, 2, 2, 1, 3, 2],
|
|
23
|
+
[1, 2, 2, 2, 3, 1],
|
|
24
|
+
[1, 1, 3, 2, 2, 2],
|
|
25
|
+
[1, 2, 3, 1, 2, 2],
|
|
26
|
+
[1, 2, 3, 2, 2, 1],
|
|
27
|
+
[2, 2, 3, 2, 1, 1],
|
|
28
|
+
[2, 2, 1, 1, 3, 2],
|
|
29
|
+
[2, 2, 1, 2, 3, 1],
|
|
30
|
+
[2, 1, 3, 2, 1, 2],
|
|
31
|
+
[2, 2, 3, 1, 1, 2],
|
|
32
|
+
[3, 1, 2, 1, 3, 1],
|
|
33
|
+
[3, 1, 1, 2, 2, 2],
|
|
34
|
+
[3, 2, 1, 1, 2, 2],
|
|
35
|
+
[3, 2, 1, 2, 2, 1],
|
|
36
|
+
[3, 1, 2, 2, 1, 2],
|
|
37
|
+
[3, 2, 2, 1, 1, 2],
|
|
38
|
+
[3, 2, 2, 2, 1, 1],
|
|
39
|
+
[2, 1, 2, 1, 2, 3],
|
|
40
|
+
[2, 1, 2, 3, 2, 1],
|
|
41
|
+
[2, 3, 2, 1, 2, 1],
|
|
42
|
+
[1, 1, 1, 3, 2, 3],
|
|
43
|
+
[1, 3, 1, 1, 2, 3],
|
|
44
|
+
[1, 3, 1, 3, 2, 1],
|
|
45
|
+
[1, 1, 2, 3, 1, 3],
|
|
46
|
+
[1, 3, 2, 1, 1, 3],
|
|
47
|
+
[1, 3, 2, 3, 1, 1],
|
|
48
|
+
[2, 1, 1, 3, 1, 3],
|
|
49
|
+
[2, 3, 1, 1, 1, 3],
|
|
50
|
+
[2, 3, 1, 3, 1, 1],
|
|
51
|
+
[1, 1, 2, 1, 3, 3],
|
|
52
|
+
[1, 1, 2, 3, 3, 1],
|
|
53
|
+
[1, 3, 2, 1, 3, 1],
|
|
54
|
+
[1, 1, 3, 1, 2, 3],
|
|
55
|
+
[1, 1, 3, 3, 2, 1],
|
|
56
|
+
[1, 3, 3, 1, 2, 1],
|
|
57
|
+
[3, 1, 3, 1, 2, 1],
|
|
58
|
+
[2, 1, 1, 3, 3, 1],
|
|
59
|
+
[2, 3, 1, 1, 3, 1],
|
|
60
|
+
[2, 1, 3, 1, 1, 3],
|
|
61
|
+
[2, 1, 3, 3, 1, 1],
|
|
62
|
+
[2, 1, 3, 1, 3, 1],
|
|
63
|
+
[3, 1, 1, 1, 2, 3],
|
|
64
|
+
[3, 1, 1, 3, 2, 1],
|
|
65
|
+
[3, 3, 1, 1, 2, 1],
|
|
66
|
+
[3, 1, 2, 1, 1, 3],
|
|
67
|
+
[3, 1, 2, 3, 1, 1],
|
|
68
|
+
[3, 3, 2, 1, 1, 1],
|
|
69
|
+
[3, 1, 4, 1, 1, 1],
|
|
70
|
+
[2, 2, 1, 4, 1, 1],
|
|
71
|
+
[4, 3, 1, 1, 1, 1],
|
|
72
|
+
[1, 1, 1, 2, 2, 4],
|
|
73
|
+
[1, 1, 1, 4, 2, 2],
|
|
74
|
+
[1, 2, 1, 1, 2, 4],
|
|
75
|
+
[1, 2, 1, 4, 2, 1],
|
|
76
|
+
[1, 4, 1, 1, 2, 2],
|
|
77
|
+
[1, 4, 1, 2, 2, 1],
|
|
78
|
+
[1, 1, 2, 2, 1, 4],
|
|
79
|
+
[1, 1, 2, 4, 1, 2],
|
|
80
|
+
[1, 2, 2, 1, 1, 4],
|
|
81
|
+
[1, 2, 2, 4, 1, 1],
|
|
82
|
+
[1, 4, 2, 1, 1, 2],
|
|
83
|
+
[1, 4, 2, 2, 1, 1],
|
|
84
|
+
[2, 4, 1, 2, 1, 1],
|
|
85
|
+
[2, 2, 1, 1, 1, 4],
|
|
86
|
+
[4, 1, 3, 1, 1, 1],
|
|
87
|
+
[2, 4, 1, 1, 1, 2],
|
|
88
|
+
[1, 3, 4, 1, 1, 1],
|
|
89
|
+
[1, 1, 1, 2, 4, 2],
|
|
90
|
+
[1, 2, 1, 1, 4, 2],
|
|
91
|
+
[1, 2, 1, 2, 4, 1],
|
|
92
|
+
[1, 1, 4, 2, 1, 2],
|
|
93
|
+
[1, 2, 4, 1, 1, 2],
|
|
94
|
+
[1, 2, 4, 2, 1, 1],
|
|
95
|
+
[4, 1, 1, 2, 1, 2],
|
|
96
|
+
[4, 2, 1, 1, 1, 2],
|
|
97
|
+
[4, 2, 1, 2, 1, 1],
|
|
98
|
+
[2, 1, 2, 1, 4, 1],
|
|
99
|
+
[2, 1, 4, 1, 2, 1],
|
|
100
|
+
[4, 1, 2, 1, 2, 1],
|
|
101
|
+
[1, 1, 1, 1, 4, 3],
|
|
102
|
+
[1, 1, 1, 3, 4, 1],
|
|
103
|
+
[1, 3, 1, 1, 4, 1],
|
|
104
|
+
[1, 1, 4, 1, 1, 3],
|
|
105
|
+
[1, 1, 4, 3, 1, 1],
|
|
106
|
+
[4, 1, 1, 1, 1, 3],
|
|
107
|
+
[4, 1, 1, 3, 1, 1],
|
|
108
|
+
[1, 1, 3, 1, 4, 1],
|
|
109
|
+
[1, 1, 4, 1, 3, 1],
|
|
110
|
+
[3, 1, 1, 1, 4, 1],
|
|
111
|
+
[4, 1, 1, 1, 3, 1],
|
|
112
|
+
[2, 1, 1, 4, 1, 2], // 100-103 (103 = Start A)
|
|
113
|
+
[2, 1, 1, 2, 1, 4],
|
|
114
|
+
[2, 1, 1, 2, 4, 1],
|
|
115
|
+
[2, 3, 3, 1, 1, 1], // 104 = Start B, 105 = Start C, 106 = Stop (partial)
|
|
116
|
+
];
|
|
117
|
+
// Stop pattern for Code 128 is special: 2 3 3 1 1 1 2 (13 modules)
|
|
118
|
+
const C128_STOP = [2, 3, 3, 1, 1, 1, 2];
|
|
119
|
+
const EAN_L = [
|
|
120
|
+
'0001101',
|
|
121
|
+
'0011001',
|
|
122
|
+
'0010011',
|
|
123
|
+
'0111101',
|
|
124
|
+
'0100011',
|
|
125
|
+
'0110001',
|
|
126
|
+
'0101111',
|
|
127
|
+
'0111011',
|
|
128
|
+
'0110111',
|
|
129
|
+
'0001011',
|
|
130
|
+
];
|
|
131
|
+
const EAN_G = [
|
|
132
|
+
'0100111',
|
|
133
|
+
'0110011',
|
|
134
|
+
'0011011',
|
|
135
|
+
'0100001',
|
|
136
|
+
'0011101',
|
|
137
|
+
'0111001',
|
|
138
|
+
'0000101',
|
|
139
|
+
'0010001',
|
|
140
|
+
'0001001',
|
|
141
|
+
'0010111',
|
|
142
|
+
];
|
|
143
|
+
const EAN_R = [
|
|
144
|
+
'1110010',
|
|
145
|
+
'1100110',
|
|
146
|
+
'1101100',
|
|
147
|
+
'1000010',
|
|
148
|
+
'1011100',
|
|
149
|
+
'1001110',
|
|
150
|
+
'1010000',
|
|
151
|
+
'1000100',
|
|
152
|
+
'1001000',
|
|
153
|
+
'1110100',
|
|
154
|
+
];
|
|
155
|
+
// First digit parity structure for EAN-13 (L=false, G=true)
|
|
156
|
+
const EAN13_PARITY = [
|
|
157
|
+
[false, false, false, false, false, false], // 0
|
|
158
|
+
[false, false, true, false, true, true], // 1
|
|
159
|
+
[false, false, true, true, false, true], // 2
|
|
160
|
+
[false, false, true, true, true, false], // 3
|
|
161
|
+
[false, true, false, false, true, true], // 4
|
|
162
|
+
[false, true, true, false, false, true], // 5
|
|
163
|
+
[false, true, true, true, false, false], // 6
|
|
164
|
+
[false, true, false, true, false, true], // 7
|
|
165
|
+
[false, true, false, true, true, false], // 8
|
|
166
|
+
[false, true, true, false, true, false], // 9
|
|
167
|
+
];
|
|
168
|
+
function eanCheckDigit(digits) {
|
|
169
|
+
let sum = 0;
|
|
170
|
+
for (let i = 0; i < digits.length; i++) {
|
|
171
|
+
const fromRight = digits.length - 1 - i;
|
|
172
|
+
sum += digits[i] * (fromRight % 2 === 0 ? 3 : 1);
|
|
173
|
+
}
|
|
174
|
+
return (10 - (sum % 10)) % 10;
|
|
175
|
+
}
|
|
176
|
+
const C39_CHARS = {
|
|
177
|
+
'0': [1, 1, 1, 3, 3, 1, 3, 1, 1],
|
|
178
|
+
'1': [3, 1, 1, 3, 1, 1, 1, 1, 3],
|
|
179
|
+
'2': [1, 1, 3, 3, 1, 1, 1, 1, 3],
|
|
180
|
+
'3': [3, 1, 3, 3, 1, 1, 1, 1, 1],
|
|
181
|
+
'4': [1, 1, 1, 3, 3, 1, 1, 1, 3],
|
|
182
|
+
'5': [3, 1, 1, 3, 3, 1, 1, 1, 1],
|
|
183
|
+
'6': [1, 1, 3, 3, 3, 1, 1, 1, 1],
|
|
184
|
+
'7': [1, 1, 1, 3, 1, 1, 3, 1, 3],
|
|
185
|
+
'8': [3, 1, 1, 3, 1, 1, 3, 1, 1],
|
|
186
|
+
'9': [1, 1, 3, 3, 1, 1, 3, 1, 1],
|
|
187
|
+
A: [3, 1, 1, 1, 1, 3, 1, 1, 3],
|
|
188
|
+
B: [1, 1, 3, 1, 1, 3, 1, 1, 3],
|
|
189
|
+
C: [3, 1, 3, 1, 1, 3, 1, 1, 1],
|
|
190
|
+
D: [1, 1, 1, 1, 3, 3, 1, 1, 3],
|
|
191
|
+
E: [3, 1, 1, 1, 3, 3, 1, 1, 1],
|
|
192
|
+
F: [1, 1, 3, 1, 3, 3, 1, 1, 1],
|
|
193
|
+
G: [1, 1, 1, 1, 1, 3, 3, 1, 3],
|
|
194
|
+
H: [3, 1, 1, 1, 1, 3, 3, 1, 1],
|
|
195
|
+
I: [1, 1, 3, 1, 1, 3, 3, 1, 1],
|
|
196
|
+
J: [1, 1, 1, 1, 3, 3, 3, 1, 1],
|
|
197
|
+
K: [3, 1, 1, 1, 1, 1, 1, 3, 3],
|
|
198
|
+
L: [1, 1, 3, 1, 1, 1, 1, 3, 3],
|
|
199
|
+
M: [3, 1, 3, 1, 1, 1, 1, 3, 1],
|
|
200
|
+
N: [1, 1, 1, 1, 3, 1, 1, 3, 3],
|
|
201
|
+
O: [3, 1, 1, 1, 3, 1, 1, 3, 1],
|
|
202
|
+
P: [1, 1, 3, 1, 3, 1, 1, 3, 1],
|
|
203
|
+
Q: [1, 1, 1, 1, 1, 1, 3, 3, 3],
|
|
204
|
+
R: [3, 1, 1, 1, 1, 1, 3, 3, 1],
|
|
205
|
+
S: [1, 1, 3, 1, 1, 1, 3, 3, 1],
|
|
206
|
+
T: [1, 1, 1, 1, 3, 1, 3, 3, 1],
|
|
207
|
+
U: [3, 3, 1, 1, 1, 1, 1, 1, 3],
|
|
208
|
+
V: [1, 3, 3, 1, 1, 1, 1, 1, 3],
|
|
209
|
+
W: [3, 3, 3, 1, 1, 1, 1, 1, 1],
|
|
210
|
+
X: [1, 3, 1, 1, 3, 1, 1, 1, 3],
|
|
211
|
+
Y: [3, 3, 1, 1, 3, 1, 1, 1, 1],
|
|
212
|
+
Z: [1, 3, 3, 1, 3, 1, 1, 1, 1],
|
|
213
|
+
'-': [1, 3, 1, 1, 1, 1, 3, 1, 3],
|
|
214
|
+
'.': [3, 3, 1, 1, 1, 1, 3, 1, 1],
|
|
215
|
+
' ': [1, 3, 3, 1, 1, 1, 3, 1, 1],
|
|
216
|
+
$: [1, 3, 1, 3, 1, 3, 1, 1, 1],
|
|
217
|
+
'/': [1, 3, 1, 3, 1, 1, 1, 3, 1],
|
|
218
|
+
'+': [1, 3, 1, 1, 1, 3, 1, 3, 1],
|
|
219
|
+
'%': [1, 1, 1, 3, 1, 3, 1, 3, 1],
|
|
220
|
+
'*': [1, 3, 1, 1, 3, 1, 3, 1, 1], // * = start/stop
|
|
221
|
+
};
|
|
222
|
+
function renderSvg(modules, barWidth, height, color, bg) {
|
|
223
|
+
const totalWidth = modules.reduce((a, b) => a + b, 0) * barWidth;
|
|
224
|
+
const rects = [`<rect width="${totalWidth}" height="${height}" fill="${bg}" />`];
|
|
225
|
+
let x = 0;
|
|
226
|
+
let isBar = false;
|
|
227
|
+
for (const w of modules) {
|
|
228
|
+
const px = w * barWidth;
|
|
229
|
+
if (isBar) {
|
|
230
|
+
rects.push(`<rect x="${x}" y="0" width="${px}" height="${height}" fill="${color}" />`);
|
|
231
|
+
}
|
|
232
|
+
x += px;
|
|
233
|
+
isBar = !isBar;
|
|
234
|
+
}
|
|
235
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${totalWidth}" height="${height}" viewBox="0 0 ${totalWidth} ${height}">${rects.join('')}</svg>`;
|
|
236
|
+
}
|
|
237
|
+
function renderPng(modules, barWidth, height, color, bg) {
|
|
238
|
+
const totalWidth = modules.reduce((a, b) => a + b, 0) * barWidth;
|
|
239
|
+
const canvas = createCanvas(totalWidth, height);
|
|
240
|
+
const ctx = canvas.getContext('2d');
|
|
241
|
+
ctx.fillStyle = bg;
|
|
242
|
+
ctx.fillRect(0, 0, totalWidth, height);
|
|
243
|
+
ctx.fillStyle = color;
|
|
244
|
+
let x = 0;
|
|
245
|
+
let isBar = false;
|
|
246
|
+
for (const w of modules) {
|
|
247
|
+
const px = w * barWidth;
|
|
248
|
+
if (isBar)
|
|
249
|
+
ctx.fillRect(x, 0, px, height);
|
|
250
|
+
x += px;
|
|
251
|
+
isBar = !isBar;
|
|
252
|
+
}
|
|
253
|
+
return canvas.toBuffer('image/png');
|
|
254
|
+
}
|
|
255
|
+
function encodeCode128(data) {
|
|
256
|
+
for (const ch of data) {
|
|
257
|
+
const code = ch.charCodeAt(0);
|
|
258
|
+
if (code < 32 || code > 126) {
|
|
259
|
+
throw new Error(`Code 128 only supports ASCII 32-126 (invalid char: "${ch}")`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const START_B = 104;
|
|
263
|
+
const charValues = [...data].map((ch) => ch.charCodeAt(0) - 32);
|
|
264
|
+
let checksum = START_B;
|
|
265
|
+
for (let i = 0; i < charValues.length; i++) {
|
|
266
|
+
checksum += (i + 1) * charValues[i];
|
|
267
|
+
}
|
|
268
|
+
checksum %= 103;
|
|
269
|
+
const patterns = [C128_PATTERNS[START_B], ...charValues.map((v) => C128_PATTERNS[v]), C128_PATTERNS[checksum]];
|
|
270
|
+
const modules = [];
|
|
271
|
+
for (const pat of patterns) {
|
|
272
|
+
for (const w of pat)
|
|
273
|
+
modules.push(w);
|
|
274
|
+
}
|
|
275
|
+
for (const w of C128_STOP)
|
|
276
|
+
modules.push(w);
|
|
277
|
+
return [10, ...modules, 10];
|
|
278
|
+
}
|
|
279
|
+
function bitsToModules(bits) {
|
|
280
|
+
const modules = [];
|
|
281
|
+
let i = 0;
|
|
282
|
+
while (i < bits.length) {
|
|
283
|
+
let count = 1;
|
|
284
|
+
while (i + count < bits.length && bits[i + count] === bits[i])
|
|
285
|
+
count++;
|
|
286
|
+
modules.push(count);
|
|
287
|
+
i += count;
|
|
288
|
+
}
|
|
289
|
+
return modules;
|
|
290
|
+
}
|
|
291
|
+
function encodeEan13(data) {
|
|
292
|
+
const digits = data.replace(/\D/g, '');
|
|
293
|
+
if (digits.length !== 12 && digits.length !== 13) {
|
|
294
|
+
throw new Error('EAN-13 requires 12 or 13 digits');
|
|
295
|
+
}
|
|
296
|
+
const d = digits.split('').map(Number);
|
|
297
|
+
let nums;
|
|
298
|
+
if (d.length === 13) {
|
|
299
|
+
const expected = eanCheckDigit(d.slice(0, 12));
|
|
300
|
+
if (d[12] !== expected) {
|
|
301
|
+
throw new Error(`Invalid EAN-13 check digit (expected ${expected}, got ${d[12]})`);
|
|
302
|
+
}
|
|
303
|
+
nums = d;
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
nums = [...d, eanCheckDigit(d)];
|
|
307
|
+
}
|
|
308
|
+
const first = nums[0];
|
|
309
|
+
const parity = EAN13_PARITY[first];
|
|
310
|
+
let bits = '101';
|
|
311
|
+
for (let i = 0; i < 6; i++) {
|
|
312
|
+
bits += parity[i] ? EAN_G[nums[i + 1]] : EAN_L[nums[i + 1]];
|
|
313
|
+
}
|
|
314
|
+
bits += '01010';
|
|
315
|
+
for (let i = 7; i <= 12; i++) {
|
|
316
|
+
bits += EAN_R[nums[i]];
|
|
317
|
+
}
|
|
318
|
+
bits += '101';
|
|
319
|
+
return [7, ...bitsToModules(bits), 7];
|
|
320
|
+
}
|
|
321
|
+
function encodeEan8(data) {
|
|
322
|
+
const digits = data.replace(/\D/g, '');
|
|
323
|
+
if (digits.length !== 7 && digits.length !== 8) {
|
|
324
|
+
throw new Error('EAN-8 requires 7 or 8 digits');
|
|
325
|
+
}
|
|
326
|
+
const d = digits.split('').map(Number);
|
|
327
|
+
let nums;
|
|
328
|
+
if (d.length === 8) {
|
|
329
|
+
const expected = eanCheckDigit(d.slice(0, 7));
|
|
330
|
+
if (d[7] !== expected) {
|
|
331
|
+
throw new Error(`Invalid EAN-8 check digit (expected ${expected}, got ${d[7]})`);
|
|
332
|
+
}
|
|
333
|
+
nums = d;
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
nums = [...d, eanCheckDigit(d)];
|
|
337
|
+
}
|
|
338
|
+
let bits = '101';
|
|
339
|
+
for (let i = 0; i < 4; i++)
|
|
340
|
+
bits += EAN_L[nums[i]];
|
|
341
|
+
bits += '01010';
|
|
342
|
+
for (let i = 4; i < 8; i++)
|
|
343
|
+
bits += EAN_R[nums[i]];
|
|
344
|
+
bits += '101';
|
|
345
|
+
return [7, ...bitsToModules(bits), 7];
|
|
346
|
+
}
|
|
347
|
+
function encodeUpca(data) {
|
|
348
|
+
const digits = data.replace(/\D/g, '');
|
|
349
|
+
if (digits.length !== 11 && digits.length !== 12) {
|
|
350
|
+
throw new Error('UPC-A requires 11 or 12 digits');
|
|
351
|
+
}
|
|
352
|
+
return encodeEan13(digits.length === 11 ? `0${digits}` : `0${digits.slice(0, 11)}${digits[11]}`);
|
|
353
|
+
}
|
|
354
|
+
function encodeCode39(data) {
|
|
355
|
+
const upper = data.toUpperCase();
|
|
356
|
+
for (const ch of upper) {
|
|
357
|
+
if (!C39_CHARS[ch]) {
|
|
358
|
+
throw new Error(`Code 39 invalid character: "${ch}". Allowed: A-Z, 0-9, space, - . $ / + %`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const NARROW = 1;
|
|
362
|
+
const GAP = NARROW;
|
|
363
|
+
const modules = [NARROW * 10];
|
|
364
|
+
const encode = (ch) => C39_CHARS[ch];
|
|
365
|
+
const chars = ['*', ...upper, '*'];
|
|
366
|
+
for (let i = 0; i < chars.length; i++) {
|
|
367
|
+
const pat = encode(chars[i]);
|
|
368
|
+
for (const w of pat)
|
|
369
|
+
modules.push(w);
|
|
370
|
+
if (i < chars.length - 1)
|
|
371
|
+
modules.push(GAP);
|
|
372
|
+
}
|
|
373
|
+
modules.push(NARROW * 10);
|
|
374
|
+
return modules;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Generates a barcode image in SVG or PNG format.
|
|
378
|
+
*
|
|
379
|
+
* @param options.data - Data to encode (required)
|
|
380
|
+
* @param options.type - Barcode type: code128, ean13, ean8, upca, code39 (default: code128)
|
|
381
|
+
* @param options.width - Bar unit width in px (1–5, default 2)
|
|
382
|
+
* @param options.height - Bar height in px (50–300, default 100)
|
|
383
|
+
* @param options.format - Output format: svg or png (default: svg)
|
|
384
|
+
* @param options.color - Bar color hex (default: #000000)
|
|
385
|
+
* @param options.bg - Background color hex (default: #ffffff)
|
|
386
|
+
* @returns Object with contentType and body
|
|
387
|
+
* @throws Error if data is missing, invalid for the type, or parameters are out of range
|
|
388
|
+
*/
|
|
389
|
+
export default function barcode(options) {
|
|
390
|
+
if (!options.data)
|
|
391
|
+
throw new Error('Please provide data to encode (?data={string})');
|
|
392
|
+
const type = (options.type ?? 'code128');
|
|
393
|
+
const format = (options.format ?? 'svg');
|
|
394
|
+
const barWidth = clamp(options.width ?? 2, 1, 5);
|
|
395
|
+
const height = clamp(options.height ?? 100, 50, 300);
|
|
396
|
+
const color = normalizeColor(options.color, '#000000');
|
|
397
|
+
const bg = normalizeColor(options.bg, '#ffffff');
|
|
398
|
+
if (!VALID_TYPES.includes(type)) {
|
|
399
|
+
throw new Error(`Type must be one of: ${VALID_TYPES.join(', ')}`);
|
|
400
|
+
}
|
|
401
|
+
if (!VALID_FORMATS.includes(format)) {
|
|
402
|
+
throw new Error(`Format must be one of: ${VALID_FORMATS.join(', ')}`);
|
|
403
|
+
}
|
|
404
|
+
if (options.width !== undefined && (options.width < 1 || options.width > 5)) {
|
|
405
|
+
throw new Error('Width must be between 1 and 5');
|
|
406
|
+
}
|
|
407
|
+
if (options.height !== undefined && (options.height < 50 || options.height > 300)) {
|
|
408
|
+
throw new Error('Height must be between 50 and 300');
|
|
409
|
+
}
|
|
410
|
+
const encoders = {
|
|
411
|
+
code128: encodeCode128,
|
|
412
|
+
ean13: encodeEan13,
|
|
413
|
+
ean8: encodeEan8,
|
|
414
|
+
upca: encodeUpca,
|
|
415
|
+
code39: encodeCode39,
|
|
416
|
+
};
|
|
417
|
+
const modules = encoders[type](options.data);
|
|
418
|
+
const contentType = format === 'png' ? 'image/png' : 'image/svg+xml';
|
|
419
|
+
const body = format === 'png'
|
|
420
|
+
? renderPng(modules, barWidth, height, color, bg)
|
|
421
|
+
: renderSvg(modules, barWidth, height, color, bg);
|
|
422
|
+
return { contentType, body };
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=barcode.js.map
|