@volcanicminds/backend 2.2.7 → 2.2.9

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 (125) hide show
  1. package/README.md +85 -22
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +100 -51
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/api/auth/controller/auth.d.ts +10 -0
  6. package/dist/lib/api/auth/controller/auth.d.ts.map +1 -1
  7. package/dist/lib/api/auth/controller/auth.js +26 -4
  8. package/dist/lib/api/auth/controller/auth.js.map +1 -1
  9. package/dist/lib/api/token/controller/token.d.ts +1 -1
  10. package/dist/lib/api/token/controller/token.d.ts.map +1 -1
  11. package/dist/lib/api/token/controller/token.js +7 -5
  12. package/dist/lib/api/token/controller/token.js.map +1 -1
  13. package/dist/lib/api/users/controller/user.d.ts +2 -2
  14. package/dist/lib/api/users/controller/user.d.ts.map +1 -1
  15. package/dist/lib/api/users/controller/user.js +14 -4
  16. package/dist/lib/api/users/controller/user.js.map +1 -1
  17. package/dist/lib/apollo/resolvers.d.ts +1 -1
  18. package/dist/lib/apollo/resolvers.d.ts.map +1 -1
  19. package/dist/lib/apollo/resolvers.js +1 -1
  20. package/dist/lib/apollo/resolvers.js.map +1 -1
  21. package/dist/lib/config/general.d.ts +1 -0
  22. package/dist/lib/config/general.d.ts.map +1 -1
  23. package/dist/lib/config/general.js +2 -1
  24. package/dist/lib/config/general.js.map +1 -1
  25. package/dist/lib/hooks/onError.d.ts +1 -1
  26. package/dist/lib/hooks/onError.d.ts.map +1 -1
  27. package/dist/lib/hooks/onError.js +5 -3
  28. package/dist/lib/hooks/onError.js.map +1 -1
  29. package/dist/lib/hooks/onRequest.d.ts.map +1 -1
  30. package/dist/lib/hooks/onRequest.js +18 -2
  31. package/dist/lib/hooks/onRequest.js.map +1 -1
  32. package/dist/lib/hooks/onResponse.d.ts.map +1 -1
  33. package/dist/lib/hooks/onResponse.js +9 -1
  34. package/dist/lib/hooks/onResponse.js.map +1 -1
  35. package/dist/lib/loader/general.js +4 -2
  36. package/dist/lib/loader/general.js.map +1 -1
  37. package/dist/lib/loader/hooks.d.ts.map +1 -1
  38. package/dist/lib/loader/hooks.js +8 -4
  39. package/dist/lib/loader/hooks.js.map +1 -1
  40. package/dist/lib/loader/plugins.d.ts.map +1 -1
  41. package/dist/lib/loader/plugins.js +6 -3
  42. package/dist/lib/loader/plugins.js.map +1 -1
  43. package/dist/lib/loader/roles.js +4 -2
  44. package/dist/lib/loader/roles.js.map +1 -1
  45. package/dist/lib/loader/router.d.ts.map +1 -1
  46. package/dist/lib/loader/router.js +31 -16
  47. package/dist/lib/loader/router.js.map +1 -1
  48. package/dist/lib/loader/schedules.d.ts.map +1 -1
  49. package/dist/lib/loader/schedules.js +19 -10
  50. package/dist/lib/loader/schedules.js.map +1 -1
  51. package/dist/lib/loader/schemas.d.ts.map +1 -1
  52. package/dist/lib/loader/schemas.js +18 -9
  53. package/dist/lib/loader/schemas.js.map +1 -1
  54. package/dist/lib/loader/tracking.d.ts.map +1 -1
  55. package/dist/lib/loader/tracking.js +6 -3
  56. package/dist/lib/loader/tracking.js.map +1 -1
  57. package/dist/lib/loader/translation.d.ts.map +1 -1
  58. package/dist/lib/loader/translation.js.map +1 -1
  59. package/dist/lib/middleware/isAdmin.d.ts.map +1 -1
  60. package/dist/lib/middleware/isAdmin.js +2 -1
  61. package/dist/lib/middleware/isAdmin.js.map +1 -1
  62. package/dist/lib/middleware/isAuthenticated.d.ts.map +1 -1
  63. package/dist/lib/middleware/isAuthenticated.js +3 -2
  64. package/dist/lib/middleware/isAuthenticated.js.map +1 -1
  65. package/dist/lib/middleware/preAuth.d.ts +1 -1
  66. package/dist/lib/middleware/preAuth.d.ts.map +1 -1
  67. package/dist/lib/middleware/preAuth.js +1 -1
  68. package/dist/lib/middleware/preAuth.js.map +1 -1
  69. package/dist/lib/middleware/preForgotPasswordHandler.d.ts +1 -1
  70. package/dist/lib/middleware/preForgotPasswordHandler.d.ts.map +1 -1
  71. package/dist/lib/middleware/preForgotPasswordHandler.js +1 -1
  72. package/dist/lib/middleware/preForgotPasswordHandler.js.map +1 -1
  73. package/dist/lib/schemas/auth.d.ts +3 -0
  74. package/dist/lib/schemas/auth.d.ts.map +1 -1
  75. package/dist/lib/schemas/auth.js +1 -0
  76. package/dist/lib/schemas/auth.js.map +1 -1
  77. package/dist/lib/util/common.d.ts.map +1 -1
  78. package/dist/lib/util/common.js.map +1 -1
  79. package/dist/lib/util/errors.d.ts.map +1 -1
  80. package/dist/lib/util/errors.js.map +1 -1
  81. package/dist/lib/util/logger.js +1 -1
  82. package/dist/lib/util/logger.js.map +1 -1
  83. package/dist/lib/util/mark.d.ts.map +1 -1
  84. package/dist/lib/util/mark.js +34 -17
  85. package/dist/lib/util/mark.js.map +1 -1
  86. package/dist/lib/util/regexp.d.ts.map +1 -1
  87. package/dist/lib/util/regexp.js +3 -3
  88. package/dist/lib/util/regexp.js.map +1 -1
  89. package/dist/lib/util/tracker.d.ts +2 -2
  90. package/dist/lib/util/tracker.d.ts.map +1 -1
  91. package/dist/lib/util/tracker.js +6 -4
  92. package/dist/lib/util/tracker.js.map +1 -1
  93. package/dist/lib/util/yn.d.ts.map +1 -1
  94. package/dist/lib/util/yn.js.map +1 -1
  95. package/dist/server.js.map +1 -1
  96. package/lib/api/auth/controller/auth.ts +36 -4
  97. package/lib/api/token/controller/token.ts +7 -5
  98. package/lib/api/users/controller/user.ts +17 -4
  99. package/lib/apollo/resolvers.ts +2 -1
  100. package/lib/config/general.ts +2 -1
  101. package/lib/hooks/onError.ts +4 -3
  102. package/lib/hooks/onRequest.ts +21 -14
  103. package/lib/hooks/onResponse.ts +10 -4
  104. package/lib/loader/general.ts +2 -2
  105. package/lib/loader/hooks.ts +6 -4
  106. package/lib/loader/plugins.ts +4 -3
  107. package/lib/loader/roles.ts +2 -2
  108. package/lib/loader/router.ts +21 -24
  109. package/lib/loader/schedules.ts +23 -26
  110. package/lib/loader/schemas.ts +10 -9
  111. package/lib/loader/tracking.ts +4 -3
  112. package/lib/loader/translation.ts +2 -0
  113. package/lib/middleware/isAdmin.ts +2 -1
  114. package/lib/middleware/isAuthenticated.ts +3 -2
  115. package/lib/middleware/preAuth.ts +1 -1
  116. package/lib/middleware/preForgotPasswordHandler.ts +1 -1
  117. package/lib/schemas/auth.ts +1 -0
  118. package/lib/util/common.ts +1 -0
  119. package/lib/util/errors.ts +1 -0
  120. package/lib/util/logger.ts +1 -1
  121. package/lib/util/mark.ts +18 -17
  122. package/lib/util/regexp.ts +3 -3
  123. package/lib/util/tracker.ts +6 -4
  124. package/lib/util/yn.ts +1 -0
  125. package/package.json +11 -2
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { normalizePatterns } from '../util/path.js'
2
3
  import { globSync } from 'glob'
