Haraka 3.1.0 → 3.1.2

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 (160) hide show
  1. package/.prettierignore +4 -0
  2. package/CONTRIBUTORS.md +5 -5
  3. package/Changes.md +69 -50
  4. package/Plugins.md +3 -1
  5. package/README.md +1 -1
  6. package/bin/haraka +475 -478
  7. package/config/outbound.ini +3 -0
  8. package/connection.js +1072 -1108
  9. package/docs/Connection.md +29 -30
  10. package/docs/CoreConfig.md +38 -39
  11. package/docs/CustomReturnCodes.md +0 -1
  12. package/docs/HAProxy.md +2 -2
  13. package/docs/Header.md +1 -1
  14. package/docs/Logging.md +29 -5
  15. package/docs/Outbound.md +93 -78
  16. package/docs/Plugins.md +103 -108
  17. package/docs/Transaction.md +49 -51
  18. package/docs/Tutorial.md +127 -143
  19. package/docs/deprecated/access.md +0 -1
  20. package/docs/deprecated/backscatterer.md +2 -3
  21. package/docs/deprecated/connect.rdns_access.md +18 -27
  22. package/docs/deprecated/data.headers.md +0 -1
  23. package/docs/deprecated/data.nomsgid.md +1 -2
  24. package/docs/deprecated/data.noreceived.md +1 -2
  25. package/docs/deprecated/data.rfc5322_header_checks.md +1 -2
  26. package/docs/deprecated/dkim_sign.md +13 -17
  27. package/docs/deprecated/dkim_verify.md +9 -17
  28. package/docs/deprecated/dnsbl.md +36 -38
  29. package/docs/deprecated/dnswl.md +41 -43
  30. package/docs/deprecated/lookup_rdns.strict.md +21 -34
  31. package/docs/deprecated/mail_from.access.md +17 -25
  32. package/docs/deprecated/mail_from.blocklist.md +9 -12
  33. package/docs/deprecated/mail_from.nobounces.md +1 -2
  34. package/docs/deprecated/rcpt_to.access.md +20 -27
  35. package/docs/deprecated/rcpt_to.blocklist.md +10 -13
  36. package/docs/deprecated/rcpt_to.routes.md +0 -1
  37. package/docs/deprecated/rdns.regexp.md +13 -15
  38. package/docs/plugins/aliases.md +89 -89
  39. package/docs/plugins/auth/auth_bridge.md +5 -7
  40. package/docs/plugins/auth/auth_ldap.md +11 -14
  41. package/docs/plugins/auth/auth_proxy.md +10 -12
  42. package/docs/plugins/auth/auth_vpopmaild.md +5 -6
  43. package/docs/plugins/auth/flat_file.md +4 -4
  44. package/docs/plugins/block_me.md +3 -3
  45. package/docs/plugins/data.signatures.md +1 -2
  46. package/docs/plugins/delay_deny.md +3 -4
  47. package/docs/plugins/max_unrecognized_commands.md +4 -4
  48. package/docs/plugins/prevent_credential_leaks.md +6 -6
  49. package/docs/plugins/process_title.md +18 -18
  50. package/docs/plugins/queue/deliver.md +2 -3
  51. package/docs/plugins/queue/discard.md +4 -4
  52. package/docs/plugins/queue/lmtp.md +1 -3
  53. package/docs/plugins/queue/qmail-queue.md +7 -9
  54. package/docs/plugins/queue/quarantine.md +16 -21
  55. package/docs/plugins/queue/rabbitmq.md +8 -11
  56. package/docs/plugins/queue/rabbitmq_amqplib.md +43 -39
  57. package/docs/plugins/queue/smtp_bridge.md +7 -10
  58. package/docs/plugins/queue/smtp_forward.md +42 -34
  59. package/docs/plugins/queue/smtp_proxy.md +30 -29
  60. package/docs/plugins/queue/test.md +1 -3
  61. package/docs/plugins/rcpt_to.in_host_list.md +6 -6
  62. package/docs/plugins/rcpt_to.max_count.md +1 -1
  63. package/docs/plugins/record_envelope_addresses.md +3 -3
  64. package/docs/plugins/reseed_rng.md +6 -6
  65. package/docs/plugins/status.md +9 -8
  66. package/docs/plugins/tarpit.md +7 -11
  67. package/docs/plugins/tls.md +12 -17
  68. package/docs/plugins/toobusy.md +4 -4
  69. package/docs/plugins/xclient.md +3 -3
  70. package/docs/tutorials/Migrating_from_v1_to_v2.md +19 -41
  71. package/docs/tutorials/SettingUpOutbound.md +6 -9
  72. package/endpoint.js +35 -38
  73. package/eslint.config.mjs +22 -19
  74. package/haraka.js +42 -47
  75. package/host_pool.js +75 -79
  76. package/http/html/404.html +45 -49
  77. package/http/html/index.html +39 -28
  78. package/http/package.json +2 -4
  79. package/line_socket.js +27 -28
  80. package/logger.js +182 -201
  81. package/outbound/client_pool.js +34 -27
  82. package/outbound/config.js +64 -59
  83. package/outbound/fsync_writestream.js +24 -25
  84. package/outbound/hmail.js +888 -835
  85. package/outbound/index.js +194 -187
  86. package/outbound/qfile.js +49 -52
  87. package/outbound/queue.js +197 -190
  88. package/outbound/timer_queue.js +41 -43
  89. package/outbound/tls.js +68 -61
  90. package/outbound/todo.js +11 -11
  91. package/package.json +38 -33
  92. package/plugins/.eslintrc.yaml +0 -1
  93. package/plugins/auth/auth_base.js +123 -127
  94. package/plugins/auth/auth_bridge.js +7 -7
  95. package/plugins/auth/auth_proxy.js +121 -126
  96. package/plugins/auth/auth_vpopmaild.js +84 -85
  97. package/plugins/auth/flat_file.js +18 -17
  98. package/plugins/block_me.js +31 -31
  99. package/plugins/data.signatures.js +13 -13
  100. package/plugins/delay_deny.js +65 -61
  101. package/plugins/prevent_credential_leaks.js +23 -23
  102. package/plugins/process_title.js +125 -128
  103. package/plugins/profile.js +5 -5
  104. package/plugins/queue/deliver.js +3 -3
  105. package/plugins/queue/discard.js +13 -14
  106. package/plugins/queue/lmtp.js +16 -17
  107. package/plugins/queue/qmail-queue.js +54 -55
  108. package/plugins/queue/quarantine.js +68 -70
  109. package/plugins/queue/rabbitmq.js +80 -87
  110. package/plugins/queue/rabbitmq_amqplib.js +75 -54
  111. package/plugins/queue/smtp_bridge.js +16 -16
  112. package/plugins/queue/smtp_forward.js +175 -179
  113. package/plugins/queue/smtp_proxy.js +69 -71
  114. package/plugins/queue/test.js +9 -9
  115. package/plugins/rcpt_to.host_list_base.js +30 -34
  116. package/plugins/rcpt_to.in_host_list.js +19 -19
  117. package/plugins/record_envelope_addresses.js +4 -4
  118. package/plugins/reseed_rng.js +4 -4
  119. package/plugins/status.js +90 -97
  120. package/plugins/tarpit.js +25 -14
  121. package/plugins/tls.js +68 -68
  122. package/plugins/toobusy.js +21 -23
  123. package/plugins/xclient.js +51 -53
  124. package/plugins.js +276 -293
  125. package/rfc1869.js +30 -35
  126. package/server.js +308 -299
  127. package/smtp_client.js +244 -228
  128. package/test/.eslintrc.yaml +0 -1
  129. package/test/connection.js +127 -134
  130. package/test/endpoint.js +53 -47
  131. package/test/fixtures/line_socket.js +12 -12
  132. package/test/fixtures/util_hmailitem.js +89 -85
  133. package/test/host_pool.js +90 -92
  134. package/test/installation/plugins/base_plugin.js +2 -2
  135. package/test/installation/plugins/folder_plugin/index.js +2 -3
  136. package/test/installation/plugins/inherits.js +3 -3
  137. package/test/installation/plugins/load_first.js +2 -3
  138. package/test/installation/plugins/plugin.js +1 -3
  139. package/test/installation/plugins/tls.js +2 -4
  140. package/test/logger.js +135 -116
  141. package/test/outbound/hmail.js +49 -35
  142. package/test/outbound/index.js +118 -101
  143. package/test/outbound/qfile.js +51 -53
  144. package/test/outbound_bounce_net_errors.js +84 -69
  145. package/test/outbound_bounce_rfc3464.js +235 -165
  146. package/test/plugins/auth/auth_base.js +420 -279
  147. package/test/plugins/auth/auth_vpopmaild.js +38 -39
  148. package/test/plugins/queue/smtp_forward.js +126 -104
  149. package/test/plugins/rcpt_to.host_list_base.js +85 -67
  150. package/test/plugins/rcpt_to.in_host_list.js +159 -112
  151. package/test/plugins/status.js +71 -64
  152. package/test/plugins/tls.js +37 -34
  153. package/test/plugins.js +97 -92
  154. package/test/rfc1869.js +19 -26
  155. package/test/server.js +293 -272
  156. package/test/smtp_client.js +180 -176
  157. package/test/tls_socket.js +62 -66
  158. package/test/transaction.js +159 -160
  159. package/tls_socket.js +331 -333
  160. package/transaction.js +129 -137
