directus 9.22.4 → 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 (404) hide show
  1. package/dist/app.js +19 -14
  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 +2 -2
  5. package/dist/auth/drivers/ldap.js +47 -36
  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 +22 -15
  10. package/dist/auth/drivers/openid.d.ts +1 -1
  11. package/dist/auth/drivers/openid.js +23 -16
  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 +59 -16
  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 +21 -20
  21. package/dist/cli/commands/schema/snapshot.js +2 -2
  22. package/dist/cli/utils/create-db-connection.d.ts +2 -1
  23. package/dist/cli/utils/create-db-connection.js +2 -1
  24. package/dist/cli/utils/create-env/env-stub.liquid +1 -1
  25. package/dist/cli/utils/create-env/index.d.ts +2 -2
  26. package/dist/cli/utils/drivers.d.ts +3 -9
  27. package/dist/constants.d.ts +3 -9
  28. package/dist/constants.js +5 -10
  29. package/dist/controllers/activity.js +1 -2
  30. package/dist/controllers/assets.js +17 -12
  31. package/dist/controllers/auth.js +29 -15
  32. package/dist/controllers/dashboards.js +5 -2
  33. package/dist/controllers/extensions.js +7 -7
  34. package/dist/controllers/fields.js +4 -4
  35. package/dist/controllers/files.js +11 -6
  36. package/dist/controllers/flows.js +5 -2
  37. package/dist/controllers/folders.js +5 -2
  38. package/dist/controllers/graphql.js +6 -0
  39. package/dist/controllers/items.js +5 -2
  40. package/dist/controllers/not-found.d.ts +1 -1
  41. package/dist/controllers/not-found.js +1 -2
  42. package/dist/controllers/notifications.js +5 -2
  43. package/dist/controllers/operations.js +5 -2
  44. package/dist/controllers/panels.js +5 -2
  45. package/dist/controllers/permissions.js +5 -2
  46. package/dist/controllers/presets.js +5 -2
  47. package/dist/controllers/roles.js +5 -2
  48. package/dist/controllers/schema.d.ts +2 -0
  49. package/dist/controllers/schema.js +98 -0
  50. package/dist/controllers/shares.js +8 -5
  51. package/dist/controllers/users.js +16 -20
  52. package/dist/controllers/utils.js +6 -11
  53. package/dist/controllers/webhooks.js +5 -2
  54. package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
  55. package/dist/database/helpers/fn/dialects/mssql.js +10 -11
  56. package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
  57. package/dist/database/helpers/fn/dialects/mysql.js +2 -3
  58. package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
  59. package/dist/database/helpers/fn/dialects/oracle.js +10 -11
  60. package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
  61. package/dist/database/helpers/fn/dialects/postgres.js +10 -11
  62. package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
  63. package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
  64. package/dist/database/helpers/fn/types.d.ts +5 -5
  65. package/dist/database/helpers/fn/types.js +5 -4
  66. package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
  67. package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
  68. package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
  69. package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
  70. package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
  71. package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
  72. package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
  73. package/dist/database/helpers/geometry/types.d.ts +2 -2
  74. package/dist/database/helpers/geometry/types.js +1 -2
  75. package/dist/database/helpers/index.d.ts +5 -5
  76. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +2 -2
  77. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  78. package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
  79. package/dist/database/helpers/schema/dialects/mysql.js +1 -2
  80. package/dist/database/helpers/schema/dialects/oracle.d.ts +5 -2
  81. package/dist/database/helpers/schema/dialects/oracle.js +23 -0
  82. package/dist/database/helpers/schema/types.d.ts +9 -7
  83. package/dist/database/helpers/schema/types.js +7 -1
  84. package/dist/database/helpers/types.d.ts +1 -1
  85. package/dist/database/helpers/types.js +1 -0
  86. package/dist/database/index.d.ts +2 -1
  87. package/dist/database/index.js +8 -8
  88. package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
  89. package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
  90. package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
  91. package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
  92. package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
  93. package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
  94. package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
  95. package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
  96. package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
  97. package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
  98. package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
  99. package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
  100. package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
  101. package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
  102. package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
  103. package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
  104. package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
  105. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
  106. package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
  107. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
  108. package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
  109. package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
  110. package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
  111. package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
  112. package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
  113. package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
  114. package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
  115. package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
  116. package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
  117. package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
  118. package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
  119. package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
  120. package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
  121. package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
  122. package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
  123. package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
  124. package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
  125. package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
  126. package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
  127. package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
  128. package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
  129. package/dist/database/migrations/20211007A-update-presets.js +7 -9
  130. package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
  131. package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
  132. package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
  133. package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
  134. package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
  135. package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
  136. package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
  137. package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
  138. package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
  139. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
  140. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
  141. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
  142. package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
  143. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
  144. package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
  145. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
  146. package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
  147. package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
  148. package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
  149. package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
  150. package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
  151. package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
  152. package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
  153. package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
  154. package/dist/database/migrations/run.d.ts +1 -1
  155. package/dist/database/run-ast.d.ts +3 -3
  156. package/dist/database/run-ast.js +19 -28
  157. package/dist/database/seeds/run.d.ts +1 -1
  158. package/dist/database/seeds/run.js +1 -2
  159. package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
  160. package/dist/database/system-data/collections/index.d.ts +1 -1
  161. package/dist/database/system-data/fields/collections.yaml +2 -0
  162. package/dist/database/system-data/fields/index.d.ts +1 -1
  163. package/dist/database/system-data/fields/index.js +1 -2
  164. package/dist/database/system-data/fields/settings.yaml +4 -0
  165. package/dist/database/system-data/relations/index.d.ts +1 -1
  166. package/dist/emitter.d.ts +1 -1
  167. package/dist/emitter.js +3 -0
  168. package/dist/env.js +19 -4
  169. package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
  170. package/dist/exceptions/database/dialects/mssql.js +5 -6
  171. package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
  172. package/dist/exceptions/database/dialects/mysql.js +19 -25
  173. package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
  174. package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
  175. package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
  176. package/dist/exceptions/database/translate.d.ts +1 -1
  177. package/dist/exceptions/database/value-out-of-range.js +1 -1
  178. package/dist/exceptions/range-not-satisfiable.js +2 -3
  179. package/dist/extensions.d.ts +1 -1
  180. package/dist/extensions.js +34 -24
  181. package/dist/flows.js +56 -30
  182. package/dist/logger.d.ts +1 -1
  183. package/dist/logger.js +19 -3
  184. package/dist/messenger.js +8 -6
  185. package/dist/middleware/authenticate.d.ts +1 -1
  186. package/dist/middleware/authenticate.js +12 -5
  187. package/dist/middleware/cache.d.ts +1 -1
  188. package/dist/middleware/cache.js +7 -7
  189. package/dist/middleware/check-ip.d.ts +1 -1
  190. package/dist/middleware/check-ip.js +1 -1
  191. package/dist/middleware/collection-exists.d.ts +1 -1
  192. package/dist/middleware/collection-exists.js +2 -2
  193. package/dist/middleware/cors.d.ts +1 -1
  194. package/dist/middleware/error-handler.d.ts +1 -1
  195. package/dist/middleware/error-handler.js +9 -10
  196. package/dist/middleware/extract-token.d.ts +1 -1
  197. package/dist/middleware/get-permissions.d.ts +1 -1
  198. package/dist/middleware/graphql.d.ts +1 -1
  199. package/dist/middleware/graphql.js +3 -3
  200. package/dist/middleware/rate-limiter-global.d.ts +5 -0
  201. package/dist/middleware/rate-limiter-global.js +48 -0
  202. package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
  203. package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +3 -3
  204. package/dist/middleware/respond.d.ts +1 -1
  205. package/dist/middleware/respond.js +18 -14
  206. package/dist/middleware/sanitize-query.d.ts +1 -1
  207. package/dist/middleware/schema.d.ts +1 -1
  208. package/dist/middleware/use-collection.d.ts +1 -1
  209. package/dist/operations/condition/index.d.ts +1 -1
  210. package/dist/operations/exec/index.js +14 -3
  211. package/dist/operations/item-create/index.js +1 -2
  212. package/dist/operations/item-delete/index.d.ts +1 -1
  213. package/dist/operations/item-read/index.d.ts +1 -1
  214. package/dist/operations/item-update/index.d.ts +1 -1
  215. package/dist/operations/item-update/index.js +1 -2
  216. package/dist/operations/notification/index.js +1 -2
  217. package/dist/operations/request/index.js +21 -20
  218. package/dist/operations/trigger/index.d.ts +2 -0
  219. package/dist/operations/trigger/index.js +27 -11
  220. package/dist/rate-limiter.d.ts +1 -1
  221. package/dist/rate-limiter.js +8 -8
  222. package/dist/request/index.d.ts +5 -0
  223. package/dist/request/index.js +18 -0
  224. package/dist/request/index.test.d.ts +1 -0
  225. package/dist/request/request-interceptor.d.ts +2 -0
  226. package/dist/request/request-interceptor.js +33 -0
  227. package/dist/request/request-interceptor.test.d.ts +1 -0
  228. package/dist/request/response-interceptor.d.ts +2 -0
  229. package/dist/request/response-interceptor.js +9 -0
  230. package/dist/request/response-interceptor.test.d.ts +1 -0
  231. package/dist/request/validate-ip.d.ts +1 -0
  232. package/dist/request/validate-ip.js +27 -0
  233. package/dist/request/validate-ip.test.d.ts +1 -0
  234. package/dist/server.js +8 -9
  235. package/dist/services/activity.d.ts +1 -1
  236. package/dist/services/activity.js +7 -6
  237. package/dist/services/assets.d.ts +3 -3
  238. package/dist/services/assets.js +33 -26
  239. package/dist/services/authentication.d.ts +2 -2
  240. package/dist/services/authentication.js +18 -15
  241. package/dist/services/authorization.d.ts +3 -3
  242. package/dist/services/authorization.js +27 -31
  243. package/dist/services/collections.d.ts +5 -5
  244. package/dist/services/collections.js +52 -48
  245. package/dist/services/dashboards.d.ts +1 -1
  246. package/dist/services/fields.d.ts +5 -5
  247. package/dist/services/fields.js +49 -48
  248. package/dist/services/files.d.ts +1 -2
  249. package/dist/services/files.js +70 -108
  250. package/dist/services/flows.d.ts +2 -2
  251. package/dist/services/folders.d.ts +1 -1
  252. package/dist/services/graphql/index.d.ts +4 -4
  253. package/dist/services/graphql/index.js +181 -170
  254. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
  255. package/dist/services/graphql/utils/process-error.d.ts +2 -2
  256. package/dist/services/graphql/utils/process-error.js +29 -9
  257. package/dist/services/import-export.d.ts +7 -5
  258. package/dist/services/import-export.js +41 -24
  259. package/dist/services/import-export.test.d.ts +1 -0
  260. package/dist/services/index.d.ts +1 -0
  261. package/dist/services/index.js +1 -0
  262. package/dist/services/items.d.ts +3 -3
  263. package/dist/services/items.js +67 -42
  264. package/dist/services/mail/index.d.ts +4 -4
  265. package/dist/services/mail/index.js +9 -5
  266. package/dist/services/meta.d.ts +3 -3
  267. package/dist/services/meta.js +10 -9
  268. package/dist/services/notifications.d.ts +3 -3
  269. package/dist/services/notifications.js +7 -6
  270. package/dist/services/operations.d.ts +2 -2
  271. package/dist/services/panels.d.ts +1 -1
  272. package/dist/services/payload.d.ts +3 -3
  273. package/dist/services/payload.js +124 -122
  274. package/dist/services/permissions.d.ts +3 -3
  275. package/dist/services/permissions.js +11 -11
  276. package/dist/services/presets.d.ts +1 -1
  277. package/dist/services/relations.d.ts +6 -6
  278. package/dist/services/relations.js +47 -43
  279. package/dist/services/revisions.d.ts +1 -1
  280. package/dist/services/roles.d.ts +2 -2
  281. package/dist/services/roles.js +34 -13
  282. package/dist/services/schema.d.ts +15 -0
  283. package/dist/services/schema.js +56 -0
  284. package/dist/services/schema.test.d.ts +1 -0
  285. package/dist/services/server.d.ts +3 -3
  286. package/dist/services/server.js +69 -13
  287. package/dist/services/settings.d.ts +1 -1
  288. package/dist/services/shares.d.ts +2 -2
  289. package/dist/services/shares.js +14 -15
  290. package/dist/services/specifications.d.ts +4 -4
  291. package/dist/services/specifications.js +132 -116
  292. package/dist/services/tfa.d.ts +2 -2
  293. package/dist/services/tfa.js +7 -5
  294. package/dist/services/users.d.ts +3 -3
  295. package/dist/services/users.js +89 -62
  296. package/dist/services/utils.d.ts +3 -3
  297. package/dist/services/utils.js +10 -8
  298. package/dist/services/webhooks.d.ts +2 -2
  299. package/dist/services/webhooks.js +2 -1
  300. package/dist/types/assets.d.ts +2 -2
  301. package/dist/types/ast.d.ts +1 -1
  302. package/dist/types/auth.d.ts +2 -2
  303. package/dist/types/collection.d.ts +2 -2
  304. package/dist/types/database.d.ts +3 -0
  305. package/dist/types/database.js +4 -0
  306. package/dist/types/events.d.ts +2 -2
  307. package/dist/types/graphql.d.ts +2 -2
  308. package/dist/types/index.d.ts +1 -0
  309. package/dist/types/index.js +1 -0
  310. package/dist/types/items.d.ts +7 -2
  311. package/dist/types/services.d.ts +5 -5
  312. package/dist/types/snapshot.d.ts +25 -3
  313. package/dist/types/snapshot.js +14 -0
  314. package/dist/utils/apply-diff.d.ts +9 -0
  315. package/dist/utils/apply-diff.js +256 -0
  316. package/dist/utils/apply-diff.test.d.ts +1 -0
  317. package/dist/utils/apply-query.d.ts +3 -3
  318. package/dist/utils/apply-query.js +15 -16
  319. package/dist/utils/apply-snapshot.d.ts +3 -5
  320. package/dist/utils/apply-snapshot.js +9 -240
  321. package/dist/utils/construct-flow-tree.d.ts +1 -1
  322. package/dist/utils/construct-flow-tree.js +2 -2
  323. package/dist/utils/filter-items.d.ts +1 -1
  324. package/dist/utils/get-accountability-for-role.d.ts +2 -2
  325. package/dist/utils/get-accountability-for-role.js +1 -1
  326. package/dist/utils/get-ast-from-query.d.ts +3 -3
  327. package/dist/utils/get-ast-from-query.js +22 -28
  328. package/dist/utils/get-cache-headers.d.ts +4 -2
  329. package/dist/utils/get-cache-headers.js +21 -21
  330. package/dist/utils/get-cache-headers.test.d.ts +1 -0
  331. package/dist/utils/get-cache-key.d.ts +1 -1
  332. package/dist/utils/get-cache-key.js +2 -3
  333. package/dist/utils/get-collection-from-alias.d.ts +1 -1
  334. package/dist/utils/get-column-path.d.ts +2 -2
  335. package/dist/utils/get-column-path.js +3 -4
  336. package/dist/utils/get-column.d.ts +4 -4
  337. package/dist/utils/get-column.js +4 -5
  338. package/dist/utils/get-default-value.d.ts +2 -2
  339. package/dist/utils/get-default-value.js +1 -2
  340. package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
  341. package/dist/utils/get-graphql-query-and-variables.js +1 -2
  342. package/dist/utils/get-graphql-type.d.ts +2 -2
  343. package/dist/utils/get-graphql-type.js +1 -1
  344. package/dist/utils/get-ip-from-req.d.ts +1 -1
  345. package/dist/utils/get-local-type.d.ts +1 -1
  346. package/dist/utils/get-local-type.js +3 -3
  347. package/dist/utils/get-milliseconds.d.ts +4 -0
  348. package/dist/utils/get-milliseconds.js +14 -0
  349. package/dist/utils/get-milliseconds.test.d.ts +1 -0
  350. package/dist/utils/get-permissions.d.ts +1 -1
  351. package/dist/utils/get-permissions.js +1 -1
  352. package/dist/utils/get-relation-info.d.ts +1 -1
  353. package/dist/utils/get-relation-info.js +3 -5
  354. package/dist/utils/get-relation-type.d.ts +1 -1
  355. package/dist/utils/get-relation-type.js +3 -4
  356. package/dist/utils/get-schema.d.ts +2 -2
  357. package/dist/utils/get-schema.js +19 -21
  358. package/dist/utils/get-snapshot-diff.js +10 -7
  359. package/dist/utils/get-snapshot.d.ts +3 -3
  360. package/dist/utils/get-snapshot.js +35 -14
  361. package/dist/utils/get-versioned-hash.d.ts +1 -0
  362. package/dist/utils/get-versioned-hash.js +12 -0
  363. package/dist/utils/get-versioned-hash.test.d.ts +1 -0
  364. package/dist/utils/is-directus-jwt.js +1 -1
  365. package/dist/utils/job-queue.js +2 -0
  366. package/dist/utils/jwt.d.ts +1 -1
  367. package/dist/utils/map-values-deep.d.ts +1 -0
  368. package/dist/utils/map-values-deep.js +29 -0
  369. package/dist/utils/map-values-deep.test.d.ts +1 -0
  370. package/dist/utils/merge-permissions-for-share.d.ts +1 -1
  371. package/dist/utils/merge-permissions-for-share.js +3 -4
  372. package/dist/utils/merge-permissions.d.ts +3 -3
  373. package/dist/utils/redact-header-cookies.d.ts +1 -0
  374. package/dist/utils/redact-header-cookies.js +11 -0
  375. package/dist/utils/redact-header-cookies.test.d.ts +1 -0
  376. package/dist/utils/reduce-schema.d.ts +1 -1
  377. package/dist/utils/reduce-schema.js +12 -12
  378. package/dist/utils/sanitize-query.d.ts +1 -1
  379. package/dist/utils/sanitize-query.js +1 -1
  380. package/dist/utils/sanitize-schema.d.ts +30 -0
  381. package/dist/utils/sanitize-schema.js +80 -0
  382. package/dist/utils/sanitize-schema.test.d.ts +1 -0
  383. package/dist/utils/should-skip-cache.d.ts +7 -0
  384. package/dist/utils/should-skip-cache.js +21 -0
  385. package/dist/utils/should-skip-cache.test.d.ts +1 -0
  386. package/dist/utils/track.js +3 -3
  387. package/dist/utils/transformations.d.ts +1 -1
  388. package/dist/utils/transformations.js +2 -4
  389. package/dist/utils/url.js +9 -8
  390. package/dist/utils/url.test.d.ts +1 -0
  391. package/dist/utils/user-name.d.ts +1 -1
  392. package/dist/utils/validate-diff.d.ts +7 -0
  393. package/dist/utils/validate-diff.js +113 -0
  394. package/dist/utils/validate-diff.test.d.ts +1 -0
  395. package/dist/utils/validate-keys.d.ts +2 -2
  396. package/dist/utils/validate-keys.js +1 -1
  397. package/dist/utils/validate-query.d.ts +1 -1
  398. package/dist/utils/validate-query.js +3 -3
  399. package/dist/utils/validate-query.test.d.ts +1 -0
  400. package/dist/utils/validate-snapshot.d.ts +5 -0
  401. package/dist/utils/validate-snapshot.js +71 -0
  402. package/dist/utils/validate-snapshot.test.d.ts +1 -0
  403. package/dist/webhooks.js +4 -3
  404. package/package.json +62 -62
