@volcanicminds/backend 2.0.4 → 2.1.1

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 (289) hide show
  1. package/README.md +8 -7
  2. package/dist/index.d.ts +7 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +160 -210
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/api/auth/controller/auth.d.ts +35 -0
  7. package/dist/lib/api/auth/controller/auth.d.ts.map +1 -0
  8. package/dist/lib/api/auth/controller/auth.js +245 -333
  9. package/dist/lib/api/auth/controller/auth.js.map +1 -1
  10. package/dist/lib/api/auth/routes.d.ts +90 -0
  11. package/dist/lib/api/auth/routes.d.ts.map +1 -0
  12. package/dist/lib/api/auth/routes.js +1 -2
  13. package/dist/lib/api/auth/routes.js.map +1 -1
  14. package/dist/lib/api/health/controller/health.d.ts +3 -0
  15. package/dist/lib/api/health/controller/health.d.ts.map +1 -0
  16. package/dist/lib/api/health/controller/health.js +1 -4
  17. package/dist/lib/api/health/controller/health.js.map +1 -1
  18. package/dist/lib/api/health/routes.d.ts +26 -0
  19. package/dist/lib/api/health/routes.d.ts.map +1 -0
  20. package/dist/lib/api/health/routes.js +1 -2
  21. package/dist/lib/api/health/routes.js.map +1 -1
  22. package/dist/lib/api/token/controller/token.d.ts +16 -0
  23. package/dist/lib/api/token/controller/token.d.ts.map +1 -0
  24. package/dist/lib/api/token/controller/token.js +69 -105
  25. package/dist/lib/api/token/controller/token.js.map +1 -1
  26. package/dist/lib/api/token/routes.d.ts +179 -0
  27. package/dist/lib/api/token/routes.d.ts.map +1 -0
  28. package/dist/lib/api/token/routes.js +1 -2
  29. package/dist/lib/api/token/routes.js.map +1 -1
  30. package/dist/lib/api/tool/controller/tool.d.ts +3 -0
  31. package/dist/lib/api/tool/controller/tool.d.ts.map +1 -0
  32. package/dist/lib/api/tool/controller/tool.js +8 -22
  33. package/dist/lib/api/tool/controller/tool.js.map +1 -1
  34. package/dist/lib/api/tool/routes.d.ts +26 -0
  35. package/dist/lib/api/tool/routes.d.ts.map +1 -0
  36. package/dist/lib/api/tool/routes.js +1 -2
  37. package/dist/lib/api/tool/routes.js.map +1 -1
  38. package/dist/lib/api/users/controller/user.d.ts +12 -0
  39. package/dist/lib/api/users/controller/user.d.ts.map +1 -0
  40. package/dist/lib/api/users/controller/user.js +59 -112
  41. package/dist/lib/api/users/controller/user.js.map +1 -1
  42. package/dist/lib/api/users/routes.d.ts +173 -0
  43. package/dist/lib/api/users/routes.d.ts.map +1 -0
  44. package/dist/lib/api/users/routes.js +1 -2
  45. package/dist/lib/api/users/routes.js.map +1 -1
  46. package/dist/lib/apollo/context.d.ts +6 -0
  47. package/dist/lib/apollo/context.d.ts.map +1 -0
  48. package/dist/lib/apollo/context.js +2 -16
  49. package/dist/lib/apollo/context.js.map +1 -1
  50. package/dist/lib/apollo/resolvers.d.ts +8 -0
  51. package/dist/lib/apollo/resolvers.d.ts.map +1 -0
  52. package/dist/lib/apollo/resolvers.js +1 -2
  53. package/dist/lib/apollo/resolvers.js.map +1 -1
  54. package/dist/lib/apollo/type-defs.d.ts +3 -0
  55. package/dist/lib/apollo/type-defs.d.ts.map +1 -0
  56. package/dist/lib/apollo/type-defs.js +1 -2
  57. package/dist/lib/apollo/type-defs.js.map +1 -1
  58. package/dist/lib/config/general.d.ts +12 -0
  59. package/dist/lib/config/general.d.ts.map +1 -0
  60. package/dist/lib/config/general.js +1 -2
  61. package/dist/lib/config/general.js.map +1 -1
  62. package/dist/lib/config/plugins.d.ts +25 -0
  63. package/dist/lib/config/plugins.d.ts.map +1 -0
  64. package/dist/lib/config/plugins.js +1 -2
  65. package/dist/lib/config/plugins.js.map +1 -1
  66. package/dist/lib/config/roles.d.ts +7 -0
  67. package/dist/lib/config/roles.d.ts.map +1 -0
  68. package/dist/lib/config/roles.js +1 -2
  69. package/dist/lib/config/roles.js.map +1 -1
  70. package/dist/lib/config/tracking.d.ts +10 -0
  71. package/dist/lib/config/tracking.d.ts.map +1 -0
  72. package/dist/lib/config/tracking.js +1 -2
  73. package/dist/lib/config/tracking.js.map +1 -1
  74. package/dist/lib/hooks/onError.d.ts +3 -0
  75. package/dist/lib/hooks/onError.d.ts.map +1 -0
  76. package/dist/lib/hooks/onError.js +2 -12
  77. package/dist/lib/hooks/onError.js.map +1 -1
  78. package/dist/lib/hooks/onRequest.d.ts +3 -0
  79. package/dist/lib/hooks/onRequest.d.ts.map +1 -0
  80. package/dist/lib/hooks/onRequest.js +24 -35
  81. package/dist/lib/hooks/onRequest.js.map +1 -1
  82. package/dist/lib/hooks/onResponse.d.ts +3 -0
  83. package/dist/lib/hooks/onResponse.d.ts.map +1 -0
  84. package/dist/lib/hooks/onResponse.js +2 -12
  85. package/dist/lib/hooks/onResponse.js.map +1 -1
  86. package/dist/lib/hooks/preHandler.d.ts +3 -0
  87. package/dist/lib/hooks/preHandler.d.ts.map +1 -0
  88. package/dist/lib/hooks/preHandler.js +3 -47
  89. package/dist/lib/hooks/preHandler.js.map +1 -1
  90. package/dist/lib/hooks/preSerialization.d.ts +3 -0
  91. package/dist/lib/hooks/preSerialization.d.ts.map +1 -0
  92. package/dist/lib/hooks/preSerialization.js +6 -53
  93. package/dist/lib/hooks/preSerialization.js.map +1 -1
  94. package/dist/lib/loader/general.d.ts +3 -0
  95. package/dist/lib/loader/general.d.ts.map +1 -0
  96. package/dist/lib/loader/general.js +15 -13
  97. package/dist/lib/loader/general.js.map +1 -1
  98. package/dist/lib/loader/hooks.d.ts +2 -0
  99. package/dist/lib/loader/hooks.d.ts.map +1 -0
  100. package/dist/lib/loader/hooks.js +19 -18
  101. package/dist/lib/loader/hooks.js.map +1 -1
  102. package/dist/lib/loader/plugins.d.ts +2 -0
  103. package/dist/lib/loader/plugins.d.ts.map +1 -0
  104. package/dist/lib/loader/plugins.js +11 -12
  105. package/dist/lib/loader/plugins.js.map +1 -1
  106. package/dist/lib/loader/roles.d.ts +3 -0
  107. package/dist/lib/loader/roles.d.ts.map +1 -0
  108. package/dist/lib/loader/roles.js +11 -12
  109. package/dist/lib/loader/roles.js.map +1 -1
  110. package/dist/lib/loader/router.d.ts +2 -0
  111. package/dist/lib/loader/router.d.ts.map +1 -0
  112. package/dist/lib/loader/router.js +111 -129
  113. package/dist/lib/loader/router.js.map +1 -1
  114. package/dist/lib/loader/schedules.d.ts +3 -0
  115. package/dist/lib/loader/schedules.d.ts.map +1 -0
  116. package/dist/lib/loader/schedules.js +18 -25
  117. package/dist/lib/loader/schedules.js.map +1 -1
  118. package/dist/lib/loader/schemas.d.ts +2 -0
  119. package/dist/lib/loader/schemas.d.ts.map +1 -0
  120. package/dist/lib/loader/schemas.js +26 -22
  121. package/dist/lib/loader/schemas.js.map +1 -1
  122. package/dist/lib/loader/tracking.d.ts +6 -0
  123. package/dist/lib/loader/tracking.d.ts.map +1 -0
  124. package/dist/lib/loader/tracking.js +17 -19
  125. package/dist/lib/loader/tracking.js.map +1 -1
  126. package/dist/lib/loader/translation.d.ts +2 -0
  127. package/dist/lib/loader/translation.d.ts.map +1 -0
  128. package/dist/lib/loader/translation.js +11 -10
  129. package/dist/lib/loader/translation.js.map +1 -1
  130. package/dist/lib/middleware/dispatchForgotPasswordLink.d.ts +3 -0
  131. package/dist/lib/middleware/dispatchForgotPasswordLink.d.ts.map +1 -0
  132. package/dist/lib/middleware/dispatchForgotPasswordLink.js +2 -16
  133. package/dist/lib/middleware/dispatchForgotPasswordLink.js.map +1 -1
  134. package/dist/lib/middleware/isAdmin.d.ts +3 -0
  135. package/dist/lib/middleware/isAdmin.d.ts.map +1 -0
  136. package/dist/lib/middleware/isAdmin.js +1 -4
  137. package/dist/lib/middleware/isAdmin.js.map +1 -1
  138. package/dist/lib/middleware/isAuthenticated.d.ts +3 -0
  139. package/dist/lib/middleware/isAuthenticated.d.ts.map +1 -0
  140. package/dist/lib/middleware/isAuthenticated.js +2 -6
  141. package/dist/lib/middleware/isAuthenticated.js.map +1 -1
  142. package/dist/lib/middleware/postAuth.d.ts +3 -0
  143. package/dist/lib/middleware/postAuth.d.ts.map +1 -0
  144. package/dist/lib/middleware/postAuth.js +2 -16
  145. package/dist/lib/middleware/postAuth.js.map +1 -1
  146. package/dist/lib/middleware/preAuth.d.ts +3 -0
  147. package/dist/lib/middleware/preAuth.d.ts.map +1 -0
  148. package/dist/lib/middleware/preAuth.js +1 -15
  149. package/dist/lib/middleware/preAuth.js.map +1 -1
  150. package/dist/lib/middleware/preForgotPasswordHandler.d.ts +3 -0
  151. package/dist/lib/middleware/preForgotPasswordHandler.d.ts.map +1 -0
  152. package/dist/lib/middleware/preForgotPasswordHandler.js +1 -15
  153. package/dist/lib/middleware/preForgotPasswordHandler.js.map +1 -1
  154. package/dist/lib/schedules/test.job.d.ts +4 -0
  155. package/dist/lib/schedules/test.job.d.ts.map +1 -0
  156. package/dist/lib/schedules/test.job.js +3 -18
  157. package/dist/lib/schedules/test.job.js.map +1 -1
  158. package/dist/lib/schemas/auth.d.ts +175 -0
  159. package/dist/lib/schemas/auth.d.ts.map +1 -0
  160. package/dist/lib/schemas/auth.js +9 -12
  161. package/dist/lib/schemas/auth.js.map +1 -1
  162. package/dist/lib/schemas/common.d.ts +81 -0
  163. package/dist/lib/schemas/common.d.ts.map +1 -0
  164. package/dist/lib/schemas/common.js +6 -9
  165. package/dist/lib/schemas/common.js.map +1 -1
  166. package/dist/lib/schemas/global.d.ts +29 -0
  167. package/dist/lib/schemas/global.d.ts.map +1 -0
  168. package/dist/lib/schemas/global.js +2 -5
  169. package/dist/lib/schemas/global.js.map +1 -1
  170. package/dist/lib/schemas/token.d.ts +68 -0
  171. package/dist/lib/schemas/token.d.ts.map +1 -0
  172. package/dist/lib/schemas/token.js +3 -6
  173. package/dist/lib/schemas/token.js.map +1 -1
  174. package/dist/lib/schemas/user.d.ts +120 -0
  175. package/dist/lib/schemas/user.d.ts.map +1 -0
  176. package/dist/lib/schemas/user.js +5 -8
  177. package/dist/lib/schemas/user.js.map +1 -1
  178. package/dist/lib/util/common.d.ts +5 -0
  179. package/dist/lib/util/common.d.ts.map +1 -0
  180. package/dist/lib/util/common.js +4 -8
  181. package/dist/lib/util/common.js.map +1 -1
  182. package/dist/lib/util/errors.d.ts +15 -0
  183. package/dist/lib/util/errors.d.ts.map +1 -0
  184. package/dist/lib/util/errors.js +7 -7
  185. package/dist/lib/util/errors.js.map +1 -1
  186. package/dist/lib/util/generate.d.ts +2 -0
  187. package/dist/lib/util/generate.d.ts.map +1 -0
  188. package/dist/lib/util/generate.js +2 -5
  189. package/dist/lib/util/generate.js.map +1 -1
  190. package/dist/lib/util/logger.d.ts +35 -0
  191. package/dist/lib/util/logger.d.ts.map +1 -0
  192. package/dist/lib/util/logger.js +8 -12
  193. package/dist/lib/util/logger.js.map +1 -1
  194. package/dist/lib/util/mark.d.ts +2 -0
  195. package/dist/lib/util/mark.d.ts.map +1 -0
  196. package/dist/lib/util/mark.js +2 -4
  197. package/dist/lib/util/mark.js.map +1 -1
  198. package/dist/lib/util/path.d.ts +2 -0
  199. package/dist/lib/util/path.d.ts.map +1 -0
  200. package/dist/lib/util/path.js +5 -5
  201. package/dist/lib/util/path.js.map +1 -1
  202. package/dist/lib/util/regexp.d.ts +12 -0
  203. package/dist/lib/util/regexp.d.ts.map +1 -0
  204. package/dist/lib/util/regexp.js +11 -14
  205. package/dist/lib/util/regexp.js.map +1 -1
  206. package/dist/lib/util/require.d.ts +3 -0
  207. package/dist/lib/util/require.d.ts.map +1 -0
  208. package/dist/lib/util/require.js +4 -0
  209. package/dist/lib/util/require.js.map +1 -0
  210. package/dist/lib/util/tracker.d.ts +4 -0
  211. package/dist/lib/util/tracker.d.ts.map +1 -0
  212. package/dist/lib/util/tracker.js +63 -86
  213. package/dist/lib/util/tracker.js.map +1 -1
  214. package/dist/lib/util/yn.d.ts +2 -0
  215. package/dist/lib/util/yn.d.ts.map +1 -0
  216. package/dist/lib/util/yn.js +1 -3
  217. package/dist/lib/util/yn.js.map +1 -1
  218. package/dist/server.d.ts +2 -0
  219. package/dist/server.d.ts.map +1 -0
  220. package/dist/server.js +1 -2
  221. package/dist/server.js.map +1 -1
  222. package/lib/api/auth/controller/auth.ts +1 -1
  223. package/lib/api/auth/routes.ts +1 -1
  224. package/lib/api/health/routes.ts +1 -1
  225. package/lib/api/token/routes.ts +1 -1
  226. package/lib/api/tool/routes.ts +1 -1
  227. package/lib/api/users/controller/user.ts +2 -2
  228. package/lib/api/users/routes.ts +1 -1
  229. package/lib/apollo/resolvers.ts +1 -1
  230. package/lib/config/general.ts +1 -3
  231. package/lib/config/plugins.ts +1 -3
  232. package/lib/config/roles.ts +1 -1
  233. package/lib/config/tracking.ts +1 -1
  234. package/lib/hooks/onError.ts +1 -1
  235. package/lib/hooks/onRequest.ts +8 -6
  236. package/lib/hooks/onResponse.ts +1 -1
  237. package/lib/hooks/preHandler.ts +2 -2
  238. package/lib/hooks/preSerialization.ts +2 -2
  239. package/lib/loader/general.ts +13 -9
  240. package/lib/loader/hooks.ts +15 -11
  241. package/lib/loader/plugins.ts +14 -10
  242. package/lib/loader/roles.ts +14 -9
  243. package/lib/loader/router.ts +106 -88
  244. package/lib/loader/schedules.ts +6 -6
  245. package/lib/loader/schemas.ts +27 -19
  246. package/lib/loader/tracking.ts +14 -9
  247. package/lib/loader/translation.ts +9 -14
  248. package/lib/schedules/test.job.ts +1 -1
  249. package/lib/util/common.ts +1 -1
  250. package/lib/util/generate.ts +1 -1
  251. package/lib/util/logger.ts +1 -1
  252. package/lib/util/mark.ts +1 -0
  253. package/lib/util/path.ts +6 -1
  254. package/lib/util/require.ts +3 -0
  255. package/lib/util/tracker.ts +1 -1
  256. package/package.json +24 -15
  257. package/.dockerignore +0 -6
  258. package/.mocharc.json +0 -3
  259. package/.nvmrc +0 -1
  260. package/.prettierignore +0 -5
  261. package/.prettierrc +0 -9
  262. package/DOCKER.md +0 -27
  263. package/Dockerfile +0 -24
  264. package/Dockerfile.prod +0 -33
  265. package/NPM.md +0 -24
  266. package/TODO.md +0 -14
  267. package/combine.js +0 -124
  268. package/dist/lib/locales/en.json +0 -12
  269. package/dist/lib/locales/it.json +0 -12
  270. package/dist/nodemon.json +0 -7
  271. package/dist/package-lock.json +0 -9787
  272. package/dist/package.json +0 -108
  273. package/dist/tsconfig.json +0 -32
  274. package/index.d.ts +0 -16
  275. package/index.ts +0 -410
  276. package/logo-dark.png +0 -0
  277. package/nodemon.json +0 -7
  278. package/server.ts +0 -5
  279. package/test/common/api.ts +0 -80
  280. package/test/common/bootstrap.ts +0 -33
  281. package/test/demo/demo.ts +0 -9
  282. package/test/demo/index.ts +0 -14
  283. package/test/e2e/index.ts +0 -14
  284. package/test/index.spec.ts +0 -20
  285. package/test/unit/index.ts +0 -14
  286. package/test/unit/semver.ts +0 -24
  287. package/test/unit/translation.ts +0 -77
  288. package/tsconfig.json +0 -40
  289. package/types/global.d.ts +0 -225
