emailengine-app 2.65.0 → 2.67.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 (50) hide show
  1. package/.github/workflows/deploy.yml +8 -8
  2. package/.github/workflows/release.yaml +9 -9
  3. package/.github/workflows/test.yml +2 -2
  4. package/CHANGELOG.md +53 -0
  5. package/bin/emailengine.js +3 -0
  6. package/data/google-crawlers.json +7 -1
  7. package/lib/account.js +35 -29
  8. package/lib/consts.js +5 -0
  9. package/lib/email-client/gmail-client.js +23 -27
  10. package/lib/email-client/imap/mailbox.js +46 -19
  11. package/lib/email-client/imap/sync-operations.js +51 -19
  12. package/lib/email-client/imap-client.js +28 -5
  13. package/lib/email-client/outlook-client.js +155 -1
  14. package/lib/oauth/gmail.js +52 -1
  15. package/lib/passkeys.js +206 -0
  16. package/lib/routes-ui.js +522 -21
  17. package/lib/ui-routes/oauth-routes.js +6 -1
  18. package/package.json +13 -11
  19. package/sbom.json +1 -1
  20. package/static/js/login-passkey.js +75 -0
  21. package/static/js/passkey-register.js +107 -0
  22. package/static/licenses.html +238 -38
  23. package/static/vendor/handlebars/handlebars.min-v4.7.9.js +29 -0
  24. package/static/vendor/simplewebauthn/browser.min.js +2 -0
  25. package/translations/de.mo +0 -0
  26. package/translations/de.po +91 -53
  27. package/translations/en.mo +0 -0
  28. package/translations/en.po +84 -52
  29. package/translations/et.mo +0 -0
  30. package/translations/et.po +95 -60
  31. package/translations/fr.mo +0 -0
  32. package/translations/fr.po +102 -65
  33. package/translations/ja.mo +0 -0
  34. package/translations/ja.po +93 -57
  35. package/translations/messages.pot +101 -76
  36. package/translations/nl.mo +0 -0
  37. package/translations/nl.po +92 -56
  38. package/translations/pl.mo +0 -0
  39. package/translations/pl.po +106 -70
  40. package/views/account/login.hbs +35 -25
  41. package/views/account/password.hbs +4 -4
  42. package/views/account/security.hbs +101 -12
  43. package/views/account/totp.hbs +3 -3
  44. package/views/config/oauth/app.hbs +25 -0
  45. package/views/layout/app.hbs +2 -2
  46. package/views/layout/login.hbs +6 -1
  47. package/views/oauth-scope-error.hbs +29 -0
  48. package/workers/api.js +81 -3
  49. package/workers/imap.js +4 -0
  50. package/static/vendor/handlebars/handlebars.min-v4.7.7.js +0 -29
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ document.addEventListener('DOMContentLoaded', function () {
4
+ var passkeyBtn = document.getElementById('passkey-login-btn');
5
+ if (!passkeyBtn) {
6
+ return;
7
+ }
8
+
9
+ if (typeof SimpleWebAuthnBrowser === 'undefined' || !SimpleWebAuthnBrowser.browserSupportsWebAuthn()) {
10
+ passkeyBtn.style.display = 'none';
11
+ return;
12
+ }
13
+
14
+ passkeyBtn.addEventListener('click', async function () {
15
+ var errorEl = document.getElementById('passkey-error');
16
+ errorEl.style.display = 'none';
17
+ passkeyBtn.disabled = true;
18
+ passkeyBtn.textContent = 'Waiting for passkey...';
19
+
20
+ try {
21
+ var crumbInput = document.getElementById('crumb');
22
+ var crumbValue = crumbInput ? crumbInput.value : '';
23
+
24
+ var optionsResp = await fetch('/admin/passkey/auth/options', {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({ crumb: crumbValue })
28
+ });
29
+
30
+ var optionsData = await optionsResp.json();
31
+
32
+ if (!optionsResp.ok || optionsData.error) {
33
+ throw new Error(
34
+ optionsData.error === 'no_passkeys' ? 'No passkeys have been registered.' : optionsData.error || 'Could not start authentication.'
35
+ );
36
+ }
37
+
38
+ var authResponse = await SimpleWebAuthnBrowser.startAuthentication({ optionsJSON: optionsData.options });
39
+
40
+ var nextInput = document.querySelector('input[name="next"]');
41
+ var nextValue = nextInput ? nextInput.value : '';
42
+
43
+ var verifyResp = await fetch('/admin/passkey/auth/verify', {
44
+ method: 'POST',
45
+ headers: { 'Content-Type': 'application/json' },
46
+ body: JSON.stringify({
47
+ crumb: crumbValue,
48
+ challengeId: optionsData.challengeId,
49
+ credential: authResponse,
50
+ next: nextValue,
51
+ // Reads the hidden "remember" input; always "Y" (persistent sessions hardcoded, no UI toggle)
52
+ remember: (document.querySelector('input[name="remember"]') || {}).value || false
53
+ })
54
+ });
55
+
56
+ var verifyData = await verifyResp.json();
57
+
58
+ if (verifyData.success) {
59
+ window.location.href = verifyData.redirect || '/admin';
60
+ } else {
61
+ throw new Error(verifyData.error || 'Authentication failed.');
62
+ }
63
+ } catch (err) {
64
+ if (err.name === 'NotAllowedError') {
65
+ errorEl.textContent = 'Passkey authentication was cancelled or timed out.';
66
+ } else {
67
+ errorEl.textContent = err.message || 'Passkey authentication failed.';
68
+ }
69
+ errorEl.style.display = 'block';
70
+ } finally {
71
+ passkeyBtn.disabled = false;
72
+ passkeyBtn.textContent = 'Sign in with a passkey';
73
+ }
74
+ });
75
+ });
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ document.addEventListener('DOMContentLoaded', function () {
4
+ var registerBtn = document.getElementById('register-passkey-btn');
5
+ if (!registerBtn) {
6
+ return;
7
+ }
8
+
9
+ if (typeof SimpleWebAuthnBrowser === 'undefined' || !SimpleWebAuthnBrowser.browserSupportsWebAuthn()) {
10
+ registerBtn.disabled = true;
11
+ registerBtn.title = 'Your browser does not support passkeys';
12
+ return;
13
+ }
14
+
15
+ registerBtn.addEventListener('click', function () {
16
+ var nameInput = document.getElementById('passkey-name');
17
+ if (nameInput) {
18
+ nameInput.value = '';
19
+ }
20
+ var passwordInput = document.getElementById('passkey-current-password');
21
+ if (passwordInput) {
22
+ passwordInput.value = '';
23
+ }
24
+ var errorEl = document.getElementById('passkey-register-error');
25
+ var successEl = document.getElementById('passkey-register-success');
26
+ if (errorEl) {
27
+ errorEl.style.display = 'none';
28
+ }
29
+ if (successEl) {
30
+ successEl.style.display = 'none';
31
+ }
32
+ var confirmBtn = document.getElementById('passkey-register-confirm-btn');
33
+ if (confirmBtn) {
34
+ confirmBtn.disabled = false;
35
+ }
36
+ $('#registerPasskeyModal').modal('show');
37
+ });
38
+
39
+ var confirmBtn = document.getElementById('passkey-register-confirm-btn');
40
+ if (!confirmBtn) {
41
+ return;
42
+ }
43
+
44
+ confirmBtn.addEventListener('click', async function () {
45
+ var errorEl = document.getElementById('passkey-register-error');
46
+ var successEl = document.getElementById('passkey-register-success');
47
+ errorEl.style.display = 'none';
48
+ successEl.style.display = 'none';
49
+ confirmBtn.disabled = true;
50
+
51
+ var nameInput = document.getElementById('passkey-name');
52
+ var name = (nameInput && nameInput.value.trim()) || 'Unnamed passkey';
53
+
54
+ var passwordInput = document.getElementById('passkey-current-password');
55
+ var password = passwordInput ? passwordInput.value : '';
56
+
57
+ var crumbInput = document.getElementById('security-crumb');
58
+ var crumbValue = crumbInput ? crumbInput.value : '';
59
+
60
+ try {
61
+ var optionsResp = await fetch('/admin/account/passkeys/register/options', {
62
+ method: 'POST',
63
+ headers: { 'Content-Type': 'application/json' },
64
+ body: JSON.stringify({ crumb: crumbValue, password: password })
65
+ });
66
+
67
+ if (!optionsResp.ok) {
68
+ var errData = await optionsResp.json();
69
+ throw new Error(errData.error || 'Could not start registration.');
70
+ }
71
+
72
+ var optionsData = await optionsResp.json();
73
+
74
+ var regResponse = await SimpleWebAuthnBrowser.startRegistration({ optionsJSON: optionsData.options });
75
+
76
+ var verifyResp = await fetch('/admin/account/passkeys/register/verify', {
77
+ method: 'POST',
78
+ headers: { 'Content-Type': 'application/json' },
79
+ body: JSON.stringify({
80
+ crumb: crumbValue,
81
+ challengeId: optionsData.challengeId,
82
+ name: name,
83
+ credential: regResponse
84
+ })
85
+ });
86
+
87
+ var verifyData = await verifyResp.json();
88
+
89
+ if (verifyData.success) {
90
+ successEl.style.display = 'block';
91
+ setTimeout(function () {
92
+ window.location.reload();
93
+ }, 1000);
94
+ } else {
95
+ throw new Error(verifyData.error || 'Registration failed.');
96
+ }
97
+ } catch (err) {
98
+ if (err.name === 'NotAllowedError') {
99
+ errorEl.textContent = 'Passkey registration was cancelled or timed out.';
100
+ } else {
101
+ errorEl.textContent = err.message || 'Registration failed.';
102
+ }
103
+ errorEl.style.display = 'block';
104
+ confirmBtn.disabled = false;
105
+ }
106
+ });
107
+ });
@@ -1,6 +1,6 @@
1
1
  <!doctype html><html><head><meta charset="utf-8"><title>EmailEngine Licenses</title><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous"></head><body>
