directus 9.23.1 → 9.23.4

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 (383) hide show
  1. package/dist/app.js +25 -21
  2. package/dist/auth/auth.d.ts +3 -3
  3. package/dist/auth/auth.js +2 -0
  4. package/dist/auth/drivers/ldap.d.ts +1 -1
  5. package/dist/auth/drivers/ldap.js +57 -46
  6. package/dist/auth/drivers/local.d.ts +1 -1
  7. package/dist/auth/drivers/local.js +20 -17
  8. package/dist/auth/drivers/oauth2.d.ts +1 -1
  9. package/dist/auth/drivers/oauth2.js +44 -35
  10. package/dist/auth/drivers/openid.d.ts +1 -1
  11. package/dist/auth/drivers/openid.js +50 -41
  12. package/dist/auth/drivers/saml.d.ts +1 -1
  13. package/dist/auth/drivers/saml.js +20 -17
  14. package/dist/auth.d.ts +1 -1
  15. package/dist/auth.js +8 -7
  16. package/dist/cache.d.ts +9 -1
  17. package/dist/cache.js +66 -18
  18. package/dist/cli/commands/bootstrap/index.js +7 -6
  19. package/dist/cli/commands/init/index.js +3 -3
  20. package/dist/cli/commands/schema/apply.js +14 -15
  21. package/dist/cli/commands/schema/snapshot.js +2 -2
  22. package/dist/cli/utils/create-db-connection.d.ts +1 -1
  23. package/dist/cli/utils/create-db-connection.js +3 -2
  24. package/dist/cli/utils/create-env/index.d.ts +2 -2
  25. package/dist/cli/utils/create-env/index.js +1 -1
  26. package/dist/cli/utils/drivers.d.ts +1 -1
  27. package/dist/constants.d.ts +3 -2
  28. package/dist/constants.js +7 -7
  29. package/dist/controllers/activity.js +10 -11
  30. package/dist/controllers/assets.js +31 -25
  31. package/dist/controllers/auth.js +40 -26
  32. package/dist/controllers/collections.js +10 -10
  33. package/dist/controllers/dashboards.js +14 -11
  34. package/dist/controllers/extensions.js +3 -3
  35. package/dist/controllers/fields.js +20 -20
  36. package/dist/controllers/files.js +26 -20
  37. package/dist/controllers/flows.js +16 -13
  38. package/dist/controllers/folders.js +14 -11
  39. package/dist/controllers/graphql.js +6 -8
  40. package/dist/controllers/items.js +22 -19
  41. package/dist/controllers/not-found.d.ts +1 -1
  42. package/dist/controllers/not-found.js +1 -2
  43. package/dist/controllers/notifications.js +14 -11
  44. package/dist/controllers/operations.js +14 -11
  45. package/dist/controllers/panels.js +14 -11
  46. package/dist/controllers/permissions.js +14 -11
  47. package/dist/controllers/presets.js +14 -11
  48. package/dist/controllers/relations.js +10 -10
  49. package/dist/controllers/revisions.js +3 -3
  50. package/dist/controllers/roles.js +14 -11
  51. package/dist/controllers/schema.js +5 -5
  52. package/dist/controllers/server.js +7 -7
  53. package/dist/controllers/settings.js +2 -2
  54. package/dist/controllers/shares.js +21 -18
  55. package/dist/controllers/users.js +32 -36
  56. package/dist/controllers/utils.js +10 -15
  57. package/dist/controllers/webhooks.js +14 -11
  58. package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
  59. package/dist/database/helpers/fn/dialects/mssql.js +10 -11
  60. package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
  61. package/dist/database/helpers/fn/dialects/mysql.js +2 -3
  62. package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
  63. package/dist/database/helpers/fn/dialects/oracle.js +10 -11
  64. package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
  65. package/dist/database/helpers/fn/dialects/postgres.js +10 -11
  66. package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
  67. package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
  68. package/dist/database/helpers/fn/types.d.ts +5 -6
  69. package/dist/database/helpers/fn/types.js +4 -5
  70. package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
  71. package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
  72. package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
  73. package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
  74. package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
  75. package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
  76. package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
  77. package/dist/database/helpers/geometry/types.d.ts +2 -2
  78. package/dist/database/helpers/geometry/types.js +1 -2
  79. package/dist/database/helpers/index.d.ts +5 -5
  80. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -1
  81. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  82. package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
  83. package/dist/database/helpers/schema/dialects/mysql.js +1 -2
  84. package/dist/database/helpers/schema/dialects/oracle.d.ts +2 -2
  85. package/dist/database/helpers/schema/dialects/oracle.js +4 -6
  86. package/dist/database/helpers/schema/types.d.ts +4 -4
  87. package/dist/database/helpers/types.d.ts +1 -1
  88. package/dist/database/helpers/types.js +1 -0
  89. package/dist/database/index.d.ts +1 -1
  90. package/dist/database/index.js +13 -13
  91. package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
  92. package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
  93. package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
  94. package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
  95. package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
  96. package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
  97. package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
  98. package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
  99. package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
  100. package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
  101. package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
  102. package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
  103. package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
  104. package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
  105. package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
  106. package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
  107. package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
  108. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
  109. package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
  110. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
  111. package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
  112. package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
  113. package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
  114. package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
  115. package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
  116. package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
  117. package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
  118. package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
  119. package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
  120. package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
  121. package/dist/database/migrations/20210805B-change-image-metadata-structure.js +15 -15
  122. package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
  123. package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
  124. package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
  125. package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
  126. package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
  127. package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
  128. package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
  129. package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
  130. package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
  131. package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
  132. package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
  133. package/dist/database/migrations/20211007A-update-presets.js +7 -9
  134. package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
  135. package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
  136. package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
  137. package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
  138. package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
  139. package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
  140. package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
  141. package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
  142. package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
  143. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
  144. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
  145. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
  146. package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
  147. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
  148. package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
  149. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
  150. package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
  151. package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
  152. package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
  153. package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
  154. package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
  155. package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
  156. package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
  157. package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
  158. package/dist/database/migrations/run.d.ts +1 -1
  159. package/dist/database/migrations/run.js +1 -1
  160. package/dist/database/run-ast.d.ts +3 -3
  161. package/dist/database/run-ast.js +21 -30
  162. package/dist/database/seeds/run.d.ts +1 -1
  163. package/dist/database/seeds/run.js +1 -2
  164. package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
  165. package/dist/database/system-data/collections/index.d.ts +1 -1
  166. package/dist/database/system-data/collections/index.js +2 -2
  167. package/dist/database/system-data/fields/collections.yaml +2 -0
  168. package/dist/database/system-data/fields/index.d.ts +1 -1
  169. package/dist/database/system-data/fields/index.js +3 -4
  170. package/dist/database/system-data/fields/settings.yaml +4 -0
  171. package/dist/database/system-data/relations/index.d.ts +1 -1
  172. package/dist/emitter.d.ts +1 -1
  173. package/dist/emitter.js +3 -0
  174. package/dist/env.js +11 -3
  175. package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
  176. package/dist/exceptions/database/dialects/mssql.js +5 -6
  177. package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
  178. package/dist/exceptions/database/dialects/mysql.js +19 -25
  179. package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
  180. package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
  181. package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
  182. package/dist/exceptions/database/translate.d.ts +1 -1
  183. package/dist/exceptions/database/value-out-of-range.js +1 -1
  184. package/dist/exceptions/range-not-satisfiable.js +2 -3
  185. package/dist/extensions.d.ts +1 -1
  186. package/dist/extensions.js +43 -33
  187. package/dist/flows.js +65 -46
  188. package/dist/logger.d.ts +2 -1
  189. package/dist/logger.js +35 -19
  190. package/dist/logger.test.d.ts +1 -0
  191. package/dist/mailer.js +16 -16
  192. package/dist/messenger.js +9 -7
  193. package/dist/middleware/authenticate.d.ts +1 -1
  194. package/dist/middleware/authenticate.js +13 -6
  195. package/dist/middleware/cache.d.ts +1 -1
  196. package/dist/middleware/cache.js +16 -16
  197. package/dist/middleware/check-ip.d.ts +1 -1
  198. package/dist/middleware/check-ip.js +1 -1
  199. package/dist/middleware/collection-exists.d.ts +1 -1
  200. package/dist/middleware/collection-exists.js +5 -5
  201. package/dist/middleware/cors.d.ts +1 -1
  202. package/dist/middleware/cors.js +7 -7
  203. package/dist/middleware/error-handler.d.ts +1 -1
  204. package/dist/middleware/error-handler.js +11 -12
  205. package/dist/middleware/extract-token.d.ts +1 -1
  206. package/dist/middleware/extract-token.js +2 -2
  207. package/dist/middleware/get-permissions.d.ts +1 -1
  208. package/dist/middleware/graphql.d.ts +1 -1
  209. package/dist/middleware/graphql.js +15 -9
  210. package/dist/middleware/rate-limiter-global.d.ts +5 -0
  211. package/dist/middleware/rate-limiter-global.js +48 -0
  212. package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
  213. package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +5 -5
  214. package/dist/middleware/respond.d.ts +1 -1
  215. package/dist/middleware/respond.js +18 -19
  216. package/dist/middleware/sanitize-query.d.ts +1 -1
  217. package/dist/middleware/sanitize-query.js +1 -1
  218. package/dist/middleware/schema.d.ts +1 -1
  219. package/dist/middleware/use-collection.d.ts +1 -1
  220. package/dist/operations/condition/index.d.ts +1 -1
  221. package/dist/operations/exec/index.js +15 -4
  222. package/dist/operations/item-create/index.js +1 -2
  223. package/dist/operations/item-delete/index.d.ts +1 -1
  224. package/dist/operations/item-read/index.d.ts +1 -1
  225. package/dist/operations/item-update/index.d.ts +1 -1
  226. package/dist/operations/item-update/index.js +1 -2
  227. package/dist/operations/notification/index.js +1 -2
  228. package/dist/operations/request/index.js +19 -19
  229. package/dist/operations/trigger/index.js +2 -3
  230. package/dist/rate-limiter.d.ts +1 -1
  231. package/dist/rate-limiter.js +9 -9
  232. package/dist/request/validate-ip.js +2 -2
  233. package/dist/server.js +12 -13
  234. package/dist/services/activity.d.ts +1 -1
  235. package/dist/services/activity.js +17 -16
  236. package/dist/services/assets.d.ts +3 -3
  237. package/dist/services/assets.js +35 -37
  238. package/dist/services/authentication.d.ts +2 -2
  239. package/dist/services/authentication.js +22 -19
  240. package/dist/services/authorization.d.ts +3 -3
  241. package/dist/services/authorization.js +27 -31
  242. package/dist/services/collections.d.ts +5 -5
  243. package/dist/services/collections.js +54 -50
  244. package/dist/services/dashboards.d.ts +1 -1
  245. package/dist/services/fields.d.ts +5 -5
  246. package/dist/services/fields.js +50 -50
  247. package/dist/services/files.d.ts +1 -2
  248. package/dist/services/files.js +33 -27
  249. package/dist/services/flows.d.ts +2 -2
  250. package/dist/services/folders.d.ts +1 -1
  251. package/dist/services/graphql/index.d.ts +4 -4
  252. package/dist/services/graphql/index.js +259 -252
  253. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
  254. package/dist/services/graphql/utils/process-error.d.ts +2 -2
  255. package/dist/services/graphql/utils/process-error.js +11 -4
  256. package/dist/services/import-export.d.ts +3 -3
  257. package/dist/services/import-export.js +30 -27
  258. package/dist/services/items.d.ts +3 -3
  259. package/dist/services/items.js +42 -36
  260. package/dist/services/mail/index.d.ts +4 -4
  261. package/dist/services/mail/index.js +14 -10
  262. package/dist/services/meta.d.ts +3 -3
  263. package/dist/services/meta.js +11 -9
  264. package/dist/services/notifications.d.ts +3 -3
  265. package/dist/services/notifications.js +10 -9
  266. package/dist/services/operations.d.ts +2 -2
  267. package/dist/services/panels.d.ts +1 -1
  268. package/dist/services/payload.d.ts +3 -3
  269. package/dist/services/payload.js +124 -122
  270. package/dist/services/permissions.d.ts +3 -3
  271. package/dist/services/permissions.js +11 -11
  272. package/dist/services/presets.d.ts +1 -1
  273. package/dist/services/relations.d.ts +6 -6
  274. package/dist/services/relations.js +45 -43
  275. package/dist/services/revisions.d.ts +1 -1
  276. package/dist/services/revisions.js +3 -3
  277. package/dist/services/roles.d.ts +2 -2
  278. package/dist/services/roles.js +7 -7
  279. package/dist/services/schema.d.ts +3 -3
  280. package/dist/services/schema.js +9 -11
  281. package/dist/services/server.d.ts +3 -3
  282. package/dist/services/server.js +88 -32
  283. package/dist/services/settings.d.ts +1 -1
  284. package/dist/services/shares.d.ts +1 -1
  285. package/dist/services/shares.js +14 -15
  286. package/dist/services/specifications.d.ts +4 -4
  287. package/dist/services/specifications.js +137 -119
  288. package/dist/services/tfa.d.ts +2 -2
  289. package/dist/services/tfa.js +7 -5
  290. package/dist/services/users.d.ts +2 -6
  291. package/dist/services/users.js +37 -40
  292. package/dist/services/utils.d.ts +3 -3
  293. package/dist/services/utils.js +10 -8
  294. package/dist/services/webhooks.d.ts +2 -2
  295. package/dist/services/webhooks.js +2 -1
  296. package/dist/storage/register-locations.js +1 -1
  297. package/dist/types/assets.d.ts +1 -1
  298. package/dist/types/ast.d.ts +1 -1
  299. package/dist/types/auth.d.ts +2 -2
  300. package/dist/types/collection.d.ts +2 -2
  301. package/dist/types/events.d.ts +2 -2
  302. package/dist/types/graphql.d.ts +2 -2
  303. package/dist/types/items.d.ts +3 -3
  304. package/dist/types/services.d.ts +5 -5
  305. package/dist/types/snapshot.d.ts +4 -4
  306. package/dist/utils/apply-diff.d.ts +3 -3
  307. package/dist/utils/apply-diff.js +25 -28
  308. package/dist/utils/apply-query.d.ts +3 -3
  309. package/dist/utils/apply-query.js +10 -12
  310. package/dist/utils/apply-snapshot.d.ts +3 -3
  311. package/dist/utils/apply-snapshot.js +5 -6
  312. package/dist/utils/construct-flow-tree.d.ts +1 -1
  313. package/dist/utils/construct-flow-tree.js +2 -2
  314. package/dist/utils/dynamic-import.js +1 -1
  315. package/dist/utils/filter-items.d.ts +1 -1
  316. package/dist/utils/generate-hash.js +1 -1
  317. package/dist/utils/get-accountability-for-role.d.ts +2 -2
  318. package/dist/utils/get-accountability-for-role.js +1 -1
  319. package/dist/utils/get-ast-from-query.d.ts +3 -3
  320. package/dist/utils/get-ast-from-query.js +22 -28
  321. package/dist/utils/get-auth-providers.js +1 -1
  322. package/dist/utils/get-cache-headers.d.ts +1 -1
  323. package/dist/utils/get-cache-headers.js +6 -7
  324. package/dist/utils/get-cache-key.d.ts +1 -1
  325. package/dist/utils/get-cache-key.js +2 -3
  326. package/dist/utils/get-collection-from-alias.d.ts +1 -1
  327. package/dist/utils/get-collection-from-alias.js +1 -0
  328. package/dist/utils/get-column-path.d.ts +2 -2
  329. package/dist/utils/get-column-path.js +3 -4
  330. package/dist/utils/get-column.d.ts +4 -4
  331. package/dist/utils/get-column.js +4 -5
  332. package/dist/utils/get-default-value.d.ts +2 -2
  333. package/dist/utils/get-default-value.js +2 -3
  334. package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
  335. package/dist/utils/get-graphql-query-and-variables.js +1 -2
  336. package/dist/utils/get-graphql-type.d.ts +2 -2
  337. package/dist/utils/get-graphql-type.js +1 -1
  338. package/dist/utils/get-ip-from-req.d.ts +1 -1
  339. package/dist/utils/get-ip-from-req.js +2 -2
  340. package/dist/utils/get-local-type.d.ts +1 -1
  341. package/dist/utils/get-local-type.js +3 -3
  342. package/dist/utils/get-milliseconds.js +1 -2
  343. package/dist/utils/get-permissions.d.ts +1 -1
  344. package/dist/utils/get-permissions.js +12 -12
  345. package/dist/utils/get-relation-info.d.ts +1 -1
  346. package/dist/utils/get-relation-info.js +3 -5
  347. package/dist/utils/get-relation-type.d.ts +1 -1
  348. package/dist/utils/get-relation-type.js +3 -4
  349. package/dist/utils/get-schema.d.ts +2 -2
  350. package/dist/utils/get-schema.js +20 -22
  351. package/dist/utils/get-snapshot-diff.js +2 -3
  352. package/dist/utils/get-snapshot.d.ts +3 -3
  353. package/dist/utils/get-snapshot.js +6 -8
  354. package/dist/utils/is-directus-jwt.js +1 -1
  355. package/dist/utils/is-url-allowed.js +5 -2
  356. package/dist/utils/job-queue.js +2 -0
  357. package/dist/utils/jwt.d.ts +1 -1
  358. package/dist/utils/merge-permissions-for-share.d.ts +1 -1
  359. package/dist/utils/merge-permissions-for-share.js +3 -4
  360. package/dist/utils/merge-permissions.d.ts +3 -3
  361. package/dist/utils/reduce-schema.d.ts +1 -1
  362. package/dist/utils/reduce-schema.js +12 -12
  363. package/dist/utils/sanitize-query.d.ts +1 -1
  364. package/dist/utils/sanitize-query.js +27 -27
  365. package/dist/utils/sanitize-schema.d.ts +2 -2
  366. package/dist/utils/should-skip-cache.d.ts +7 -0
  367. package/dist/utils/should-skip-cache.js +21 -0
  368. package/dist/utils/should-skip-cache.test.d.ts +1 -0
  369. package/dist/utils/track.js +16 -16
  370. package/dist/utils/transformations.d.ts +1 -1
  371. package/dist/utils/transformations.js +2 -4
  372. package/dist/utils/url.js +7 -2
  373. package/dist/utils/user-name.d.ts +1 -1
  374. package/dist/utils/validate-diff.js +7 -8
  375. package/dist/utils/validate-keys.d.ts +2 -2
  376. package/dist/utils/validate-keys.js +1 -1
  377. package/dist/utils/validate-query.d.ts +1 -1
  378. package/dist/utils/validate-query.js +3 -3
  379. package/dist/utils/validate-storage.js +8 -8
  380. package/dist/webhooks.js +3 -3
  381. package/package.json +36 -37
  382. package/dist/utils/with-timeout.d.ts +0 -1
  383. package/dist/utils/with-timeout.js +0 -16