@@ -1,11 +1,11 @@
1
1
  import { FastifyReply, FastifyRequest } from 'fastify'
2
- import { AuthenticatedUser } from '../../../../types/global'
2
+ import type { AuthenticatedUser } from '../../../../types/global.js'
3
3
 
4
4
  export async function getRoles(req: FastifyRequest, reply: FastifyReply) {
5
5
  const allRoles = Object.keys(roles).map((key) => roles[key])
6
6
  return reply.send(allRoles)
7
7
  }
8
-
8
+ // ... resto del file invariato ...
9
9
  export async function count(req: FastifyRequest, reply: FastifyReply) {
10
10
  return req.server['userManager'].countQuery(req.data())
11
11
  }
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  config: {
3
3
  title: 'User functions',
4
4
  description: 'User functions',
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- import { MyContext } from './context'
3
+ import { MyContext } from './context.js'
4
4
 
5
5
  const resolvers = {
6
6
  Query: {
@@ -1,6 +1,4 @@
1
- 'use strict'
2
-
3
- module.exports = {
1
+ export default {
4
2
  name: 'general',
5
3
  enable: true,
6
4
  options: {
@@ -1,6 +1,4 @@
1
- 'use strict'
2
-
3
- module.exports = [
1
+ export default [
4
2
  {
5
3
  name: 'cors',
6
4
  enable: true,
@@ -1,4 +1,4 @@
1
- module.exports = [
1
+ export default [
2
2
  {
3
3
  code: 'public',
4
4
  name: 'Public',
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  config: {
3
3
  enableAll: false, // optional, default true
4
4
  changeEntity: 'Change', // optional, default 'Change'
@@ -1,4 +1,4 @@
1
- module.exports = async (req, reply, error) => {
1
+ export default async (req, reply, error) => {
2
2
  log.e && log.error(`${error}`)
3
3
  log.t && log.trace(error)
4
4
  }
@@ -1,5 +1,5 @@
1
- import { getParams, getData } from '../util/common'
2
- import { AuthenticatedUser, AuthenticatedToken, Role } from '../../types/global'
1
+ import { getParams, getData } from '../util/common.js'
2
+ import type { AuthenticatedUser, AuthenticatedToken, Role } from '../../types/global.js'
3
3
 
4
4
  const { embedded_auth = true } = global.config?.options || {}
5
5
 
@@ -22,7 +22,7 @@ const normalizeRoles = (rolesArray: any[] | undefined): string[] => {
22
22
  return [roles.public.code]
23
23
  }
24
24
 
25
- module.exports = async (req, reply) => {
25
+ export default async (req, reply) => {
26
26
  log.i && (req.startedAt = new Date())
27
27
 
28
28
  // Request enrichment
@@ -88,9 +88,11 @@ module.exports = async (req, reply) => {
88
88
  } catch (error) {
89
89
  const isRoutePublic = (cfg.requiredRoles || []).some((role: Role) => role.code === roles.public.code)
90
90
  if (!isRoutePublic) {
91
- return reply
92
- .status(401)
93
- .send({ statusCode: 401, code: 'UNAUTHORIZED', message: error.message || 'Invalid or expired token' })
91
+ return reply.status(401).send({
92
+ statusCode: 401,
93
+ code: 'UNAUTHORIZED',
94
+ message: (error as any)?.message || 'Invalid or expired token'
95
+ })
94
96
  }
95
97
  }
96
98
  }
@@ -1,4 +1,4 @@
1
- module.exports = async (req, reply) => {
1
+ export default async (req, reply) => {
2
2
  let extraMessage: string = ''
3
3
  if (log.i && req.startedAt) {
4
4
  const elapsed: number = new Date().getTime() - req.startedAt.getTime()
@@ -1,5 +1,5 @@
1
- import * as tracking from '../util/tracker'
1
+ import * as tracking from '../util/tracker.js'
2
2
 
3
- module.exports = async (req, reply) => {
3
+ export default async (req, reply) => {
4
4
  tracking.initialize(req, reply)
5
5
  }
@@ -1,7 +1,7 @@
1
1
  import sizeof from 'object-sizeof'
2
- import * as tracking from '../util/tracker'
2
+ import * as tracking from '../util/tracker.js'
3
3
 
4
- module.exports = async (req, reply, payload) => {
4
+ export default async (req, reply, payload) => {
5
5
  if (log.t) {
6
6
  req.payloadSize = sizeof(req.body) + sizeof(req.params) + sizeof(req.query)
7
7
  reply.payloadSize = sizeof(payload)
@@ -1,8 +1,8 @@
1
- import { GeneralConfig } from '../../types/global'
2
- import { normalizePatterns } from '../util/path'
3
- const glob = require('glob')
1
+ import type { GeneralConfig } from '../../types/global.js'
2
+ import { normalizePatterns } from '../util/path.js'
3
+ import { globSync } from 'glob'
4
4
 
5
- export function load() {
5
+ export async function load() {
6
6
  const generalConfig: GeneralConfig = {
7
7
  name: 'general',
8
8
  enable: true,
@@ -15,10 +15,14 @@ export function load() {
15
15
  }
16
16
 
17
17
  const patterns = normalizePatterns(['..', 'config', 'general.{ts,js}'], ['src', 'config', 'general.{ts,js}'])
18
- patterns.forEach((pattern) => {
18
+
19
+ for (const pattern of patterns) {
19
20
  log.t && log.trace('Looking for ' + pattern)
20
- glob.sync(pattern).forEach((f: string) => {
21
- const config: GeneralConfig = require(f)
21
+ const files = globSync(pattern, { windowsPathsNoEscape: true })
22
+
23
+ for (const f of files) {
24
+ const module = await import(f)
25
+ const config: GeneralConfig = module.default || module
22
26
 
23
27
  if (config.name === generalConfig.name) {
24
28
  generalConfig.enable = config.enable
@@ -27,8 +31,8 @@ export function load() {
27
31
  ...(config.options || {})
28
32
  }
29
33
  }
30
- })
31
- })
34
+ }
35
+ }
32
36
 
33
37
  log.d && log.debug('General configuration loaded')
34
38
  return generalConfig
@@ -1,4 +1,6 @@
1
- import { normalizePatterns } from '../util/path'
1
+ import { normalizePatterns } from '../util/path.js'
2
+ import { globSync } from 'glob'
3
+ import path from 'path'
2
4
 
3
5
  const hooks = [
4
6
  'onRequest',
@@ -16,27 +18,29 @@ const hooks = [
16
18
  'preHandler'
17
19
  ]
18
20
 
19
- const glob = require('glob')
20
- const path = require('path')
21
-
22
- export function apply(server: any): void {
21
+ export async function apply(server: any): Promise<void> {
23
22
  const patterns = normalizePatterns(['..', 'hooks', '*.{ts,js}'], ['src', 'hooks', '*.{ts,js}'])
24
23
  const allHooks: any = hooks.reduce((acc, v) => ({ ...acc, [v]: [] as Function[] }), {})
25
24
 
26
- patterns.forEach((pattern) => {
25
+ for (const pattern of patterns) {
27
26
  log.t && log.trace('Looking for ' + pattern)
28
- glob.sync(pattern).forEach((f: string) => {
27
+ const files = globSync(pattern, { windowsPathsNoEscape: true })
28
+
29
+ for (const f of files) {
30
+ if (f.endsWith('.d.ts')) continue
31
+
29
32
  const hookName = path.basename(f, path.extname(f))
30
- const fn = require(f)
33
+ const module = await import(f)
34
+ const fn = module.default || module
31
35
 
32
- if (fn != null) {
36
+ if (fn != null && typeof fn === 'function') {
33
37
  if (allHooks[hookName] == null) {
34
38
  allHooks[hookName] = [] as Function[]
35
39
  }
36
40
  allHooks[hookName].push((...args) => fn(...args))
37
41
  }
38
- })
39
- })
42
+ }
43
+ }
40
44
 
41
45
  hooks.map((hookName) => {
42
46
  const fns: Function[] = allHooks[hookName]
@@ -1,22 +1,26 @@
1
- import { config } from 'dotenv'
2
- import { normalizePatterns } from '../util/path'
1
+ import { normalizePatterns } from '../util/path.js'
2
+ import { globSync } from 'glob'
3
3
 
4
- const glob = require('glob')
5
-
6
- export function load() {
4
+ export async function load() {
7
5
  const plugins: any = {}
8
6
 
9
7
  const patterns = normalizePatterns(['..', 'config', 'plugins.{ts,js}'], ['src', 'config', 'plugins.{ts,js}'])
10
- patterns.forEach((pattern) => {
8
+
9
+ for (const pattern of patterns) {
11
10
  log.t && log.trace('Looking for ' + pattern)
12
- glob.sync(pattern).forEach((f: string) => {
13
- const configPlugins = require(f)
11
+ const files = globSync(pattern, { windowsPathsNoEscape: true })
12
+
13
+ for (const f of files) {
14
+ const module = await import(f)
15
+ const configPlugins = module.default || module
16
+
14
17
  configPlugins.forEach((plugin) => {
15
18
  plugins[plugin.name] = plugin.enable ? plugin.options : false
16
19
  log.t && log.trace(`* Plugin ${plugin.name} ${plugin.enable ? 'enabled' : 'disabled'}`)
17
20
  })
18
- })
19
- })
21
+ }
22
+ }
23
+
20
24
  const enabledPulgins = Object.keys(plugins).filter((p) => !!plugins[p])
21
25
  log.d && log.debug(`Plugins loaded: ${enabledPulgins.length > 0 ? enabledPulgins.join(', ') : 0}`)
22
26
  return plugins
@@ -1,21 +1,26 @@
1
- import { Role, Roles } from '../../types/global'
2
- import { normalizePatterns } from '../util/path'
3
- const glob = require('glob')
1
+ import type { Role, Roles } from '../../types/global.js'
2
+ import { normalizePatterns } from '../util/path.js'
3
+ import { globSync } from 'glob'
4
4
 
5
- export function load() {
5
+ export async function load() {
6
6
  const roles: Roles = {}
7
7
 
8
8
  const patterns = normalizePatterns(['..', 'config', 'roles.{ts,js}'], ['src', 'config', 'roles.{ts,js}'])
9
- patterns.forEach((pattern) => {
9
+
10
+ for (const pattern of patterns) {
10
11
  log.t && log.trace('Looking for ' + pattern)
11
- glob.sync(pattern).forEach((f: string) => {
12
- const configRoles = require(f)
12
+ const files = globSync(pattern, { windowsPathsNoEscape: true })
13
+
14
+ for (const f of files) {
15
+ const module = await import(f)
16
+ const configRoles = module.default || module
13
17
 
14
18
  configRoles.forEach((role: Role) => {
15
19
  roles[role.code] = role
16
20
  })
17
- })
18
- })
21
+ }
22
+ }
23
+
19
24
  log.d && log.debug('Roles loaded: ' + Object.keys(roles).join(', '))
20
25
  return roles
21
26
  }
@@ -1,26 +1,89 @@
1
- import yn from '../util/yn'
2
- import { Role, Route, ConfiguredRoute, RouteConfig } from '../../types/global'
1
+ import yn from '../util/yn.js'
2
+ import type { Role, Route, ConfiguredRoute, RouteConfig } from '../../types/global.js'
3
3
  import { FastifyReply, FastifyRequest } from 'fastify'
4
- import { normalizePatterns } from '../util/path'
4
+ import { normalizePatterns } from '../util/path.js'
5
+ import { globSync } from 'glob'
6
+ import path from 'path'
7
+ import { fileURLToPath } from 'url'
8
+ import require from '../util/require.js'
9
+
10
+ const __filename = fileURLToPath(import.meta.url)
11
+ const __dirname = path.dirname(__filename)
5
12
 
6
- const glob = require('glob')
7
- const path = require('path')
8
13
  const methods = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH', 'OPTIONS']
9
14
 
10
- export function load(): ConfiguredRoute[] {
15
+ async function tryToLoadFile(fileName: string) {
16
+ try {
17
+ const module = await import(fileName)
18
+ return module.default || module
19
+ } catch (err) {
20
+ return null
21
+ }
22
+ }
23
+
24
+ async function loadMiddleware(base: string, middleware: string = '') {
25
+ const key = 'global.'
26
+ const isGlobal = middleware.indexOf(key) > -1
27
+ let loadedModule: any = null
28
+
29
+ if (isGlobal) {
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)
34
+
35
+ loadedModule = await tryToLoadFile(localPath)
36
+ if (!loadedModule) loadedModule = await tryToLoadFile(localPathJs)
37
+
38
+ // Se non trova locale, prova interno alla lib
39
+ if (!loadedModule) {
40
+ const libPath = path.resolve(__dirname + '/../middleware/' + name + '.js')
41
+ loadedModule = await tryToLoadFile(libPath)
42
+ }
43
+ } else {
44
+ // Middleware locale alla route
45
+ 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
+ loadedModule = await tryToLoadFile(routeMiddPath + '.ts')
48
+ if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath + '.js')
49
+ if (!loadedModule) loadedModule = await tryToLoadFile(routeMiddPath) // Magari ha già estensione
50
+ }
51
+
52
+ if (!loadedModule) {
53
+ log.error(`Middleware ${middleware} not loaded`)
54
+ throw new Error(`Middleware ${middleware} not loaded`)
55
+ }
56
+ return loadedModule
57
+ }
58
+
59
+ async function loadMiddlewares(base: string, middlewares: string[] = []) {
60
+ const midds = {}
61
+ for (const m of middlewares) {
62
+ const middleware = await loadMiddleware(base, m)
63
+ // I middleware possono esportare più funzioni (preHandler, preSerialization, ecc.)
64
+ Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]))
65
+ }
66
+ return midds
67
+ }
68
+
69
+ async function load(): Promise<ConfiguredRoute[]> {
11
70
  const validRoutes: ConfiguredRoute[] = []
12
71
  const patterns = normalizePatterns(['..', 'api', '**', 'routes.{ts,js}'], ['src', 'api', '**', 'routes.{ts,js}'])
13
72
  const authMiddlewares = ['global.isAuthenticated', 'global.isAdmin']
14
73
 
15
- patterns.forEach((pattern) => {
74
+ for (const pattern of patterns) {
16
75
  log.t && log.trace('Looking for ' + pattern)
17
- glob.sync(pattern).forEach((f: string, index: number, values: string[]) => {
76
+ const files = globSync(pattern, { windowsPathsNoEscape: true })
77
+
78
+ for (const f of files) {
79
+ if (f.endsWith('.d.ts')) continue
80
+
18
81
  const base = path.dirname(f)
19
82
  const dir = path.basename(base)
20
83
  const file = path.join(dir, path.basename(f))
21
84
 
22
- // allow array or structure
23
- const routesjs = require(f)
85
+ const module = await import(f)
86
+ const routesjs = module.default || module
24
87
  const { routes = [], config: defaultConfig = {} } = routesjs || {}
25
88
 
26
89
  log.t && log.trace(`* Add ${routes.length} routes from ${file}`)
@@ -41,7 +104,7 @@ export function load(): ConfiguredRoute[] {
41
104
  let requiredRoles: Role[] = []
42
105
 
43
106
  try {
44
- requiredRoles = rsp.some((r) => r.code === roles.admin.code) ? rsp : [...rsp, roles.admin] // admin is always present
107
+ requiredRoles = rsp.some((r) => r.code === roles.admin.code) ? rsp : [...rsp, roles.admin]
45
108
  } catch (err) {
46
109
  log.e && log.error(`Error in loading roles for ${methodCase} ${pathName} (${handler})`)
47
110
  log.t && log.trace(err)
@@ -56,7 +119,6 @@ export function load(): ConfiguredRoute[] {
56
119
  config.security = 'bearer'
57
120
  }
58
121
 
59
- // specific route config
60
122
  const {
61
123
  title = '',
62
124
  description = '',
@@ -73,24 +135,15 @@ export function load(): ConfiguredRoute[] {
73
135
  rawBody = false
74
136
  } = config || {}
75
137
 
76
- // adjust something
77
138
  const endpoint = `${dir}${pathName.replace(/\/+$/, '')}`
78
139
  const method = methodCase.toUpperCase()
79
140
  const num = index + 1
80
141
  const handlerParts = handler.split('.')
81
142
 
82
143
  if (enable) {
83
- if (!pathName.startsWith('/')) {
84
- errors.push(`Error in [${file}] bad path [${pathName}] at route n. ${num}`)
85
- }
86
-
87
- if (!methods.includes(method)) {
88
- errors.push(`Error in [${file}] bad method [${method}] at route n. ${num}`)
89
- }
90
-
91
- if (handlerParts.length !== 2) {
92
- errors.push(`Error in [${file}] bad handler [${handler}] at route n. ${num}`)
93
- }
144
+ if (!pathName.startsWith('/')) errors.push(`Error in [${file}] bad path [${pathName}] at route n. ${num}`)
145
+ if (!methods.includes(method)) errors.push(`Error in [${file}] bad method [${method}] at route n. ${num}`)
146
+ if (handlerParts.length !== 2) errors.push(`Error in [${file}] bad handler [${handler}] at route n. ${num}`)
94
147
 
95
148
  const key = method + endpoint + version
96
149
  if (validRoutes.some((r) => `${r.method}${r.path}${r.doc?.version}` === key)) {
@@ -121,19 +174,7 @@ export function load(): ConfiguredRoute[] {
121
174
  version,
122
175
  security: security === 'bearer' ? [{ Bearer: [] }] : security,
123
176
  response
124
- } as {
125
- summary: string
126
- description: string
127
- deprecated: boolean
128
- tags: string[]
129
- version: string
130
- security: any
131
- response: any
132
- querystring: any | undefined
133
- params: any | undefined
134
- body: any | undefined
135
- consumes: any | undefined
136
- }
177
+ } as any
137
178
 
138
179
  if (query) doc.querystring = query
139
180
  if (params) doc.params = params
@@ -152,67 +193,26 @@ export function load(): ConfiguredRoute[] {
152
193
  base,
153
194
  file: path.join(base, defaultConfig.controller || 'controller', handlerParts[0]),
154
195
  func: handlerParts[1],
155
- doc: doc // swagger & schema validation
196
+ doc: doc
156
197
  })
157
198
  }
158
199
  })
159
- })
160
- })
200
+ }
201
+ }
161
202
 
162
203
  log.d && log.debug(`Routes loaded: ${validRoutes.length}`)
163
204
  return validRoutes
164
205
  }
165
206
 
166
- async function tryToLoadFile(fileName: string) {
167
- return new Promise((resolve, reject) => {
168
- try {
169
- const required = fileName ? require(fileName) : null
170
- resolve(required)
171
- } catch (err) {
172
- reject(err)
173
- }
174
- })
175
- }
176
-
177
- async function loadMiddleware(base: string, middleware: string = '') {
178
- const key = 'global.'
179
- const isGlobal = middleware.indexOf(key) > -1
180
- let required: any = null
181
-
182
- if (isGlobal) {
183
- const name = middleware.substring(key.length)
184
- required = await tryToLoadFile(path.resolve(process.cwd() + '/src/middleware/' + name)).catch(async () => {
185
- return await tryToLoadFile(path.resolve(__dirname + '/../middleware/' + name))
186
- })
187
- } else {
188
- required = await tryToLoadFile(path.resolve(base + '/middleware/' + middleware))
189
- }
190
-
191
- if (!required) {
192
- log.error(`Middleware ${middleware} not loaded`)
193
- throw new Error(`Middleware ${middleware} not loaded`)
207
+ async function applyRoutes(server: any, routes: ConfiguredRoute[]): Promise<void> {
208
+ if (!routes || routes.length === 0) {
209
+ log.w && log.warn('No routes to apply to server')
210
+ return
194
211
  }
195
- return required
196
- }
197
-
198
- async function loadMiddlewares(base: string, middlewares: string[] = []) {
199
- const midds = {}
200
- await Promise.all(
201
- middlewares.map(async (m) => {
202
- const middleware = await loadMiddleware(base, m)
203
- Object.keys(middleware).map((name) => (midds[name] = [...(midds[name] || []), middleware[name]]))
204
- })
205
- )
206
- // log.debug(base + ' middleware ' + middlewares.length + ' -> ' + Object.keys(midds))
207
- return midds
208
- }
209
-
210
- // preParsing, preValidation, preHandler, preSerialization, ..
211
212
 
212
- export function apply(server: any, routes: ConfiguredRoute[]): void {
213
213
  log.t && log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`)
214
214
 
215
- routes.forEach(async (route) => {
215
+ for (const route of routes) {
216
216
  if (route?.enable) {
217
217
  const { handler, method, path, middlewares, roles, rawBody, rateLimit, base, file, func, doc } = route
218
218
 
@@ -231,7 +231,20 @@ export function apply(server: any, routes: ConfiguredRoute[]): void {
231
231
  },
232
232
  handler: async function (req: FastifyRequest, reply: FastifyReply) {
233
233
  try {
234
- const module = await import(file)
234
+ // Import dinamico del controller
235
+ // Dobbiamo assicurarci che 'file' abbia l'estensione corretta o che il resolver la trovi
236
+ // In ESM strict, meglio provare ad aggiungere .js se manca, o lasciare che Node risolva se è un path assoluto
237
+ let module
238
+ try {
239
+ module = await import(file + '.js')
240
+ } catch {
241
+ try {
242
+ module = await import(file + '.ts')
243
+ } catch {
244
+ module = await import(file)
245
+ }
246
+ }
247
+
235
248
  return await module[func](req, reply)
236
249
  } catch (err) {
237
250
  log.e && log.error(`Cannot find ${file} or method ${func}: ${err}`)
@@ -240,5 +253,10 @@ export function apply(server: any, routes: ConfiguredRoute[]): void {
240
253
  }
241
254
  })
242
255
  }
243
- })
256
+ }
257
+ }
258
+
259
+ export async function apply(server: any): Promise<void> {
260
+ const routes = await load()
261
+ return await applyRoutes(server, routes)
244
262
  }
@@ -1,10 +1,10 @@
1
1
  import _ from 'lodash'
2
- import { JobSchedule } from '../../types/global'
3
- import { normalizePatterns } from '../util/path'
2
+ import type { JobSchedule } from '../../types/global.js'
3
+ import { normalizePatterns } from '../util/path.js'
4
4
  import { CronJob, SimpleIntervalJob, Task, AsyncTask } from 'toad-scheduler'
5
-
6
- const glob = require('glob')
7
- const path = require('path')
5
+ import { globSync } from 'glob'
6
+ import path from 'path'
7
+ import require from '../util/require.js'
8
8
 
9
9
  export function load(): any[] {
10
10
  const patterns = normalizePatterns(['..', 'schedules', '*.job.{ts,js}'], ['src', 'schedules', '*.job.{ts,js}'])
@@ -33,7 +33,7 @@ export function load(): any[] {
33
33
 
34
34
  patterns.forEach((pattern) => {
35
35
  log.t && log.trace('Looking for ' + pattern)
36
- glob.sync(pattern).forEach((f: string) => {
36
+ globSync(pattern, { windowsPathsNoEscape: true }).forEach((f: string) => {
37
37
  log.t && log.trace(`* Add job schedule from ${f}`)
38
38
 
39
39
  const jobName = path.basename(f, path.extname(f))