2
2
  <div class="container-fluid">
3
- <h1>EmailEngine v2.64.0</h1><p>EmailEngine includes code from the following software packages:</p>
3
+ <h1>EmailEngine v2.66.0</h1><p>EmailEngine includes code from the following software packages:</p>
4
4
  <table class="table table-sm">
5
5
  <tr><thead class="thead-dark"><th>Package</th><th>Version</th><th>License</th><th>Publisher</th><th>Publisher's Email</th><th>Package URL</th></tr>
6
6
  <tbody>
@@ -216,7 +216,7 @@
216
216
  </tr>
217
217
  <tr>
218
218
  <td><a href="https://npmjs.com/package/@csstools/css-syntax-patches-for-csstree">@csstools/css-syntax-patches-for-csstree</a></td>
219
- <td>1.1.1</td>
219
+ <td>1.1.2</td>
220
220
  <td>MIT-0</td>
221
221
  <td></td>
222
222
  <td></td>
@@ -735,6 +735,16 @@
735
735
  </td
736
736
  </tr>
737
737
  <tr>
738
+ <td><a href="https://npmjs.com/package/@hexagon/base64">@hexagon/base64</a></td>
739
+ <td>1.1.28</td>
740
+ <td>MIT</td>
741
+ <td>Hexagon</td>
742
+ <td>github.com/hexagon</td>
743
+ <td>
744
+ <a href="https://github.com/hexagon/base64">github.com/hexagon/base64</a>
745
+ </td
746
+ </tr>
747
+ <tr>
738
748
  <td><a href="https://npmjs.com/package/@humanfs/core">@humanfs/core</a></td>