package/dist/flows.js CHANGED
@@ -67,16 +67,17 @@ const ACCOUNTABILITY_KEY = '$accountability';
67
67
  const LAST_KEY = '$last';
68
68
  const ENV_KEY = '$env';
69
69
  class FlowManager {
70
+ isLoaded = false;
71
+ operations = {};
72
+ triggerHandlers = [];
73
+ operationFlowHandlers = {};
74
+ webhookFlowHandlers = {};
75
+ reloadQueue;
70
76
  constructor() {
71
- this.isLoaded = false;
72
- this.operations = {};
73
- this.triggerHandlers = [];
74
- this.operationFlowHandlers = {};
75
- this.webhookFlowHandlers = {};
76
77
  this.reloadQueue = new job_queue_1.JobQueue();
77
78
  const messenger = (0, messenger_1.getMessenger)();
78
79
  messenger.subscribe('flows', (event) => {
79
- if (event.type === 'reload') {
80
+ if (event['type'] === 'reload') {
80
81
  this.reloadQueue.enqueue(async () => {
81
82
  if (this.isLoaded) {
82
83
  await this.unload();
@@ -121,7 +122,6 @@ class FlowManager {
121
122
  return handler(data, context);
122
123
  }
123
124
  async load() {
124
- var _a, _b, _c, _d;
125
125
  const flowsService = new services_1.FlowsService({ knex: (0, database_1.default)(), schema: await (0, get_schema_1.getSchema)() });
126
126
  const flows = await flowsService.readByQuery({
127
127
  filter: { status: { _eq: 'active' } },
@@ -132,14 +132,13 @@ class FlowManager {
132
132
  for (const flow of flowTrees) {
133
133
  if (flow.trigger === 'event') {
134
134
  let events = [];
135
- if ((_a = flow.options) === null || _a === void 0 ? void 0 : _a.scope) {
136
- events = (0, utils_1.toArray)(flow.options.scope)
135
+ if (flow.options?.['scope']) {
136
+ events = (0, utils_1.toArray)(flow.options['scope'])
137
137
  .map((scope) => {
138
- var _a;
139
138
  if (['items.create', 'items.update', 'items.delete'].includes(scope)) {
140
- if (!((_a = flow.options) === null || _a === void 0 ? void 0 : _a.collections))
139
+ if (!flow.options?.['collections'])
141
140
  return [];
142
- return (0, utils_1.toArray)(flow.options.collections).map((collection) => {
141
+ return (0, utils_1.toArray)(flow.options['collections']).map((collection) => {
143
142
  if (collection.startsWith('directus_')) {
144
143
  const action = scope.split('.')[1];
145
144
  return collection.substring(9) + '.' + action;
@@ -151,11 +150,11 @@ class FlowManager {
151
150
  })
152
151
  .flat();
153
152
  }
154
- if (flow.options.type === 'filter') {
153
+ if (flow.options['type'] === 'filter') {
155
154
  const handler = (payload, meta, context) => this.executeFlow(flow, { payload, ...meta }, {
156
- accountability: context.accountability,
157
- database: context.database,
158
- getSchema: context.schema ? () => context.schema : get_schema_1.getSchema,
155
+ accountability: context['accountability'],
156
+ database: context['database'],
157
+ getSchema: context['schema'] ? () => context['schema'] : get_schema_1.getSchema,
159
158
  });
160
159
  events.forEach((event) => emitter_1.default.onFilter(event, handler));
161
160
  this.triggerHandlers.push({
@@ -163,11 +162,11 @@ class FlowManager {
163
162
  events: events.map((event) => ({ type: 'filter', name: event, handler })),
164
163
  });
165
164
  }
166
- else if (flow.options.type === 'action') {
165
+ else if (flow.options['type'] === 'action') {
167
166
  const handler = (meta, context) => this.executeFlow(flow, meta, {
168
- accountability: context.accountability,
167
+ accountability: context['accountability'],
169
168
  database: (0, database_1.default)(),
170
- getSchema: context.schema ? () => context.schema : get_schema_1.getSchema,
169
+ getSchema: context['schema'] ? () => context['schema'] : get_schema_1.getSchema,
171
170
  });
172
171
  events.forEach((event) => emitter_1.default.onAction(event, handler));
173
172
  this.triggerHandlers.push({
@@ -177,8 +176,8 @@ class FlowManager {
177
176
  }
178
177
  }
179
178
  else if (flow.trigger === 'schedule') {
180
- if ((0, node_cron_1.validate)(flow.options.cron)) {
181
- const task = (0, node_cron_1.schedule)(flow.options.cron, async () => {
179
+ if ((0, node_cron_1.validate)(flow.options['cron'])) {
180
+ const task = (0, node_cron_1.schedule)(flow.options['cron'], async () => {
182
181
  try {
183
182
  await this.executeFlow(flow);
184
183
  }
@@ -189,7 +188,7 @@ class FlowManager {
189
188
  this.triggerHandlers.push({ id: flow.id, events: [{ type: flow.trigger, task }] });
190
189
  }
191
190
  else {
192
- logger_1.default.warn(`Couldn't register cron trigger. Provided cron is invalid: ${flow.options.cron}`);
191
+ logger_1.default.warn(`Couldn't register cron trigger. Provided cron is invalid: ${flow.options['cron']}`);
193
192
  }
194
193
  }
195
194
  else if (flow.trigger === 'operation') {
@@ -198,23 +197,23 @@ class FlowManager {
198
197
  }
199
198
  else if (flow.trigger === 'webhook') {
200
199
  const handler = (data, context) => {
201
- if (flow.options.async) {
200
+ if (flow.options['async']) {
202
201
  this.executeFlow(flow, data, context);
202
+ return undefined;
203
203
  }
204
204
  else {
205
205
  return this.executeFlow(flow, data, context);
206
206
  }
207
207
  };
208
- const method = (_c = (_b = flow.options) === null || _b === void 0 ? void 0 : _b.method) !== null && _c !== void 0 ? _c : 'GET';
208
+ const method = flow.options?.['method'] ?? 'GET';
209
209
  // Default return to $last for webhooks
210
- flow.options.return = (_d = flow.options.return) !== null && _d !== void 0 ? _d : '$last';
210
+ flow.options['return'] = flow.options['return'] ?? '$last';
211
211
  this.webhookFlowHandlers[`${method}-${flow.id}`] = handler;
212
212
  }
213
213
  else if (flow.trigger === 'manual') {
214
214
  const handler = (data, context) => {
215
- var _a, _b;
216
- const enabledCollections = (_b = (_a = flow.options) === null || _a === void 0 ? void 0 : _a.collections) !== null && _b !== void 0 ? _b : [];
217
- const targetCollection = data === null || data === void 0 ? void 0 : data.body.collection;
215
+ const enabledCollections = flow.options?.['collections'] ?? [];
216
+ const targetCollection = data?.['body'].collection;
218
217
  if (!targetCollection) {
219
218
  logger_1.default.warn(`Manual trigger requires "collection" to be specified in the payload`);
220
219
  throw new exceptions.ForbiddenException();
@@ -227,15 +226,16 @@ class FlowManager {
227
226
  logger_1.default.warn(`Specified collection must be one of: ${enabledCollections.join(', ')}.`);
228
227
  throw new exceptions.ForbiddenException();
229
228
  }
230
- if (flow.options.async) {
229
+ if (flow.options['async']) {
231
230
  this.executeFlow(flow, data, context);
231
+ return undefined;
232
232
  }
233
233
  else {
234
234
  return this.executeFlow(flow, data, context);
235
235
  }
236
236
  };
237
237
  // Default return to $last for manual
238
- flow.options.return = '$last';
238
+ flow.options['return'] = '$last';
239
239
  this.webhookFlowHandlers[`POST-${flow.id}`] = handler;
240
240
  }
241
241
  }
@@ -263,14 +263,13 @@ class FlowManager {
263
263
  this.isLoaded = false;
264
264
  }
265
265
  async executeFlow(flow, data = null, context = {}) {
266
- var _a, _b, _c, _d, _e, _f, _g;
267
- const database = (_a = context.database) !== null && _a !== void 0 ? _a : (0, database_1.default)();
268
- const schema = (_b = context.schema) !== null && _b !== void 0 ? _b : (await (0, get_schema_1.getSchema)({ database }));
266
+ const database = context['database'] ?? (0, database_1.default)();
267
+ const schema = context['schema'] ?? (await (0, get_schema_1.getSchema)({ database }));
269
268
  const keyedData = {
270
269
  [TRIGGER_KEY]: data,
271
270
  [LAST_KEY]: data,
272
- [ACCOUNTABILITY_KEY]: (_c = context === null || context === void 0 ? void 0 : context.accountability) !== null && _c !== void 0 ? _c : null,
273
- [ENV_KEY]: (0, lodash_1.pick)(env_1.default, env_1.default.FLOWS_ENV_ALLOW_LIST ? (0, utils_1.toArray)(env_1.default.FLOWS_ENV_ALLOW_LIST) : []),
271
+ [ACCOUNTABILITY_KEY]: context?.['accountability'] ?? null,
272
+ [ENV_KEY]: (0, lodash_1.pick)(env_1.default, env_1.default['FLOWS_ENV_ALLOW_LIST'] ? (0, utils_1.toArray)(env_1.default['FLOWS_ENV_ALLOW_LIST']) : []),
274
273
  };
275
274
  let nextOperation = flow.operation;
276
275
  let lastOperationStatus = 'unknown';
@@ -288,14 +287,14 @@ class FlowManager {
288
287
  knex: database,
289
288
  schema: schema,
290
289
  });
291
- const accountability = context === null || context === void 0 ? void 0 : context.accountability;
290
+ const accountability = context?.['accountability'];
292
291
  const activity = await activityService.createOne({
293
292
  action: types_1.Action.RUN,
294
- user: (_d = accountability === null || accountability === void 0 ? void 0 : accountability.user) !== null && _d !== void 0 ? _d : null,
293
+ user: accountability?.user ?? null,
295
294
  collection: 'directus_flows',
296
- ip: (_e = accountability === null || accountability === void 0 ? void 0 : accountability.ip) !== null && _e !== void 0 ? _e : null,
297
- user_agent: (_f = accountability === null || accountability === void 0 ? void 0 : accountability.userAgent) !== null && _f !== void 0 ? _f : null,
298
- origin: (_g = accountability === null || accountability === void 0 ? void 0 : accountability.origin) !== null && _g !== void 0 ? _g : null,
295
+ ip: accountability?.ip ?? null,
296
+ user_agent: accountability?.userAgent ?? null,
297
+ origin: accountability?.origin ?? null,
299
298
  item: flow.id,
300
299
  });
301
300
  if (flow.accountability === 'all') {
@@ -314,14 +313,14 @@ class FlowManager {
314
313
  });
315
314
  }
316
315
  }
317
- if (flow.trigger === 'event' && flow.options.type === 'filter' && lastOperationStatus === 'reject') {
316
+ if (flow.trigger === 'event' && flow.options['type'] === 'filter' && lastOperationStatus === 'reject') {
318
317
  throw keyedData[LAST_KEY];
319
318
  }
320
- if (flow.options.return === '$all') {
319
+ if (flow.options['return'] === '$all') {
321
320
  return keyedData;
322
321
  }
323
- else if (flow.options.return) {
324
- return (0, micromustache_1.get)(keyedData, flow.options.return);
322
+ else if (flow.options['return']) {
323
+ return (0, micromustache_1.get)(keyedData, flow.options['return']);
325
324
  }
326
325
  return undefined;
327
326
  }
@@ -344,15 +343,35 @@ class FlowManager {
344
343
  accountability: null,
345
344
  ...context,
346
345
  });
346
+ // Validate that the operations result is serializable and thus catching the error inside the flow execution
347
+ JSON.stringify(result ?? null);
347
348
  // JSON structures don't allow for undefined values, so we need to replace them with null
348
349
  // Otherwise the applyOptionsData function will not work correctly on the next operation
349
350
  if (typeof result === 'object' && result !== null) {
350
351
  result = (0, map_values_deep_1.mapValuesDeep)(result, (_, value) => (value === undefined ? null : value));
351
352
  }
352
- return { successor: operation.resolve, status: 'resolve', data: result !== null && result !== void 0 ? result : null, options };
353
+ return { successor: operation.resolve, status: 'resolve', data: result ?? null, options };
353
354
  }
354
355
  catch (error) {
355
- return { successor: operation.reject, status: 'reject', data: error !== null && error !== void 0 ? error : null, options };
356
+ let data;
357
+ if (error instanceof Error) {
358
+ // If the error is instance of Error, use the message of it as the error data
359
+ data = { message: error.message };
360
+ }
361
+ else if (typeof error === 'string') {
362
+ // If the error is a JSON string, parse it and use that as the error data
363
+ data = (0, utils_1.isValidJSON)(error) ? (0, utils_1.parseJSON)(error) : error;
364
+ }
365
+ else {
366
+ // If error is plain object, use this as the error data and otherwise fallback to null
367
+ data = error ?? null;
368
+ }
369
+ return {
370
+ successor: operation.reject,
371
+ status: 'reject',
372
+ data,
373
+ options,
374
+ };
356
375
  }
357
376
  }
358
377
  }
package/dist/logger.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /// <reference types="qs" />
2
- import { RequestHandler } from 'express';
3
2
  import { LoggerOptions } from 'pino';
3
+ import type { RequestHandler } from 'express';
4
+ export declare const httpLoggerOptions: LoggerOptions;
4
5
  declare const logger: import("pino").Logger<LoggerOptions & Record<string, any>>;
5
6
  export declare const expressLogger: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
6
7
  export default logger;
package/dist/logger.js CHANGED
@@ -26,29 +26,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.expressLogger = void 0;
29
+ exports.expressLogger = exports.httpLoggerOptions = void 0;
30
+ const utils_1 = require("@directus/shared/utils");
31
+ const lodash_1 = require("lodash");
30
32
  const pino_1 = __importDefault(require("pino"));
31
33
  const pino_http_1 = __importStar(require("pino-http"));
32
- const get_config_from_env_1 = require("./utils/get-config-from-env");
33
34
  const url_1 = require("url");
34
35
  const env_1 = __importDefault(require("./env"));
35
- const utils_1 = require("@directus/shared/utils");
36
- const lodash_1 = require("lodash");
36
+ const constants_1 = require("./constants");
37
+ const get_config_from_env_1 = require("./utils/get-config-from-env");
37
38
  const pinoOptions = {
38
- level: env_1.default.LOG_LEVEL || 'info',
39
+ level: env_1.default['LOG_LEVEL'] || 'info',
39
40
  redact: {
40
- paths: ['req.headers.authorization', `req.cookies.${env_1.default.REFRESH_TOKEN_COOKIE_NAME}`],
41
- censor: '--redact--',
41
+ paths: ['req.headers.authorization', 'req.headers.cookie'],
42
+ censor: constants_1.REDACT_TEXT,
42
43
  },
43
44
  };
44
- const httpLoggerOptions = {
45
- level: env_1.default.LOG_LEVEL || 'info',
45
+ exports.httpLoggerOptions = {
46
+ level: env_1.default['LOG_LEVEL'] || 'info',
46
47
  redact: {
47
- paths: ['req.headers.authorization', `req.cookies.${env_1.default.REFRESH_TOKEN_COOKIE_NAME}`],
48
- censor: '--redact--',
48
+ paths: ['req.headers.authorization', 'req.headers.cookie'],
49
+ censor: constants_1.REDACT_TEXT,
49
50
  },
50
51
  };
51
- if (env_1.default.LOG_STYLE !== 'raw') {
52
+ if (env_1.default['LOG_STYLE'] !== 'raw') {
52
53
  pinoOptions.transport = {
53
54
  target: 'pino-pretty',
54
55
  options: {
@@ -56,7 +57,7 @@ if (env_1.default.LOG_STYLE !== 'raw') {
56
57
  sync: true,
57
58
  },
58
59
  };
59
- httpLoggerOptions.transport = {
60
+ exports.httpLoggerOptions.transport = {
60
61
  target: 'pino-http-print',
61
62
  options: {
62
63
  all: true,
@@ -69,11 +70,26 @@ if (env_1.default.LOG_STYLE !== 'raw') {
69
70
  },
70
71
  };
71
72
  }
73
+ if (env_1.default['LOG_STYLE'] === 'raw') {
74
+ exports.httpLoggerOptions.redact = {
75
+ paths: ['req.headers.authorization', 'req.headers.cookie', 'res.headers'],
76
+ censor: (value, pathParts) => {
77
+ const path = pathParts.join('.');
78
+ if (path === 'res.headers') {
79
+ if ('set-cookie' in value) {
80
+ value['set-cookie'] = constants_1.REDACT_TEXT;
81
+ }
82
+ return value;
83
+ }
84
+ return constants_1.REDACT_TEXT;
85
+ },
86
+ };
87
+ }
72
88
  const loggerEnvConfig = (0, get_config_from_env_1.getConfigFromEnv)('LOGGER_', 'LOGGER_HTTP');
73
89
  // Expose custom log levels into formatter function
74
- if (loggerEnvConfig.levels) {
90
+ if (loggerEnvConfig['levels']) {
75
91
  const customLogLevels = {};
76
- for (const el of (0, utils_1.toArray)(loggerEnvConfig.levels)) {
92
+ for (const el of (0, utils_1.toArray)(loggerEnvConfig['levels'])) {
77
93
  const key_val = el.split(':');
78
94
  customLogLevels[key_val[0].trim()] = key_val[1].trim();
79
95
  }
@@ -85,7 +101,7 @@ if (loggerEnvConfig.levels) {
85
101
  };
86
102
  },
87
103
  };
88
- httpLoggerOptions.formatters = {
104
+ exports.httpLoggerOptions.formatters = {
89
105
  level(label, number) {
90
106
  return {
91
107
  severity: customLogLevels[label] || 'info',
@@ -93,12 +109,12 @@ if (loggerEnvConfig.levels) {
93
109
  };
94
110
  },
95
111
  };
96
- delete loggerEnvConfig.levels;
112
+ delete loggerEnvConfig['levels'];
97
113
  }
98
114
  const logger = (0, pino_1.default)((0, lodash_1.merge)(pinoOptions, loggerEnvConfig));
99
115
  const httpLoggerEnvConfig = (0, get_config_from_env_1.getConfigFromEnv)('LOGGER_HTTP', ['LOGGER_HTTP_LOGGER']);
100
116
  exports.expressLogger = (0, pino_http_1.default)({
101
- logger: (0, pino_1.default)((0, lodash_1.merge)(httpLoggerOptions, loggerEnvConfig)),
117
+ logger: (0, pino_1.default)((0, lodash_1.merge)(exports.httpLoggerOptions, loggerEnvConfig)),
102
118
  ...httpLoggerEnvConfig,
103
119
  serializers: {
104
120
  req(request) {
@@ -112,7 +128,7 @@ exports.default = logger;
112
128
  function redactQuery(originalPath) {
113
129
  const url = new url_1.URL(originalPath, 'http://example.com/');
114
130
  if (url.searchParams.has('access_token')) {
115
- url.searchParams.set('access_token', '--redacted--');
131
+ url.searchParams.set('access_token', constants_1.REDACT_TEXT);
116
132
  }
117
133
  return url.pathname + url.search;
118
134
  }
@@ -0,0 +1 @@
1
+ export {};
package/dist/mailer.js CHANGED
@@ -11,12 +11,12 @@ let transporter;
11
11
  function getMailer() {
12
12
  if (transporter)
13
13
  return transporter;
14
- const transportName = env_1.default.EMAIL_TRANSPORT.toLowerCase();
14
+ const transportName = env_1.default['EMAIL_TRANSPORT'].toLowerCase();
15
15
  if (transportName === 'sendmail') {
16
16
  transporter = nodemailer_1.default.createTransport({
17
17
  sendmail: true,
18
- newline: env_1.default.EMAIL_SENDMAIL_NEW_LINE || 'unix',
19
- path: env_1.default.EMAIL_SENDMAIL_PATH || '/usr/sbin/sendmail',
18
+ newline: env_1.default['EMAIL_SENDMAIL_NEW_LINE'] || 'unix',
19
+ path: env_1.default['EMAIL_SENDMAIL_PATH'] || '/usr/sbin/sendmail',
20
20
  });
21
21
  }
22
22
  else if (transportName === 'ses') {
@@ -29,20 +29,20 @@ function getMailer() {
29
29
  }
30
30
  else if (transportName === 'smtp') {
31
31
  let auth = false;
32
- if (env_1.default.EMAIL_SMTP_USER || env_1.default.EMAIL_SMTP_PASSWORD) {
32
+ if (env_1.default['EMAIL_SMTP_USER'] || env_1.default['EMAIL_SMTP_PASSWORD']) {
33
33
  auth = {
34
- user: env_1.default.EMAIL_SMTP_USER,
35
- pass: env_1.default.EMAIL_SMTP_PASSWORD,
34
+ user: env_1.default['EMAIL_SMTP_USER'],
35
+ pass: env_1.default['EMAIL_SMTP_PASSWORD'],
36
36
  };
37
37
  }
38
38
  const tls = (0, get_config_from_env_1.getConfigFromEnv)('EMAIL_SMTP_TLS_');
39
39
  transporter = nodemailer_1.default.createTransport({
40
- name: env_1.default.EMAIL_SMTP_NAME,
41
- pool: env_1.default.EMAIL_SMTP_POOL,
42
- host: env_1.default.EMAIL_SMTP_HOST,
43
- port: env_1.default.EMAIL_SMTP_PORT,
44
- secure: env_1.default.EMAIL_SMTP_SECURE,
45
- ignoreTLS: env_1.default.EMAIL_SMTP_IGNORE_TLS,
40
+ name: env_1.default['EMAIL_SMTP_NAME'],
41
+ pool: env_1.default['EMAIL_SMTP_POOL'],
42
+ host: env_1.default['EMAIL_SMTP_HOST'],
43
+ port: env_1.default['EMAIL_SMTP_PORT'],
44
+ secure: env_1.default['EMAIL_SMTP_SECURE'],
45
+ ignoreTLS: env_1.default['EMAIL_SMTP_IGNORE_TLS'],
46
46
  auth,
47
47
  tls,
48
48
  });
@@ -51,16 +51,16 @@ function getMailer() {
51
51
  const mg = require('nodemailer-mailgun-transport');
52
52
  transporter = nodemailer_1.default.createTransport(mg({
53
53
  auth: {
54
- api_key: env_1.default.EMAIL_MAILGUN_API_KEY,
55
- domain: env_1.default.EMAIL_MAILGUN_DOMAIN,
54
+ api_key: env_1.default['EMAIL_MAILGUN_API_KEY'],
55
+ domain: env_1.default['EMAIL_MAILGUN_DOMAIN'],
56
56
  },
57
- host: env_1.default.EMAIL_MAILGUN_HOST || 'api.mailgun.net',
57
+ host: env_1.default['EMAIL_MAILGUN_HOST'] || 'api.mailgun.net',
58
58
  }));
59
59
  }
60
60
  else if (transportName === 'sendgrid') {
61
61
  const sg = require('nodemailer-sendgrid');
62
62
  transporter = nodemailer_1.default.createTransport(sg({
63
- apiKey: env_1.default.EMAIL_SENDGRID_API_KEY,
63
+ apiKey: env_1.default['EMAIL_SENDGRID_API_KEY'],
64
64
  }));
65
65
  }
66
66
  else {
package/dist/messenger.js CHANGED
@@ -9,12 +9,12 @@ const ioredis_1 = __importDefault(require("ioredis"));
9
9
  const env_1 = __importDefault(require("./env"));
10
10
  const get_config_from_env_1 = require("./utils/get-config-from-env");
11
11
  class MessengerMemory {
12
+ handlers;
12
13
  constructor() {
13
14
  this.handlers = {};
14
15
  }
15
16
  publish(channel, payload) {
16
- var _a, _b;
17
- (_b = (_a = this.handlers)[channel]) === null || _b === void 0 ? void 0 : _b.call(_a, payload);
17
+ this.handlers[channel]?.(payload);
18
18
  }
19
19
  subscribe(channel, callback) {
20
20
  this.handlers[channel] = callback;
@@ -25,12 +25,14 @@ class MessengerMemory {
25
25
  }
26
26
  exports.MessengerMemory = MessengerMemory;
27
27
  class MessengerRedis {
28
+ namespace;
29
+ pub;
30
+ sub;
28
31
  constructor() {
29
- var _a, _b, _c;
30
32
  const config = (0, get_config_from_env_1.getConfigFromEnv)('MESSENGER_REDIS');
31
- this.pub = new ioredis_1.default((_a = env_1.default.MESSENGER_REDIS) !== null && _a !== void 0 ? _a : config);
32
- this.sub = new ioredis_1.default((_b = env_1.default.MESSENGER_REDIS) !== null && _b !== void 0 ? _b : config);
33
- this.namespace = (_c = env_1.default.MESSENGER_NAMESPACE) !== null && _c !== void 0 ? _c : 'directus';
33
+ this.pub = new ioredis_1.default(env_1.default['MESSENGER_REDIS'] ?? config);
34
+ this.sub = new ioredis_1.default(env_1.default['MESSENGER_REDIS'] ?? config);
35
+ this.namespace = env_1.default['MESSENGER_NAMESPACE'] ?? 'directus';
34
36
  }
35
37
  publish(channel, payload) {
36
38
  this.pub.publish(`${this.namespace}:${channel}`, JSON.stringify(payload));
@@ -53,7 +55,7 @@ let messenger;
53
55
  function getMessenger() {
54
56
  if (messenger)
55
57
  return messenger;
56
- if (env_1.default.MESSENGER_STORE === 'redis') {
58
+ if (env_1.default['MESSENGER_STORE'] === 'redis') {
57
59
  messenger = new MessengerRedis();
58
60
  }
59
61
  else {
@@ -1,5 +1,5 @@
1
1
  /// <reference types="qs" />
2
- import { NextFunction, Request, Response } from 'express';
2
+ import type { NextFunction, Request, Response } from 'express';
3
3
  /**
4
4
  * Verify the passed JWT and assign the user ID and role to `req`
5
5
  */
@@ -23,9 +23,13 @@ const handler = async (req, res, next) => {
23
23
  admin: false,
24
24
  app: false,
25
25
  ip: (0, get_ip_from_req_1.getIPFromReq)(req),
26
- userAgent: req.get('user-agent'),
27
- origin: req.get('origin'),
28
26
  };
27
+ const userAgent = req.get('user-agent');
28
+ if (userAgent)
29
+ defaultAccountability.userAgent = userAgent;
30
+ const origin = req.get('origin');
31
+ if (origin)
32
+ defaultAccountability.origin = origin;
29
33
  const database = (0, database_1.default)();
30
34
  const customAccountability = await emitter_1.default.emitFilter('authenticate', defaultAccountability, {
31
35
  req,
@@ -41,13 +45,16 @@ const handler = async (req, res, next) => {
41
45
  req.accountability = defaultAccountability;
42
46
  if (req.token) {
43
47
  if ((0, is_directus_jwt_1.default)(req.token)) {
44
- const payload = (0, jwt_1.verifyAccessJWT)(req.token, env_1.default.SECRET);
45
- req.accountability.share = payload.share;
46
- req.accountability.share_scope = payload.share_scope;
47
- req.accountability.user = payload.id;
48
+ const payload = (0, jwt_1.verifyAccessJWT)(req.token, env_1.default['SECRET']);
48
49
  req.accountability.role = payload.role;
49
50
  req.accountability.admin = payload.admin_access === true || payload.admin_access == 1;
50
51
  req.accountability.app = payload.app_access === true || payload.app_access == 1;
52
+ if (payload.share)
53
+ req.accountability.share = payload.share;
54
+ if (payload.share_scope)
55
+ req.accountability.share_scope = payload.share_scope;
56
+ if (payload.id)
57
+ req.accountability.user = payload.id;
51
58
  }
52
59
  else {
53
60
  // Try finding the user with the provided token
@@ -1,3 +1,3 @@
1
- import { RequestHandler } from 'express';
1
+ import type { RequestHandler } from 'express';
2
2
  declare const checkCacheMiddleware: RequestHandler;
3
3
  export default checkCacheMiddleware;
@@ -5,22 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const cache_1 = require("../cache");
7
7
  const env_1 = __importDefault(require("../env"));
8
+ const logger_1 = __importDefault(require("../logger"));
8
9
  const async_handler_1 = __importDefault(require("../utils/async-handler"));
9
10
  const get_cache_headers_1 = require("../utils/get-cache-headers");
10
11
  const get_cache_key_1 = require("../utils/get-cache-key");
11
- const logger_1 = __importDefault(require("../logger"));
12
+ const should_skip_cache_1 = require("../utils/should-skip-cache");
12
13
  const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next) => {
13
- var _a, _b, _c, _d;
14
14
  const { cache } = (0, cache_1.getCache)();
15
- if (req.method.toLowerCase() !== 'get' && ((_a = req.originalUrl) === null || _a === void 0 ? void 0 : _a.startsWith('/graphql')) === false)
15
+ if (req.method.toLowerCase() !== 'get' && req.originalUrl?.startsWith('/graphql') === false)
16
16
  return next();
17
- if (env_1.default.CACHE_ENABLED !== true)
17
+ if (env_1.default['CACHE_ENABLED'] !== true)
18
18
  return next();
19
19
  if (!cache)
20
20
  return next();
21
- if (((_b = req.headers['cache-control']) === null || _b === void 0 ? void 0 : _b.includes('no-store')) || ((_c = req.headers['Cache-Control']) === null || _c === void 0 ? void 0 : _c.includes('no-store'))) {
22
- if (env_1.default.CACHE_STATUS_HEADER)
23
- res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
21
+ if ((0, should_skip_cache_1.shouldSkipCache)(req)) {
22
+ if (env_1.default['CACHE_STATUS_HEADER'])
23
+ res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
24
24
  return next();
25
25
  }
26
26
  const key = (0, get_cache_key_1.getCacheKey)(req);
@@ -30,31 +30,31 @@ const checkCacheMiddleware = (0, async_handler_1.default)(async (req, res, next)
30
30
  }
31
31
  catch (err) {
32
32
  logger_1.default.warn(err, `[cache] Couldn't read key ${key}. ${err.message}`);
33
- if (env_1.default.CACHE_STATUS_HEADER)
34
- res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
33
+ if (env_1.default['CACHE_STATUS_HEADER'])
34
+ res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
35
35
  return next();
36
36
  }
37
37
  if (cachedData) {
38
38
  let cacheExpiryDate;
39
39
  try {
40
- cacheExpiryDate = (_d = (await (0, cache_1.getCacheValue)(cache, `${key}__expires_at`))) === null || _d === void 0 ? void 0 : _d.exp;
40
+ cacheExpiryDate = (await (0, cache_1.getCacheValue)(cache, `${key}__expires_at`))?.exp;
41
41
  }
42
42
  catch (err) {
43
43
  logger_1.default.warn(err, `[cache] Couldn't read key ${`${key}__expires_at`}. ${err.message}`);
44
- if (env_1.default.CACHE_STATUS_HEADER)
45
- res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
44
+ if (env_1.default['CACHE_STATUS_HEADER'])
45
+ res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
46
46
  return next();
47
47
  }
48
48
  const cacheTTL = cacheExpiryDate ? cacheExpiryDate - Date.now() : undefined;
49
49
  res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, cacheTTL, true, true));
50
50
  res.setHeader('Vary', 'Origin, Cache-Control');
51
- if (env_1.default.CACHE_STATUS_HEADER)
52
- res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'HIT');
51
+ if (env_1.default['CACHE_STATUS_HEADER'])
52
+ res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'HIT');
53
53
  return res.json(cachedData);
54
54
  }
55
55
  else {
56
- if (env_1.default.CACHE_STATUS_HEADER)
57
- res.setHeader(`${env_1.default.CACHE_STATUS_HEADER}`, 'MISS');
56
+ if (env_1.default['CACHE_STATUS_HEADER'])
57
+ res.setHeader(`${env_1.default['CACHE_STATUS_HEADER']}`, 'MISS');
58
58
  return next();
59
59
  }
60
60
  });
@@ -1,2 +1,2 @@
1
- import { RequestHandler } from 'express';
1
+ import type { RequestHandler } from 'express';
2
2
  export declare const checkIP: RequestHandler;
@@ -17,7 +17,7 @@ exports.checkIP = (0, async_handler_1.default)(async (req, _res, next) => {
17
17
  query.whereNull('id');
18
18
  }
19
19
  const role = await query.first();
20
- const ipAllowlist = ((role === null || role === void 0 ? void 0 : role.ip_access) || '').split(',').filter((ip) => ip);
20
+ const ipAllowlist = (role?.ip_access || '').split(',').filter((ip) => ip);
21
21
  if (ipAllowlist.length > 0 && ipAllowlist.includes(req.accountability.ip) === false)
22
22
  throw new exceptions_1.InvalidIPException();
23
23
  return next();
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Check if requested collection exists, and save it to req.collection
3
3
  */
4
- import { RequestHandler } from 'express';
4
+ import type { RequestHandler } from 'express';
5
5
  declare const collectionExists: RequestHandler;
6
6
  export default collectionExists;