directus 9.23.1 → 9.23.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/dist/app.js +25 -21
  2. package/dist/auth/auth.d.ts +3 -3
  3. package/dist/auth/auth.js +2 -0
  4. package/dist/auth/drivers/ldap.d.ts +1 -1
  5. package/dist/auth/drivers/ldap.js +57 -46
  6. package/dist/auth/drivers/local.d.ts +1 -1
  7. package/dist/auth/drivers/local.js +20 -17
  8. package/dist/auth/drivers/oauth2.d.ts +1 -1
  9. package/dist/auth/drivers/oauth2.js +44 -35
  10. package/dist/auth/drivers/openid.d.ts +1 -1
  11. package/dist/auth/drivers/openid.js +50 -41
  12. package/dist/auth/drivers/saml.d.ts +1 -1
  13. package/dist/auth/drivers/saml.js +20 -17
  14. package/dist/auth.d.ts +1 -1
  15. package/dist/auth.js +8 -7
  16. package/dist/cache.d.ts +9 -1
  17. package/dist/cache.js +66 -18
  18. package/dist/cli/commands/bootstrap/index.js +7 -6
  19. package/dist/cli/commands/init/index.js +3 -3
  20. package/dist/cli/commands/schema/apply.js +14 -15
  21. package/dist/cli/commands/schema/snapshot.js +2 -2
  22. package/dist/cli/utils/create-db-connection.d.ts +1 -1
  23. package/dist/cli/utils/create-db-connection.js +3 -2
  24. package/dist/cli/utils/create-env/index.d.ts +2 -2
  25. package/dist/cli/utils/create-env/index.js +1 -1
  26. package/dist/cli/utils/drivers.d.ts +1 -1
  27. package/dist/constants.d.ts +3 -2
  28. package/dist/constants.js +7 -7
  29. package/dist/controllers/activity.js +10 -11
  30. package/dist/controllers/assets.js +31 -25
  31. package/dist/controllers/auth.js +40 -26
  32. package/dist/controllers/collections.js +10 -10
  33. package/dist/controllers/dashboards.js +14 -11
  34. package/dist/controllers/extensions.js +3 -3
  35. package/dist/controllers/fields.js +20 -20
  36. package/dist/controllers/files.js +26 -20
  37. package/dist/controllers/flows.js +16 -13
  38. package/dist/controllers/folders.js +14 -11
  39. package/dist/controllers/graphql.js +6 -8
  40. package/dist/controllers/items.js +22 -19
  41. package/dist/controllers/not-found.d.ts +1 -1
  42. package/dist/controllers/not-found.js +1 -2
  43. package/dist/controllers/notifications.js +14 -11
  44. package/dist/controllers/operations.js +14 -11
  45. package/dist/controllers/panels.js +14 -11
  46. package/dist/controllers/permissions.js +14 -11
  47. package/dist/controllers/presets.js +14 -11
  48. package/dist/controllers/relations.js +10 -10
  49. package/dist/controllers/revisions.js +3 -3
  50. package/dist/controllers/roles.js +14 -11
  51. package/dist/controllers/schema.js +5 -5
  52. package/dist/controllers/server.js +7 -7
  53. package/dist/controllers/settings.js +2 -2
  54. package/dist/controllers/shares.js +21 -18
  55. package/dist/controllers/users.js +32 -36
  56. package/dist/controllers/utils.js +10 -15
  57. package/dist/controllers/webhooks.js +14 -11
  58. package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
  59. package/dist/database/helpers/fn/dialects/mssql.js +10 -11
  60. package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
  61. package/dist/database/helpers/fn/dialects/mysql.js +2 -3
  62. package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
  63. package/dist/database/helpers/fn/dialects/oracle.js +10 -11
  64. package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
  65. package/dist/database/helpers/fn/dialects/postgres.js +10 -11
  66. package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
  67. package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
  68. package/dist/database/helpers/fn/types.d.ts +5 -6
  69. package/dist/database/helpers/fn/types.js +4 -5
  70. package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
  71. package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
  72. package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
  73. package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
  74. package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
  75. package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
  76. package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
  77. package/dist/database/helpers/geometry/types.d.ts +2 -2
  78. package/dist/database/helpers/geometry/types.js +1 -2
  79. package/dist/database/helpers/index.d.ts +5 -5
  80. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -1
  81. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  82. package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
  83. package/dist/database/helpers/schema/dialects/mysql.js +1 -2
  84. package/dist/database/helpers/schema/dialects/oracle.d.ts +2 -2
  85. package/dist/database/helpers/schema/dialects/oracle.js +4 -6
  86. package/dist/database/helpers/schema/types.d.ts +4 -4
  87. package/dist/database/helpers/types.d.ts +1 -1
  88. package/dist/database/helpers/types.js +1 -0
  89. package/dist/database/index.d.ts +1 -1
  90. package/dist/database/index.js +13 -13
  91. package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
  92. package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
  93. package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
  94. package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
  95. package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
  96. package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
  97. package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
  98. package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
  99. package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
  100. package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
  101. package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
  102. package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
  103. package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
  104. package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
  105. package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
  106. package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
  107. package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
  108. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
  109. package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
  110. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
  111. package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
  112. package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
  113. package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
  114. package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
  115. package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
  116. package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
  117. package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
  118. package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
  119. package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
  120. package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
  121. package/dist/database/migrations/20210805B-change-image-metadata-structure.js +15 -15
  122. package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
  123. package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
  124. package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
  125. package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
  126. package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
  127. package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
  128. package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
  129. package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
  130. package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
  131. package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
  132. package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
  133. package/dist/database/migrations/20211007A-update-presets.js +7 -9
  134. package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
  135. package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
  136. package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
  137. package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
  138. package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
  139. package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
  140. package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
  141. package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
  142. package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
  143. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
  144. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
  145. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
  146. package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
  147. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
  148. package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
  149. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
  150. package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
  151. package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
  152. package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
  153. package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
  154. package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
  155. package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
  156. package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
  157. package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
  158. package/dist/database/migrations/run.d.ts +1 -1
  159. package/dist/database/migrations/run.js +1 -1
  160. package/dist/database/run-ast.d.ts +3 -3
  161. package/dist/database/run-ast.js +21 -30
  162. package/dist/database/seeds/run.d.ts +1 -1
  163. package/dist/database/seeds/run.js +1 -2
  164. package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
  165. package/dist/database/system-data/collections/index.d.ts +1 -1
  166. package/dist/database/system-data/collections/index.js +2 -2
  167. package/dist/database/system-data/fields/collections.yaml +2 -0
  168. package/dist/database/system-data/fields/index.d.ts +1 -1
  169. package/dist/database/system-data/fields/index.js +3 -4
  170. package/dist/database/system-data/fields/settings.yaml +4 -0
  171. package/dist/database/system-data/relations/index.d.ts +1 -1
  172. package/dist/emitter.d.ts +1 -1
  173. package/dist/emitter.js +3 -0
  174. package/dist/env.js +11 -3
  175. package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
  176. package/dist/exceptions/database/dialects/mssql.js +5 -6
  177. package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
  178. package/dist/exceptions/database/dialects/mysql.js +19 -25
  179. package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
  180. package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
  181. package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
  182. package/dist/exceptions/database/translate.d.ts +1 -1
  183. package/dist/exceptions/database/value-out-of-range.js +1 -1
  184. package/dist/exceptions/range-not-satisfiable.js +2 -3
  185. package/dist/extensions.d.ts +1 -1
  186. package/dist/extensions.js +43 -33
  187. package/dist/flows.js +65 -46
  188. package/dist/logger.d.ts +2 -1
  189. package/dist/logger.js +35 -19
  190. package/dist/logger.test.d.ts +1 -0
  191. package/dist/mailer.js +16 -16
  192. package/dist/messenger.js +9 -7
  193. package/dist/middleware/authenticate.d.ts +1 -1
  194. package/dist/middleware/authenticate.js +13 -6
  195. package/dist/middleware/cache.d.ts +1 -1
  196. package/dist/middleware/cache.js +16 -16
  197. package/dist/middleware/check-ip.d.ts +1 -1
  198. package/dist/middleware/check-ip.js +1 -1
  199. package/dist/middleware/collection-exists.d.ts +1 -1
  200. package/dist/middleware/collection-exists.js +5 -5
  201. package/dist/middleware/cors.d.ts +1 -1
  202. package/dist/middleware/cors.js +7 -7
  203. package/dist/middleware/error-handler.d.ts +1 -1
  204. package/dist/middleware/error-handler.js +11 -12
  205. package/dist/middleware/extract-token.d.ts +1 -1
  206. package/dist/middleware/extract-token.js +2 -2
  207. package/dist/middleware/get-permissions.d.ts +1 -1
  208. package/dist/middleware/graphql.d.ts +1 -1
  209. package/dist/middleware/graphql.js +15 -9
  210. package/dist/middleware/rate-limiter-global.d.ts +5 -0
  211. package/dist/middleware/rate-limiter-global.js +48 -0
  212. package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
  213. package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +5 -5
  214. package/dist/middleware/respond.d.ts +1 -1
  215. package/dist/middleware/respond.js +18 -19
  216. package/dist/middleware/sanitize-query.d.ts +1 -1
  217. package/dist/middleware/sanitize-query.js +1 -1
  218. package/dist/middleware/schema.d.ts +1 -1
  219. package/dist/middleware/use-collection.d.ts +1 -1
  220. package/dist/operations/condition/index.d.ts +1 -1
  221. package/dist/operations/exec/index.js +15 -4
  222. package/dist/operations/item-create/index.js +1 -2
  223. package/dist/operations/item-delete/index.d.ts +1 -1
  224. package/dist/operations/item-read/index.d.ts +1 -1
  225. package/dist/operations/item-update/index.d.ts +1 -1
  226. package/dist/operations/item-update/index.js +1 -2
  227. package/dist/operations/notification/index.js +1 -2
  228. package/dist/operations/request/index.js +19 -19
  229. package/dist/operations/trigger/index.js +2 -3
  230. package/dist/rate-limiter.d.ts +1 -1
  231. package/dist/rate-limiter.js +9 -9
  232. package/dist/request/validate-ip.js +2 -2
  233. package/dist/server.js +12 -13
  234. package/dist/services/activity.d.ts +1 -1
  235. package/dist/services/activity.js +17 -16
  236. package/dist/services/assets.d.ts +3 -3
  237. package/dist/services/assets.js +35 -37
  238. package/dist/services/authentication.d.ts +2 -2
  239. package/dist/services/authentication.js +22 -19
  240. package/dist/services/authorization.d.ts +3 -3
  241. package/dist/services/authorization.js +27 -31
  242. package/dist/services/collections.d.ts +5 -5
  243. package/dist/services/collections.js +54 -50
  244. package/dist/services/dashboards.d.ts +1 -1
  245. package/dist/services/fields.d.ts +5 -5
  246. package/dist/services/fields.js +50 -50
  247. package/dist/services/files.d.ts +1 -2
  248. package/dist/services/files.js +33 -27
  249. package/dist/services/flows.d.ts +2 -2
  250. package/dist/services/folders.d.ts +1 -1
  251. package/dist/services/graphql/index.d.ts +4 -4
  252. package/dist/services/graphql/index.js +259 -252
  253. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
  254. package/dist/services/graphql/utils/process-error.d.ts +2 -2
  255. package/dist/services/graphql/utils/process-error.js +11 -4
  256. package/dist/services/import-export.d.ts +3 -3
  257. package/dist/services/import-export.js +30 -27
  258. package/dist/services/items.d.ts +3 -3
  259. package/dist/services/items.js +42 -36
  260. package/dist/services/mail/index.d.ts +4 -4
  261. package/dist/services/mail/index.js +14 -10
  262. package/dist/services/meta.d.ts +3 -3
  263. package/dist/services/meta.js +11 -9
  264. package/dist/services/notifications.d.ts +3 -3
  265. package/dist/services/notifications.js +10 -9
  266. package/dist/services/operations.d.ts +2 -2
  267. package/dist/services/panels.d.ts +1 -1
  268. package/dist/services/payload.d.ts +3 -3
  269. package/dist/services/payload.js +124 -122
  270. package/dist/services/permissions.d.ts +3 -3
  271. package/dist/services/permissions.js +11 -11
  272. package/dist/services/presets.d.ts +1 -1
  273. package/dist/services/relations.d.ts +6 -6
  274. package/dist/services/relations.js +45 -43
  275. package/dist/services/revisions.d.ts +1 -1
  276. package/dist/services/revisions.js +3 -3
  277. package/dist/services/roles.d.ts +2 -2
  278. package/dist/services/roles.js +7 -7
  279. package/dist/services/schema.d.ts +3 -3
  280. package/dist/services/schema.js +9 -11
  281. package/dist/services/server.d.ts +3 -3
  282. package/dist/services/server.js +88 -32
  283. package/dist/services/settings.d.ts +1 -1
  284. package/dist/services/shares.d.ts +1 -1
  285. package/dist/services/shares.js +14 -15
  286. package/dist/services/specifications.d.ts +4 -4
  287. package/dist/services/specifications.js +137 -119
  288. package/dist/services/tfa.d.ts +2 -2
  289. package/dist/services/tfa.js +7 -5
  290. package/dist/services/users.d.ts +2 -6
  291. package/dist/services/users.js +37 -40
  292. package/dist/services/utils.d.ts +3 -3
  293. package/dist/services/utils.js +10 -8
  294. package/dist/services/webhooks.d.ts +2 -2
  295. package/dist/services/webhooks.js +2 -1
  296. package/dist/storage/register-locations.js +1 -1
  297. package/dist/types/assets.d.ts +1 -1
  298. package/dist/types/ast.d.ts +1 -1
  299. package/dist/types/auth.d.ts +2 -2
  300. package/dist/types/collection.d.ts +2 -2
  301. package/dist/types/events.d.ts +2 -2
  302. package/dist/types/graphql.d.ts +2 -2
  303. package/dist/types/items.d.ts +3 -3
  304. package/dist/types/services.d.ts +5 -5
  305. package/dist/types/snapshot.d.ts +4 -4
  306. package/dist/utils/apply-diff.d.ts +3 -3
  307. package/dist/utils/apply-diff.js +25 -28
  308. package/dist/utils/apply-query.d.ts +3 -3
  309. package/dist/utils/apply-query.js +10 -12
  310. package/dist/utils/apply-snapshot.d.ts +3 -3
  311. package/dist/utils/apply-snapshot.js +5 -6
  312. package/dist/utils/construct-flow-tree.d.ts +1 -1
  313. package/dist/utils/construct-flow-tree.js +2 -2
  314. package/dist/utils/dynamic-import.js +1 -1
  315. package/dist/utils/filter-items.d.ts +1 -1
  316. package/dist/utils/generate-hash.js +1 -1
  317. package/dist/utils/get-accountability-for-role.d.ts +2 -2
  318. package/dist/utils/get-accountability-for-role.js +1 -1
  319. package/dist/utils/get-ast-from-query.d.ts +3 -3
  320. package/dist/utils/get-ast-from-query.js +22 -28
  321. package/dist/utils/get-auth-providers.js +1 -1
  322. package/dist/utils/get-cache-headers.d.ts +1 -1
  323. package/dist/utils/get-cache-headers.js +6 -7
  324. package/dist/utils/get-cache-key.d.ts +1 -1
  325. package/dist/utils/get-cache-key.js +2 -3
  326. package/dist/utils/get-collection-from-alias.d.ts +1 -1
  327. package/dist/utils/get-collection-from-alias.js +1 -0
  328. package/dist/utils/get-column-path.d.ts +2 -2
  329. package/dist/utils/get-column-path.js +3 -4
  330. package/dist/utils/get-column.d.ts +4 -4
  331. package/dist/utils/get-column.js +4 -5
  332. package/dist/utils/get-default-value.d.ts +2 -2
  333. package/dist/utils/get-default-value.js +2 -3
  334. package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
  335. package/dist/utils/get-graphql-query-and-variables.js +1 -2
  336. package/dist/utils/get-graphql-type.d.ts +2 -2
  337. package/dist/utils/get-graphql-type.js +1 -1
  338. package/dist/utils/get-ip-from-req.d.ts +1 -1
  339. package/dist/utils/get-ip-from-req.js +2 -2
  340. package/dist/utils/get-local-type.d.ts +1 -1
  341. package/dist/utils/get-local-type.js +3 -3
  342. package/dist/utils/get-milliseconds.js +1 -2
  343. package/dist/utils/get-permissions.d.ts +1 -1
  344. package/dist/utils/get-permissions.js +12 -12
  345. package/dist/utils/get-relation-info.d.ts +1 -1
  346. package/dist/utils/get-relation-info.js +3 -5
  347. package/dist/utils/get-relation-type.d.ts +1 -1
  348. package/dist/utils/get-relation-type.js +3 -4
  349. package/dist/utils/get-schema.d.ts +2 -2
  350. package/dist/utils/get-schema.js +20 -22
  351. package/dist/utils/get-snapshot-diff.js +2 -3
  352. package/dist/utils/get-snapshot.d.ts +3 -3
  353. package/dist/utils/get-snapshot.js +6 -8
  354. package/dist/utils/is-directus-jwt.js +1 -1
  355. package/dist/utils/is-url-allowed.js +5 -2
  356. package/dist/utils/job-queue.js +2 -0
  357. package/dist/utils/jwt.d.ts +1 -1
  358. package/dist/utils/merge-permissions-for-share.d.ts +1 -1
  359. package/dist/utils/merge-permissions-for-share.js +3 -4
  360. package/dist/utils/merge-permissions.d.ts +3 -3
  361. package/dist/utils/reduce-schema.d.ts +1 -1
  362. package/dist/utils/reduce-schema.js +12 -12
  363. package/dist/utils/sanitize-query.d.ts +1 -1
  364. package/dist/utils/sanitize-query.js +27 -27
  365. package/dist/utils/sanitize-schema.d.ts +2 -2
  366. package/dist/utils/should-skip-cache.d.ts +7 -0
  367. package/dist/utils/should-skip-cache.js +21 -0
  368. package/dist/utils/should-skip-cache.test.d.ts +1 -0
  369. package/dist/utils/track.js +16 -16
  370. package/dist/utils/transformations.d.ts +1 -1
  371. package/dist/utils/transformations.js +2 -4
  372. package/dist/utils/url.js +7 -2
  373. package/dist/utils/user-name.d.ts +1 -1
  374. package/dist/utils/validate-diff.js +7 -8
  375. package/dist/utils/validate-keys.d.ts +2 -2
  376. package/dist/utils/validate-keys.js +1 -1
  377. package/dist/utils/validate-query.d.ts +1 -1
  378. package/dist/utils/validate-query.js +3 -3
  379. package/dist/utils/validate-storage.js +8 -8
  380. package/dist/webhooks.js +3 -3
  381. package/package.json +36 -37
  382. package/dist/utils/with-timeout.d.ts +0 -1
  383. package/dist/utils/with-timeout.js +0 -16