739
749
  <td>0.19.1</td>
740
750
  <td>Apache-2.0</td>
@@ -776,16 +786,6 @@
776
786
  </tr>
777
787
  <tr>
778
788
  <td><a href="https://npmjs.com/package/@ioredis/commands">@ioredis/commands</a></td>
779
- <td>1.5.0</td>
780
- <td>MIT</td>
781
- <td>Zihua Li</td>
782
- <td>i@zihua.li</td>
783
- <td>
784
- <a href="https://github.com/ioredis/commands">github.com/ioredis/commands</a>
785
- </td
786
- </tr>
787
- <tr>
788
- <td><a href="https://npmjs.com/package/@ioredis/commands">@ioredis/commands</a></td>
789
789
  <td>1.5.1</td>
790
790
  <td>MIT</td>
791
791
  <td>Zihua Li</td>
@@ -815,6 +815,16 @@
815
815
  </td
816
816
  </tr>
817
817
  <tr>
818
+ <td><a href="https://npmjs.com/package/@levischuck/tiny-cbor">@levischuck/tiny-cbor</a></td>
819
+ <td>0.2.11</td>
820
+ <td>MIT</td>
821
+ <td></td>
822
+ <td></td>
823
+ <td>
824
+ <a href="https://github.com/levischuck/tiny-cbor">github.com/levischuck/tiny-cbor</a>
825
+ </td
826
+ </tr>
827
+ <tr>
818
828
  <td><a href="https://npmjs.com/package/@msgpackr-extract/msgpackr-extract-darwin-arm64">@msgpackr-extract/msgpackr-extract-darwin-arm64</a></td>