3
4
 
@@ -7,7 +8,7 @@ export async function load() {
7
8
  const patterns = normalizePatterns(['..', 'config', 'plugins.{ts,js}'], ['src', 'config', 'plugins.{ts,js}'])
8
9
 
9
10
  for (const pattern of patterns) {
10
- log.t && log.trace('Looking for ' + pattern)
11
+ if (log.t) log.trace('Looking for ' + pattern)
11
12
  const files = globSync(pattern, { windowsPathsNoEscape: true })
12
13
 
13
14
  for (const f of files) {
@@ -16,12 +17,12 @@ export async function load() {
16
17
 
17
18
  configPlugins.forEach((plugin) => {
18
19
  plugins[plugin.name] = plugin.enable ? plugin.options : false
19
- log.t && log.trace(`* Plugin ${plugin.name} ${plugin.enable ? 'enabled' : 'disabled'}`)
20
+ if (log.t) log.trace(`* Plugin ${plugin.name} ${plugin.enable ? 'enabled' : 'disabled'}`)
20
21
  })
21
22
  }
22
23
  }
23
24
 
24
25
  const enabledPulgins = Object.keys(plugins).filter((p) => !!plugins[p])
25
- log.d && log.debug(`Plugins loaded: ${enabledPulgins.length > 0 ? enabledPulgins.join(', ') : 0}`)
26
+ if (log.d) log.debug(`Plugins loaded: ${enabledPulgins.length > 0 ? enabledPulgins.join(', ') : 0}`)
26
27
  return plugins
27
28
  }
@@ -8,7 +8,7 @@ export async function load() {
8
8
  const patterns = normalizePatterns(['..', 'config', 'roles.{ts,js}'], ['src', 'config', 'roles.{ts,js}'])
9
9
 
10
10
  for (const pattern of patterns) {
11
- log.t && log.trace('Looking for ' + pattern)
11
+ if (log.t) log.trace('Looking for ' + pattern)
12
12
  const files = globSync(pattern, { windowsPathsNoEscape: true })
13
13
 
14
14
  for (const f of files) {
@@ -21,6 +21,6 @@ export async function load() {
21
21
  }
22
22
  }
23
23
 
24
- log.d && log.debug('Roles loaded: ' + Object.keys(roles).join(', '))
24
+ if (log.d) log.debug('Roles loaded: ' + Object.keys(roles).join(', '))
25
25
  return roles
26
26
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import yn from '../util/yn.js'
2
3
  import type { Role, Route, ConfiguredRoute, RouteConfig } from '../../types/global.js'
3
4
  import { FastifyReply, FastifyRequest } from 'fastify'
@@ -5,7 +6,6 @@ import { normalizePatterns } from '../util/path.js'
5
6
  import { globSync } from 'glob'
6
7
  import path from 'path'
7
8
  import { fileURLToPath } from 'url'
8
- import require from '../util/require.js'
9
9
 
10
10
  const __filename = fileURLToPath(import.meta.url)
11
11
  const __dirname = path.dirname(__filename)
@@ -16,7 +16,7 @@ async function tryToLoadFile(fileName: string) {
16
16
  try {
17
17
  const module = await import(fileName)
18
18
  return module.default || module
19
- } catch (err) {
19
+ } catch (_err) {
20
20
  return null
21
21
  }
22
22
  }
@@ -28,25 +28,21 @@ async function loadMiddleware(base: string, middleware: string = '') {
28
28
 
29
29
  if (isGlobal) {
30
30
  const name = middleware.substring(key.length)
31
- // Prova path locali (es. src/middleware/auth.ts)
32
- const localPath = path.resolve(process.cwd() + '/src/middleware/' + name + '.ts') // Prova TS
33
- const localPathJs = path.resolve(process.cwd() + '/src/middleware/' + name + '.js') // Prova JS (dist)
31
+ const localPath = path.resolve(process.cwd() + '/src/middleware/' + name + '.ts')
32
+ const localPathJs = path.resolve(process.cwd() + '/src/middleware/' + name + '.js')
34
33
 
35
34
  loadedModule = await tryToLoadFile(localPath)
36
35
  if (!loadedModule) loadedModule = await tryToLoadFile(localPathJs)
37
36
 
38
- // Se non trova locale, prova interno alla lib
39
37
  if (!loadedModule) {
40
38
  const libPath = path.resolve(__dirname + '/../middleware/' + name + '.js')
41
39
  loadedModule = await tryToLoadFile(libPath)
42
40
  }
43
41
  } else {
44
- // Middleware locale alla route
45
42
  const routeMiddPath = path.resolve(base + '/middleware/' + middleware)
46
- // Qui è difficile indovinare l'estensione se non fornita, assumiamo che il loader sappia cosa fa o proviamo entrambe
47
43
  loadedModule = await tryToLoadFile(routeMiddPath + '.ts')
48
44
  if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath + '.js')
49
- if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath) // Magari ha già estensione
45
+ if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath)
50
46
  }
51
47
 
52
48
  if (!loadedModule) {
@@ -60,7 +56,6 @@ async function loadMiddlewares(base: string, middlewares: string[] = []) {
60
56
  const midds = {}
61
57
  for (const m of middlewares) {
62
58
  const middleware = await loadMiddleware(base, m)
63
- // I middleware possono esportare più funzioni (preHandler, preSerialization, ecc.)
64
59
  Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]))
65
60
  }