package/dist/cache.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getCacheValue = exports.setCacheValue = exports.getSystemCache = exports.setSystemCache = exports.clearSystemCache = exports.flushCaches = exports.getCache = void 0;
6
+ exports.getCacheValue = exports.setCacheValue = exports.getSchemaCache = exports.setSchemaCache = exports.getSystemCache = exports.setSystemCache = exports.clearSystemCache = exports.flushCaches = exports.getCache = void 0;
7
7
  const keyv_1 = __importDefault(require("keyv"));
8
8
  const env_1 = __importDefault(require("./env"));
9
9
  const logger_1 = __importDefault(require("./logger"));
@@ -11,40 +11,67 @@ const compress_1 = require("./utils/compress");
11
11
  const get_config_from_env_1 = require("./utils/get-config-from-env");
12
12
  const get_milliseconds_1 = require("./utils/get-milliseconds");
13
13
  const validate_env_1 = require("./utils/validate-env");
14
+ const messenger_1 = require("./messenger");
15
+ const utils_1 = require("@directus/shared/utils");
14
16
  let cache = null;
15
17
  let systemCache = null;
18
+ let localSchemaCache = null;
19
+ let sharedSchemaCache = null;
16
20
  let lockCache = null;
21
+ let messengerSubscribed = false;
22
+ const messenger = (0, messenger_1.getMessenger)();
23
+ if (env_1.default['MESSENGER_STORE'] === 'redis' &&
24
+ env_1.default['CACHE_STORE'] === 'memory' &&
25
+ env_1.default['CACHE_AUTO_PURGE'] &&
26
+ !messengerSubscribed) {
27
+ messengerSubscribed = true;
28
+ messenger.subscribe('schemaChanged', async (opts) => {
29
+ if (cache && opts?.['autoPurgeCache'] !== false) {
30
+ await cache.clear();
31
+ }
32
+ });
33
+ }
17
34
  function getCache() {
18
- if (env_1.default.CACHE_ENABLED === true && cache === null) {
35
+ if (env_1.default['CACHE_ENABLED'] === true && cache === null) {
19
36
  (0, validate_env_1.validateEnv)(['CACHE_NAMESPACE', 'CACHE_TTL', 'CACHE_STORE']);
20
- cache = getKeyvInstance((0, get_milliseconds_1.getMilliseconds)(env_1.default.CACHE_TTL));
37
+ cache = getKeyvInstance(env_1.default['CACHE_STORE'], (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_TTL']));
21
38
  cache.on('error', (err) => logger_1.default.warn(err, `[cache] ${err}`));
22
39
  }
23
40
  if (systemCache === null) {
24
- systemCache = getKeyvInstance((0, get_milliseconds_1.getMilliseconds)(env_1.default.CACHE_SYSTEM_TTL), '_system');
25
- systemCache.on('error', (err) => logger_1.default.warn(err, `[cache] ${err}`));
41
+ systemCache = getKeyvInstance(env_1.default['CACHE_STORE'], (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_SYSTEM_TTL']), '_system');
42
+ systemCache.on('error', (err) => logger_1.default.warn(err, `[system-cache] ${err}`));
43
+ }
44
+ if (sharedSchemaCache === null) {
45
+ sharedSchemaCache = getKeyvInstance(env_1.default['CACHE_STORE'], (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_SYSTEM_TTL']), '_schema_shared');
46
+ sharedSchemaCache.on('error', (err) => logger_1.default.warn(err, `[shared-schema-cache] ${err}`));
47
+ }
48
+ if (localSchemaCache === null) {
49
+ localSchemaCache = getKeyvInstance('memory', (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_SYSTEM_TTL']), '_schema');
50
+ localSchemaCache.on('error', (err) => logger_1.default.warn(err, `[schema-cache] ${err}`));
26
51
  }
27
52
  if (lockCache === null) {
28
- lockCache = getKeyvInstance(undefined, '_lock');
29
- lockCache.on('error', (err) => logger_1.default.warn(err, `[cache] ${err}`));
53
+ lockCache = getKeyvInstance(env_1.default['CACHE_STORE'], undefined, '_lock');
54
+ lockCache.on('error', (err) => logger_1.default.warn(err, `[lock-cache] ${err}`));
30
55
  }
31
- return { cache, systemCache, lockCache };
56
+ return { cache, systemCache, sharedSchemaCache, localSchemaCache, lockCache };
32
57
  }
33
58
  exports.getCache = getCache;
34
59
  async function flushCaches(forced) {
35
60
  const { cache } = getCache();
36
- await clearSystemCache(forced);
37
- await (cache === null || cache === void 0 ? void 0 : cache.clear());
61
+ await clearSystemCache({ forced });
62
+ await cache?.clear();
38
63
  }
39
64
  exports.flushCaches = flushCaches;
40
- async function clearSystemCache(forced) {
41
- const { systemCache, lockCache } = getCache();
65
+ async function clearSystemCache(opts) {
66
+ const { systemCache, localSchemaCache, lockCache } = getCache();
42
67
  // Flush system cache when forced or when system cache lock not set
43
- if (forced || !(await lockCache.get('system-cache-lock'))) {
68
+ if (opts?.forced || !(await lockCache.get('system-cache-lock'))) {
44
69
  await lockCache.set('system-cache-lock', true, 10000);
45
70
  await systemCache.clear();
46
71
  await lockCache.delete('system-cache-lock');
47
72
  }
73
+ await localSchemaCache.clear();
74
+ messenger.publish('schemaChanged', { autoPurgeCache: opts?.autoPurgeCache });
48
75
  }
49
76
  exports.clearSystemCache = clearSystemCache;
50
77
  async function setSystemCache(key, value, ttl) {
@@ -59,6 +86,25 @@ async function getSystemCache(key) {
59
86
  return await getCacheValue(systemCache, key);
60
87
  }
61
88
  exports.getSystemCache = getSystemCache;
89
+ async function setSchemaCache(schema) {
90
+ const { localSchemaCache, sharedSchemaCache } = getCache();
91
+ const schemaHash = await (0, utils_1.getSimpleHash)(JSON.stringify(schema));
92
+ await sharedSchemaCache.set('hash', schemaHash);
93
+ await localSchemaCache.set('schema', schema);
94
+ await localSchemaCache.set('hash', schemaHash);
95
+ }
96
+ exports.setSchemaCache = setSchemaCache;
97
+ async function getSchemaCache() {
98
+ const { localSchemaCache, sharedSchemaCache } = getCache();
99
+ const sharedSchemaHash = await sharedSchemaCache.get('hash');
100
+ if (!sharedSchemaHash)
101
+ return;
102
+ const localSchemaHash = await localSchemaCache.get('hash');
103
+ if (!localSchemaHash || localSchemaHash !== sharedSchemaHash)
104
+ return;
105
+ return await localSchemaCache.get('schema');
106
+ }
107
+ exports.getSchemaCache = getSchemaCache;
62
108
  async function setCacheValue(cache, key, value, ttl) {
63
109
  const compressed = await (0, compress_1.compress)(value);
64
110
  await cache.set(key, compressed, ttl);
@@ -72,8 +118,8 @@ async function getCacheValue(cache, key) {
72
118
  return decompressed;
73
119
  }
74
120
  exports.getCacheValue = getCacheValue;
75
- function getKeyvInstance(ttl, namespaceSuffix) {
76
- switch (env_1.default.CACHE_STORE) {
121
+ function getKeyvInstance(store, ttl, namespaceSuffix) {
122
+ switch (store) {
77
123
  case 'redis':
78
124
  return new keyv_1.default(getConfig('redis', ttl, namespaceSuffix));
79
125
  case 'memcache':
@@ -85,18 +131,20 @@ function getKeyvInstance(ttl, namespaceSuffix) {
85
131
  }
86
132
  function getConfig(store = 'memory', ttl, namespaceSuffix = '') {
87
133
  const config = {
88
- namespace: `${env_1.default.CACHE_NAMESPACE}${namespaceSuffix}`,
134
+ namespace: `${env_1.default['CACHE_NAMESPACE']}${namespaceSuffix}`,
89
135
  ttl,
90
136
  };
91
137
  if (store === 'redis') {
92
138
  const KeyvRedis = require('@keyv/redis');
93
- config.store = new KeyvRedis(env_1.default.CACHE_REDIS || (0, get_config_from_env_1.getConfigFromEnv)('CACHE_REDIS_'));
139
+ config.store = new KeyvRedis(env_1.default['CACHE_REDIS'] || (0, get_config_from_env_1.getConfigFromEnv)('CACHE_REDIS_'));
94
140
  }
95
141
  if (store === 'memcache') {
96
142
  const KeyvMemcache = require('keyv-memcache');
97
143
  // keyv-memcache uses memjs which only accepts a comma separated string instead of an array,
98
144
  // so we need to join array into a string when applicable. See #7986
99
- const cacheMemcache = Array.isArray(env_1.default.CACHE_MEMCACHE) ? env_1.default.CACHE_MEMCACHE.join(',') : env_1.default.CACHE_MEMCACHE;
145
+ const cacheMemcache = Array.isArray(env_1.default['CACHE_MEMCACHE'])
146
+ ? env_1.default['CACHE_MEMCACHE'].join(',')
147
+ : env_1.default['CACHE_MEMCACHE'];
100
148
  config.store = new KeyvMemcache(cacheMemcache);
101
149
  }
102
150
  return config;
@@ -26,13 +26,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ const database_1 = __importStar(require("../../../database"));
29
30
  const run_1 = __importDefault(require("../../../database/migrations/run"));
30
31
  const run_2 = __importDefault(require("../../../database/seeds/run"));
31
32
  const env_1 = __importDefault(require("../../../env"));
32
33
  const logger_1 = __importDefault(require("../../../logger"));
33
- const get_schema_1 = require("../../../utils/get-schema");
34
34
  const services_1 = require("../../../services");
35
- const database_1 = __importStar(require("../../../database"));
35
+ const get_schema_1 = require("../../../utils/get-schema");
36
36
  const defaults_1 = require("../../utils/defaults");
37
37
  async function bootstrap({ skipAdminInit }) {
38
38
  logger_1.default.info('Initializing bootstrap...');
@@ -50,9 +50,9 @@ async function bootstrap({ skipAdminInit }) {
50
50
  else {
51
51
  logger_1.default.info('Skipping creation of default Admin user and role...');
52
52
  }
53
- if (env_1.default.PROJECT_NAME && typeof env_1.default.PROJECT_NAME === 'string' && env_1.default.PROJECT_NAME.length > 0) {
53
+ if (env_1.default['PROJECT_NAME'] && typeof env_1.default['PROJECT_NAME'] === 'string' && env_1.default['PROJECT_NAME'].length > 0) {
54
54
  const settingsService = new services_1.SettingsService({ schema });
55
- await settingsService.upsertSingleton({ project_name: env_1.default.PROJECT_NAME });
55
+ await settingsService.upsertSingleton({ project_name: env_1.default['PROJECT_NAME'] });
56
56
  }
57
57
  }
58
58
  else {
@@ -75,6 +75,7 @@ async function waitForDatabase(database) {
75
75
  }
76
76
  // This will throw and exit the process if the database is not available
77
77
  await (0, database_1.validateDatabaseConnection)(database);
78
+ return database;
78
79
  }
79
80
  async function createDefaultAdmin(schema) {
80
81
  const { nanoid } = await import('nanoid');
@@ -83,12 +84,12 @@ async function createDefaultAdmin(schema) {
83
84
  const role = await rolesService.createOne(defaults_1.defaultAdminRole);
84
85
  logger_1.default.info('Adding first admin user...');
85
86
  const usersService = new services_1.UsersService({ schema });
86
- let adminEmail = env_1.default.ADMIN_EMAIL;
87
+ let adminEmail = env_1.default['ADMIN_EMAIL'];
87
88
  if (!adminEmail) {
88
89
  logger_1.default.info('No admin email provided. Defaulting to "admin@example.com"');
89
90
  adminEmail = 'admin@example.com';
90
91
  }
91
- let adminPassword = env_1.default.ADMIN_PASSWORD;
92
+ let adminPassword = env_1.default['ADMIN_PASSWORD'];
92
93
  if (!adminPassword) {
93
94
  adminPassword = nanoid(12);
94
95
  logger_1.default.info(`No admin password provided. Defaulting to "${adminPassword}"`);
@@ -6,17 +6,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const chalk_1 = __importDefault(require("chalk"));
7
7
  const execa_1 = __importDefault(require("execa"));
8
8
  const inquirer_1 = __importDefault(require("inquirer"));
9
+ const joi_1 = __importDefault(require("joi"));
9
10
  const ora_1 = __importDefault(require("ora"));
10
11
  const uuid_1 = require("uuid");
11
- const joi_1 = __importDefault(require("joi"));
12
12
  const run_1 = __importDefault(require("../../../database/migrations/run"));
13
13
  const run_2 = __importDefault(require("../../../database/seeds/run"));
14
+ const generate_hash_1 = require("../../../utils/generate-hash");
14
15
  const create_db_connection_1 = __importDefault(require("../../utils/create-db-connection"));
15
16
  const create_env_1 = __importDefault(require("../../utils/create-env"));
17
+ const defaults_1 = require("../../utils/defaults");
16
18
  const drivers_1 = require("../../utils/drivers");
17
19
  const questions_1 = require("./questions");
18
- const generate_hash_1 = require("../../../utils/generate-hash");
19
- const defaults_1 = require("../../utils/defaults");
20
20
  async function init() {
21
21
  const rootPath = process.cwd();
22
22
  const { client } = await inquirer_1.default.prompt([
@@ -41,7 +41,6 @@ const apply_snapshot_1 = require("../../../utils/apply-snapshot");
41
41
  const get_snapshot_1 = require("../../../utils/get-snapshot");
42
42
  const get_snapshot_diff_1 = require("../../../utils/get-snapshot-diff");
43
43
  async function apply(snapshotPath, options) {
44
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
45
44
  const filename = path_1.default.resolve(process.cwd(), snapshotPath);
46
45
  const database = (0, database_1.default)();
47
46
  await (0, database_1.validateDatabaseConnection)(database);
@@ -68,14 +67,14 @@ async function apply(snapshotPath, options) {
68
67
  database.destroy();
69
68
  process.exit(0);
70
69
  }
71
- const dryRun = (options === null || options === void 0 ? void 0 : options.dryRun) === true;
72
- const promptForChanges = !dryRun && (options === null || options === void 0 ? void 0 : options.yes) !== true;
70
+ const dryRun = options?.dryRun === true;
71
+ const promptForChanges = !dryRun && options?.yes !== true;
73
72
  if (dryRun || promptForChanges) {
74
73
  let message = '';
75
74
  if (snapshotDiff.collections.length > 0) {
76
75
  message += chalk_1.default.black.underline.bold('Collections:');
77
76
  for (const { collection, diff } of snapshotDiff.collections) {
78
- if (((_a = diff[0]) === null || _a === void 0 ? void 0 : _a.kind) === types_1.DiffKind.EDIT) {
77
+ if (diff[0]?.kind === types_1.DiffKind.EDIT) {
79
78
  message += `\n - ${chalk_1.default.blue('Update')} ${collection}`;
80
79
  for (const change of diff) {
81
80
  if (change.kind === types_1.DiffKind.EDIT) {
@@ -84,13 +83,13 @@ async function apply(snapshotPath, options) {
84
83
  }
85
84
  }
86
85
  }
87
- else if (((_b = diff[0]) === null || _b === void 0 ? void 0 : _b.kind) === types_1.DiffKind.DELETE) {
86
+ else if (diff[0]?.kind === types_1.DiffKind.DELETE) {
88
87
  message += `\n - ${chalk_1.default.red('Delete')} ${collection}`;
89
88
  }
90
- else if (((_c = diff[0]) === null || _c === void 0 ? void 0 : _c.kind) === types_1.DiffKind.NEW) {
89
+ else if (diff[0]?.kind === types_1.DiffKind.NEW) {
91
90
  message += `\n - ${chalk_1.default.green('Create')} ${collection}`;
92
91
  }
93
- else if (((_d = diff[0]) === null || _d === void 0 ? void 0 : _d.kind) === types_1.DiffKind.ARRAY) {
92
+ else if (diff[0]?.kind === types_1.DiffKind.ARRAY) {
94
93
  message += `\n - ${chalk_1.default.blue('Update')} ${collection}`;
95
94
  }
96
95
  }
@@ -98,7 +97,7 @@ async function apply(snapshotPath, options) {
98
97
  if (snapshotDiff.fields.length > 0) {
99
98
  message += '\n\n' + chalk_1.default.black.underline.bold('Fields:');
100
99
  for (const { collection, field, diff } of snapshotDiff.fields) {
101
- if (((_e = diff[0]) === null || _e === void 0 ? void 0 : _e.kind) === types_1.DiffKind.EDIT || (0, apply_diff_1.isNestedMetaUpdate)(diff[0])) {
100
+ if (diff[0]?.kind === types_1.DiffKind.EDIT || (0, apply_diff_1.isNestedMetaUpdate)(diff[0])) {
102
101
  message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
103
102
  for (const change of diff) {
104
103
  const path = change.path.slice(1).join('.');
@@ -113,13 +112,13 @@ async function apply(snapshotPath, options) {
113
112
  }
114
113
  }
115
114
  }
116
- else if (((_f = diff[0]) === null || _f === void 0 ? void 0 : _f.kind) === types_1.DiffKind.DELETE) {
115
+ else if (diff[0]?.kind === types_1.DiffKind.DELETE) {
117
116
  message += `\n - ${chalk_1.default.red('Delete')} ${collection}.${field}`;
118
117
  }
119
- else if (((_g = diff[0]) === null || _g === void 0 ? void 0 : _g.kind) === types_1.DiffKind.NEW) {
118
+ else if (diff[0]?.kind === types_1.DiffKind.NEW) {
120
119
  message += `\n - ${chalk_1.default.green('Create')} ${collection}.${field}`;
121
120
  }
122
- else if (((_h = diff[0]) === null || _h === void 0 ? void 0 : _h.kind) === types_1.DiffKind.ARRAY) {
121
+ else if (diff[0]?.kind === types_1.DiffKind.ARRAY) {
123
122
  message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
124
123
  }
125
124
  }
@@ -127,7 +126,7 @@ async function apply(snapshotPath, options) {
127
126
  if (snapshotDiff.relations.length > 0) {
128
127
  message += '\n\n' + chalk_1.default.black.underline.bold('Relations:');
129
128
  for (const { collection, field, related_collection, diff } of snapshotDiff.relations) {
130
- if (((_j = diff[0]) === null || _j === void 0 ? void 0 : _j.kind) === types_1.DiffKind.EDIT) {
129
+ if (diff[0]?.kind === types_1.DiffKind.EDIT) {
131
130
  message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
132
131
  for (const change of diff) {
133
132
  if (change.kind === types_1.DiffKind.EDIT) {
@@ -136,13 +135,13 @@ async function apply(snapshotPath, options) {
136
135
  }
137
136
  }
138
137
  }
139
- else if (((_k = diff[0]) === null || _k === void 0 ? void 0 : _k.kind) === types_1.DiffKind.DELETE) {
138
+ else if (diff[0]?.kind === types_1.DiffKind.DELETE) {
140
139
  message += `\n - ${chalk_1.default.red('Delete')} ${collection}.${field}`;
141
140
  }
142
- else if (((_l = diff[0]) === null || _l === void 0 ? void 0 : _l.kind) === types_1.DiffKind.NEW) {
141
+ else if (diff[0]?.kind === types_1.DiffKind.NEW) {
143
142
  message += `\n - ${chalk_1.default.green('Create')} ${collection}.${field}`;
144
143
  }
145
- else if (((_m = diff[0]) === null || _m === void 0 ? void 0 : _m.kind) === types_1.DiffKind.ARRAY) {
144
+ else if (diff[0]?.kind === types_1.DiffKind.ARRAY) {
146
145
  message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
147
146
  }
148
147
  else {
@@ -16,7 +16,7 @@ async function snapshot(snapshotPath, options) {
16
16
  try {
17
17
  const snapshot = await (0, get_snapshot_1.getSnapshot)({ database });
18
18
  let snapshotString;
19
- if ((options === null || options === void 0 ? void 0 : options.format) === 'yaml') {
19
+ if (options?.format === 'yaml') {
20
20
  snapshotString = (0, js_yaml_1.dump)(snapshot);
21
21
  }
22
22
  else {
@@ -32,7 +32,7 @@ async function snapshot(snapshotPath, options) {
32
32
  catch {
33
33
  snapshotExists = false;
34
34
  }
35
- if (snapshotExists && (options === null || options === void 0 ? void 0 : options.yes) === false) {
35
+ if (snapshotExists && options?.yes === false) {
36
36
  const { overwrite } = await inquirer_1.default.prompt([
37
37
  {
38
38
  type: 'confirm',
@@ -1,5 +1,5 @@
1
1
  import { Knex } from 'knex';
2
- import { Driver } from '../../types';
2
+ import type { Driver } from '../../types';
3
3
  export type Credentials = {
4
4
  filename?: string;
5
5
  host?: string;
@@ -25,11 +25,12 @@ function createDBConnection(client, credentials) {
25
25
  };
26
26
  if (client === 'pg' || client === 'cockroachdb') {
27
27
  const { ssl } = credentials;
28
- connection['ssl'] = ssl;
28
+ connection.ssl = ssl;
29
29
  }
30
30
  if (client === 'mssql') {
31
31
  const { options__encrypt } = credentials;
32
- connection['options'] = {
32
+ connection = {
33
+ ...connection,
33
34
  encrypt: options__encrypt,
34
35
  };
35
36
  }
@@ -1,3 +1,3 @@
1
- import { Credentials } from '../create-db-connection';
2
- import { drivers } from '../drivers';
1
+ import type { Credentials } from '../create-db-connection';
2
+ import type { drivers } from '../drivers';
3
3
  export default function createEnv(client: keyof typeof drivers, credentials: Credentials, directory: string): Promise<void>;
@@ -27,7 +27,7 @@ async function createEnv(client, credentials, directory) {
27
27
  },
28
28
  };
29
29
  for (const [key, value] of Object.entries(credentials)) {
30
- config.database[`DB_${key.toUpperCase()}`] = value;
30
+ config['database'][`DB_${key.toUpperCase()}`] = value;
31
31
  }
32
32
  const configAsStrings = {};
33
33
  for (const [key, value] of Object.entries(config)) {
@@ -1,3 +1,3 @@
1
- import { Driver } from '../../types';
1
+ import type { Driver } from '../../types';
2
2
  export declare const drivers: Record<Driver, string>;
3
3
  export declare function getDriverForClient(client: string): Driver | null;
@@ -1,5 +1,5 @@
1
- import { CookieOptions } from 'express';
2
- import { TransformationParams } from './types';
1
+ import type { CookieOptions } from 'express';
2
+ import type { TransformationParams } from './types';
3
3
  export declare const SYSTEM_ASSET_ALLOW_LIST: TransformationParams[];
4
4
  export declare const ASSET_TRANSFORM_QUERY_KEYS: string[];
5
5
  export declare const FILTER_VARIABLES: string[];
@@ -10,3 +10,4 @@ export declare const GENERATE_SPECIAL: string[];
10
10
  export declare const UUID_REGEX = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
11
11
  export declare const COOKIE_OPTIONS: CookieOptions;
12
12
  export declare const OAS_REQUIRED_SCHEMAS: string[];
13
+ export declare const REDACT_TEXT = "--redact--";
package/dist/constants.js CHANGED
@@ -2,9 +2,8 @@
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
- var _a;
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.OAS_REQUIRED_SCHEMAS = exports.COOKIE_OPTIONS = exports.UUID_REGEX = exports.GENERATE_SPECIAL = exports.COLUMN_TRANSFORMS = exports.DEFAULT_AUTH_PROVIDER = exports.ALIAS_TYPES = exports.FILTER_VARIABLES = exports.ASSET_TRANSFORM_QUERY_KEYS = exports.SYSTEM_ASSET_ALLOW_LIST = void 0;
6
+ exports.REDACT_TEXT = exports.OAS_REQUIRED_SCHEMAS = exports.COOKIE_OPTIONS = exports.UUID_REGEX = exports.GENERATE_SPECIAL = exports.COLUMN_TRANSFORMS = exports.DEFAULT_AUTH_PROVIDER = exports.ALIAS_TYPES = exports.FILTER_VARIABLES = exports.ASSET_TRANSFORM_QUERY_KEYS = exports.SYSTEM_ASSET_ALLOW_LIST = void 0;
8
7
  const env_1 = __importDefault(require("./env"));
9
8
  const get_milliseconds_1 = require("./utils/get-milliseconds");
10
9
  exports.SYSTEM_ASSET_ALLOW_LIST = [
@@ -51,9 +50,10 @@ exports.GENERATE_SPECIAL = ['uuid', 'date-created', 'role-created', 'user-create
51
50
  exports.UUID_REGEX = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
52
51
  exports.COOKIE_OPTIONS = {
53
52
  httpOnly: true,
54
- domain: env_1.default.REFRESH_TOKEN_COOKIE_DOMAIN,
55
- maxAge: (0, get_milliseconds_1.getMilliseconds)(env_1.default.REFRESH_TOKEN_TTL),
56
- secure: (_a = env_1.default.REFRESH_TOKEN_COOKIE_SECURE) !== null && _a !== void 0 ? _a : false,
57
- sameSite: env_1.default.REFRESH_TOKEN_COOKIE_SAME_SITE || 'strict',
53
+ domain: env_1.default['REFRESH_TOKEN_COOKIE_DOMAIN'],
54
+ maxAge: (0, get_milliseconds_1.getMilliseconds)(env_1.default['REFRESH_TOKEN_TTL']),
55
+ secure: env_1.default['REFRESH_TOKEN_COOKIE_SECURE'] ?? false,
56
+ sameSite: env_1.default['REFRESH_TOKEN_COOKIE_SAME_SITE'] || 'strict',
58
57
  };
59
- exports.OAS_REQUIRED_SCHEMAS = ['Query', 'x-metadata'];
58
+ exports.OAS_REQUIRED_SCHEMAS = ['Diff', 'Schema', 'Query', 'x-metadata'];
59
+ exports.REDACT_TEXT = '--redact--';
@@ -35,7 +35,7 @@ const readHandler = (0, async_handler_1.default)(async (req, res, next) => {
35
35
  result = await service.readByQuery(req.sanitizedQuery);
36
36
  }
37
37
  const meta = await metaService.getMetaForQuery('directus_activity', req.sanitizedQuery);
38
- res.locals.payload = {
38
+ res.locals['payload'] = {
39
39
  data: result,
40
40
  meta,
41
41
  };
@@ -48,8 +48,8 @@ router.get('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
48
48
  accountability: req.accountability,
49
49
  schema: req.schema,
50
50
  });
51
- const record = await service.readOne(req.params.pk, req.sanitizedQuery);
52
- res.locals.payload = {
51
+ const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
52
+ res.locals['payload'] = {
53
53
  data: record || null,
54
54
  };
55
55
  return next();
@@ -60,7 +60,6 @@ const createCommentSchema = joi_1.default.object({
60
60
  item: [joi_1.default.number().required(), joi_1.default.string().required()],
61
61
  });
62
62
  router.post('/comment', (0, async_handler_1.default)(async (req, res, next) => {
63
- var _a;
64
63
  const service = new services_1.ActivityService({
65
64
  accountability: req.accountability,
66
65
  schema: req.schema,
@@ -72,14 +71,14 @@ router.post('/comment', (0, async_handler_1.default)(async (req, res, next) => {
72
71
  const primaryKey = await service.createOne({
73
72
  ...req.body,
74
73
  action: types_1.Action.COMMENT,
75
- user: (_a = req.accountability) === null || _a === void 0 ? void 0 : _a.user,
74
+ user: req.accountability?.user,
76
75
  ip: (0, get_ip_from_req_1.getIPFromReq)(req),
77
76
  user_agent: req.get('user-agent'),
78
77
  origin: req.get('origin'),
79
78
  });
80
79
  try {
81
80
  const record = await service.readOne(primaryKey, req.sanitizedQuery);
82
- res.locals.payload = {
81
+ res.locals['payload'] = {
83
82
  data: record || null,
84
83
  };
85
84
  }
@@ -103,10 +102,10 @@ router.patch('/comment/:pk', (0, async_handler_1.default)(async (req, res, next)
103
102
  if (error) {
104
103
  throw new exceptions_1.InvalidPayloadException(error.message);
105
104
  }
106
- const primaryKey = await service.updateOne(req.params.pk, req.body);
105
+ const primaryKey = await service.updateOne(req.params['pk'], req.body);
107
106
  try {
108
107
  const record = await service.readOne(primaryKey, req.sanitizedQuery);
109
- res.locals.payload = {
108
+ res.locals['payload'] = {
110
109
  data: record || null,
111
110
  };
112
111
  }
@@ -126,11 +125,11 @@ router.delete('/comment/:pk', (0, async_handler_1.default)(async (req, res, next
126
125
  const adminService = new services_1.ActivityService({
127
126
  schema: req.schema,
128
127
  });
129
- const item = await adminService.readOne(req.params.pk, { fields: ['action'] });
130
- if (!item || item.action !== 'comment') {
128
+ const item = await adminService.readOne(req.params['pk'], { fields: ['action'] });
129
+ if (!item || item['action'] !== 'comment') {
131
130
  throw new exceptions_1.ForbiddenException();
132
131
  }
133
- await service.deleteOne(req.params.pk);
132
+ await service.deleteOne(req.params['pk']);
134
133
  return next();
135
134
  }), respond_1.respond);
136
135
  exports.default = router;
@@ -52,8 +52,8 @@ router.get('/:pk/:filename?',
52
52
  throw new exceptions_1.InvalidQueryException(`"transforms" Parameter needs to be a JSON array of allowed transformations.`);
53
53
  }
54
54
  // Check against ASSETS_TRANSFORM_MAX_OPERATIONS
55
- if (transforms.length > Number(env_1.default.ASSETS_TRANSFORM_MAX_OPERATIONS)) {
56
- throw new exceptions_1.InvalidQueryException(`"transforms" Parameter is only allowed ${env_1.default.ASSETS_TRANSFORM_MAX_OPERATIONS} transformations.`);
55
+ if (transforms.length > Number(env_1.default['ASSETS_TRANSFORM_MAX_OPERATIONS'])) {
56
+ throw new exceptions_1.InvalidQueryException(`"transforms" Parameter is only allowed ${env_1.default['ASSETS_TRANSFORM_MAX_OPERATIONS']} transformations.`);
57
57
  }
58
58
  // Check the transformations are valid
59
59
  transforms.forEach((transform) => {
@@ -62,33 +62,33 @@ router.get('/:pk/:filename?',
62
62
  throw new exceptions_1.InvalidQueryException(`"transforms" Parameter does not allow "${name}" as a transformation.`);
63
63
  }
64
64
  });
65
- transformation.transforms = transforms;
65
+ transformation['transforms'] = transforms;
66
66
  }
67
- const systemKeys = constants_1.SYSTEM_ASSET_ALLOW_LIST.map((transformation) => transformation.key);
67
+ const systemKeys = constants_1.SYSTEM_ASSET_ALLOW_LIST.map((transformation) => transformation['key']);
68
68
  const allKeys = [
69
69
  ...systemKeys,
70
- ...(assetSettings.storage_asset_presets || []).map((transformation) => transformation.key),
70
+ ...(assetSettings.storage_asset_presets || []).map((transformation) => transformation['key']),
71
71
  ];
72
72
  // For use in the next request handler
73
- res.locals.shortcuts = [...constants_1.SYSTEM_ASSET_ALLOW_LIST, ...(assetSettings.storage_asset_presets || [])];
74
- res.locals.transformation = transformation;
73
+ res.locals['shortcuts'] = [...constants_1.SYSTEM_ASSET_ALLOW_LIST, ...(assetSettings.storage_asset_presets || [])];
74
+ res.locals['transformation'] = transformation;
75
75
  if (Object.keys(transformation).length === 0 ||
76
- ('transforms' in transformation && transformation.transforms.length === 0)) {
76
+ ('transforms' in transformation && transformation['transforms'].length === 0)) {
77
77
  return next();
78
78
  }
79
79
  if (assetSettings.storage_asset_transform === 'all') {
80
- if (transformation.key && allKeys.includes(transformation.key) === false) {
81
- throw new exceptions_1.InvalidQueryException(`Key "${transformation.key}" isn't configured.`);
80
+ if (transformation['key'] && allKeys.includes(transformation['key']) === false) {
81
+ throw new exceptions_1.InvalidQueryException(`Key "${transformation['key']}" isn't configured.`);
82
82
  }
83
83
  return next();
84
84
  }
85
85
  else if (assetSettings.storage_asset_transform === 'presets') {
86
- if (allKeys.includes(transformation.key))
86
+ if (allKeys.includes(transformation['key']))
87
87
  return next();
88
88
  throw new exceptions_1.InvalidQueryException(`Only configured presets can be used in asset generation.`);
89
89
  }
90
90
  else {
91
- if (transformation.key && systemKeys.includes(transformation.key))
91
+ if (transformation['key'] && systemKeys.includes(transformation['key']))
92
92
  return next();
93
93
  throw new exceptions_1.InvalidQueryException(`Dynamic asset generation has been disabled for this project.`);
94
94
  }
@@ -103,31 +103,36 @@ router.get('/:pk/:filename?',
103
103
  }),
104
104
  // Return file
105
105
  (0, async_handler_1.default)(async (req, res) => {
106
- var _a, _b;
107
- const id = (_a = req.params.pk) === null || _a === void 0 ? void 0 : _a.substring(0, 36);
106
+ const id = req.params['pk']?.substring(0, 36);
108
107
  const service = new services_1.AssetsService({
109
108
  accountability: req.accountability,
110
109
  schema: req.schema,
111
110
  });
112
- const transformation = res.locals.transformation.key
113
- ? res.locals.shortcuts.find((transformation) => transformation.key === res.locals.transformation.key)
114
- : res.locals.transformation;
111
+ const transformation = res.locals['transformation'].key
112
+ ? res.locals['shortcuts'].find((transformation) => transformation['key'] === res.locals['transformation'].key)
113
+ : res.locals['transformation'];
115
114
  let range = undefined;
116
115
  if (req.headers.range) {
117
116
  const rangeParts = /bytes=([0-9]*)-([0-9]*)/.exec(req.headers.range);
118
- range = {
119
- start: (rangeParts === null || rangeParts === void 0 ? void 0 : rangeParts[1]) ? Number(rangeParts[1]) : undefined,
120
- end: (rangeParts === null || rangeParts === void 0 ? void 0 : rangeParts[2]) ? Number(rangeParts[2]) : undefined,
121
- };
122
- if (Number.isNaN(range.start) || Number.isNaN(range.end)) {
123
- throw new exceptions_1.RangeNotSatisfiableException(range);
117
+ if (rangeParts && rangeParts.length > 1) {
118
+ range = {};
119
+ if (rangeParts[1]) {
120
+ range.start = Number(rangeParts[1]);
121
+ if (Number.isNaN(range.start))
122
+ throw new exceptions_1.RangeNotSatisfiableException(range);
123
+ }
124
+ if (rangeParts[2]) {
125
+ range.end = Number(rangeParts[2]);
126
+ if (Number.isNaN(range.end))
127
+ throw new exceptions_1.RangeNotSatisfiableException(range);
128
+ }
124
129
  }
125
130
  }
126
131
  const { stream, file, stat } = await service.getAsset(id, transformation, range);
127
- res.attachment((_b = req.params.filename) !== null && _b !== void 0 ? _b : file.filename_download);
132
+ res.attachment(req.params['filename'] ?? file.filename_download);
128
133
  res.setHeader('Content-Type', file.type);
129
134
  res.setHeader('Accept-Ranges', 'bytes');
130
- res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, (0, get_milliseconds_1.getMilliseconds)(env_1.default.ASSETS_CACHE_TTL), false, true));
135
+ res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, (0, get_milliseconds_1.getMilliseconds)(env_1.default['ASSETS_CACHE_TTL']), false, true));
131
136
  const unixTime = Date.parse(file.modified_on);
132
137
  if (!Number.isNaN(unixTime)) {
133
138
  const lastModifiedDate = new Date(unixTime);
@@ -176,5 +181,6 @@ router.get('/:pk/:filename?',
176
181
  });
177
182
  }
178
183
  });
184
+ return undefined;
179
185
  }));
180
186
  exports.default = router;