819
829
  <td>3.0.3</td>
820
830
  <td>MIT</td>
@@ -836,7 +846,7 @@
836
846
  </tr>
837
847
  <tr>
838
848
  <td><a href="https://npmjs.com/package/@opentelemetry/api">@opentelemetry/api</a></td>
839
- <td>1.9.0</td>
849
+ <td>1.9.1</td>
840
850
  <td>Apache-2.0</td>
841
851
  <td>OpenTelemetry Authors</td>
842
852
  <td></td>
@@ -846,7 +856,7 @@
846
856
  </tr>
847
857
  <tr>
848
858
  <td><a href="https://npmjs.com/package/@opentelemetry/core">@opentelemetry/core</a></td>
849
- <td>2.6.0</td>
859
+ <td>2.6.1</td>
850
860
  <td>Apache-2.0</td>
851
861
  <td>OpenTelemetry Authors</td>
852
862
  <td></td>
@@ -875,6 +885,116 @@
875
885
  </td
876
886
  </tr>
877
887
  <tr>
888
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-android">@peculiar/asn1-android</a></td>
889
+ <td>2.6.0</td>
890
+ <td>MIT</td>
891
+ <td>PeculiarVentures, LLC</td>
892
+ <td></td>
893
+ <td>
894
+ </td
895
+ </tr>
896
+ <tr>
897
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-cms">@peculiar/asn1-cms</a></td>
898
+ <td>2.6.1</td>
899
+ <td>MIT</td>
900
+ <td>PeculiarVentures, LLC</td>
901
+ <td></td>
902
+ <td>
903
+ </td
904
+ </tr>
905
+ <tr>
906
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-csr">@peculiar/asn1-csr</a></td>
907
+ <td>2.6.1</td>
908
+ <td>MIT</td>
909
+ <td>PeculiarVentures, LLC</td>
910
+ <td></td>
911
+ <td>
912
+ </td
913
+ </tr>
914
+ <tr>
915
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-ecc">@peculiar/asn1-ecc</a></td>
916
+ <td>2.6.1</td>
917
+ <td>MIT</td>
918
+ <td>PeculiarVentures, LLC</td>
919
+ <td></td>
920
+ <td>
921
+ </td
922
+ </tr>
923
+ <tr>
924
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-pfx">@peculiar/asn1-pfx</a></td>
925
+ <td>2.6.1</td>
926
+ <td>MIT</td>
927
+ <td>PeculiarVentures, LLC</td>
928
+ <td></td>
929
+ <td>
930
+ </td
931
+ </tr>
932
+ <tr>
933
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-pkcs8">@peculiar/asn1-pkcs8</a></td>
934
+ <td>2.6.1</td>
935
+ <td>MIT</td>
936
+ <td>PeculiarVentures, LLC</td>
937
+ <td></td>
938
+ <td>
939
+ </td
940
+ </tr>
941
+ <tr>
942
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-pkcs9">@peculiar/asn1-pkcs9</a></td>
943
+ <td>2.6.1</td>
944
+ <td>MIT</td>
945
+ <td>PeculiarVentures, LLC</td>
946
+ <td></td>
947
+ <td>
948
+ <a href="https://github.com/PeculiarVentures/asn1-schema">github.com/PeculiarVentures/asn1-schema</a>
949
+ </td
950
+ </tr>
951
+ <tr>
952
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-rsa">@peculiar/asn1-rsa</a></td>
953
+ <td>2.6.1</td>
954
+ <td>MIT</td>
955
+ <td>PeculiarVentures, LLC</td>
956
+ <td></td>
957
+ <td>
958
+ </td
959
+ </tr>
960
+ <tr>
961
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-schema">@peculiar/asn1-schema</a></td>
962
+ <td>2.6.0</td>
963
+ <td>MIT</td>
964
+ <td>PeculiarVentures, LLC</td>
965
+ <td></td>
966
+ <td>
967
+ </td
968
+ </tr>
969
+ <tr>
970
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-x509-attr">@peculiar/asn1-x509-attr</a></td>
971
+ <td>2.6.1</td>
972
+ <td>MIT</td>
973
+ <td>PeculiarVentures, LLC</td>
974
+ <td></td>
975
+ <td>
976
+ </td
977
+ </tr>
978
+ <tr>
979
+ <td><a href="https://npmjs.com/package/@peculiar/asn1-x509">@peculiar/asn1-x509</a></td>
980
+ <td>2.6.1</td>
981
+ <td>MIT</td>
982
+ <td>PeculiarVentures, LLC</td>
983
+ <td></td>
984
+ <td>
985
+ </td
986
+ </tr>
987
+ <tr>
988
+ <td><a href="https://npmjs.com/package/@peculiar/x509">@peculiar/x509</a></td>
989
+ <td>1.14.3</td>
990
+ <td>MIT</td>
991
+ <td>Peculiar Ventures LLC</td>
992
+ <td></td>
993
+ <td>
994
+ <a href="https://github.com/PeculiarVentures/x509">github.com/PeculiarVentures/x509</a>
995
+ </td
996
+ </tr>
997
+ <tr>
878
998
  <td><a href="https://npmjs.com/package/@phc/format">@phc/format</a></td>
