directus 9.23.1 → 9.23.3

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 (359) hide show
  1. package/dist/app.js +14 -10
  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 +39 -28
  6. package/dist/auth/drivers/local.d.ts +1 -1
  7. package/dist/auth/drivers/local.js +13 -10
  8. package/dist/auth/drivers/oauth2.d.ts +1 -1
  9. package/dist/auth/drivers/oauth2.js +20 -13
  10. package/dist/auth/drivers/openid.d.ts +1 -1
  11. package/dist/auth/drivers/openid.js +21 -14
  12. package/dist/auth/drivers/saml.d.ts +1 -1
  13. package/dist/auth/drivers/saml.js +10 -7
  14. package/dist/auth.d.ts +1 -1
  15. package/dist/auth.js +4 -4
  16. package/dist/cache.d.ts +9 -1
  17. package/dist/cache.js +57 -14
  18. package/dist/cli/commands/bootstrap/index.js +2 -2
  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 +2 -1
  24. package/dist/cli/utils/create-env/index.d.ts +2 -2
  25. package/dist/cli/utils/drivers.d.ts +1 -1
  26. package/dist/constants.d.ts +2 -2
  27. package/dist/constants.js +2 -3
  28. package/dist/controllers/activity.js +1 -2
  29. package/dist/controllers/assets.js +14 -9
  30. package/dist/controllers/auth.js +29 -15
  31. package/dist/controllers/dashboards.js +5 -2
  32. package/dist/controllers/fields.js +4 -4
  33. package/dist/controllers/files.js +10 -5
  34. package/dist/controllers/flows.js +5 -2
  35. package/dist/controllers/folders.js +5 -2
  36. package/dist/controllers/graphql.js +2 -4
  37. package/dist/controllers/items.js +5 -2
  38. package/dist/controllers/not-found.d.ts +1 -1
  39. package/dist/controllers/not-found.js +1 -2
  40. package/dist/controllers/notifications.js +5 -2
  41. package/dist/controllers/operations.js +5 -2
  42. package/dist/controllers/panels.js +5 -2
  43. package/dist/controllers/permissions.js +5 -2
  44. package/dist/controllers/presets.js +5 -2
  45. package/dist/controllers/roles.js +5 -2
  46. package/dist/controllers/shares.js +8 -5
  47. package/dist/controllers/users.js +16 -20
  48. package/dist/controllers/utils.js +6 -11
  49. package/dist/controllers/webhooks.js +5 -2
  50. package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
  51. package/dist/database/helpers/fn/dialects/mssql.js +10 -11
  52. package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
  53. package/dist/database/helpers/fn/dialects/mysql.js +2 -3
  54. package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
  55. package/dist/database/helpers/fn/dialects/oracle.js +10 -11
  56. package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
  57. package/dist/database/helpers/fn/dialects/postgres.js +10 -11
  58. package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
  59. package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
  60. package/dist/database/helpers/fn/types.d.ts +5 -5
  61. package/dist/database/helpers/fn/types.js +5 -4
  62. package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
  63. package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
  64. package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
  65. package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
  66. package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
  67. package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
  68. package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
  69. package/dist/database/helpers/geometry/types.d.ts +2 -2
  70. package/dist/database/helpers/geometry/types.js +1 -2
  71. package/dist/database/helpers/index.d.ts +5 -5
  72. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -1
  73. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  74. package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
  75. package/dist/database/helpers/schema/dialects/mysql.js +1 -2
  76. package/dist/database/helpers/schema/dialects/oracle.d.ts +2 -2
  77. package/dist/database/helpers/schema/dialects/oracle.js +4 -6
  78. package/dist/database/helpers/schema/types.d.ts +4 -4
  79. package/dist/database/helpers/types.d.ts +1 -1
  80. package/dist/database/helpers/types.js +1 -0
  81. package/dist/database/index.d.ts +1 -1
  82. package/dist/database/index.js +8 -8
  83. package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
  84. package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
  85. package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
  86. package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
  87. package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
  88. package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
  89. package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
  90. package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
  91. package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
  92. package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
  93. package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
  94. package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
  95. package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
  96. package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
  97. package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
  98. package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
  99. package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
  100. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
  101. package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
  102. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
  103. package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
  104. package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
  105. package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
  106. package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
  107. package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
  108. package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
  109. package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
  110. package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
  111. package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
  112. package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
  113. package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
  114. package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
  115. package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
  116. package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
  117. package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
  118. package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
  119. package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
  120. package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
  121. package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
  122. package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
  123. package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
  124. package/dist/database/migrations/20211007A-update-presets.js +7 -9
  125. package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
  126. package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
  127. package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
  128. package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
  129. package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
  130. package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
  131. package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
  132. package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
  133. package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
  134. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
  135. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
  136. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
  137. package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
  138. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
  139. package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
  140. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
  141. package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
  142. package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
  143. package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
  144. package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
  145. package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
  146. package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
  147. package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
  148. package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
  149. package/dist/database/migrations/run.d.ts +1 -1
  150. package/dist/database/run-ast.d.ts +3 -3
  151. package/dist/database/run-ast.js +17 -26
  152. package/dist/database/seeds/run.d.ts +1 -1
  153. package/dist/database/seeds/run.js +1 -2
  154. package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
  155. package/dist/database/system-data/collections/index.d.ts +1 -1
  156. package/dist/database/system-data/fields/collections.yaml +2 -0
  157. package/dist/database/system-data/fields/index.d.ts +1 -1
  158. package/dist/database/system-data/fields/index.js +1 -2
  159. package/dist/database/system-data/fields/settings.yaml +4 -0
  160. package/dist/database/system-data/relations/index.d.ts +1 -1
  161. package/dist/emitter.d.ts +1 -1
  162. package/dist/emitter.js +3 -0
  163. package/dist/env.js +10 -2
  164. package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
  165. package/dist/exceptions/database/dialects/mssql.js +5 -6
  166. package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
  167. package/dist/exceptions/database/dialects/mysql.js +19 -25
  168. package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
  169. package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
  170. package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
  171. package/dist/exceptions/database/translate.d.ts +1 -1
  172. package/dist/exceptions/database/value-out-of-range.js +1 -1
  173. package/dist/exceptions/range-not-satisfiable.js +2 -3
  174. package/dist/extensions.d.ts +1 -1
  175. package/dist/extensions.js +33 -23
  176. package/dist/flows.js +42 -25
  177. package/dist/logger.d.ts +1 -1
  178. package/dist/logger.js +19 -3
  179. package/dist/messenger.js +8 -6
  180. package/dist/middleware/authenticate.d.ts +1 -1
  181. package/dist/middleware/authenticate.js +12 -5
  182. package/dist/middleware/cache.d.ts +1 -1
  183. package/dist/middleware/cache.js +5 -5
  184. package/dist/middleware/check-ip.d.ts +1 -1
  185. package/dist/middleware/check-ip.js +1 -1
  186. package/dist/middleware/collection-exists.d.ts +1 -1
  187. package/dist/middleware/collection-exists.js +2 -2
  188. package/dist/middleware/cors.d.ts +1 -1
  189. package/dist/middleware/error-handler.d.ts +1 -1
  190. package/dist/middleware/error-handler.js +9 -10
  191. package/dist/middleware/extract-token.d.ts +1 -1
  192. package/dist/middleware/get-permissions.d.ts +1 -1
  193. package/dist/middleware/graphql.d.ts +1 -1
  194. package/dist/middleware/graphql.js +3 -3
  195. package/dist/middleware/rate-limiter-global.d.ts +5 -0
  196. package/dist/middleware/rate-limiter-global.js +48 -0
  197. package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
  198. package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +3 -3
  199. package/dist/middleware/respond.d.ts +1 -1
  200. package/dist/middleware/respond.js +6 -7
  201. package/dist/middleware/sanitize-query.d.ts +1 -1
  202. package/dist/middleware/schema.d.ts +1 -1
  203. package/dist/middleware/use-collection.d.ts +1 -1
  204. package/dist/operations/condition/index.d.ts +1 -1
  205. package/dist/operations/exec/index.js +14 -3
  206. package/dist/operations/item-create/index.js +1 -2
  207. package/dist/operations/item-delete/index.d.ts +1 -1
  208. package/dist/operations/item-read/index.d.ts +1 -1
  209. package/dist/operations/item-update/index.d.ts +1 -1
  210. package/dist/operations/item-update/index.js +1 -2
  211. package/dist/operations/notification/index.js +1 -2
  212. package/dist/operations/request/index.js +19 -19
  213. package/dist/operations/trigger/index.js +2 -3
  214. package/dist/rate-limiter.d.ts +1 -1
  215. package/dist/rate-limiter.js +8 -8
  216. package/dist/server.js +8 -9
  217. package/dist/services/activity.d.ts +1 -1
  218. package/dist/services/activity.js +7 -6
  219. package/dist/services/assets.d.ts +3 -3
  220. package/dist/services/assets.js +33 -35
  221. package/dist/services/authentication.d.ts +2 -2
  222. package/dist/services/authentication.js +13 -10
  223. package/dist/services/authorization.d.ts +3 -3
  224. package/dist/services/authorization.js +27 -31
  225. package/dist/services/collections.d.ts +5 -5
  226. package/dist/services/collections.js +52 -48
  227. package/dist/services/dashboards.d.ts +1 -1
  228. package/dist/services/fields.d.ts +5 -5
  229. package/dist/services/fields.js +48 -48
  230. package/dist/services/files.d.ts +1 -2
  231. package/dist/services/files.js +27 -21
  232. package/dist/services/flows.d.ts +2 -2
  233. package/dist/services/folders.d.ts +1 -1
  234. package/dist/services/graphql/index.d.ts +4 -4
  235. package/dist/services/graphql/index.js +172 -167
  236. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
  237. package/dist/services/graphql/utils/process-error.d.ts +2 -2
  238. package/dist/services/graphql/utils/process-error.js +11 -4
  239. package/dist/services/import-export.d.ts +3 -3
  240. package/dist/services/import-export.js +25 -22
  241. package/dist/services/items.d.ts +3 -3
  242. package/dist/services/items.js +42 -36
  243. package/dist/services/mail/index.d.ts +4 -4
  244. package/dist/services/mail/index.js +9 -5
  245. package/dist/services/meta.d.ts +3 -3
  246. package/dist/services/meta.js +10 -9
  247. package/dist/services/notifications.d.ts +3 -3
  248. package/dist/services/notifications.js +7 -6
  249. package/dist/services/operations.d.ts +2 -2
  250. package/dist/services/panels.d.ts +1 -1
  251. package/dist/services/payload.d.ts +3 -3
  252. package/dist/services/payload.js +124 -122
  253. package/dist/services/permissions.d.ts +3 -3
  254. package/dist/services/permissions.js +11 -11
  255. package/dist/services/presets.d.ts +1 -1
  256. package/dist/services/relations.d.ts +6 -6
  257. package/dist/services/relations.js +45 -43
  258. package/dist/services/revisions.d.ts +1 -1
  259. package/dist/services/roles.d.ts +2 -2
  260. package/dist/services/roles.js +2 -2
  261. package/dist/services/schema.d.ts +3 -3
  262. package/dist/services/schema.js +9 -11
  263. package/dist/services/server.d.ts +3 -3
  264. package/dist/services/server.js +69 -13
  265. package/dist/services/settings.d.ts +1 -1
  266. package/dist/services/shares.d.ts +1 -1
  267. package/dist/services/shares.js +5 -6
  268. package/dist/services/specifications.d.ts +4 -4
  269. package/dist/services/specifications.js +132 -116
  270. package/dist/services/tfa.d.ts +2 -2
  271. package/dist/services/tfa.js +7 -5
  272. package/dist/services/users.d.ts +3 -3
  273. package/dist/services/users.js +17 -17
  274. package/dist/services/utils.d.ts +3 -3
  275. package/dist/services/utils.js +10 -8
  276. package/dist/services/webhooks.d.ts +2 -2
  277. package/dist/services/webhooks.js +2 -1
  278. package/dist/types/assets.d.ts +1 -1
  279. package/dist/types/ast.d.ts +1 -1
  280. package/dist/types/auth.d.ts +2 -2
  281. package/dist/types/collection.d.ts +2 -2
  282. package/dist/types/events.d.ts +2 -2
  283. package/dist/types/graphql.d.ts +2 -2
  284. package/dist/types/items.d.ts +3 -3
  285. package/dist/types/services.d.ts +5 -5
  286. package/dist/types/snapshot.d.ts +4 -4
  287. package/dist/utils/apply-diff.d.ts +3 -3
  288. package/dist/utils/apply-diff.js +25 -28
  289. package/dist/utils/apply-query.d.ts +3 -3
  290. package/dist/utils/apply-query.js +8 -11
  291. package/dist/utils/apply-snapshot.d.ts +3 -3
  292. package/dist/utils/apply-snapshot.js +5 -6
  293. package/dist/utils/construct-flow-tree.d.ts +1 -1
  294. package/dist/utils/construct-flow-tree.js +2 -2
  295. package/dist/utils/filter-items.d.ts +1 -1
  296. package/dist/utils/get-accountability-for-role.d.ts +2 -2
  297. package/dist/utils/get-accountability-for-role.js +1 -1
  298. package/dist/utils/get-ast-from-query.d.ts +3 -3
  299. package/dist/utils/get-ast-from-query.js +22 -28
  300. package/dist/utils/get-cache-headers.d.ts +1 -1
  301. package/dist/utils/get-cache-headers.js +3 -4
  302. package/dist/utils/get-cache-key.d.ts +1 -1
  303. package/dist/utils/get-cache-key.js +2 -3
  304. package/dist/utils/get-collection-from-alias.d.ts +1 -1
  305. package/dist/utils/get-column-path.d.ts +2 -2
  306. package/dist/utils/get-column-path.js +3 -4
  307. package/dist/utils/get-column.d.ts +4 -4
  308. package/dist/utils/get-column.js +4 -5
  309. package/dist/utils/get-default-value.d.ts +2 -2
  310. package/dist/utils/get-default-value.js +1 -2
  311. package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
  312. package/dist/utils/get-graphql-query-and-variables.js +1 -2
  313. package/dist/utils/get-graphql-type.d.ts +2 -2
  314. package/dist/utils/get-graphql-type.js +1 -1
  315. package/dist/utils/get-ip-from-req.d.ts +1 -1
  316. package/dist/utils/get-local-type.d.ts +1 -1
  317. package/dist/utils/get-local-type.js +3 -3
  318. package/dist/utils/get-milliseconds.js +1 -2
  319. package/dist/utils/get-permissions.d.ts +1 -1
  320. package/dist/utils/get-permissions.js +1 -1
  321. package/dist/utils/get-relation-info.d.ts +1 -1
  322. package/dist/utils/get-relation-info.js +3 -5
  323. package/dist/utils/get-relation-type.d.ts +1 -1
  324. package/dist/utils/get-relation-type.js +3 -4
  325. package/dist/utils/get-schema.d.ts +2 -2
  326. package/dist/utils/get-schema.js +19 -21
  327. package/dist/utils/get-snapshot-diff.js +2 -3
  328. package/dist/utils/get-snapshot.d.ts +3 -3
  329. package/dist/utils/get-snapshot.js +6 -8
  330. package/dist/utils/is-directus-jwt.js +1 -1
  331. package/dist/utils/job-queue.js +2 -0
  332. package/dist/utils/jwt.d.ts +1 -1
  333. package/dist/utils/merge-permissions-for-share.d.ts +1 -1
  334. package/dist/utils/merge-permissions-for-share.js +3 -4
  335. package/dist/utils/merge-permissions.d.ts +3 -3
  336. package/dist/utils/redact-header-cookies.d.ts +1 -0
  337. package/dist/utils/redact-header-cookies.js +11 -0
  338. package/dist/utils/redact-header-cookies.test.d.ts +1 -0
  339. package/dist/utils/reduce-schema.d.ts +1 -1
  340. package/dist/utils/reduce-schema.js +12 -12
  341. package/dist/utils/sanitize-query.d.ts +1 -1
  342. package/dist/utils/sanitize-query.js +1 -1
  343. package/dist/utils/sanitize-schema.d.ts +2 -2
  344. package/dist/utils/should-skip-cache.d.ts +7 -0
  345. package/dist/utils/should-skip-cache.js +21 -0
  346. package/dist/utils/should-skip-cache.test.d.ts +1 -0
  347. package/dist/utils/transformations.d.ts +1 -1
  348. package/dist/utils/transformations.js +2 -4
  349. package/dist/utils/url.js +7 -2
  350. package/dist/utils/user-name.d.ts +1 -1
  351. package/dist/utils/validate-diff.js +7 -8
  352. package/dist/utils/validate-keys.d.ts +2 -2
  353. package/dist/utils/validate-keys.js +1 -1
  354. package/dist/utils/validate-query.d.ts +1 -1
  355. package/dist/utils/validate-query.js +2 -2
  356. package/dist/webhooks.js +1 -1
  357. package/package.json +36 -37
  358. package/dist/utils/with-timeout.d.ts +0 -1
  359. package/dist/utils/with-timeout.js +0 -16
