@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.
Files changed (49) hide show
  1. package/README.md +3 -3
  2. package/dist/app.js +7 -2
  3. package/dist/app.js.map +1 -1
  4. package/dist/middleware/ratelimit.js +1 -1
  5. package/dist/middleware/ratelimit.js.map +1 -1
  6. package/dist/modules/v5/address.js +20 -0
  7. package/dist/modules/v5/address.js.map +1 -0
  8. package/dist/modules/v5/algorithms.js +39 -0
  9. package/dist/modules/v5/algorithms.js.map +1 -0
  10. package/dist/modules/v5/asymmetric.js +10 -3
  11. package/dist/modules/v5/asymmetric.js.map +1 -1
  12. package/dist/modules/v5/barcode.js +424 -0
  13. package/dist/modules/v5/barcode.js.map +1 -0
  14. package/dist/modules/v5/case.js +2 -0
  15. package/dist/modules/v5/case.js.map +1 -1
  16. package/dist/modules/v5/chart.js +16 -10
  17. package/dist/modules/v5/chart.js.map +1 -1
  18. package/dist/modules/v5/chat.js +107 -0
  19. package/dist/modules/v5/chat.js.map +1 -0
  20. package/dist/modules/v5/evaluate.js +8 -5
  21. package/dist/modules/v5/evaluate.js.map +1 -1
  22. package/dist/modules/v5/jwt.js +11 -4
  23. package/dist/modules/v5/jwt.js.map +1 -1
  24. package/dist/modules/v5/matrix.js +5 -4
  25. package/dist/modules/v5/matrix.js.map +1 -1
  26. package/dist/modules/v5/otp.js +16 -7
  27. package/dist/modules/v5/otp.js.map +1 -1
  28. package/dist/modules/v5/symmetric.js +36 -19
  29. package/dist/modules/v5/symmetric.js.map +1 -1
  30. package/dist/modules/v5/text.js +12 -0
  31. package/dist/modules/v5/text.js.map +1 -0
  32. package/dist/modules/v5/tic_tac_toe.js +226 -0
  33. package/dist/modules/v5/tic_tac_toe.js.map +1 -0
  34. package/dist/modules/v5.js +7 -1
  35. package/dist/modules/v5.js.map +1 -1
  36. package/dist/routes/get.js +64 -48
  37. package/dist/routes/get.js.map +1 -1
  38. package/dist/routes/index.js +4 -1
  39. package/dist/routes/index.js.map +1 -1
  40. package/dist/routes/post.js +1 -1
  41. package/dist/utils/helpers.js +6 -1
  42. package/dist/utils/helpers.js.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/modules/v4/colors.js +0 -54
  45. package/dist/modules/v4/colors.js.map +0 -1
  46. package/dist/modules/v4/utils.js +0 -26
  47. package/dist/modules/v4/utils.js.map +0 -1
  48. package/dist/utils/version.js +0 -3
  49. 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
- [![Version](https://custom-icon-badges.demolab.com/badge/Version%20:-v5.3.0-6479ee?logo=api.sylvain.sh&labelColor=23272A)](https://github.com/20syldev/api/releases/latest)
6
+ [![Version](https://custom-icon-badges.demolab.com/badge/Version%20:-v5.4.0-6479ee?logo=api.sylvain.sh&labelColor=23272A)](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.3.0 build
44
+ > @20syldev/api@5.4.0 build
45
45
  > tsc
46
46
 
47
- > @20syldev/api@5.3.0 start
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,OAAO,MAAM,SAAS,CAAC;AAE9B,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;AAE1C,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,iBAAiB;AACjB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEtB,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,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"}
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":"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"}
1
+ {"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"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"}
@@ -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
- const modulusLength = options.modulusLength ?? 2048;
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: options.publicKey, oaepHash: algo.oaepHash, padding: cryptoConstants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(options.text, 'utf8'));
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":"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"}
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