@@ -20,6 +20,12 @@ const authorization_1 = require("./authorization");
20
20
  const index_1 = require("./index");
21
21
  const payload_1 = require("./payload");
22
22
  class ItemsService {
23
+ collection;
24
+ knex;
25
+ accountability;
26
+ eventScope;
27
+ schema;
28
+ cache;
23
29
  constructor(collection, options) {
24
30
  this.collection = collection;
25
31
  this.knex = options.knex || (0, database_1.default)();
@@ -72,7 +78,7 @@ class ItemsService {
72
78
  });
73
79
  // Run all hooks that are attached to this event so the end user has the chance to augment the
74
80
  // item that is about to be saved
75
- const payloadAfterHooks = (opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false
81
+ const payloadAfterHooks = opts?.emitEvents !== false
76
82
  ? await emitter_1.default.emitFilter(this.eventScope === 'items'
77
83
  ? ['items.create', `${this.collection}.items.create`]
78
84
  : `${this.eventScope}.create`, payload, {
@@ -86,6 +92,9 @@ class ItemsService {
86
92
  const payloadWithPresets = this.accountability
87
93
  ? await authorizationService.validatePayload('create', this.collection, payloadAfterHooks)
88
94
  : payloadAfterHooks;
95
+ if (opts?.preMutationException) {
96
+ throw opts.preMutationException;
97
+ }
89
98
  const { payload: payloadWithM2O, revisions: revisionsM2O, nestedActionEvents: nestedActionEventsM2O, } = await payloadService.processM2O(payloadWithPresets, opts);
90
99
  const { payload: payloadWithA2O, revisions: revisionsA2O, nestedActionEvents: nestedActionEventsA2O, } = await payloadService.processA2O(payloadWithM2O, opts);
91
100
  const payloadWithoutAliases = (0, lodash_1.pick)(payloadWithA2O, (0, lodash_1.without)(fields, ...aliases));
@@ -100,10 +109,10 @@ class ItemsService {
100
109
  .then((result) => result[0]);
101
110
  const returnedKey = typeof result === 'object' ? result[primaryKeyField] : result;
102
111
  if (this.schema.collections[this.collection].fields[primaryKeyField].type === 'uuid') {
103
- primaryKey = (0, helpers_1.getHelpers)(trx).schema.formatUUID(primaryKey !== null && primaryKey !== void 0 ? primaryKey : returnedKey);
112
+ primaryKey = (0, helpers_1.getHelpers)(trx).schema.formatUUID(primaryKey ?? returnedKey);
104
113
  }
105
114
  else {
106
- primaryKey = primaryKey !== null && primaryKey !== void 0 ? primaryKey : returnedKey;
115
+ primaryKey = primaryKey ?? returnedKey;
107
116
  }
108
117
  }
109
118
  catch (err) {
@@ -145,26 +154,27 @@ class ItemsService {
145
154
  knex: trx,
146
155
  schema: this.schema,
147
156
  });
157
+ const revisionDelta = await payloadService.prepareDelta(payloadAfterHooks);
148
158
  const revision = await revisionsService.createOne({
149
159
  activity: activity,
150
160
  collection: this.collection,
151
161
  item: primaryKey,
152
- data: await payloadService.prepareDelta(payload),
153
- delta: await payloadService.prepareDelta(payload),
162
+ data: revisionDelta,
163
+ delta: revisionDelta,
154
164
  });
155
165
  // Make sure to set the parent field of the child-revision rows
156
166
  const childrenRevisions = [...revisionsM2O, ...revisionsA2O, ...revisionsO2M];
157
167
  if (childrenRevisions.length > 0) {
158
168
  await revisionsService.updateMany(childrenRevisions, { parent: revision });
159
169
  }
160
- if (opts === null || opts === void 0 ? void 0 : opts.onRevisionCreate) {
170
+ if (opts?.onRevisionCreate) {
161
171
  opts.onRevisionCreate(revision);
162
172
  }
163
173
  }
164
174
  }
165
175
  return primaryKey;
166
176
  });
167
- if ((opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false) {
177
+ if (opts?.emitEvents !== false) {
168
178
  const actionEvent = {
169
179
  event: this.eventScope === 'items'
170
180
  ? ['items.create', `${this.collection}.items.create`]
@@ -180,17 +190,22 @@ class ItemsService {
180
190
  accountability: this.accountability,
181
191
  },
182
192
  };
183
- if (!(opts === null || opts === void 0 ? void 0 : opts.bypassEmitAction)) {
184
- emitter_1.default.emitAction(actionEvent.event, actionEvent.meta, actionEvent.context);
193
+ if (opts?.bypassEmitAction) {
194
+ opts.bypassEmitAction(actionEvent);
185
195
  }
186
196
  else {
187
- opts.bypassEmitAction(actionEvent);
197
+ emitter_1.default.emitAction(actionEvent.event, actionEvent.meta, actionEvent.context);
188
198
  }
189
199
  for (const nestedActionEvent of nestedActionEvents) {
190
- emitter_1.default.emitAction(nestedActionEvent.event, nestedActionEvent.meta, nestedActionEvent.context);
200
+ if (opts?.bypassEmitAction) {
201
+ opts.bypassEmitAction(nestedActionEvent);
202
+ }
203
+ else {
204
+ emitter_1.default.emitAction(nestedActionEvent.event, nestedActionEvent.meta, nestedActionEvent.context);
205
+ }
191
206
  }
192
207
  }
193
- if (this.cache && env_1.default.CACHE_AUTO_PURGE && (opts === null || opts === void 0 ? void 0 : opts.autoPurgeCache) !== false) {
208
+ if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
194
209
  await this.cache.clear();
195
210
  }
196
211
  return primaryKey;
@@ -211,23 +226,23 @@ class ItemsService {
211
226
  const primaryKey = await service.createOne(payload, {
212
227
  ...(opts || {}),
213
228
  autoPurgeCache: false,
214
- bypassEmitAction: (params) => (opts === null || opts === void 0 ? void 0 : opts.bypassEmitAction) ? opts.bypassEmitAction(params) : nestedActionEvents.push(params),
229
+ bypassEmitAction: (params) => nestedActionEvents.push(params),
215
230
  });
216
231
  primaryKeys.push(primaryKey);
217
232
  }
218
233
  return { primaryKeys, nestedActionEvents };
219
234
  });
220
- if ((opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false) {
235
+ if (opts?.emitEvents !== false) {
221
236
  for (const nestedActionEvent of nestedActionEvents) {
222
- if (!(opts === null || opts === void 0 ? void 0 : opts.bypassEmitAction)) {
223
- emitter_1.default.emitAction(nestedActionEvent.event, nestedActionEvent.meta, nestedActionEvent.context);
237
+ if (opts?.bypassEmitAction) {
238
+ opts.bypassEmitAction(nestedActionEvent);
224
239
  }
225
240
  else {
226
- opts.bypassEmitAction(nestedActionEvent);
241
+ emitter_1.default.emitAction(nestedActionEvent.event, nestedActionEvent.meta, nestedActionEvent.context);
227
242
  }
228
243
  }
229
244
  }
230
- if (this.cache && env_1.default.CACHE_AUTO_PURGE && (opts === null || opts === void 0 ? void 0 : opts.autoPurgeCache) !== false) {
245
+ if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
231
246
  await this.cache.clear();
232
247
  }
233
248
  return primaryKeys;
@@ -236,7 +251,7 @@ class ItemsService {
236
251
  * Get items by query
237
252
  */
238
253
  async readByQuery(query, opts) {
239
- const updatedQuery = (opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false
254
+ const updatedQuery = opts?.emitEvents !== false
240
255
  ? await emitter_1.default.emitFilter(this.eventScope === 'items'
241
256
  ? ['items.query', `${this.collection}.items.query`]
242
257
  : `${this.eventScope}.query`, query, {
@@ -252,7 +267,7 @@ class ItemsService {
252
267
  // By setting the permissions action, you can read items using the permissions for another
253
268
  // operation's permissions. This is used to dynamically check if you have update/delete
254
269
  // access to (a) certain item(s)
255
- action: (opts === null || opts === void 0 ? void 0 : opts.permissionsAction) || 'read',
270
+ action: opts?.permissionsAction || 'read',
256
271
  knex: this.knex,
257
272
  });
258
273
  if (this.accountability && this.accountability.admin !== true) {
@@ -261,17 +276,17 @@ class ItemsService {
261
276
  knex: this.knex,
262
277
  schema: this.schema,
263
278
  });
264
- ast = await authorizationService.processAST(ast, opts === null || opts === void 0 ? void 0 : opts.permissionsAction);
279
+ ast = await authorizationService.processAST(ast, opts?.permissionsAction);
265
280
  }
266
281
  const records = await (0, run_ast_1.default)(ast, this.schema, {
267
282
  knex: this.knex,
268
283
  // GraphQL requires relational keys to be returned regardless
269
- stripNonRequested: (opts === null || opts === void 0 ? void 0 : opts.stripNonRequested) !== undefined ? opts.stripNonRequested : true,
284
+ stripNonRequested: opts?.stripNonRequested !== undefined ? opts.stripNonRequested : true,
270
285
  });
271
286
  if (records === null) {
272
287
  throw new exceptions_1.ForbiddenException();
273
288
  }
274
- const filteredRecords = (opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false
289
+ const filteredRecords = opts?.emitEvents !== false
275
290
  ? await emitter_1.default.emitFilter(this.eventScope === 'items' ? ['items.read', `${this.collection}.items.read`] : `${this.eventScope}.read`, records, {
276
291
  query: updatedQuery,
277
292
  collection: this.collection,
@@ -281,7 +296,7 @@ class ItemsService {
281
296
  accountability: this.accountability,
282
297
  })
283
298
  : records;
284
- if ((opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false) {
299
+ if (opts?.emitEvents !== false) {
285
300
  emitter_1.default.emitAction(this.eventScope === 'items' ? ['items.read', `${this.collection}.items.read`] : `${this.eventScope}.read`, {
286
301
  payload: filteredRecords,
287
302
  query: updatedQuery,
@@ -312,10 +327,9 @@ class ItemsService {
312
327
  * Get multiple items by primary keys
313
328
  */
314
329
  async readMany(keys, query = {}, opts) {
315
- var _a;
316
330
  const primaryKeyField = this.schema.collections[this.collection].primary;
317
331
  (0, validate_keys_1.validateKeys)(this.schema, this.collection, primaryKeyField, keys);
318
- const filterWithKey = { _and: [{ [primaryKeyField]: { _in: keys } }, (_a = query.filter) !== null && _a !== void 0 ? _a : {}] };
332
+ const filterWithKey = { _and: [{ [primaryKeyField]: { _in: keys } }, query.filter ?? {}] };
319
333
  const queryWithKey = (0, lodash_1.assign)({}, query, { filter: filterWithKey });
320
334
  // Set query limit as the number of keys
321
335
  if (Array.isArray(keys) && keys.length > 0 && !queryWithKey.limit) {
@@ -367,7 +381,7 @@ class ItemsService {
367
381
  });
368
382
  }
369
383
  finally {
370
- if (this.cache && env_1.default.CACHE_AUTO_PURGE && (opts === null || opts === void 0 ? void 0 : opts.autoPurgeCache) !== false) {
384
+ if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
371
385
  await this.cache.clear();
372
386
  }
373
387
  }
@@ -392,7 +406,7 @@ class ItemsService {
392
406
  });
393
407
  // Run all hooks that are attached to this event so the end user has the chance to augment the
394
408
  // item that is about to be saved
395
- const payloadAfterHooks = (opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false
409
+ const payloadAfterHooks = opts?.emitEvents !== false
396
410
  ? await emitter_1.default.emitFilter(this.eventScope === 'items'
397
411
  ? ['items.update', `${this.collection}.items.update`]
398
412
  : `${this.eventScope}.update`, payload, {
@@ -412,6 +426,9 @@ class ItemsService {
412
426
  const payloadWithPresets = this.accountability
413
427
  ? await authorizationService.validatePayload('update', this.collection, payloadAfterHooks)
414
428
  : payloadAfterHooks;
429
+ if (opts?.preMutationException) {
430
+ throw opts.preMutationException;
431
+ }
415
432
  await this.knex.transaction(async (trx) => {
416
433
  const payloadService = new payload_1.PayloadService(this.collection, {
417
434
  accountability: this.accountability,
@@ -473,7 +490,7 @@ class ItemsService {
473
490
  const revisionIDs = await revisionsService.createMany(revisions);
474
491
  for (let i = 0; i < revisionIDs.length; i++) {
475
492
  const revisionID = revisionIDs[i];
476
- if (opts === null || opts === void 0 ? void 0 : opts.onRevisionCreate) {
493
+ if (opts?.onRevisionCreate) {
477
494
  opts.onRevisionCreate(revisionID);
478
495
  }
479
496
  if (i === 0) {
@@ -489,10 +506,10 @@ class ItemsService {
489
506
  }
490
507
  }
491
508
  });
492
- if (this.cache && env_1.default.CACHE_AUTO_PURGE && (opts === null || opts === void 0 ? void 0 : opts.autoPurgeCache) !== false) {
509
+ if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
493
510
  await this.cache.clear();
494
511
  }
495
- if ((opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false) {
512
+ if (opts?.emitEvents !== false) {
496
513
  const actionEvent = {
497
514
  event: this.eventScope === 'items'
498
515
  ? ['items.update', `${this.collection}.items.update`]
@@ -508,14 +525,19 @@ class ItemsService {
508
525
  accountability: this.accountability,
509
526
  },
510
527
  };
511
- if (!(opts === null || opts === void 0 ? void 0 : opts.bypassEmitAction)) {
512
- emitter_1.default.emitAction(actionEvent.event, actionEvent.meta, actionEvent.context);
528
+ if (opts?.bypassEmitAction) {
529
+ opts.bypassEmitAction(actionEvent);
513
530
  }
514
531
  else {
515
- opts.bypassEmitAction(actionEvent);
532
+ emitter_1.default.emitAction(actionEvent.event, actionEvent.meta, actionEvent.context);
516
533
  }
517
534
  for (const nestedActionEvent of nestedActionEvents) {
518
- emitter_1.default.emitAction(nestedActionEvent.event, nestedActionEvent.meta, nestedActionEvent.context);
535
+ if (opts?.bypassEmitAction) {
536
+ opts.bypassEmitAction(nestedActionEvent);
537
+ }
538
+ else {
539
+ emitter_1.default.emitAction(nestedActionEvent.event, nestedActionEvent.meta, nestedActionEvent.context);
540
+ }
519
541
  }
520
542
  }
521
543
  return keys;
@@ -559,7 +581,7 @@ class ItemsService {
559
581
  }
560
582
  return primaryKeys;
561
583
  });
562
- if (this.cache && env_1.default.CACHE_AUTO_PURGE && (opts === null || opts === void 0 ? void 0 : opts.autoPurgeCache) !== false) {
584
+ if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
563
585
  await this.cache.clear();
564
586
  }
565
587
  return primaryKeys;
@@ -596,7 +618,10 @@ class ItemsService {
596
618
  });
597
619
  await authorizationService.checkAccess('delete', this.collection, keys);
598
620
  }
599
- if ((opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false) {
621
+ if (opts?.preMutationException) {
622
+ throw opts.preMutationException;
623
+ }
624
+ if (opts?.emitEvents !== false) {
600
625
  await emitter_1.default.emitFilter(this.eventScope === 'items' ? ['items.delete', `${this.collection}.items.delete`] : `${this.eventScope}.delete`, keys, {
601
626
  collection: this.collection,
602
627
  }, {
@@ -623,10 +648,10 @@ class ItemsService {
623
648
  })));
624
649
  }
625
650
  });
626
- if (this.cache && env_1.default.CACHE_AUTO_PURGE && (opts === null || opts === void 0 ? void 0 : opts.autoPurgeCache) !== false) {
651
+ if (this.cache && env_1.default.CACHE_AUTO_PURGE && opts?.autoPurgeCache !== false) {
627
652
  await this.cache.clear();
628
653
  }
629
- if ((opts === null || opts === void 0 ? void 0 : opts.emitEvents) !== false) {
654
+ if (opts?.emitEvents !== false) {
630
655
  const actionEvent = {
631
656
  event: this.eventScope === 'items'
632
657
  ? ['items.delete', `${this.collection}.items.delete`]
@@ -642,11 +667,11 @@ class ItemsService {
642
667
  accountability: this.accountability,
643
668
  },
644
669
  };
645
- if (!(opts === null || opts === void 0 ? void 0 : opts.bypassEmitAction)) {
646
- emitter_1.default.emitAction(actionEvent.event, actionEvent.meta, actionEvent.context);
670
+ if (opts?.bypassEmitAction) {
671
+ opts.bypassEmitAction(actionEvent);
647
672
  }
648
673
  else {
649
- opts.bypassEmitAction(actionEvent);
674
+ emitter_1.default.emitAction(actionEvent.event, actionEvent.meta, actionEvent.context);
650
675
  }
651
676
  }
652
677
  return keys;
@@ -1,7 +1,7 @@
1
- import { Knex } from 'knex';
2
- import { AbstractServiceOptions } from '../../types';
3
- import { Accountability, SchemaOverview } from '@directus/shared/types';
4
- import { Transporter, SendMailOptions } from 'nodemailer';
1
+ import type { Accountability, SchemaOverview } from '@directus/shared/types';
2
+ import type { Knex } from 'knex';
3
+ import type { SendMailOptions, Transporter } from 'nodemailer';
4
+ import type { AbstractServiceOptions } from '../../types';
5
5
  export type EmailOptions = SendMailOptions & {
6
6
  template?: {
7
7
  name: string;
@@ -18,10 +18,14 @@ const liquidEngine = new liquidjs_1.Liquid({
18
18
  extname: '.liquid',
19
19
  });
20
20
  class MailService {
21
+ schema;
22
+ accountability;
23
+ knex;
24
+ mailer;
21
25
  constructor(opts) {
22
26
  this.schema = opts.schema;
23
27
  this.accountability = opts.accountability || null;
24
- this.knex = (opts === null || opts === void 0 ? void 0 : opts.knex) || (0, database_1.default)();
28
+ this.knex = opts?.knex || (0, database_1.default)();
25
29
  this.mailer = (0, mailer_1.default)();
26
30
  if (env_1.default.EMAIL_VERIFY_SETUP) {
27
31
  this.mailer.verify((error) => {
@@ -72,10 +76,10 @@ class MailService {
72
76
  .from('directus_settings')
73
77
  .first();
74
78
  return {
75
- projectName: (projectInfo === null || projectInfo === void 0 ? void 0 : projectInfo.project_name) || 'Directus',
76
- projectColor: (projectInfo === null || projectInfo === void 0 ? void 0 : projectInfo.project_color) || '#546e7a',
77
- projectLogo: getProjectLogoURL(projectInfo === null || projectInfo === void 0 ? void 0 : projectInfo.project_logo),
78
- projectUrl: (projectInfo === null || projectInfo === void 0 ? void 0 : projectInfo.project_url) || '',
79
+ projectName: projectInfo?.project_name || 'Directus',
80
+ projectColor: projectInfo?.project_color || '#546e7a',
81
+ projectLogo: getProjectLogoURL(projectInfo?.project_logo),
82
+ projectUrl: projectInfo?.project_url || '',
79
83
  };
80
84
  function getProjectLogoURL(logoID) {
81
85
  const projectLogoUrl = new url_1.Url(env_1.default.PUBLIC_URL);
@@ -1,6 +1,6 @@
1
- import { Knex } from 'knex';
2
- import { AbstractServiceOptions } from '../types';
3
- import { Accountability, Query, SchemaOverview } from '@directus/shared/types';
1
+ import type { Accountability, Query, SchemaOverview } from '@directus/shared/types';
2
+ import type { Knex } from 'knex';
3
+ import type { AbstractServiceOptions } from '../types';
4
4
  export declare class MetaService {
5
5
  knex: Knex;
6
6
  accountability: Accountability | null;
@@ -8,6 +8,9 @@ const database_1 = __importDefault(require("../database"));
8
8
  const exceptions_1 = require("../exceptions");
9
9
  const apply_query_1 = require("../utils/apply-query");
10
10
  class MetaService {
11
+ knex;
12
+ accountability;
13
+ schema;
11
14
  constructor(options) {
12
15
  this.knex = options.knex || (0, database_1.default)();
13
16
  this.accountability = options.accountability || null;
@@ -31,31 +34,29 @@ class MetaService {
31
34
  }, {});
32
35
  }
33
36
  async totalCount(collection) {
34
- var _a, _b, _c, _d, _e;
35
37
  const dbQuery = this.knex(collection).count('*', { as: 'count' }).first();
36
- if (((_a = this.accountability) === null || _a === void 0 ? void 0 : _a.admin) !== true) {
37
- const permissionsRecord = (_c = (_b = this.accountability) === null || _b === void 0 ? void 0 : _b.permissions) === null || _c === void 0 ? void 0 : _c.find((permission) => {
38
+ if (this.accountability?.admin !== true) {
39
+ const permissionsRecord = this.accountability?.permissions?.find((permission) => {
38
40
  return permission.action === 'read' && permission.collection === collection;
39
41
  });
40
42
  if (!permissionsRecord)
41
43
  throw new exceptions_1.ForbiddenException();
42
- const permissions = (_d = permissionsRecord.permissions) !== null && _d !== void 0 ? _d : {};
44
+ const permissions = permissionsRecord.permissions ?? {};
43
45
  (0, apply_query_1.applyFilter)(this.knex, this.schema, dbQuery, permissions, collection, {});
44
46
  }
45
47
  const result = await dbQuery;
46
- return Number((_e = result === null || result === void 0 ? void 0 : result.count) !== null && _e !== void 0 ? _e : 0);
48
+ return Number(result?.count ?? 0);
47
49
  }
48
50
  async filterCount(collection, query) {
49
- var _a, _b, _c, _d;
50
51
  const dbQuery = this.knex(collection).count('*', { as: 'count' });
51
52
  let filter = query.filter || {};
52
- if (((_a = this.accountability) === null || _a === void 0 ? void 0 : _a.admin) !== true) {
53
- const permissionsRecord = (_c = (_b = this.accountability) === null || _b === void 0 ? void 0 : _b.permissions) === null || _c === void 0 ? void 0 : _c.find((permission) => {
53
+ if (this.accountability?.admin !== true) {
54
+ const permissionsRecord = this.accountability?.permissions?.find((permission) => {
54
55
  return permission.action === 'read' && permission.collection === collection;
55
56
  });
56
57
  if (!permissionsRecord)
57
58
  throw new exceptions_1.ForbiddenException();
58
- const permissions = (_d = permissionsRecord.permissions) !== null && _d !== void 0 ? _d : {};
59
+ const permissions = permissionsRecord.permissions ?? {};
59
60
  if (Object.keys(filter).length > 0) {
60
61
  filter = { _and: [permissions, filter] };
61
62
  }
@@ -1,8 +1,8 @@
1
- import { AbstractServiceOptions, PrimaryKey, MutationOptions } from '../types';
1
+ import type { Notification } from '@directus/shared/types';
2
+ import type { AbstractServiceOptions, MutationOptions, PrimaryKey } from '../types';
2
3
  import { ItemsService } from './items';
3
- import { Notification } from '@directus/shared/types';
4
- import { UsersService } from './users';
5
4
  import { MailService } from './mail';
5
+ import { UsersService } from './users';
6
6
  export declare class NotificationsService extends ItemsService {
7
7
  usersService: UsersService;
8
8
  mailService: MailService;
@@ -4,14 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.NotificationsService = void 0;
7
- const items_1 = require("./items");
7
+ const env_1 = __importDefault(require("../env"));
8
+ const logger_1 = __importDefault(require("../logger"));
8
9
  const md_1 = require("../utils/md");
9
10
  const url_1 = require("../utils/url");
10
- const users_1 = require("./users");
11
+ const items_1 = require("./items");
11
12
  const mail_1 = require("./mail");
12
- const logger_1 = __importDefault(require("../logger"));
13
- const env_1 = __importDefault(require("../env"));
13
+ const users_1 = require("./users");
14
14
  class NotificationsService extends items_1.ItemsService {
15
+ usersService;
16
+ mailService;
15
17
  constructor(options) {
16
18
  super('directus_notifications', options);
17
19
  this.usersService = new users_1.UsersService({ schema: this.schema });
@@ -30,7 +32,6 @@ class NotificationsService extends items_1.ItemsService {
30
32
  return response;
31
33
  }
32
34
  async sendEmail(data) {
33
- var _a;
34
35
  if (data.recipient) {
35
36
  const user = await this.usersService.readOne(data.recipient, {
36
37
  fields: ['id', 'email', 'email_notifications', 'role.app_access'],
@@ -42,7 +43,7 @@ class NotificationsService extends items_1.ItemsService {
42
43
  await this.mailService.send({
43
44
  template: {
44
45
  name: 'base',
45
- data: ((_a = user.role) === null || _a === void 0 ? void 0 : _a.app_access) ? { url: manageUserAccountUrl, html } : { html },
46
+ data: user.role?.app_access ? { url: manageUserAccountUrl, html } : { html },
46
47
  },
47
48
  to: user.email,
48
49
  subject: data.subject,
@@ -1,5 +1,5 @@
1
- import { OperationRaw } from '@directus/shared/types';
2
- import { AbstractServiceOptions, Item, MutationOptions, PrimaryKey } from '../types';
1
+ import type { OperationRaw } from '@directus/shared/types';
2
+ import type { AbstractServiceOptions, Item, MutationOptions, PrimaryKey } from '../types';
3
3
  import { ItemsService } from './items';
4
4
  export declare class OperationsService extends ItemsService<OperationRaw> {
5
5
  constructor(options: AbstractServiceOptions);
@@ -1,4 +1,4 @@
1
- import { AbstractServiceOptions } from '../types';
1
+ import type { AbstractServiceOptions } from '../types';
2
2
  import { ItemsService } from './items';
3
3
  export declare class PanelsService extends ItemsService {
4
4
  constructor(options: AbstractServiceOptions);
@@ -1,7 +1,7 @@
1
- import { Accountability, SchemaOverview } from '@directus/shared/types';
2
- import { Knex } from 'knex';
1
+ import type { Accountability, SchemaOverview } from '@directus/shared/types';
2
+ import type { Knex } from 'knex';
3
3
  import { Helpers } from '../database/helpers';
4
- import { AbstractServiceOptions, ActionEventParams, Item, MutationOptions, PrimaryKey } from '../types';
4
+ import type { AbstractServiceOptions, ActionEventParams, Item, MutationOptions, PrimaryKey } from '../types';
5
5
  type Action = 'create' | 'read' | 'update';
6
6
  type Transformers = {
7
7
  [type: string]: (context: {