@@ -1,2 +1,2 @@
1
- import { CollectionMeta } from '../../../types';
1
+ import type { CollectionMeta } from '../../../types';
2
2
  export declare const systemCollectionRows: CollectionMeta[];
@@ -72,12 +72,14 @@ fields:
72
72
  meta:
73
73
  interface: system-language
74
74
  width: half
75
+ required: true
75
76
  - field: translation
76
77
  name: $t:field_options.directus_collections.collection_name
77
78
  type: string
78
79
  meta:
79
80
  interface: input
80
81
  width: half
82
+ required: true
81
83
  options:
82
84
  placeholder: $t:field_options.directus_collections.translation_placeholder
83
85
  - field: singular
@@ -1,2 +1,2 @@
1
- import { FieldMeta } from '@directus/shared/types';
1
+ import type { FieldMeta } from '@directus/shared/types';
2
2
  export declare const systemFieldRows: FieldMeta[];
@@ -26,8 +26,7 @@ for (const filepath of fieldData) {
26
26
  // Dynamically populate auth providers field
27
27
  if (systemField.collection === 'directus_users' && systemField.field === 'provider') {
28
28
  (0, get_auth_providers_1.getAuthProviders)().forEach(({ name }) => {
29
- var _a, _b;
30
- (_b = (_a = systemField.options) === null || _a === void 0 ? void 0 : _a.choices) === null || _b === void 0 ? void 0 : _b.push({
29
+ systemField.options?.choices?.push({
31
30
  text: (0, format_title_1.default)(name),
32
31
  value: name,
33
32
  });
@@ -183,6 +183,7 @@ fields:
183
183
  slug: true
184
184
  onlyOnCreate: false
185
185
  width: full
186
+ required: true
186
187
  - field: fit
187
188
  name: $t:field_options.directus_settings.storage_asset_presets.fit_label
188
189
  type: string
@@ -322,6 +323,7 @@ fields:
322
323
  is_nullable: false
323
324
  meta:
324
325
  interface: text-input
326
+ required: true
325
327
  options:
326
328
  placeholder: $t:field_options.directus_settings.basemaps_name_placeholder
327
329
  - field: type
@@ -397,6 +399,7 @@ fields:
397
399
  meta:
398
400
  interface: text-input
399
401
  width: half
402
+ required: true
400
403
  options:
401
404
  placeholder: $t:text
402
405
  - field: value
@@ -405,5 +408,6 @@ fields:
405
408
  meta:
406
409
  interface: input
407
410
  width: half
411
+ required: true
408
412
  options:
409
413
  placeholder: $t:value
@@ -1,2 +1,2 @@
1
- import { RelationMeta } from '@directus/shared/types';
1
+ import type { RelationMeta } from '@directus/shared/types';
2
2
  export declare const systemRelationRows: RelationMeta[];
package/dist/emitter.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ActionHandler, EventContext, FilterHandler, InitHandler } from '@directus/shared/types';
1
+ import type { ActionHandler, EventContext, FilterHandler, InitHandler } from '@directus/shared/types';
2
2
  export declare class Emitter {
3
3
  private filterEmitter;
4
4
  private actionEmitter;
package/dist/emitter.js CHANGED
@@ -7,6 +7,9 @@ exports.Emitter = void 0;
7
7
  const eventemitter2_1 = require("eventemitter2");
8
8
  const logger_1 = __importDefault(require("./logger"));
9
9
  class Emitter {
10
+ filterEmitter;
11
+ actionEmitter;
12
+ initEmitter;
10
13
  constructor() {
11
14
  const emitterOptions = {
12
15
  wildcard: true,
package/dist/env.js CHANGED
@@ -62,6 +62,7 @@ const allowedEnvironmentVars = [
62
62
  'CORS_CREDENTIALS',
63
63
  'CORS_MAX_AGE',
64
64
  // rate limiting
65
+ 'RATE_LIMITER_GLOBAL_.+',
65
66
  'RATE_LIMITER_.+',
66
67
  // cache
67
68
  'CACHE_ENABLED',
@@ -80,6 +81,7 @@ const allowedEnvironmentVars = [
80
81
  'CACHE_REDIS_PASSWORD',
81
82
  'CACHE_MEMCACHE',
82
83
  'CACHE_VALUE_MAX_SIZE',
84
+ 'CACHE_SKIP_ALLOWED',
83
85
  'CACHE_HEALTHCHECK_THRESHOLD',
84
86
  // storage
85
87
  'STORAGE_LOCATIONS',
@@ -203,9 +205,13 @@ const defaults = {
203
205
  STORAGE_LOCAL_DRIVER: 'local',
204
206
  STORAGE_LOCAL_ROOT: './uploads',
205
207
  RATE_LIMITER_ENABLED: false,
206
- RATE_LIMITER_POINTS: 25,
208
+ RATE_LIMITER_POINTS: 50,
207
209
  RATE_LIMITER_DURATION: 1,
208
210
  RATE_LIMITER_STORE: 'memory',
211
+ RATE_LIMITER_GLOBAL_ENABLED: false,
212
+ RATE_LIMITER_GLOBAL_POINTS: 1000,
213
+ RATE_LIMITER_GLOBAL_DURATION: 1,
214
+ RATE_LIMITER_GLOBAL_STORE: 'memory',
209
215
  ACCESS_TOKEN_TTL: '15m',
210
216
  REFRESH_TOKEN_TTL: '7d',
211
217
  REFRESH_TOKEN_COOKIE_SECURE: false,
@@ -229,6 +235,7 @@ const defaults = {
229
235
  CACHE_SCHEMA: true,
230
236
  CACHE_PERMISSIONS: true,
231
237
  CACHE_VALUE_MAX_SIZE: false,
238
+ CACHE_SKIP_ALLOWED: false,
232
239
  AUTH_PROVIDERS: '',
233
240
  AUTH_DISABLE_DEFAULT: false,
234
241
  PACKAGE_FILE_LOCATION: '.',
@@ -241,7 +248,7 @@ const defaults = {
241
248
  EMAIL_SENDMAIL_PATH: '/usr/sbin/sendmail',
242
249
  TELEMETRY: true,
243
250
  ASSETS_CACHE_TTL: '30d',
244
- ASSETS_TRANSFORM_MAX_CONCURRENT: 1,
251
+ ASSETS_TRANSFORM_MAX_CONCURRENT: 25,
245
252
  ASSETS_TRANSFORM_IMAGE_MAX_DIMENSION: 6000,
246
253
  ASSETS_TRANSFORM_MAX_OPERATIONS: 5,
247
254
  ASSETS_TRANSFORM_TIMEOUT: '7500ms',
@@ -268,6 +275,7 @@ const typeMap = {
268
275
  DB_DATABASE: 'string',
269
276
  DB_PORT: 'number',
270
277
  DB_EXCLUDE_TABLES: 'array',
278
+ CACHE_SKIP_ALLOWED: 'boolean',
271
279
  IMPORT_IP_DENY_LIST: 'array',
272
280
  FILE_METADATA_ALLOW_LIST: 'array',
273
281
  GRAPHQL_INTROSPECTION: 'boolean',
@@ -1,2 +1,2 @@
1
- import { MSSQLError } from './types';
1
+ import type { MSSQLError } from './types';
2
2
  export declare function extractError(error: MSSQLError): Promise<MSSQLError | Error>;
@@ -48,15 +48,14 @@ async function uniqueViolation(error) {
48
48
  * While it's not ideal, the best next thing we can do is extract the column name from
49
49
  * information_schema when this happens
50
50
  */
51
- var _a, _b, _c;
52
51
  const betweenQuotes = /'([^']+)'/g;
53
52
  const betweenParens = /\(([^)]+)\)/g;
54
53
  const quoteMatches = error.message.match(betweenQuotes);
55
54
  const parenMatches = error.message.match(betweenParens);
56
55
  if (!quoteMatches || !parenMatches)
57
56
  return error;
58
- const keyName = (_a = quoteMatches[1]) === null || _a === void 0 ? void 0 : _a.slice(1, -1);
59
- let collection = (_b = quoteMatches[0]) === null || _b === void 0 ? void 0 : _b.slice(1, -1);
57
+ const keyName = quoteMatches[1]?.slice(1, -1);
58
+ let collection = quoteMatches[0]?.slice(1, -1);
60
59
  let field = null;
61
60
  if (keyName) {
62
61
  const database = (0, database_1.default)();
@@ -75,10 +74,10 @@ async function uniqueViolation(error) {
75
74
  })
76
75
  .where('sys.indexes.name', '=', keyName)
77
76
  .first();
78
- collection = constraintUsage === null || constraintUsage === void 0 ? void 0 : constraintUsage.collection;
79
- field = constraintUsage === null || constraintUsage === void 0 ? void 0 : constraintUsage.field;
77
+ collection = constraintUsage?.collection;
78
+ field = constraintUsage?.field;
80
79
  }
81
- const invalid = (_c = parenMatches[parenMatches.length - 1]) === null || _c === void 0 ? void 0 : _c.slice(1, -1);
80
+ const invalid = parenMatches[parenMatches.length - 1]?.slice(1, -1);
82
81
  return new record_not_unique_1.RecordNotUniqueException(field, {
83
82
  collection,
84
83
  field,
@@ -1,2 +1,2 @@
1
- import { MySQLError } from './types';
1
+ import type { MySQLError } from './types';
2
2
  export declare function extractError(error: MySQLError): MySQLError | Error;
@@ -38,7 +38,6 @@ function extractError(error) {
38
38
  }
39
39
  exports.extractError = extractError;
40
40
  function uniqueViolation(error) {
41
- var _a, _b, _c, _d, _e;
42
41
  const betweenQuotes = /'([^']+)'/g;
43
42
  const matches = error.sqlMessage.match(betweenQuotes);
44
43
  if (!matches)
@@ -50,13 +49,13 @@ function uniqueViolation(error) {
50
49
  */
51
50
  /** MySQL 8+ style error message */
52
51
  if (matches[1].includes('.')) {
53
- const collection = (_a = matches[1]) === null || _a === void 0 ? void 0 : _a.slice(1, -1).split('.')[0];
52
+ const collection = matches[1]?.slice(1, -1).split('.')[0];
54
53
  let field = null;
55
- const indexName = (_b = matches[1]) === null || _b === void 0 ? void 0 : _b.slice(1, -1).split('.')[1];
56
- if ((indexName === null || indexName === void 0 ? void 0 : indexName.startsWith(`${collection}_`)) && indexName.endsWith('_unique')) {
57
- field = indexName === null || indexName === void 0 ? void 0 : indexName.slice(collection.length + 1, -7);
54
+ const indexName = matches[1]?.slice(1, -1).split('.')[1];
55
+ if (indexName?.startsWith(`${collection}_`) && indexName.endsWith('_unique')) {
56
+ field = indexName?.slice(collection.length + 1, -7);
58
57
  }
59
- const invalid = (_c = matches[0]) === null || _c === void 0 ? void 0 : _c.slice(1, -1);
58
+ const invalid = matches[0]?.slice(1, -1);
60
59
  return new record_not_unique_1.RecordNotUniqueException(field, {
61
60
  collection,
62
61
  field,
@@ -65,13 +64,13 @@ function uniqueViolation(error) {
65
64
  }
66
65
  else {
67
66
  /** MySQL 5.7 style error message */
68
- const indexName = (_d = matches[1]) === null || _d === void 0 ? void 0 : _d.slice(1, -1);
67
+ const indexName = matches[1]?.slice(1, -1);
69
68
  const collection = indexName.split('_')[0];
70
69
  let field = null;
71
- if ((indexName === null || indexName === void 0 ? void 0 : indexName.startsWith(`${collection}_`)) && indexName.endsWith('_unique')) {
72
- field = indexName === null || indexName === void 0 ? void 0 : indexName.slice(collection.length + 1, -7);
70
+ if (indexName?.startsWith(`${collection}_`) && indexName.endsWith('_unique')) {
71
+ field = indexName?.slice(collection.length + 1, -7);
73
72
  }
74
- const invalid = (_e = matches[0]) === null || _e === void 0 ? void 0 : _e.slice(1, -1);
73
+ const invalid = matches[0]?.slice(1, -1);
75
74
  return new record_not_unique_1.RecordNotUniqueException(field, {
76
75
  collection,
77
76
  field,
@@ -80,61 +79,57 @@ function uniqueViolation(error) {
80
79
  }
81
80
  }
82
81
  function numericValueOutOfRange(error) {
83
- var _a, _b;
84
82
  const betweenTicks = /`([^`]+)`/g;
85
83
  const betweenQuotes = /'([^']+)'/g;
86
84
  const tickMatches = error.sql.match(betweenTicks);
87
85
  const quoteMatches = error.sqlMessage.match(betweenQuotes);
88
86
  if (!tickMatches || !quoteMatches)
89
87
  return error;
90
- const collection = (_a = tickMatches[0]) === null || _a === void 0 ? void 0 : _a.slice(1, -1);
91
- const field = (_b = quoteMatches[0]) === null || _b === void 0 ? void 0 : _b.slice(1, -1);
88
+ const collection = tickMatches[0]?.slice(1, -1);
89
+ const field = quoteMatches[0]?.slice(1, -1);
92
90
  return new value_out_of_range_1.ValueOutOfRangeException(field, {
93
91
  collection,
94
92
  field,
95
93
  });
96
94
  }
97
95
  function valueLimitViolation(error) {
98
- var _a, _b;
99
96
  const betweenTicks = /`([^`]+)`/g;
100
97
  const betweenQuotes = /'([^']+)'/g;
101
98
  const tickMatches = error.sql.match(betweenTicks);
102
99
  const quoteMatches = error.sqlMessage.match(betweenQuotes);
103
100
  if (!tickMatches || !quoteMatches)
104
101
  return error;
105
- const collection = (_a = tickMatches[0]) === null || _a === void 0 ? void 0 : _a.slice(1, -1);
106
- const field = (_b = quoteMatches[0]) === null || _b === void 0 ? void 0 : _b.slice(1, -1);
102
+ const collection = tickMatches[0]?.slice(1, -1);
103
+ const field = quoteMatches[0]?.slice(1, -1);
107
104
  return new value_too_long_1.ValueTooLongException(field, {
108
105
  collection,
109
106
  field,
110
107
  });
111
108
  }
112
109
  function notNullViolation(error) {
113
- var _a, _b;
114
110
  const betweenTicks = /`([^`]+)`/g;
115
111
  const betweenQuotes = /'([^']+)'/g;
116
112
  const tickMatches = error.sql.match(betweenTicks);
117
113
  const quoteMatches = error.sqlMessage.match(betweenQuotes);
118
114
  if (!tickMatches || !quoteMatches)
119
115
  return error;
120
- const collection = (_a = tickMatches[0]) === null || _a === void 0 ? void 0 : _a.slice(1, -1);
121
- const field = (_b = quoteMatches[0]) === null || _b === void 0 ? void 0 : _b.slice(1, -1);
116
+ const collection = tickMatches[0]?.slice(1, -1);
117
+ const field = quoteMatches[0]?.slice(1, -1);
122
118
  return new not_null_violation_1.NotNullViolationException(field, {
123
119
  collection,
124
120
  field,
125
121
  });
126
122
  }
127
123
  function foreignKeyViolation(error) {
128
- var _a, _b, _c;
129
124
  const betweenTicks = /`([^`]+)`/g;
130
125
  const betweenParens = /\(([^)]+)\)/g;
131
126
  const tickMatches = error.sqlMessage.match(betweenTicks);
132
127
  const parenMatches = error.sql.match(betweenParens);
133
128
  if (!tickMatches || !parenMatches)
134
129
  return error;
135
- const collection = (_a = tickMatches[1]) === null || _a === void 0 ? void 0 : _a.slice(1, -1);
136
- const field = (_b = tickMatches[3]) === null || _b === void 0 ? void 0 : _b.slice(1, -1);
137
- const invalid = (_c = parenMatches[1]) === null || _c === void 0 ? void 0 : _c.slice(1, -1);
130
+ const collection = tickMatches[1]?.slice(1, -1);
131
+ const field = tickMatches[3]?.slice(1, -1);
132
+ const invalid = parenMatches[1]?.slice(1, -1);
138
133
  return new invalid_foreign_key_1.InvalidForeignKeyException(field, {
139
134
  collection,
140
135
  field,
@@ -142,13 +137,12 @@ function foreignKeyViolation(error) {
142
137
  });
143
138
  }
144
139
  function containsNullValues(error) {
145
- var _a;
146
140
  const betweenTicks = /`([^`]+)`/g;
147
141
  // Normally, we shouldn't read from the executed SQL. In this case, we're altering a single
148
142
  // column, so we shouldn't have the problem where multiple columns are altered at the same time
149
143
  const tickMatches = error.sql.match(betweenTicks);
150
144
  if (!tickMatches)
151
145
  return error;
152
- const field = (_a = tickMatches[1]) === null || _a === void 0 ? void 0 : _a.slice(1, -1);
146
+ const field = tickMatches[1]?.slice(1, -1);
153
147
  return new contains_null_values_1.ContainsNullValuesException(field);
154
148
  }
@@ -1,2 +1,2 @@
1
- import { OracleError } from './types';
1
+ import type { OracleError } from './types';
2
2
  export declare function extractError(error: OracleError): OracleError | Error;
@@ -1,2 +1,2 @@
1
- import { PostgresError } from './types';
1
+ import type { PostgresError } from './types';
2
2
  export declare function extractError(error: PostgresError): PostgresError | Error;
@@ -1,2 +1,2 @@
1
- import { SQLiteError } from './types';
1
+ import type { SQLiteError } from './types';
2
2
  export declare function extractError(error: SQLiteError): SQLiteError | Error;
@@ -1,4 +1,4 @@
1
- import { SQLError } from './dialects/types';
1
+ import type { SQLError } from './dialects/types';
2
2
  /**
3
3
  * Translates an error thrown by any of the databases into a pre-defined Exception. Currently
4
4
  * supports:
@@ -5,7 +5,7 @@ const exceptions_1 = require("@directus/shared/exceptions");
5
5
  class ValueOutOfRangeException extends exceptions_1.BaseException {
6
6
  constructor(field, exceptions) {
7
7
  if (field) {
8
- super(`Numeric value in field "${field !== null && field !== void 0 ? field : ''}" is out of range.`, 400, 'VALUE_OUT_OF_RANGE', exceptions);
8
+ super(`Numeric value in field "${field ?? ''}" is out of range.`, 400, 'VALUE_OUT_OF_RANGE', exceptions);
9
9
  }
10
10
  else {
11
11
  super(`Numeric value is out of range.`, 400, 'VALUE_OUT_OF_RANGE', exceptions);
@@ -4,9 +4,8 @@ exports.RangeNotSatisfiableException = void 0;
4
4
  const exceptions_1 = require("@directus/shared/exceptions");
5
5
  class RangeNotSatisfiableException extends exceptions_1.BaseException {
6
6
  constructor(range) {
7
- var _a, _b;
8
- const rangeString = range && ((range === null || range === void 0 ? void 0 : range.start) !== undefined || (range === null || range === void 0 ? void 0 : range.end) !== undefined)
9
- ? `"${(_a = range.start) !== null && _a !== void 0 ? _a : ''}-${(_b = range.end) !== null && _b !== void 0 ? _b : ''}" `
7
+ const rangeString = range && (range?.start !== undefined || range?.end !== undefined)
8
+ ? `"${range.start ?? ''}-${range.end ?? ''}" `
10
9
  : '';
11
10
  super(`Range ${rangeString}is invalid or the file's size doesn't match the requested range.`, 416, 'RANGE_NOT_SATISFIABLE');
12
11
  }
@@ -1,4 +1,4 @@
1
- import { Extension, ExtensionInfo, ExtensionType } from '@directus/shared/types';
1
+ import type { Extension, ExtensionInfo, ExtensionType } from '@directus/shared/types';
2
2
  import { Router } from 'express';
3
3
  export declare function getExtensionManager(): ExtensionManager;
4
4
  type Options = {
@@ -29,28 +29,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.getExtensionManager = void 0;
30
30
  const constants_1 = require("@directus/shared/constants");
31
31
  const sharedExceptions = __importStar(require("@directus/shared/exceptions"));
32
- const node_1 = require("@directus/shared/utils/node");
33
- const express_1 = __importStar(require("express"));
34
- const fs_extra_1 = __importDefault(require("fs-extra"));
35
- const path_1 = __importDefault(require("path"));
36
- const database_1 = __importDefault(require("./database"));
37
- const emitter_1 = __importStar(require("./emitter"));
38
- const env_1 = __importDefault(require("./env"));
39
- const exceptions = __importStar(require("./exceptions"));
40
- const logger_1 = __importDefault(require("./logger"));
41
- const dynamic_import_1 = require("./utils/dynamic-import");
42
- const get_schema_1 = require("./utils/get-schema");
43
32
  const utils_1 = require("@directus/shared/utils");
33
+ const node_1 = require("@directus/shared/utils/node");
44
34
  const plugin_alias_1 = __importDefault(require("@rollup/plugin-alias"));
45
35
  const plugin_virtual_1 = __importDefault(require("@rollup/plugin-virtual"));
46
36
  const chokidar_1 = __importDefault(require("chokidar"));
37
+ const express_1 = __importStar(require("express"));
38
+ const fs_extra_1 = __importDefault(require("fs-extra"));
47
39
  const globby_1 = __importDefault(require("globby"));
48
40
  const lodash_1 = require("lodash");
49
41
  const node_cron_1 = require("node-cron");
42
+ const path_1 = __importDefault(require("path"));
50
43
  const rollup_1 = require("rollup");
44
+ const database_1 = __importDefault(require("./database"));
45
+ const emitter_1 = __importStar(require("./emitter"));
46
+ const env_1 = __importDefault(require("./env"));
47
+ const exceptions = __importStar(require("./exceptions"));
51
48
  const flows_1 = require("./flows");
49
+ const logger_1 = __importDefault(require("./logger"));
52
50
  const services = __importStar(require("./services"));
51
+ const dynamic_import_1 = require("./utils/dynamic-import");
53
52
  const get_module_default_1 = __importDefault(require("./utils/get-module-default"));
53
+ const get_schema_1 = require("./utils/get-schema");
54
54
  const job_queue_1 = require("./utils/job-queue");
55
55
  const url_1 = require("./utils/url");
56
56
  let extensionManager;
@@ -67,15 +67,19 @@ const defaultOptions = {
67
67
  watch: env_1.default.EXTENSIONS_AUTO_RELOAD && env_1.default.NODE_ENV !== 'development',
68
68
  };
69
69
  class ExtensionManager {
70
+ isLoaded = false;
71
+ options;
72
+ extensions = [];
73
+ appExtensions = null;
74
+ apiExtensions = [];
75
+ apiEmitter;
76
+ hookEvents = [];
77
+ endpointRouter;
78
+ hookEmbedsHead = [];
79
+ hookEmbedsBody = [];
80
+ reloadQueue;
81
+ watcher = null;
70
82
  constructor() {
71
- this.isLoaded = false;
72
- this.extensions = [];
73
- this.appExtensions = null;
74
- this.apiExtensions = [];
75
- this.hookEvents = [];
76
- this.hookEmbedsHead = [];
77
- this.hookEmbedsBody = [];
78
- this.watcher = null;
79
83
  this.options = defaultOptions;
80
84
  this.apiEmitter = new emitter_1.Emitter();
81
85
  this.endpointRouter = (0, express_1.Router)();
@@ -140,17 +144,23 @@ class ExtensionManager {
140
144
  name: extension.name,
141
145
  type: extension.type,
142
146
  local: extension.local,
143
- host: extension.host,
144
- version: extension.version,
147
+ entries: [],
145
148
  };
149
+ if (extension.host)
150
+ extensionInfo.host = extension.host;
151
+ if (extension.version)
152
+ extensionInfo.version = extension.version;
146
153
  if (extension.type === 'bundle') {
147
- return {
148
- ...extensionInfo,
154
+ const bundleExtensionInfo = {
155
+ name: extensionInfo.name,
156
+ type: 'bundle',
157
+ local: extensionInfo.local,
149
158
  entries: extension.entries.map((entry) => ({
150
159
  name: entry.name,
151
160
  type: entry.type,
152
161
  })),
153
162
  };
163
+ return bundleExtensionInfo;
154
164
  }
155
165
  else {
156
166
  return extensionInfo;
package/dist/flows.js CHANGED
@@ -67,12 +67,13 @@ 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) => {
@@ -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,12 +132,11 @@ 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) {
135
+ if (flow.options?.scope) {
136
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
141
  return (0, utils_1.toArray)(flow.options.collections).map((collection) => {
143
142
  if (collection.startsWith('directus_')) {
@@ -205,16 +204,15 @@ class FlowManager {
205
204
  return this.executeFlow(flow, data, context);
206
205
  }
207
206
  };
208
- const method = (_c = (_b = flow.options) === null || _b === void 0 ? void 0 : _b.method) !== null && _c !== void 0 ? _c : 'GET';
207
+ const method = flow.options?.method ?? 'GET';
209
208
  // Default return to $last for webhooks
210
- flow.options.return = (_d = flow.options.return) !== null && _d !== void 0 ? _d : '$last';
209
+ flow.options.return = flow.options.return ?? '$last';
211
210
  this.webhookFlowHandlers[`${method}-${flow.id}`] = handler;
212
211
  }
213
212
  else if (flow.trigger === 'manual') {
214
213
  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;
214
+ const enabledCollections = flow.options?.collections ?? [];
215
+ const targetCollection = data?.body.collection;
218
216
  if (!targetCollection) {
219
217
  logger_1.default.warn(`Manual trigger requires "collection" to be specified in the payload`);
220
218
  throw new exceptions.ForbiddenException();
@@ -263,13 +261,12 @@ class FlowManager {
263
261
  this.isLoaded = false;
264
262
  }
265
263
  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 }));
264
+ const database = context.database ?? (0, database_1.default)();
265
+ const schema = context.schema ?? (await (0, get_schema_1.getSchema)({ database }));
269
266
  const keyedData = {
270
267
  [TRIGGER_KEY]: data,
271
268
  [LAST_KEY]: data,
272
- [ACCOUNTABILITY_KEY]: (_c = context === null || context === void 0 ? void 0 : context.accountability) !== null && _c !== void 0 ? _c : null,
269
+ [ACCOUNTABILITY_KEY]: context?.accountability ?? null,
273
270
  [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
271
  };
275
272
  let nextOperation = flow.operation;
@@ -288,14 +285,14 @@ class FlowManager {
288
285
  knex: database,
289
286
  schema: schema,
290
287
  });
291
- const accountability = context === null || context === void 0 ? void 0 : context.accountability;
288
+ const accountability = context?.accountability;
292
289
  const activity = await activityService.createOne({
293
290
  action: types_1.Action.RUN,
294
- user: (_d = accountability === null || accountability === void 0 ? void 0 : accountability.user) !== null && _d !== void 0 ? _d : null,
291
+ user: accountability?.user ?? null,
295
292
  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,
293
+ ip: accountability?.ip ?? null,
294
+ user_agent: accountability?.userAgent ?? null,
295
+ origin: accountability?.origin ?? null,
299
296
  item: flow.id,
300
297
  });
301
298
  if (flow.accountability === 'all') {
@@ -344,15 +341,35 @@ class FlowManager {
344
341
  accountability: null,
345
342
  ...context,
346
343
  });
344
+ // Validate that the operations result is serializable and thus catching the error inside the flow execution
345
+ JSON.stringify(result ?? null);
347
346
  // JSON structures don't allow for undefined values, so we need to replace them with null
348
347
  // Otherwise the applyOptionsData function will not work correctly on the next operation
349
348
  if (typeof result === 'object' && result !== null) {
350
349
  result = (0, map_values_deep_1.mapValuesDeep)(result, (_, value) => (value === undefined ? null : value));
351
350
  }
352
- return { successor: operation.resolve, status: 'resolve', data: result !== null && result !== void 0 ? result : null, options };
351
+ return { successor: operation.resolve, status: 'resolve', data: result ?? null, options };
353
352
  }
354
353
  catch (error) {
355
- return { successor: operation.reject, status: 'reject', data: error !== null && error !== void 0 ? error : null, options };
354
+ let data;
355
+ if (error instanceof Error) {
356
+ // If the error is instance of Error, use the message of it as the error data
357
+ data = { message: error.message };
358
+ }
359
+ else if (typeof error === 'string') {
360
+ // If the error is a JSON string, parse it and use that as the error data
361
+ data = (0, utils_1.isValidJSON)(error) ? (0, utils_1.parseJSON)(error) : error;
362
+ }
363
+ else {
364
+ // If error is plain object, use this as the error data and otherwise fallback to null
365
+ data = error ?? null;
366
+ }
367
+ return {
368
+ successor: operation.reject,
369
+ status: 'reject',
370
+ data,
371
+ options,
372
+ };
356
373
  }
357
374
  }
358
375
  }
package/dist/logger.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="qs" />
2
- import { RequestHandler } from 'express';
3
2
  import { LoggerOptions } from 'pino';
3
+ import type { RequestHandler } from 'express';
4
4
  declare const logger: import("pino").Logger<LoggerOptions & Record<string, any>>;
5
5
  export declare const expressLogger: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
6
6
  export default logger;