879
999
  <td>0.5.0</td>
880
1000
  <td>MIT</td>
@@ -936,7 +1056,7 @@
936
1056
  </tr>
937
1057
  <tr>
938
1058
  <td><a href="https://npmjs.com/package/@postalsys/email-ai-tools">@postalsys/email-ai-tools</a></td>
939
- <td>1.12.1</td>
1059
+ <td>1.13.0</td>
940
1060
  <td>MIT</td>
941
1061
  <td>Postal Systems O&#xDC;</td>
942
1062
  <td></td>
@@ -976,7 +1096,7 @@
976
1096
  </tr>
977
1097
  <tr>
978
1098
  <td><a href="https://npmjs.com/package/@postalsys/templates">@postalsys/templates</a></td>
979
- <td>2.0.0</td>
1099
+ <td>2.0.1</td>
980
1100
  <td>ISC</td>
981
1101
  <td>Postal Systems O&#xDC;</td>
982
1102
  <td></td>
@@ -1115,6 +1235,26 @@
1115
1235
  </td
1116
1236
  </tr>
1117
1237
  <tr>
1238
+ <td><a href="https://npmjs.com/package/@simplewebauthn/browser">@simplewebauthn/browser</a></td>
1239
+ <td>13.3.0</td>
1240
+ <td>MIT</td>
1241
+ <td>Matthew Miller</td>
1242
+ <td>matthew@millerti.me</td>
1243
+ <td>
1244
+ <a href="https://github.com/MasterKale/SimpleWebAuthn">github.com/MasterKale/SimpleWebAuthn</a>
1245
+ </td
1246
+ </tr>
1247
+ <tr>
1248
+ <td><a href="https://npmjs.com/package/@simplewebauthn/server">@simplewebauthn/server</a></td>
1249
+ <td>13.3.0</td>
1250
+ <td>MIT</td>
1251
+ <td>Matthew Miller</td>
1252
+ <td>matthew@millerti.me</td>
1253
+ <td>
1254
+ <a href="https://github.com/MasterKale/SimpleWebAuthn">github.com/MasterKale/SimpleWebAuthn</a>
1255
+ </td
1256
+ </tr>
1257
+ <tr>
1118
1258
  <td><a href="https://npmjs.com/package/@standard-schema/spec">@standard-schema/spec</a></td>