66
61
  return midds
@@ -72,7 +67,7 @@ async function load(): Promise<ConfiguredRoute[]> {
72
67
  const authMiddlewares = ['global.isAuthenticated', 'global.isAdmin']
73
68
 
74
69
  for (const pattern of patterns) {
75
- log.t && log.trace('Looking for ' + pattern)
70
+ if (log.t) log.trace('Looking for ' + pattern)
76
71
  const files = globSync(pattern, { windowsPathsNoEscape: true })
77
72
 
78
73
  for (const f of files) {
@@ -86,7 +81,7 @@ async function load(): Promise<ConfiguredRoute[]> {
86
81
  const routesjs = module.default || module
87
82
  const { routes = [], config: defaultConfig = {} } = routesjs || {}
88
83
 
89
- log.t && log.trace(`* Add ${routes.length} routes from ${file}`)
84
+ if (log.t) log.trace(`* Add ${routes.length} routes from ${file}`)
90
85
 
91
86
  routes.forEach((route: Route, index: number) => {
92
87
  const errors: string[] = []
@@ -106,8 +101,8 @@ async function load(): Promise<ConfiguredRoute[]> {
106
101
  try {
107
102
  requiredRoles = rsp.some((r) => r.code === roles.admin.code) ? rsp : [...rsp, roles.admin]
108
103
  } catch (err) {
109
- log.e && log.error(`Error in loading roles for ${methodCase} ${pathName} (${handler})`)
110
- log.t && log.trace(err)
104
+ if (log.e) log.error(`Error in loading roles for ${methodCase} ${pathName} (${handler})`)
105
+ if (log.t) log.trace(err)
111
106
  config.enable = false
112
107
  }
113
108
 
@@ -151,19 +146,21 @@ async function load(): Promise<ConfiguredRoute[]> {
151
146
  }
152
147
 
153
148
  if (errors.length > 0) {
154
- log.e && errors.forEach((error) => log.error(error))
149
+ if (log.e) errors.forEach((error) => log.error(error))
155
150
  }
156
151
  }
157
152
 
158
153
  const toAdd = enable && errors.length === 0
159
- toAdd
160
- ? log.t &&
154
+ if (toAdd) {
155
+ if (log.t)
161
156
  log.trace(
162
157
  `* Method [${method}] path ${endpoint} handler ${handler} enabled with ${
163
158
  middlewares?.length || 0
164
159
  } middlewares`
165
160
  )
166
- : log.w && log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`)
161
+ } else {
162
+ if (log.w) log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`)
163
+ }
167
164
 
168
165
  if (toAdd) {
169
166
  const doc = {
@@ -200,23 +197,23 @@ async function load(): Promise<ConfiguredRoute[]> {
200
197
  }
201
198
  }
202
199
 
203
- log.d && log.debug(`Routes loaded: ${validRoutes.length}`)
200
+ if (log.d) log.debug(`Routes loaded: ${validRoutes.length}`)
204
201
  return validRoutes
205
202
  }
206
203
 
207
204
  async function applyRoutes(server: any, routes: ConfiguredRoute[]): Promise<void> {
208
205
  if (!routes || routes.length === 0) {
209
- log.w && log.warn('No routes to apply to server')
206
+ if (log.w) log.warn('No routes to apply to server')
210
207
  return
211
208
  }
212
209
 
213
- log.t && log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`)
210
+ if (log.t) log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`)
214
211
 
215
212
  for (const route of routes) {
216
213
  if (route?.enable) {
217
214
  const { handler, method, path, middlewares, roles, rawBody, rateLimit, base, file, func, doc } = route
218
215
 
219
- log.t && log.trace(`* Add path ${method} ${path} on handle ${handler}`)
216
+ if (log.t) log.trace(`* Add path ${method} ${path} on handle ${handler}`)
220
217
  const midds = await loadMiddlewares(base, middlewares)
221
218
 
222
219
  server.route({
@@ -242,12 +239,12 @@ async function applyRoutes(server: any, routes: ConfiguredRoute[]): Promise<void
242
239
  }
243
240
  }
244
241
  } catch (err) {
245
- log.e && log.error(`Cannot load module ${file}: ${err}`)
242
+ if (log.e) log.error(`Cannot load module ${file}: ${err}`)
246
243
  return reply.code(500).send(`Invalid handler module ${handler}`)
247
244
  }
248
245
 
249
246
  if (!module || typeof module[func] !== 'function') {
250
- log.e && log.error(`Method ${func} not found in ${file}`)
247
+ if (log.e) log.error(`Method ${func} not found in ${file}`)
251
248
  return reply.code(500).send(`Invalid handler method ${handler}`)
252
249
  }
253
250
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import _ from 'lodash'
2
3
  import type { JobSchedule } from '../../types/global.js'
3
4
  import { normalizePatterns } from '../util/path.js'
@@ -11,55 +12,50 @@ export function load(): any[] {
11
12
  const jobs: any = []
12
13
 
13
14
  const jobScheduleDefaults: JobSchedule = {
14
- active: false, // boolean (required)
15
- type: 'interval', // cron|interval, default: interval
16
- async: true, // boolean, default: true
17
- preventOverrun: true, // boolean, default: true
15
+ active: false,
16
+ type: 'interval',
17
+ async: true,
18
+ preventOverrun: true,
18
19
 
19
- cron: {
20
- // expression: null // required if type = 'cron', use cron syntax (if not specified cron will be disabled)
21
- // timezone: null // optional, like "Europe/Rome" (to test)
22
- },
20
+ cron: {},
23
21
 
24
22
  interval: {
25
- days: 0, // number, default 0
26
- hours: 0, // number, default 0
27
- minutes: 0, // number, default 0
28
- seconds: 0, // number, default 0
29
- milliseconds: 0, // number, default 0
30
- runImmediately: false // boolean, default: false
23
+ days: 0,
24
+ hours: 0,
25
+ minutes: 0,
26
+ seconds: 0,
27
+ milliseconds: 0,
28
+ runImmediately: false
31
29
  }
32
30
  }
33
31
 
34
32
  patterns.forEach((pattern) => {
35
- log.t && log.trace('Looking for ' + pattern)
33
+ if (log.t) log.trace('Looking for ' + pattern)
36
34
  globSync(pattern, { windowsPathsNoEscape: true }).forEach((f: string) => {
37
- log.t && log.trace(`* Add job schedule from ${f}`)
35
+ if (log.t) log.trace(`* Add job schedule from ${f}`)
38
36
 
39
37
  const jobName = path.basename(f, path.extname(f))
40
- let { job, schedule: s } = require(f)
38
+ const { job, schedule: s } = require(f)
41
39
 
42
40
  let isLoadedAndEnabled = false
43
41
  if (s && s.active) {
44
42
  isLoadedAndEnabled = true
45
43
 
46
- // apply defaults
47
-
48
44
  let schedule = _.cloneDeep(jobScheduleDefaults)
49
45
  schedule = _.merge(schedule, s)
50
46
 
51
47
  if (!job || typeof job !== 'function') {
52
- log.t && log.error(`* Job ${jobName} `)
48
+ if (log.t) log.error(`* Job ${jobName} `)
53
49
  isLoadedAndEnabled = false
54
50
  }
55
51
 
56
52
  if (!schedule.type || !['cron', 'interval'].includes(schedule.type)) {
57
- log.t && log.error(`* Job ${jobName}: schedule.type must be cron or interval`)
53
+ if (log.t) log.error(`* Job ${jobName}: schedule.type must be cron or interval`)
58
54
  isLoadedAndEnabled = false
59
55
  }
60
56
 
61
57
  if (schedule.type === 'cron' && !schedule.cron?.expression) {
62
- log.t && log.error(`* Job ${jobName}: schedule.cron.expression not defined`)
58
+ if (log.t) log.error(`* Job ${jobName}: schedule.cron.expression not defined`)
63
59
  isLoadedAndEnabled = false
64
60
  }
65
61
 
@@ -68,24 +64,25 @@ export function load(): any[] {
68
64
  const totalIntervalMs = milliseconds + 1000 * (seconds + 60 * (minutes + 60 * (hours + 24 * days)))
69
65
 
70
66
  if (totalIntervalMs < 1000) {
71
- log.t && log.error(`* Job ${jobName}: schedule.interval must have a total greater or equal to 1s`)
67
+ if (log.t) log.error(`* Job ${jobName}: schedule.interval must have a total greater or equal to 1s`)
72
68
  isLoadedAndEnabled = false
73
69
  }
74
70
  }
75
71
 
76
- isLoadedAndEnabled &&
72
+ if (isLoadedAndEnabled) {
77
73
  jobs.push({
78
74
  jobName,
79
75
  schedule,
80
76
  job
81
77
  })
78
+ }
82
79
  }
83
80
 
84
- log.t && log.trace(`* Job schedule ${jobName} ${isLoadedAndEnabled ? 'enabled' : 'disabled'}`)
81
+ if (log.t) log.trace(`* Job schedule ${jobName} ${isLoadedAndEnabled ? 'enabled' : 'disabled'}`)
85
82
  })
86
83
  })
87
84
 
88
- log.d && log.debug(`Schedule Jobs loaded: ${jobs?.length || 0}`)
85
+ if (log.d) log.debug(`Schedule Jobs loaded: ${jobs?.length || 0}`)
89
86
  return jobs
90
87
  }
91
88
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import _ from 'lodash'
2
3
  import { normalizePatterns } from '../util/path.js'
3
4
  import { globSync } from 'glob'
@@ -13,7 +14,7 @@ export async function apply(server: any): Promise<void> {
13
14
  const customSchemaIds = new Set()
14
15
  let schemaCount = 0
15
16
 
16
- log.t && log.trace('Looking for custom schemas in ' + customSchemaPath)
17
+ if (log.t) log.trace('Looking for custom schemas in ' + customSchemaPath)
17
18
  const customFiles = globSync(customSchemaPath, { windowsPathsNoEscape: true })
18
19
 
19
20
  for (const f of customFiles) {
@@ -31,11 +32,11 @@ export async function apply(server: any): Promise<void> {
31
32
  }
32
33
  })
33
34
  } catch (e) {
34
- log.w && log.warn(`Could not load custom schema file: ${f}`, e)
35
+ if (log.w) log.warn(`Could not load custom schema file: ${f}`, e)
35
36
  }
36
37
  }
37
38
 
38
- log.t && log.trace('Looking for base schemas in ' + baseSchemaPath)
39
+ if (log.t) log.trace('Looking for base schemas in ' + baseSchemaPath)
39
40
  const baseFiles = globSync(baseSchemaPath, { windowsPathsNoEscape: true })
40
41
 
41
42
  for (const f of baseFiles) {
@@ -65,8 +66,8 @@ export async function apply(server: any): Promise<void> {
65
66
  customSchema.required = mergedRequired
66
67
  }
67
68
 
68
- log.d && log.debug(`* Schema [${baseSchema.$id}] deeply merged with core definition`)
69
- log.w && log.warn(`* Schema [${baseSchema.$id}] overrided with custom definition`)
69
+ if (log.d) log.debug(`* Schema [${baseSchema.$id}] deeply merged with core definition`)
70
+ if (log.w) log.warn(`* Schema [${baseSchema.$id}] overrided with custom definition`)
70
71
  }
71
72
  } else {
72
73
  log.trace(`* Schema [${baseSchema.$id}] from ${schemaFileName} registeerd`)
@@ -74,11 +75,11 @@ export async function apply(server: any): Promise<void> {
74
75
  schemaCount++
75
76
  }
76
77
  } else if (name !== 'default') {
77
- log.w && log.warn(`* Schema with no $id found in ${schemaFileName} (export ${name}), cannot be registered`)
78
+ if (log.w) log.warn(`* Schema with no $id found in ${schemaFileName} (export ${name}), cannot be registered`)
78
79
  }
79
80
  })
80
81
  } catch (e) {
81
- log.w && log.warn(`Could not load base schema file: ${f}`, e)
82
+ if (log.w) log.warn(`Could not load base schema file: ${f}`, e)
82
83
  }