package/outbound/tls.js CHANGED
@@ -1,119 +1,126 @@
1
- 'use strict';
1
+ 'use strict'
2
2
 
3
- const net = require('node:net')
3
+ const net = require('node:net')
4
4
 
5
- const config = require('haraka-config');
6
- const hkredis = require('haraka-plugin-redis');
5
+ const config = require('haraka-config')
6
+ const hkredis = require('haraka-plugin-redis')
7
7
 
8
- const logger = require('../logger');
9
- const tls_socket = require('../tls_socket');
8
+ const logger = require('../logger')
9
+ const tls_socket = require('../tls_socket')
10
10
 
11
11
  const inheritable_opts = [
12
- 'key', 'cert', 'ciphers', 'minVersion', 'dhparam',
13
- 'requestCert', 'honorCipherOrder', 'rejectUnauthorized',
14
- 'force_tls_hosts'
15
- ];
12
+ 'key',
13
+ 'cert',
14
+ 'ciphers',
15
+ 'minVersion',
16
+ 'dhparam',
17
+ 'requestCert',
18
+ 'honorCipherOrder',
19
+ 'rejectUnauthorized',
20
+ 'force_tls_hosts',
21
+ ]
16
22
 
17
23
  class OutboundTLS {
18
- constructor () {
19
- this.config = config;
20
- this.name = 'OutboundTLS';
21
- logger.add_log_methods(this);
24
+ constructor() {
25
+ this.config = config
26
+ this.name = 'OutboundTLS'
27
+ logger.add_log_methods(this)
22
28
  }
23
29
 
24
- test_config (tls_config, our_config) {
25
- tls_socket.config = tls_config;
26
- this.config = our_config;
30
+ test_config(tls_config, our_config) {
31
+ tls_socket.config = tls_config
32
+ this.config = our_config
27
33
  }
28
34
 
29
- load_config () {
30
- const tls_cfg = tls_socket.load_tls_ini({role: 'client'});
31
- const cfg = JSON.parse(JSON.stringify(tls_cfg.outbound || {}));
32
- cfg.redis = tls_cfg.redis; // Don't clone - contains methods
35
+ load_config() {
36
+ const tls_cfg = tls_socket.load_tls_ini({ role: 'client' })
37
+ const cfg = JSON.parse(JSON.stringify(tls_cfg.outbound || {}))
38
+ cfg.redis = tls_cfg.redis // Don't clone - contains methods
33
39
 
34
40
  for (const opt of inheritable_opts) {
35
- if (cfg[opt] !== undefined) continue; // option set in [outbound]
36
- if (tls_cfg.main[opt] === undefined) continue; // opt unset in tls.ini[main]
37
- cfg[opt] = tls_cfg.main[opt]; // use value from [main] section
41
+ if (cfg[opt] !== undefined) continue // option set in [outbound]
42
+ if (tls_cfg.main[opt] === undefined) continue // opt unset in tls.ini[main]
43
+ cfg[opt] = tls_cfg.main[opt] // use value from [main] section
38
44
  }
39
45
 
40
46
  if (cfg.key) {
41
47
  if (Array.isArray(cfg.key)) {
42
- cfg.key = cfg.key[0];
48
+ cfg.key = cfg.key[0]
43
49
  }
44
- cfg.key = this.config.get(cfg.key, 'binary');
50
+ cfg.key = this.config.get(cfg.key, 'binary')
45
51
  }
46
52
 
47
53
  if (cfg.dhparam) {
48
- cfg.dhparam = this.config.get(cfg.dhparam, 'binary');
54
+ cfg.dhparam = this.config.get(cfg.dhparam, 'binary')
49
55
  }
50
56
 
51
57
  if (cfg.cert) {
52
58
  if (Array.isArray(cfg.cert)) {
53
- cfg.cert = cfg.cert[0];
59
+ cfg.cert = cfg.cert[0]
54
60
  }
55
- cfg.cert = this.config.get(cfg.cert, 'binary');
61
+ cfg.cert = this.config.get(cfg.cert, 'binary')
56
62
  }
57
63
 
58
- if (!cfg.no_tls_hosts) cfg.no_tls_hosts = [];
59
- if (!cfg.force_tls_hosts) cfg.force_tls_hosts = [];
64
+ if (!cfg.no_tls_hosts) cfg.no_tls_hosts = []
65
+ if (!cfg.force_tls_hosts) cfg.force_tls_hosts = []
60
66
 
61
- this.cfg = cfg;
67
+ this.cfg = cfg
62
68
  }
63
69
 
64
- init (cb) {
65
- this.load_config();
70
+ init(cb) {
71
+ this.load_config()
66
72
  // changing this var in-flight won't work
67
- if (this.cfg.redis && !this.cfg.redis.disable_for_failed_hosts) return cb();
68
- logger.debug(this, 'Will disable outbound TLS for failing TLS hosts');
69
- Object.assign(this, hkredis);
70
- this.merge_redis_ini();
71
- this.init_redis_plugin(cb);
73
+ if (this.cfg.redis && !this.cfg.redis.disable_for_failed_hosts) return cb()
74
+ logger.debug(this, 'Will disable outbound TLS for failing TLS hosts')
75
+ Object.assign(this, hkredis)
76
+ this.merge_redis_ini()
77
+ this.init_redis_plugin(cb)
72
78
  }
73
79
 
74
- get_tls_options (mx) {
80
+ get_tls_options(mx) {
75
81
  // do NOT set servername to an IP address
76
82
  if (net.isIP(mx.exchange)) {
77
83
  // when mx.exchange looked up in DNS, from_dns has the hostname
78
84
  if (mx.from_dns) return { ...this.cfg, servername: mx.from_dns }
79
85
  return { ...this.cfg }
80
- }
81
- else {
86
+ } else {
82
87
  // mx.exchange is a hostname
83
88
  return { ...this.cfg, servername: mx.exchange }
84
89
  }
85
90
  }
86
91
 
87
92
  // Check for if host is prohibited from TLS negotiation
88
- check_tls_nogo (host, cb_ok, cb_nogo) {
89
- if (!this.cfg.redis.disable_for_failed_hosts) return cb_ok();
90
-
91
- const dbkey = `no_tls|${host}`;
92
- this.db.get(dbkey)
93
- .then(dbr => {
94
- dbr ? cb_nogo(dbr) : cb_ok();
93
+ check_tls_nogo(host, cb_ok, cb_nogo) {
94
+ if (!this.cfg.redis.disable_for_failed_hosts) return cb_ok()
95
+
96
+ const dbkey = `no_tls|${host}`
97
+ this.db
98
+ .get(dbkey)
99
+ .then((dbr) => {
100
+ dbr ? cb_nogo(dbr) : cb_ok()
95
101
  })
96
- .catch(err => {
97
- logger.debug(this, `Redis returned error: ${err}`);
98
- cb_ok();
102
+ .catch((err) => {
103
+ logger.debug(this, `Redis returned error: ${err}`)
104
+ cb_ok()
99
105
  })
100
106
  }
101
107
 
102
- mark_tls_nogo (host, cb) {
103
- const dbkey = `no_tls|${host}`;
104
- const expiry = this.cfg.redis.disable_expiry || 604800;
108
+ mark_tls_nogo(host, cb) {
109
+ const dbkey = `no_tls|${host}`
110
+ const expiry = this.cfg.redis.disable_expiry || 604800
105
111
 
106
- if (!this.cfg.redis.disable_for_failed_hosts) return cb();
112
+ if (!this.cfg.redis.disable_for_failed_hosts) return cb()
107
113
 
108
- logger.notice(this, `TLS connection failed. Marking ${host} as non-TLS for ${expiry} seconds`);
114
+ logger.notice(this, `TLS connection failed. Marking ${host} as non-TLS for ${expiry} seconds`)
109
115
 
110
- this.db.setEx(dbkey, expiry, (new Date()).toISOString())
116
+ this.db
117
+ .setEx(dbkey, expiry, new Date().toISOString())
111
118
  .then(cb)
112
- .catch(err => {
113
- logger.error(this, `Redis returned error: ${err}`);
119
+ .catch((err) => {
120
+ logger.error(this, `Redis returned error: ${err}`)
114
121
  })
115
122
  }
116
123
  }
117
124
 
118
125
  // this is a singleton
119
- module.exports = new OutboundTLS();
126
+ module.exports = new OutboundTLS()
package/outbound/todo.js CHANGED
@@ -1,17 +1,17 @@
1
- 'use strict';
1
+ 'use strict'
2
2
 
3
3
  // queue file header data
4
4
  class TODOItem {
5
- constructor (domain, recipients, transaction) {
6
- this.queue_time = Date.now();
7
- this.domain = domain;
8
- this.rcpt_to = recipients;
9
- this.mail_from = transaction.mail_from;
10
- this.message_stream = transaction.message_stream;
11
- this.notes = transaction.notes;
12
- this.uuid = transaction.uuid;
13
- this.force_tls = false;
5
+ constructor(domain, recipients, transaction) {
6
+ this.queue_time = Date.now()
7
+ this.domain = domain
8
+ this.rcpt_to = recipients
9
+ this.mail_from = transaction.mail_from
10
+ this.message_stream = transaction.message_stream
11
+ this.notes = transaction.notes
12
+ this.uuid = transaction.uuid
13
+ this.force_tls = false
14
14
  }
15
15
  }
16
16
 
17
- module.exports = TODOItem;
17
+ module.exports = TODOItem
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "server",
10
10
  "email"
11
11
  ],
12
- "version": "3.1.0",
12
+ "version": "3.1.2",
13
13
  "homepage": "http://haraka.github.io",
14
14
  "repository": {
15
15
  "type": "git",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "main": "haraka.js",
19
19
  "engines": {
20
- "node": ">=18"
20
+ "node": ">=20"
21
21
  },
22
22
  "dependencies": {
23
23
  "address-rfc2821": "^2.1.3",
@@ -27,20 +27,20 @@
27
27
  "haraka-config": "^1.4.2",
28
28
  "haraka-constants": "^1.0.7",
29
29
  "haraka-dsn": "^1.1.0",
30
- "haraka-email-message": "^1.2.5",
31
- "haraka-message-stream": "^1.2.3",
30
+ "haraka-email-message": "^1.2.6",
31
+ "haraka-message-stream": "^1.3.2",
32
32
  "haraka-net-utils": "^1.7.2",
33
33
  "haraka-notes": "^1.1.1",
34
- "haraka-plugin-redis": "^2.0.9",
35
- "haraka-results": "^2.2.5",
36
- "haraka-tld": "^1.2.3",
34
+ "haraka-plugin-redis": "^2.0.11",
35
+ "haraka-results": "^2.2.6",
36
+ "haraka-tld": "^1.2.4",
37
37
  "haraka-utils": "^1.1.4",
38
- "ipaddr.js": "~2.2.0",
39
- "node-gyp": "^11.1.0",
40
- "nopt": "^8.1.0",
38
+ "ipaddr.js": "~2.3.0",
39
+ "node-gyp": "^12.1.0",
40
+ "nopt": "^9.0.0",
41
41
  "npid": "~0.4.0",
42
- "redis": "~4.7.0",
43
- "semver": "^7.7.1",
42
+ "redis": "~5.10.0",
43
+ "semver": "^7.7.3",
44
44
  "sockaddr": "^1.0.1",
45
45
  "sprintf-js": "~1.1.3"
46
46
  },
@@ -48,46 +48,45 @@
48
48
  "haraka-plugin-access": "^1.1.10",
49
49
  "haraka-plugin-aliases": "^1.0.3",
50
50
  "haraka-plugin-asn": "^2.0.5",
51
- "haraka-plugin-attachment": "^1.1.4",
51
+ "haraka-plugin-attachment": "^1.1.5",
52
52
  "haraka-plugin-avg": "^1.1.0",
53
- "haraka-plugin-bounce": "1.0.4",
54
- "haraka-plugin-clamd": "1.0.2",
53
+ "haraka-plugin-bounce": "^2.1.1",
54
+ "haraka-plugin-clamd": "^1.0.2",
55
55
  "haraka-plugin-dcc": "^1.0.3",
56
56
  "haraka-plugin-dkim": "^1.0.11",
57
- "haraka-plugin-dns-list": "^1.2.3",
57
+ "haraka-plugin-dns-list": "^1.2.4",
58
58
  "haraka-plugin-early_talker": "^1.0.2",
59
- "haraka-plugin-elasticsearch": "^8.1.2",
59
+ "haraka-plugin-elasticsearch": "^8.1.5",
60
60
  "haraka-plugin-esets": "^1.0.1",
61
- "haraka-plugin-fcrdns": "^1.1.1",
61
+ "haraka-plugin-fcrdns": "^1.1.2",
62
62
  "haraka-plugin-geoip": "^1.1.1",
63
63
  "haraka-plugin-graph": "^1.0.5",
64
64
  "haraka-plugin-greylist": "^1.0.1",
65
65
  "haraka-plugin-headers": "^1.0.6",
66
- "haraka-plugin-helo.checks": "^1.0.3",
67
- "haraka-plugin-karma": "^2.1.7",
68
- "haraka-plugin-known-senders": "^1.1.2",
69
- "haraka-plugin-limit": "^1.2.6",
70
- "haraka-plugin-mail_from.is_resolvable": "^1.0.3",
66
+ "haraka-plugin-helo.checks": "^1.1.0",
67
+ "haraka-plugin-karma": "^2.1.8",
68
+ "haraka-plugin-known-senders": "^1.1.3",
69
+ "haraka-plugin-limit": "^1.2.7",
70
+ "haraka-plugin-mail_from.is_resolvable": "^1.1.0",
71
71
  "haraka-plugin-messagesniffer": "^1.0.1",
72
72
  "haraka-plugin-p0f": "^1.0.11",
73
73
  "haraka-plugin-qmail-deliverable": "^1.2.5",
74
- "haraka-plugin-recipient-routes": "^1.2.2",
74
+ "haraka-plugin-recipient-routes": "^1.3.1",
75
75
  "haraka-plugin-relay": "^1.0.1",
76
- "haraka-plugin-rspamd": "^1.3.2",
76
+ "haraka-plugin-rspamd": "^1.4.2",
77
77
  "haraka-plugin-spamassassin": "^1.0.3",
78
- "haraka-plugin-spf": "1.2.9",
78
+ "haraka-plugin-spf": "^1.2.10",
79
79
  "haraka-plugin-syslog": "^1.0.7",
80
80
  "haraka-plugin-uribl": "^1.0.10",
81
81
  "haraka-plugin-watch": "^2.0.8",
82
- "@techteamer/ocsp": "^1.0.1",
83
- "tmp": "~0.2.3"
82
+ "@techteamer/ocsp": "^1.0.1"
84
83
  },
85
84
  "devDependencies": {
86
- "@haraka/eslint-config": "^2.0.2",
87
- "haraka-test-fixtures": "^1.3.9",
88
- "mocha": "^11.1.0",
85
+ "@haraka/eslint-config": "^2.0.3",
86
+ "haraka-test-fixtures": "^1.3.10",
87
+ "mocha": "^11.7.5",
89
88
  "mock-require": "^3.0.3",
90
- "nodemailer": "^6.10.0"
89
+ "nodemailer": "^7.0.12"
91
90
  },
92
91
  "bugs": {
93
92
  "mail": "haraka.mail@gmail.com",
@@ -105,6 +104,12 @@
105
104
  "prettier:fix": "npx prettier . --write --log-level=warn",
106
105
  "test": "npx mocha --exit --timeout=4000 test test/outbound test/plugins/auth test/plugins/queue test/plugins",
107
106
  "versions": "npx dependency-version-checker check",
108
- "versions:fix": "npx dependency-version-checker update"
107
+ "versions:fix": "npx dependency-version-checker update",
108
+ "format": "npm run prettier:fix && npm run lint:fix"
109
+ },
110
+ "prettier": {
111
+ "singleQuote": true,
112
+ "printWidth": 120,
113
+ "semi": false
109
114
  }
110
115
  }
@@ -1,4 +1,3 @@
1
-
2
1
  globals:
3
2
  server: true
4
3
  NEXT_HOOK: true