1119
1259
  <td>1.1.0</td>
1120
1260
  <td>MIT</td>
@@ -1425,6 +1565,16 @@
1425
1565
  </td
1426
1566
  </tr>
1427
1567
  <tr>
1568
+ <td><a href="https://npmjs.com/package/asn1js">asn1js</a></td>
1569
+ <td>3.0.7</td>
1570
+ <td>BSD-3-Clause</td>
1571
+ <td>Yury Strozhevsky</td>
1572
+ <td>yury@strozhevsky.com</td>
1573
+ <td>
1574
+ <a href="https://github.com/PeculiarVentures/asn1.js">github.com/PeculiarVentures/asn1.js</a>
1575
+ </td
1576
+ </tr>
1577
+ <tr>
1428
1578
  <td><a href="https://npmjs.com/package/assertion-error">assertion-error</a></td>
1429
1579
  <td>1.1.0</td>
1430
1580
  <td>MIT</td>
@@ -1566,7 +1716,7 @@
1566
1716
  </tr>
1567
1717
  <tr>
1568
1718
  <td><a href="https://npmjs.com/package/brace-expansion">brace-expansion</a></td>
1569
- <td>1.1.12</td>
1719
+ <td>1.1.13</td>
1570
1720
  <td>MIT</td>
1571
1721
  <td>Julian Gruber</td>
1572
1722
  <td>mail@juliangruber.com</td>
@@ -1576,7 +1726,7 @@
1576
1726
  </tr>
1577
1727
  <tr>
1578
1728
  <td><a href="https://npmjs.com/package/brace-expansion">brace-expansion</a></td>
1579
- <td>2.0.2</td>
1729
+ <td>2.0.3</td>
1580
1730
  <td>MIT</td>
1581
1731
  <td>Julian Gruber</td>
1582
1732
  <td>mail@juliangruber.com</td>
@@ -1586,7 +1736,7 @@
1586
1736
  </tr>
1587
1737
  <tr>
1588
1738
  <td><a href="https://npmjs.com/package/brace-expansion">brace-expansion</a></td>
1589
- <td>5.0.4</td>
1739
+ <td>5.0.5</td>
1590
1740
  <td>MIT</td>
1591
1741
  <td></td>
1592
1742
  <td></td>
@@ -1616,7 +1766,7 @@
1616
1766
  </tr>
1617
1767
  <tr>
1618
1768
  <td><a href="https://npmjs.com/package/bullmq">bullmq</a></td>
1619
- <td>5.71.0</td>
1769
+ <td>5.71.1</td>
1620
1770
  <td>MIT</td>
1621
1771
  <td>Taskforce.sh Inc.</td>
1622
1772
  <td></td>
@@ -3205,7 +3355,7 @@
3205
3355
  </tr>
3206
3356
  <tr>
3207
3357
  <td><a href="https://npmjs.com/package/handlebars">handlebars</a></td>
3208
- <td>4.7.8</td>
3358
+ <td>4.7.9</td>
3209
3359
  <td>MIT</td>
3210
3360
  <td>Yehuda Katz</td>
3211
3361
  <td></td>
@@ -3475,7 +3625,7 @@
3475
3625
  </tr>
3476
3626
  <tr>
3477
3627
  <td><a href="https://npmjs.com/package/imapflow">imapflow</a></td>