83
84
  }
84
85
 
@@ -88,9 +89,9 @@ export async function apply(server: any): Promise<void> {
88
89
  server.addSchema(schema)
89
90
  schemaCount++
90
91
  } catch (e: any) {
91
- log.e && log.error(`Error registering schema ${schema.$id}: ${e.message}`)
92
+ if (log.e) log.error(`Error registering schema ${schema.$id}: ${e.message}`)
92
93
  }
93
94
  })
94
95
 
95
- log.d && log.debug(`Schemas loaded: ${schemaCount} referenceable by $ref`)
96
+ if (log.d) log.debug(`Schemas loaded: ${schemaCount} referenceable by $ref`)
96
97
  }
@@ -11,7 +11,7 @@ export async function load() {
11
11
  const patterns = normalizePatterns(['..', 'config', 'tracking.{ts,js}'], ['src', 'config', 'tracking.{ts,js}'])
12
12
 
13
13
  for (const pattern of patterns) {
14
- log.t && log.trace('Looking for ' + pattern)
14
+ if (log.t) log.trace('Looking for ' + pattern)
15
15
  const files = globSync(pattern, { windowsPathsNoEscape: true })
16
16
 
17
17
  for (const f of files) {
@@ -23,7 +23,7 @@ export async function load() {
23
23
 
24
24
  trackConfig = { ...trackConfig, ...config }
25
25
 
26
- enableAll &&
26
+ if (enableAll) {
27
27
  changes.forEach((change) => {
28
28
  const tc: TrackChanges = { primaryKey: primaryKey, changeEntity: changeEntity, ...change } as TrackChanges
29
29
  const code = getCodeBy(tc.method, tc.path)
@@ -35,11 +35,12 @@ export async function load() {
35
35
  trackChangesList[code] = tc
36
36
  }
37
37
  })
38
+ }
38
39
  }
39
40
  }
40
41
 
41
42
  const keys = Object.keys(trackChangesList) || []
42
- log.d && log.debug(`Tracking changes loaded: ${keys?.length || 0}`)
43
+ if (log.d) log.debug(`Tracking changes loaded: ${keys?.length || 0}`)
43
44
  return { tracking: trackChangesList, trackingConfig: trackConfig }
44
45
  }
45
46
 
@@ -1,3 +1,5 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable prefer-const */
1
3
  import path from 'path'
2
4
  import { globSync } from 'glob'
3
5
  import { I18n } from 'i18n'
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { FastifyReply, FastifyRequest } from 'fastify'
2
3
 
3
4
  export function preHandler(req: FastifyRequest, res: FastifyReply, done: any) {
@@ -8,7 +9,7 @@ export function preHandler(req: FastifyRequest, res: FastifyReply, done: any) {
8
9
 
9
10
  throw new Error('User without this privilege')
10
11
  } catch (err) {
11
- log.e && log.error(`Upps, something just happened ${err}`)
12
+ if (log.e) log.error(`Upps, something just happened ${err}`)
12
13
  res.code(403).send(new Error('User without this privilege'))
13
14
  }
14
15
  }
@@ -1,14 +1,15 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { FastifyReply, FastifyRequest } from 'fastify'
2
3
 
3
4
  export function preHandler(req: FastifyRequest, res: FastifyReply, done: any) {
4
5
  try {
5
- if (!!req.user?.getId()) {
6
+ if (req.user?.getId()) {
6
7
  return done()
7
8
  }
8
9
 
9
10
  throw new Error('Unauthorized')
10
11
  } catch (err) {
11
- log.e && log.error(`Upps, something just happened ${err}`)
12
+ if (log.e) log.error(`Upps, something just happened ${err}`)
12
13
  return res.code(401).send(new Error('Unauthorized')) // must be authorized first
13
14
  }
14
15
  }
@@ -1,3 +1,3 @@
1
1
  import { FastifyReply, FastifyRequest } from 'fastify'
2
2
 
3
- export async function preHandler(req: FastifyRequest, res: FastifyReply) {}
3
+ export async function preHandler(_req: FastifyRequest, _res: FastifyReply) {}
@@ -1,3 +1,3 @@
1
1
  import { FastifyReply, FastifyRequest } from 'fastify'
2
2
 
3
- export async function preHandler(req: FastifyRequest, res: FastifyReply) {}
3
+ export async function preHandler(_req: FastifyRequest, _res: FastifyReply) {}
@@ -54,6 +54,7 @@ export const authMfaChallengeSchema = {
54
54
  nullable: true,
55
55
  properties: {
56
56
  mfaRequired: { type: 'boolean' },
57
+ mfaSetupRequired: { type: 'boolean' },
57
58
  tempToken: { type: 'string' }
58
59
  }
59
60
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { FastifyRequest } from 'fastify'
2
3
  import type { Data } from '../../types/global.js'
3
4
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  export class TranslatedError extends Error {
2
3
  locale: string
3
4
  status: number
@@ -39,7 +39,7 @@ const loggerConfig = {
39
39
  }
40
40
  }
41
41
 
42
- let logger = pino(loggerConfig)
42
+ const logger = pino(loggerConfig)
43
43
  const logLevel = logger.levels.values[loggerConfig.level]
44
44
 
45
45
  // Level: trace debug info warn error fatal silent
package/lib/util/mark.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import require from './require.js'
2
3
  const pkg = require('root-require')('package.json')
3
4
 
@@ -6,21 +7,21 @@ const pkg = require('root-require')('package.json')
6
7
  */
7
8
 
8
9
  export function print(logg: any = log): void {
9
- logg.i && logg.info('Ciao')
10
- logg.i && logg.info(` ,--. ,--. `)
11
- logg.i && logg.info(`.--. ,--,---.| |,---.,--,--,--,--\\\`--',---. `)
12
- logg.i && logg.info(` \\ '' | .-. | / .--' ,-. | ,--/ .--' `)
13
- logg.i && logg.info(` \\ /' '-' | \\ \`--\\ '-' | || | \\ \`--. `)
14
- logg.i && logg.info(` \`--' \`---'\`--'\`---'\`--\`--\`--''--\`--'\`---' `)
15
- logg.i && logg.info('')
16
- logg.t && logg.trace(`Package ${pkg.name}`)
17
- logg.i && logg.info(`License ${pkg.license}`)
18
- logg.i && logg.info(`Version ${pkg.version}`)
19
- logg.i && logg.info(`Codename ${pkg.codename}`)
20
- logg.i && logg.info(`Environment ${process.env.NODE_ENV}`)
21
- logg.t && logg.trace(`Platform ${process.platform} ${process.arch}`)
22
- logg.t && logg.trace(`Root path ${process.cwd()}`)
23
- logg.t && logg.trace(`Node ${process.version}`)
24
- logg.t && logg.trace(`Release ${JSON.stringify(process.release)}`)
25
- logg.t && logg.trace(`Versions ${JSON.stringify(process.versions)}`)
10
+ if (logg.i) logg.info('Ciao')
11
+ if (logg.i) logg.info(` ,--. ,--. `)
12
+ if (logg.i) logg.info(`.--. ,--,---.| |,---.,--,--,--,--\\\`--',---. `)
13
+ if (logg.i) logg.info(` \\ '' | .-. | / .--' ,-. | ,--/ .--' `)
14
+ if (logg.i) logg.info(` \\ /' '-' | \\ \`--\\ '-' | || | \\ \`--. `)
15
+ if (logg.i) logg.info(` \`--' \`---'\`--'\`---'\`--\`--\`--''--\`--'\`---' `)
16
+ if (logg.i) logg.info('')
17
+ if (logg.t) logg.trace(`Package ${pkg.name}`)
18
+ if (logg.i) logg.info(`License ${pkg.license}`)
19
+ if (logg.i) logg.info(`Version ${pkg.version}`)
20
+ if (logg.i) logg.info(`Codename ${pkg.codename}`)
21
+ if (logg.i) logg.info(`Environment ${process.env.NODE_ENV}`)
22
+ if (logg.t) logg.trace(`Platform ${process.platform} ${process.arch}`)
23
+ if (logg.t) logg.trace(`Root path ${process.cwd()}`)
24
+ if (logg.t) logg.trace(`Node ${process.version}`)
25
+ if (logg.t) logg.trace(`Release ${JSON.stringify(process.release)}`)
26
+ if (logg.t) logg.trace(`Versions ${JSON.stringify(process.versions)}`)
26
27
  }
@@ -4,13 +4,13 @@
4
4
  */
5
5
  export const username = /(?=^.{3,33}$)^[a-z][a-z0-9]*[._-]?[a-z0-9]+$/gi
6
6
  export const emailAlt =
7
- /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
7
+ /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
8
8
 
9
9
  /*
10
10
  * email can have multiple words
11
11
  * email can use . - or + for smart labeling
12
12
  */
13
- export const email = /^\w+([\.+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
13
+ export const email = /^\w+([.+-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/
14
14
 
15
15
  /*
16
16
  * password must contain 1 number (0-9)
@@ -20,7 +20,7 @@ export const email = /^\w+([\.+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
20
20
  * password is 8-64 characters with no space
21
21
  */
22
22
  export const password =
23
- /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&*()-_=+\[\]\{\}\\|;:\'",.<>?\^])[A-Za-z\d!@#$%&*()-_=+\[\]\{\}\\|;:\'",.<>?\^]{8,}$/
23
+ /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&*()-_=+[\]{}|;:'",.<>?^])[A-Za-z\d!@#$%&*()-_=+[\]{}|;:'",.<>?^]{8,}$/
24
24
  export const zipCode = /(^\d{5}$)|(^\d{5}-\d{4}$)/
25
25
  export const taxCodePersona =
26
26
  /^[a-zA-Z]{6}[0-9]{2}[abcdehlmprstABCDEHLMPRST]{1}[0-9]{2}([a-zA-Z]{1}[0-9]{3})[a-zA-Z]{1}$/
@@ -1,7 +1,8 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import dayjs from 'dayjs'
2
3
  import type { FastifyRequest, FastifyReply } from '../../types/global.js'
3
4
 
4
- export async function initialize(req: FastifyRequest, reply: FastifyReply) {
5
+ export async function initialize(req: FastifyRequest, _reply: FastifyReply) {
5
6
  if (req.server['dataBaseManager'].isImplemented()) {
6
7
  const tc = getTrackingConfigIfEnabled(req)
7
8
  const allData = { ...req.parameters(), ...req.data() }
@@ -11,7 +12,8 @@ export async function initialize(req: FastifyRequest, reply: FastifyReply) {
11
12
  if (allData && tc.entity && tc.primaryKey && tc.primaryKey in allData) {
12
13
  const key = allData[tc.primaryKey]
13
14
  req.trackingData = await req.server['dataBaseManager'].retrieveBy(tc.entity, key)
14
- log.trace(`Tracking changes: found id ${req.trackingData ? req.trackingData[tc.primaryKey] : null}`)
15
+ if (log.t)
16
+ log.trace(`Tracking changes: found id ${req.trackingData ? req.trackingData[tc.primaryKey] : null}`)
15
17
  }
16
18
  } catch (error) {
17
19
  log.error(`Tracking changes: error on ${tc.code}`)
@@ -21,7 +23,7 @@ export async function initialize(req: FastifyRequest, reply: FastifyReply) {
21
23
  }
22
24
  }
23
25
 
24
- export async function track(req: FastifyRequest, reply: FastifyReply, payload: any) {
26
+ export async function track(req: FastifyRequest, _reply: FastifyReply, payload: any) {
25
27
  if (req.server['dataBaseManager'].isImplemented()) {
26
28
  const tc = getTrackingConfigIfEnabled(req)
27
29
  if (tc) {
@@ -66,7 +68,7 @@ export async function track(req: FastifyRequest, reply: FastifyReply, payload: a
66
68
  }
67
69
 
68
70
  if (addChange) {
69
- log.trace(`Tracking changes: add ${changeEntity} for ${entity}, ${id}, ${userId}, ${status}`)
71
+ if (log.t) log.trace(`Tracking changes: add ${changeEntity} for ${entity}, ${id}, ${userId}, ${status}`)
70
72
  await req.server['dataBaseManager'].addChange(entity, id, status, userId, contents, changeEntity)
71
73
  }
72
74
  } catch (error) {
package/lib/util/yn.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  'use strict'
2
3
 
3
4
  export default function yn(value: any, defaultValue: boolean): boolean {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volcanicminds/backend",
3
- "version": "2.2.7",
3
+ "version": "2.2.9",
4
4
  "type": "module",
5
5
  "codename": "rome",
6
6
  "license": "MIT",
@@ -55,6 +55,10 @@
55
55
  "test:full": "cross-env PORT=2231 NODE_ENV=memory BROWSER=false mocha --loader=tsx ./test/index.spec.ts -t 100000",
56
56
  "reset": "npm install && npm update && npm run build",
57
57
  "upgrade-deps": "npx npm-check-updates -u",
58
+ "lint": "eslint .",
59
+ "lint:fix": "eslint . --fix",
60
+ "type-check": "tsc --noEmit",
61
+ "check-all": "npm run lint && npm run type-check",
58
62
  "combine": "node combine.js"
59
63
  },
60
64
  "dependencies": {
@@ -87,13 +91,18 @@
87
91
  "toad-scheduler": "^3.1.0"
88
92
  },
89
93
  "devDependencies": {
94
+ "@eslint/js": "^9.39.1",
90
95
  "@types/mocha": "^10.0.10",
96
+ "@types/semver": "^7.7.1",
91
97
  "cross-env": "^10.1.0",
98
+ "eslint": "^9.39.1",
92
99
  "expect": "^30.2.0",
100
+ "globals": "^16.5.0",
93
101
  "mocha": "^11.7.5",
94
102
  "npm-upgrade": "^3.1.2",
95
103
  "tsx": "^4.19.2",
96
- "typescript": "^5.9.3"
104
+ "typescript": "^5.9.3",
105
+ "typescript-eslint": "^8.48.0"
97
106
  },
98
107
  "repository": {
99
108
  "type": "git",