@20syldev/api 4.2.0 → 4.4.0

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 (98) hide show
  1. package/README.md +3 -3
  2. package/dist/app.js +4 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/config/versions.js +19 -0
  5. package/dist/config/versions.js.map +1 -1
  6. package/dist/constants.js +2 -2
  7. package/dist/constants.js.map +1 -1
  8. package/dist/modules/v3/chat.js +1 -1
  9. package/dist/modules/v3/chat.js.map +1 -1
  10. package/dist/modules/v3/domain.js +1 -1
  11. package/dist/modules/v3/domain.js.map +1 -1
  12. package/dist/modules/v3/hyperplanning.js +1 -1
  13. package/dist/modules/v3/hyperplanning.js.map +1 -1
  14. package/dist/modules/v3/personal.js +1 -1
  15. package/dist/modules/v3/personal.js.map +1 -1
  16. package/dist/modules/v3/username.js +1 -1
  17. package/dist/modules/v3/username.js.map +1 -1
  18. package/dist/modules/v4/captcha.js +60 -23
  19. package/dist/modules/v4/captcha.js.map +1 -1
  20. package/dist/modules/v4/chat.js +1 -1
  21. package/dist/modules/v4/chat.js.map +1 -1
  22. package/dist/modules/v4/color.js +44 -35
  23. package/dist/modules/v4/color.js.map +1 -1
  24. package/dist/modules/v4/colors.js +54 -0
  25. package/dist/modules/v4/colors.js.map +1 -0
  26. package/dist/modules/v4/convert.js +93 -19
  27. package/dist/modules/v4/convert.js.map +1 -1
  28. package/dist/modules/v4/domain.js +1 -1
  29. package/dist/modules/v4/domain.js.map +1 -1
  30. package/dist/modules/v4/hash.js +11 -4
  31. package/dist/modules/v4/hash.js.map +1 -1
  32. package/dist/modules/v4/hyperplanning.js +1 -1
  33. package/dist/modules/v4/hyperplanning.js.map +1 -1
  34. package/dist/modules/v4/palette.js +2 -43
  35. package/dist/modules/v4/palette.js.map +1 -1
  36. package/dist/modules/v4/personal.js +1 -1
  37. package/dist/modules/v4/personal.js.map +1 -1
  38. package/dist/modules/v4/placeholder.js +108 -52
  39. package/dist/modules/v4/placeholder.js.map +1 -1
  40. package/dist/modules/v4/qrcode.js +79 -6
  41. package/dist/modules/v4/qrcode.js.map +1 -1
  42. package/dist/modules/v4/username.js +1 -1
  43. package/dist/modules/v4/username.js.map +1 -1
  44. package/dist/modules/v4.js +6 -0
  45. package/dist/modules/v4.js.map +1 -1
  46. package/dist/routes/delete.js +16 -17
  47. package/dist/routes/delete.js.map +1 -1
  48. package/dist/routes/get.js +212 -13
  49. package/dist/routes/get.js.map +1 -1
  50. package/dist/routes/index.js +2 -2
  51. package/dist/routes/index.js.map +1 -1
  52. package/dist/routes/patch.js +2 -3
  53. package/dist/routes/patch.js.map +1 -1
  54. package/dist/routes/post.js +10 -3
  55. package/dist/routes/post.js.map +1 -1
  56. package/dist/utils/colors.js +54 -0
  57. package/dist/utils/colors.js.map +1 -0
  58. package/dist/utils/helpers.js +26 -0
  59. package/dist/utils/helpers.js.map +1 -0
  60. package/package.json +1 -1
  61. package/src/app.ts +4 -0
  62. package/src/config/versions.ts +16 -0
  63. package/src/constants.ts +0 -2
  64. package/src/middleware/cors.ts +1 -1
  65. package/src/modules/v4/captcha.ts +84 -27
  66. package/src/modules/v4/chat.ts +25 -2
  67. package/src/modules/v4/color.ts +56 -52
  68. package/src/modules/v4/convert.ts +100 -20
  69. package/src/modules/v4/domain.ts +1 -1
  70. package/src/modules/v4/geo.ts +53 -0
  71. package/src/modules/v4/hash.ts +18 -4
  72. package/src/modules/v4/hyperplanning.ts +1 -1
  73. package/src/modules/v4/palette.ts +63 -0
  74. package/src/modules/v4/personal.ts +1 -1
  75. package/src/modules/v4/placeholder.ts +189 -0
  76. package/src/modules/v4/qrcode.ts +108 -6
  77. package/src/modules/v4/tic_tac_toe.ts +33 -1
  78. package/src/modules/v4/username.ts +1 -1
  79. package/src/modules/v4.ts +3 -0
  80. package/src/routes/delete.ts +71 -0
  81. package/src/routes/get.ts +147 -15
  82. package/src/routes/patch.ts +44 -0
  83. package/src/routes/post.ts +11 -3
  84. package/src/utils/colors.ts +91 -0
  85. package/src/utils/helpers.ts +90 -0
  86. package/src/utils/response.ts +8 -0
  87. package/tests/integration/api.test.ts +113 -25
  88. package/tests/unit/captcha.test.ts +61 -0
  89. package/tests/unit/chat.test.ts +53 -0
  90. package/tests/unit/color.test.ts +24 -4
  91. package/tests/unit/convert.test.ts +26 -1
  92. package/tests/unit/geo.test.ts +45 -0
  93. package/tests/unit/hash.test.ts +17 -10
  94. package/tests/unit/palette.test.ts +53 -0
  95. package/tests/unit/placeholder.test.ts +57 -0
  96. package/tests/unit/qrcode.test.ts +82 -0
  97. package/tests/unit/tic_tac_toe.test.ts +55 -0
  98. package/src/modules/v4/utils.ts +0 -38
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,10 @@
1
1
  import { Router } from 'express';