3478
- <td>1.2.16</td>
3628
+ <td>1.2.18</td>
3479
3629
  <td>MIT</td>
3480
3630
  <td>Postal Systems O&#xDC;</td>
3481
3631
  <td></td>
@@ -3554,16 +3704,6 @@
3554
3704
  </td
3555
3705
  </tr>
3556
3706
  <tr>
3557
- <td><a href="https://npmjs.com/package/ioredis">ioredis</a></td>
3558
- <td>5.9.3</td>
3559
- <td>MIT</td>
3560
- <td>Zihua Li</td>
3561
- <td>i@zihua.li</td>
3562
- <td>
3563
- <a href="https://github.com/luin/ioredis">github.com/luin/ioredis</a>
3564
- </td
3565
- </tr>
3566
- <tr>
3567
3707
  <td><a href="https://npmjs.com/package/ip-address">ip-address</a></td>
3568
3708
  <td>10.1.0</td>
3569
3709
  <td>MIT</td>
@@ -4135,7 +4275,7 @@
4135
4275
  </tr>
4136
4276
  <tr>
4137
4277
  <td><a href="https://npmjs.com/package/mailparser">mailparser</a></td>
4138
- <td>3.9.5</td>
4278
+ <td>3.9.6</td>
4139
4279
  <td>MIT</td>
4140
4280
  <td>Andris Reinman</td>
4141
4281
  <td></td>
@@ -4285,7 +4425,7 @@
4285
4425
  </tr>
4286
4426
  <tr>
4287
4427
  <td><a href="https://npmjs.com/package/minimatch">minimatch</a></td>
4288
- <td>10.2.4</td>
4428
+ <td>10.2.5</td>
4289
4429
  <td>BlueOak-1.0.0</td>
4290
4430
  <td>Isaac Z. Schlueter</td>
4291
4431
  <td>i@izs.me</td>
@@ -4495,7 +4635,7 @@
4495
4635
  </tr>
4496
4636
  <tr>
4497
4637
  <td><a href="https://npmjs.com/package/nodemailer">nodemailer</a></td>
4498
- <td>8.0.3</td>
4638
+ <td>8.0.4</td>
4499
4639
  <td>MIT-0</td>
4500
4640
  <td>Andris Reinman</td>
4501
4641
  <td></td>
@@ -4905,7 +5045,7 @@
4905
5045
  </tr>
4906
5046
  <tr>
4907
5047
  <td><a href="https://npmjs.com/package/picomatch">picomatch</a></td>
4908
- <td>2.3.1</td>
5048
+ <td>2.3.2</td>
4909
5049
  <td>MIT</td>
4910
5050
  <td>Jon Schlinkert</td>
4911
5051
  <td></td>
@@ -5065,7 +5205,7 @@
5065
5205
  </tr>
5066
5206
  <tr>
5067
5207
  <td><a href="https://npmjs.com/package/pubface">pubface</a></td>
5068
- <td>1.0.19</td>
5208
+ <td>1.1.0</td>
5069
5209
  <td>MIT-0</td>
5070
5210
  <td>Postal Systems O&#xDC;</td>
5071
5211
  <td></td>
@@ -5144,6 +5284,26 @@
5144
5284
  </td
5145
5285
  </tr>
5146
5286
  <tr>
5287
+ <td><a href="https://npmjs.com/package/pvtsutils">pvtsutils</a></td>
5288
+ <td>1.3.6</td>
5289
+ <td>MIT</td>
5290
+ <td>PeculiarVentures</td>
5291
+ <td></td>
5292
+ <td>
5293
+ <a href="https://github.com/PeculiarVentures/pvtsutils">github.com/PeculiarVentures/pvtsutils</a>
5294
+ </td
5295
+ </tr>
5296
+ <tr>
5297
+ <td><a href="https://npmjs.com/package/pvutils">pvutils</a></td>
5298
+ <td>1.1.5</td>
5299
+ <td>MIT</td>
5300
+ <td>Yury Strozhevsky</td>
5301
+ <td>yury@strozhevsky.com</td>
5302
+ <td>
5303
+ <a href="https://github.com/PeculiarVentures/pvutils">github.com/PeculiarVentures/pvutils</a>
5304
+ </td
5305
+ </tr>
5306
+ <tr>
5147
5307
  <td><a href="https://npmjs.com/package/qrcode">qrcode</a></td>
5148
5308
  <td>1.5.4</td>
5149
5309
  <td>MIT</td>
@@ -5284,6 +5444,16 @@
5284
5444
  </td
5285
5445
  </tr>
5286
5446
  <tr>
5447
+ <td><a href="https://npmjs.com/package/reflect-metadata">reflect-metadata</a></td>
5448
+ <td>0.2.2</td>
5449
+ <td>Apache-2.0</td>
5450
+ <td>Ron Buckton</td>
5451
+ <td>ron.buckton@microsoft.com</td>
5452
+ <td>
5453
+ <a href="https://github.com/rbuckton/reflect-metadata">github.com/rbuckton/reflect-metadata</a>
5454
+ </td
5455
+ </tr>
5456
+ <tr>
5287
5457
  <td><a href="https://npmjs.com/package/require-directory">require-directory</a></td>
5288
5458
  <td>2.1.1</td>
5289
5459
  <td>MIT</td>
@@ -5565,7 +5735,7 @@
5565
5735
  </tr>
5566
5736
  <tr>
5567
5737
  <td><a href="https://npmjs.com/package/smtp-server">smtp-server</a></td>
5568
- <td>3.18.2</td>
5738
+ <td>3.18.3</td>
5569
5739
  <td>MIT-0</td>
5570
5740
  <td>Andris Reinman</td>
5571
5741
  <td></td>
@@ -6045,6 +6215,16 @@
6045
6215
  </tr>
6046
6216
  <tr>
6047
6217
  <td><a href="https://npmjs.com/package/tslib">tslib</a></td>
6218
+ <td>1.14.1</td>
6219
+ <td>0BSD</td>
6220
+ <td>Microsoft Corp.</td>
6221
+ <td></td>
6222
+ <td>
6223
+ <a href="https://github.com/Microsoft/tslib">github.com/Microsoft/tslib</a>
6224
+ </td
6225
+ </tr>
6226
+ <tr>
6227
+ <td><a href="https://npmjs.com/package/tslib">tslib</a></td>
6048
6228
  <td>2.8.1</td>
6049
6229
  <td>0BSD</td>
6050
6230
  <td>Microsoft Corp.</td>
@@ -6064,6 +6244,16 @@
6064
6244
  </td
6065
6245
  </tr>
6066
6246
  <tr>
6247
+ <td><a href="https://npmjs.com/package/tsyringe">tsyringe</a></td>
6248
+ <td>4.10.0</td>
6249
+ <td>MIT</td>
6250
+ <td>Steven Hobson-Campbell</td>
6251
+ <td></td>
6252
+ <td>
6253
+ <a href="https://github.com/Microsoft/tsyringe">github.com/Microsoft/tsyringe</a>
6254
+ </td
6255
+ </tr>
6256
+ <tr>
6067
6257
  <td><a href="https://npmjs.com/package/type-check">type-check</a></td>
6068
6258
  <td>0.4.0</td>
6069
6259
  <td>MIT</td>
@@ -6154,6 +6344,16 @@
6154
6344
  </td
6155
6345
  </tr>
6156
6346
  <tr>
6347
+ <td><a href="https://npmjs.com/package/undici">undici</a></td>
6348
+ <td>7.24.6</td>
6349
+ <td>MIT</td>
6350
+ <td></td>
6351
+ <td></td>
6352
+ <td>
6353
+ <a href="https://github.com/nodejs/undici">github.com/nodejs/undici</a>
6354
+ </td
6355
+ </tr>
6356
+ <tr>
6157
6357
  <td><a href="https://npmjs.com/package/uri-js">uri-js</a></td>
6158
6358
  <td>4.4.1</td>
6159
6359
  <td>BSD-2-Clause</td>