2
2
  import { ticTacToeStorage } from '../storage/index.js';
3
3
  import { error } from '../utils/response.js';
4
- import { supportsRest } from '../utils/version.js';
5
4
  const router = Router();
6
- // Play a tic-tac-toe move (REST: PATCH /tic-tac-toe/:game)
5
+ // Play a tic-tac-toe move
7
6
  router.patch('/:version/tic-tac-toe/:game', (req, res) => {
8
- if (!supportsRest(req)) {
7
+ if (req.version !== 'v4') {
9
8
  error(res, 405, 'PATCH is only supported in v4+.', `${req.version}/tic-tac-toe`);
10
9
  return;
11
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB,2DAA2D;AAC3D,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACxE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,GAAG,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC;QACjF,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAc,CAAC;IACvC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAI,GAAG,CAAC,IAA+B,IAAI,EAAE,CAAC;IAE/E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAC;QACpE,OAAO;IACX,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,4CAA4C,CAAC,CAAC;QAC9D,OAAO;IACX,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,mDAAmD,CAAC,CAAC;QACrE,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;YAC1C,QAAQ;YACR,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,OAAO,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB,0BAA0B;AAC1B,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACxE,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,GAAG,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC;QACjF,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAc,CAAC;IACvC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAI,GAAG,CAAC,IAA+B,IAAI,EAAE,CAAC;IAE/E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAC;QACpE,OAAO;IACX,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,4CAA4C,CAAC,CAAC;QAC9D,OAAO;IACX,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,mDAAmD,CAAC,CAAC;QACrE,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;YAC1C,QAAQ;YACR,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,OAAO,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -58,7 +58,7 @@ router.post('/:version/chat/private', (req, res) => {
58
58
  });
59
59
  // Generate hash
60
60
  router.post('/:version/hash', (req, res) => {
61
- const { text, method } = req.body || {};
61
+ const { text, method, encoding } = req.body || {};
62
62
  if (!text) {
63
63
  error(res, 400, 'Please provide a text (?text={text})', `${req.version}/hash`);
64
64
  return;
@@ -68,8 +68,15 @@ router.post('/:version/hash', (req, res) => {
68
68
  return;
69
69
  }
70
70
  try {
71
- const result = req.module.hash(text, method);
72
- res.jsonResponse(result);
71
+ if (req.version === 'v4') {
72
+ const hashFn = req.module.hash;
73
+ const result = hashFn(text, method, encoding);
74
+ res.jsonResponse(result);
75
+ }
76
+ else {
77
+ const result = req.module.hash(text, method);
78
+ res.jsonResponse(result);
79
+ }
73
80
  }
74
81
  catch (err) {
75
82
  error(res, 400, err.message, `${req.version}/hash`);
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/routes/post.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/routes/post.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export function hexToRgb(hex) {
2
+ const clean = hex.replace('#', '');
3
+ if (!/^[0-9a-fA-F]{6}$/.test(clean))
4
+ throw new Error('Invalid HEX color (use #RRGGBB)');
5
+ return [parseInt(clean.slice(0, 2), 16), parseInt(clean.slice(2, 4), 16), parseInt(clean.slice(4, 6), 16)];
6
+ }
7
+ export function rgbToHsl(r, g, b) {
8
+ const r1 = r / 255, g1 = g / 255, b1 = b / 255;
9
+ const max = Math.max(r1, g1, b1), min = Math.min(r1, g1, b1);
10
+ const l = (max + min) / 2;
11
+ if (max === min)
12
+ return [0, 0, l];
13
+ const d = max - min;
14
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
15
+ let h = 0;
16
+ if (max === r1)
17
+ h = (g1 - b1) / d + (g1 < b1 ? 6 : 0);
18
+ else if (max === g1)
19
+ h = (b1 - r1) / d + 2;
20
+ else
21
+ h = (r1 - g1) / d + 4;
22
+ return [(h * 60 + 360) % 360, s, l];
23
+ }
24
+ export function hslToRgb(h, s, l) {
25
+ const c = (1 - Math.abs(2 * l - 1)) * s;
26
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
27
+ const m = l - c / 2;
28
+ let r1 = 0, g1 = 0, b1 = 0;
29
+ if (h < 60)
30
+ [r1, g1, b1] = [c, x, 0];
31
+ else if (h < 120)
32
+ [r1, g1, b1] = [x, c, 0];
33
+ else if (h < 180)
34
+ [r1, g1, b1] = [0, c, x];
35
+ else if (h < 240)
36
+ [r1, g1, b1] = [0, x, c];
37
+ else if (h < 300)
38
+ [r1, g1, b1] = [x, 0, c];
39
+ else
40
+ [r1, g1, b1] = [c, 0, x];
41
+ return [Math.round((r1 + m) * 255), Math.round((g1 + m) * 255), Math.round((b1 + m) * 255)];
42
+ }
43
+ export function rgbToHex(r, g, b) {
44
+ return `#${[r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('')}`;
45
+ }
46
+ export function normalizeColor(value, def) {
47
+ if (!value)
48
+ return def;
49
+ const clean = value.startsWith('#') ? value : `#${value}`;
50
+ if (!/^#([0-9a-fA-F]{3}){1,2}$/.test(clean))
51
+ throw new Error('Invalid color (use hex like ff6600)');
52
+ return clean;
53
+ }
54
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/utils/colors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACxF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACpD,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EACd,EAAE,GAAG,CAAC,GAAG,GAAG,EACZ,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;IACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAC5B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAElC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,GAAG,KAAK,EAAE;QAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,IAAI,GAAG,KAAK,EAAE;QAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;QACtC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE3B,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,IAAI,EAAE,GAAG,CAAC,EACN,EAAE,GAAG,CAAC,EACN,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAChC,IAAI,CAAC,GAAG,GAAG;QAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACtC,IAAI,CAAC,GAAG,GAAG;QAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACtC,IAAI,CAAC,GAAG,GAAG;QAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACtC,IAAI,CAAC,GAAG,GAAG;QAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;QACtC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACpD,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAyB,EAAE,GAAW;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IAC1D,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACpG,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,26 @@
1
+ export function random(arr) {
2
+ return arr[Math.floor(Math.random() * arr.length)];
3
+ }
4
+ export function randomNumber(min, max) {
5
+ return Math.floor(Math.random() * (max - min + 1)) + min;
6
+ }
7
+ export function genIP() {
8
+ return `${randomNumber(0, 255)}.${randomNumber(0, 255)}.${randomNumber(0, 255)}.${randomNumber(0, 255)}`;
9
+ }
10
+ export function formatDate(date) {
11
+ return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().replace('Z', '');
12
+ }
13
+ export function envList(key) {
14
+ const v = process.env[key];
15
+ return v && v !== 'undefined' ? v.split(' ') : null;
16
+ }
17
+ export function checkRateLimit(rateLimits, userId, timestamp, window = 10000, limit = 50) {
18
+ rateLimits[userId] = (rateLimits[userId] ?? []).filter((ts) => timestamp - ts < window);
19
+ if (rateLimits[userId].length > limit) {
20
+ const remainingTime = Math.ceil((rateLimits[userId][0] + window - timestamp) / 1000);
21
+ throw new Error(`Rate limit exceeded. Try again in ${remainingTime} seconds.`);
22
+ }
23
+ rateLimits[userId].push(timestamp);
24
+ return false;
25
+ }
26
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAI,GAAQ;IAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,GAAW;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,KAAK;IACjB,OAAO,GAAG,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU;IACjC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,cAAc,CAC1B,UAAoC,EACpC,MAAc,EACd,SAAiB,EACjB,MAAM,GAAG,KAAK,EACd,KAAK,GAAG,EAAE;IAEV,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;IAExF,IAAI,UAAU,CAAC,MAAM,CAAE,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAE,CAAC,CAAC,CAAE,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,qCAAqC,aAAa,WAAW,CAAC,CAAC;IACnF,CAAC;IAED,UAAU,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.2.0",
2
+ "version": "4.4.0",
3
3
  "name": "@20syldev/api",
4
4
  "description": "Node.js API with multiple features. Check the documentation at https://docs.sylvain.sh",
5
5
  "main": "dist/app.js",
package/src/app.ts CHANGED
@@ -9,6 +9,8 @@ import { versionCheckMiddleware, endpointCheckMiddleware } from './middleware/ve
9
9
  import indexRoutes from './routes/index.js';
10
10
  import getRoutes from './routes/get.js';
11
11
  import postRoutes from './routes/post.js';
12
+ import patchRoutes from './routes/patch.js';
13
+ import deleteRoutes from './routes/delete.js';
12
14
 
13
15
  const app = express();
14
16
 
@@ -37,6 +39,8 @@ app.use('/:version/:endpoint', endpointCheckMiddleware);
37
39
  // Versioned routes
38
40
  app.use(getRoutes);
39
41
  app.use(postRoutes);
42
+ app.use(patchRoutes);
43
+ app.use(deleteRoutes);
40
44
 
41
45
  // Start server
42
46
  if (process.env.NODE_ENV !== 'test') {
@@ -78,8 +78,24 @@ const v3 = {
78
78
 
79
79
  const v4 = {
80
80
  get: merge(v3.get, [
81
+ {
82
+ name: 'captcha',
83
+ path: '/captcha(&text={text}&length={n}&width={px}&height={px}&noise={low|medium|high}&bg={hex}&color={hex})',
84
+ },
85
+ { name: 'color', path: '/color(&hex={hex})' },
86
+ { name: 'convert', path: '/convert?value={value}&from={unit}&to={unit}' },
81
87
  { name: 'dice', path: '/dice?roll={NdX+M}' },
82
88
  { name: 'encode', path: '/encode?method={method}&text={text}(&shift={shift})' },
89
+ { name: 'geo', path: '/geo?lat1={lat}&lon1={lon}&lat2={lat}&lon2={lon}' },
90
+ { name: 'palette', path: '/palette?color={#hex}&type={type}' },
91
+ {
92
+ name: 'qrcode',
93
+ path: '/qrcode?url={URL}(&size={px}&margin={n}&correction={L|M|Q|H}&dark={hex}&light={hex}&icon={URL}&iconSize={px}&iconPadding={px}&iconRadius={px}&format={png|base64})',
94
+ },
95
+ {
96
+ name: 'placeholder',
97
+ path: '/placeholder?type={image|skeleton}&width={w}&height={h}(&bg={hex}&color={hex}&text={text}&rows={n}&avatar={bool})',
98
+ },
83
99
  { name: 'statistics', path: '/statistics?values={n1,n2,n3,...}' },
84
100
  { name: 'text', path: '/text?method={method}(&value={value}&type={type}&count={count}&lang={lang})' },
85
101
  { name: 'validate', path: '/validate?type={type}&value={value}' },
package/src/constants.ts CHANGED
@@ -14,8 +14,6 @@ export const MAX_GCD_VALUE = 100_000;
14
14
  export const MAX_PRIME_LIST = 10_000;
15
15
  export const MAX_LEVENSHTEIN_LENGTH = 1000;
16
16
  export const MAX_STRING_LENGTH = 1000;
17
- export const MIN_TEMPERATURE = -273.15;
18
- export const MAX_TEMPERATURE = 1_000_000;
19
17
  export const DOCS_URL = 'https://docs.sylvain.sh';
20
18
  export const DEFAULT_PORT = 3000;
21
19
 
@@ -8,7 +8,7 @@ const __dirname = dirname(__filename);
8
8
 
9
9
  export function setupCors(app: Express): void {
10
10
  app.set('trust proxy', 1);
11
- app.use(cors({ methods: ['GET', 'POST'] }));
11
+ app.use(cors({ methods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'] }));
12
12
  app.use(express.urlencoded({ extended: true }));
13
13
  app.use(express.json());
14
14
 
@@ -1,49 +1,106 @@
1
1
  import { createCanvas } from 'canvas';
2
+ import { normalizeColor } from '../../utils/colors.js';
2
3
 
3
- export default function captcha(text: string): Buffer {
4
- if (!text) throw new Error('Text is required to generate a captcha.');
4
+ export interface CaptchaOptions {
5
+ text?: string;
6
+ length?: number;
7
+ width?: number;
8
+ height?: number;
9
+ noise?: 'low' | 'medium' | 'high';
10
+ bg?: string;
11
+ color?: string;
12
+ }
13
+
14
+ export interface CaptchaResult {
15
+ contentType: string;
16
+ body: Buffer;
17
+ text: string;
18
+ }
19
+
20
+ const NOISE_LEVELS = new Set(['low', 'medium', 'high']);
21
+ const NOISE_CONFIG = { low: { lines: 8, dots: 80 }, medium: { lines: 25, dots: 300 }, high: { lines: 50, dots: 600 } };
22
+ const CHARSET = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
23
+
24
+ function generateText(length: number): string {
25
+ let result = '';
26
+ for (let i = 0; i < length; i++) {
27
+ result += CHARSET[Math.floor(Math.random() * CHARSET.length)];
28
+ }
29
+ return result;
30
+ }
31
+
32
+ function clamp(value: number | undefined, name: string, def: number, min: number, max: number): number {
33
+ if (value === undefined) return def;
34
+ if (isNaN(value)) throw new Error(`${name} must be a number`);
35
+ if (value < min || value > max) throw new Error(`${name} must be between ${min} and ${max}`);
36
+ return Math.floor(value);
37
+ }
38
+
39
+ export default function captcha(options: CaptchaOptions): CaptchaResult {
40
+ const text = options.text || generateText(clamp(options.length, 'length', 6, 1, 20));
41
+ const height = clamp(options.height, 'height', 120, 50, 400);
42
+ const width = clamp(options.width, 'width', text.length * 60, 100, 800);
43
+
44
+ const noise = options.noise ?? 'medium';
45
+ if (!NOISE_LEVELS.has(noise)) throw new Error('noise must be one of: low, medium, high');
46
+ const { lines, dots } = NOISE_CONFIG[noise];
47
+
48
+ const bg = normalizeColor(options.bg, '#ffffff');
49
+ const baseColor = options.color ? normalizeColor(options.color, '#000000') : undefined;
5
50
 
6
- const size = 60,
7
- font = '60px Comic Sans Ms',
8
- width = text.length * size,
9
- height = 120;
10
- const canvas = createCanvas(width, height),
11
- ctx = canvas.getContext('2d');
51
+ const canvas = createCanvas(width, height);
52
+ const ctx = canvas.getContext('2d');
12
53
 
13
- ctx.fillStyle = 'white';
54
+ ctx.fillStyle = bg;
14
55
  ctx.fillRect(0, 0, width, height);
15
56
 
16
- for (let i = 0; i < 20; i++) {
17
- ctx.strokeStyle = 'rgba(0, 0, 0, 0.3)';
57
+ for (let i = 0; i < lines; i++) {
58
+ ctx.strokeStyle = `rgba(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${0.3 + Math.random() * 0.4})`;
18
59
  ctx.beginPath();
19
- ctx.moveTo(Math.random() * width, Math.random() * height);
20
- ctx.lineTo(Math.random() * width, Math.random() * height);
21
- ctx.lineWidth = Math.random() * 2;
60
+ const x0 = Math.random() * width,
61
+ y0 = Math.random() * height;
62
+ ctx.moveTo(x0, y0);
63
+ ctx.bezierCurveTo(
64
+ Math.random() * width,
65
+ Math.random() * height,
66
+ Math.random() * width,
67
+ Math.random() * height,
68
+ Math.random() * width,
69
+ Math.random() * height,
70
+ );
71
+ ctx.lineWidth = 1 + Math.random() * 2;
22
72
  ctx.stroke();
23
73
  }
24
74
 
25
- let x = (canvas.width + 20 - width) / 2;
75
+ const baseFontSize = Math.floor(height * 0.5);
76
+ const charWidth = width / (text.length + 0.5);
77
+ let x = charWidth * 0.25;
26
78
 
27
79
  for (let i = 0; i < text.length; i++) {
28
- const offsetX = Math.cos(i * 0.3) * 10,
29
- y = height / 2.5 + Math.floor(Math.random() * (height / 2));
80
+ const size = Math.floor(baseFontSize * (0.8 + Math.random() * 0.4));
81
+ const y = height / 2 + (Math.random() - 0.5) * height * 0.3;
30
82
 
31
- ctx.font = font;
32
- ctx.fillStyle = `rgb(${Math.floor(Math.random() * 192)}, ${Math.floor(Math.random() * 192)}, ${Math.floor(Math.random() * 192)})`;
83
+ ctx.font = `${size}px Comic Sans Ms`;
84
+ if (baseColor) {
85
+ ctx.fillStyle = baseColor;
86
+ } else {
87
+ ctx.fillStyle = `rgb(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)})`;
88
+ }
33
89
 
34
90
  ctx.save();
35
- ctx.translate(x + size / 2, y);
36
- ctx.rotate((Math.random() - 0.5) * 0.5);
37
- ctx.fillText(text[i]!, -size / 2 + offsetX, 0);
91
+ ctx.translate(x + charWidth / 2, y);
92
+ ctx.rotate((Math.random() - 0.5) * 1.2);
93
+ ctx.fillText(text[i]!, -charWidth / 2, 0);
38
94
  ctx.restore();
39
95
 
40
- x += size;
96
+ x += charWidth;
41
97
  }
42
98
 
43
- for (let i = 0; i < 200; i++) {
44
- ctx.fillStyle = 'black';
45
- ctx.fillRect(Math.floor(Math.random() * width), Math.floor(Math.random() * height), 1.2, 1.2);
99
+ for (let i = 0; i < dots; i++) {
100
+ ctx.fillStyle = `rgba(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${0.4 + Math.random() * 0.5})`;
101
+ const dotSize = 1 + Math.random() * 2;
102
+ ctx.fillRect(Math.floor(Math.random() * width), Math.floor(Math.random() * height), dotSize, dotSize);
46
103
  }
47
104
 
48
- return canvas.toBuffer('image/png');
105
+ return { contentType: 'image/png', body: canvas.toBuffer('image/png'), text };
49
106
  }
@@ -1,4 +1,4 @@
1
- import { checkRateLimit } from './utils.js';
1
+ import { checkRateLimit } from '../../utils/helpers.js';
2
2
  import { SESSION_TTL } from '../../constants.js';
3
3
  import type { ChatStorage, ChatMessage } from '../../types/storage.js';
4
4
 
@@ -34,8 +34,10 @@ export default function chat(action: string, params: ChatParams): ChatMessage[]
34
34
  return getPrivateChat(params, privateChats);
35
35
  } else if (action === 'fetch') {
36
36
  return fetchMessages(messages);
37
+ } else if (action === 'clear') {
38
+ return clearPrivateChat(params, privateChats, sessions, u);
37
39
  } else {
38
- throw new Error('Invalid action. Use "message", "private", or "fetch"');
40
+ throw new Error('Invalid action. Use "message", "private", "fetch", or "clear"');
39
41
  }
40
42
  }
41
43
 
@@ -97,3 +99,24 @@ function fetchMessages(messages: ChatMessage[]): ChatMessage[] {
97
99
  if (messages.length > 0) return messages;
98
100
  throw new Error('No messages stored.');
99
101
  }
102
+
103
+ function clearPrivateChat(
104
+ params: ChatParams,
105
+ privateChats: Record<string, ChatMessage[]>,
106
+ sessions: Record<string, { user: string; last: number }>,
107
+ u: string,
108
+ ): { message: string } {
109
+ const { token, session } = params;
110
+
111
+ if (!token) throw new Error('Please provide a valid token');
112
+ if (!session) throw new Error('Please provide a valid session ID');
113
+ if (sessions[u] && sessions[u].user !== session) {
114
+ throw new Error('Session ID mismatch');
115
+ }
116
+ if (!privateChats[token]) throw new Error('Invalid or expired token.');
117
+
118
+ delete privateChats[token];
119
+ delete sessions[u];
120
+
121
+ return { message: 'Private chat cleared successfully' };
122
+ }
@@ -1,62 +1,66 @@
1
- export default function color(): Record<string, string> {
2
- const r = Math.floor(Math.random() * 256),
3
- g = Math.floor(Math.random() * 256),
4
- b = Math.floor(Math.random() * 256);
1
+ import { hexToRgb, rgbToHsl, rgbToHex } from '../../utils/colors.js';
2
+
3
+ export interface ColorResult {
4
+ hex: string;
5
+ rgb: string;
6
+ hsl: string;
7
+ hsv: string;
8
+ hwb: string;
9
+ cmyk: string;
10
+ }
11
+
12
+ function rgbToHsv(r: number, g: number, b: number): [number, number, number] {
13
+ const max = Math.max(r, g, b),
14
+ min = Math.min(r, g, b),
15
+ v = max / 255,
16
+ s = max ? (max - min) / max : 0;
17
+
18
+ if (max === min) return [0, s * 100, v * 100];
19
+
20
+ let h = 0;
21
+ const d = max - min;
22
+ if (max === r) h = (g - b) / d + (g < b ? 6 : 0);
23
+ else if (max === g) h = (b - r) / d + 2;
24
+ else h = (r - g) / d + 4;
5
25
 
6
- const hsl = ((): [number, number, number] => {
7
- const r1 = r / 255,
8
- g1 = g / 255,
9
- b1 = b / 255,
10
- max = Math.max(r1, g1, b1),
11
- min = Math.min(r1, g1, b1),
12
- l = (max + min) / 2;
13
- if (max === min) return [0, 0, l * 100];
14
- const d = max - min,
15
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
16
- const h =
17
- {
18
- [r1]: (g1 - b1) / d + (g1 < b1 ? 6 : 0),
19
- [g1]: (b1 - r1) / d + 2,
20
- [b1]: (r1 - g1) / d + 4,
21
- }[max] ?? 0;
22
- return [(h * 60) % 360, s * 100, l * 100];
23
- })();
26
+ return [(h * 60) % 360, s * 100, v * 100];
27
+ }
28
+
29
+ function rgbToHwb(r: number, g: number, b: number): [number, number, number] {
30
+ const [h] = rgbToHsv(r, g, b);
31
+ const whiteness = Math.min(r, g, b) / 255;
32
+ const blackness = 1 - Math.max(r, g, b) / 255;
33
+ return [h, whiteness * 100, blackness * 100];
34
+ }
24
35
 
25
- const hsv = ((): [number, number, number] => {
26
- const max = Math.max(r, g, b),
27
- min = Math.min(r, g, b),
28
- v = max / 255,
29
- s = max ? (max - min) / max : 0;
30
- const h =
31
- max === min
32
- ? 0
33
- : ({
34
- [r]: (g - b) / (max - min),
35
- [g]: 2 + (b - r) / (max - min),
36
- [b]: 4 + (r - g) / (max - min),
37
- }[max] ?? 0);
38
- return [(h * 60) % 360, s * 100, v * 100];
39
- })();
36
+ function rgbToCmyk(r: number, g: number, b: number): [number, number, number, number] {
37
+ const k = 1 - Math.max(r, g, b) / 255;
38
+ const c = (1 - r / 255 - k) / (1 - k) || 0;
39
+ const m = (1 - g / 255 - k) / (1 - k) || 0;
40
+ const y = (1 - b / 255 - k) / (1 - k) || 0;
41
+ return [c * 100, m * 100, y * 100, k * 100];
42
+ }
43
+
44
+ export default function color(hex?: string): ColorResult {
45
+ let r: number, g: number, b: number;
40
46
 
41
- const hwb = ((): [number, number, number] => {
42
- const [h] = hsv,
43
- whiteness = Math.min(r, g, b) / 255,
44
- blackness = 1 - Math.max(r, g, b) / 255;
45
- return [h, whiteness * 100, blackness * 100];
46
- })();
47
+ if (hex) {
48
+ [r, g, b] = hexToRgb(hex);
49
+ } else {
50
+ r = Math.floor(Math.random() * 256);
51
+ g = Math.floor(Math.random() * 256);
52
+ b = Math.floor(Math.random() * 256);
53
+ }
47
54
 
48
- const cmyk = ((): [number, number, number, number] => {
49
- const k = 1 - Math.max(r, g, b) / 255,
50
- c = (1 - r / 255 - k) / (1 - k) || 0,
51
- m = (1 - g / 255 - k) / (1 - k) || 0,
52
- y = (1 - b / 255 - k) / (1 - k) || 0;
53
- return [c * 100, m * 100, y * 100, k * 100];
54
- })();
55
+ const [h, s, l] = rgbToHsl(r, g, b);
56
+ const hsv = rgbToHsv(r, g, b);
57
+ const hwb = rgbToHwb(r, g, b);
58
+ const cmyk = rgbToCmyk(r, g, b);
55
59
 
56
60
  return {
57
- hex: `#${[r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('')}`,
61
+ hex: rgbToHex(r, g, b),
58
62
  rgb: `rgb(${r}, ${g}, ${b})`,
59
- hsl: `hsl(${hsl[0].toFixed(1)}, ${hsl[1].toFixed(1)}%, ${hsl[2].toFixed(1)}%)`,
63
+ hsl: `hsl(${h.toFixed(1)}, ${(s * 100).toFixed(1)}%, ${(l * 100).toFixed(1)}%)`,
60
64
  hsv: `hsv(${hsv[0].toFixed(1)}, ${hsv[1].toFixed(1)}%, ${hsv[2].toFixed(1)}%)`,
61
65
  hwb: `hwb(${hwb[0].toFixed(1)}, ${hwb[1].toFixed(1)}%, ${hwb[2].toFixed(1)}%)`,
62
66
  cmyk: `cmyk(${cmyk.map((x) => x.toFixed(1)).join('%, ')}%)`,