@directus/api 15.0.0 → 16.0.0

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 (169) hide show
  1. package/dist/app.js +6 -4
  2. package/dist/auth/drivers/ldap.js +7 -4
  3. package/dist/auth/drivers/local.js +3 -2
  4. package/dist/auth/drivers/oauth2.js +9 -2
  5. package/dist/auth/drivers/openid.js +9 -2
  6. package/dist/auth/drivers/saml.js +6 -4
  7. package/dist/auth.js +7 -4
  8. package/dist/bus/index.d.ts +1 -0
  9. package/dist/bus/index.js +1 -0
  10. package/dist/bus/lib/use-bus.d.ts +9 -0
  11. package/dist/bus/lib/use-bus.js +21 -0
  12. package/dist/cache.js +9 -9
  13. package/dist/cli/commands/bootstrap/index.js +6 -2
  14. package/dist/cli/commands/count/index.js +2 -1
  15. package/dist/cli/commands/database/install.js +2 -1
  16. package/dist/cli/commands/database/migrate.js +2 -1
  17. package/dist/cli/commands/roles/create.js +2 -1
  18. package/dist/cli/commands/schema/apply.js +2 -1
  19. package/dist/cli/commands/schema/snapshot.js +6 -5
  20. package/dist/cli/commands/users/create.js +4 -3
  21. package/dist/cli/commands/users/passwd.js +5 -4
  22. package/dist/cli/load-extensions.js +4 -2
  23. package/dist/cli/utils/create-env/env-stub.liquid +1 -1
  24. package/dist/constants.d.ts +1 -1
  25. package/dist/constants.js +4 -1
  26. package/dist/controllers/assets.js +5 -3
  27. package/dist/controllers/auth.js +5 -4
  28. package/dist/controllers/extensions.js +18 -6
  29. package/dist/controllers/files.js +3 -3
  30. package/dist/controllers/schema.js +3 -2
  31. package/dist/controllers/shares.js +3 -3
  32. package/dist/database/helpers/index.d.ts +1 -1
  33. package/dist/database/index.js +9 -2
  34. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +3 -1
  35. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +3 -1
  36. package/dist/database/migrations/20210802A-replace-groups.js +2 -1
  37. package/dist/database/migrations/20230721A-require-shares-fields.js +2 -1
  38. package/dist/database/migrations/20231215A-add-focalpoints.d.ts +3 -0
  39. package/dist/database/migrations/20231215A-add-focalpoints.js +12 -0
  40. package/dist/database/migrations/run.js +2 -1
  41. package/dist/database/run-ast.js +5 -2
  42. package/dist/database/system-data/app-access-permissions/app-access-permissions.yaml +0 -7
  43. package/dist/database/system-data/fields/files.yaml +16 -0
  44. package/dist/emitter.js +3 -1
  45. package/dist/extensions/lib/get-extensions-path.d.ts +1 -1
  46. package/dist/extensions/lib/get-extensions-path.js +2 -1
  47. package/dist/extensions/lib/get-extensions.d.ts +1 -1
  48. package/dist/extensions/lib/get-extensions.js +32 -8
  49. package/dist/extensions/lib/get-shared-deps-mapping.js +6 -4
  50. package/dist/extensions/lib/sandbox/register/call-reference.js +4 -2
  51. package/dist/extensions/lib/sandbox/sdk/generators/log.js +2 -1
  52. package/dist/extensions/lib/sync-extensions.js +6 -4
  53. package/dist/extensions/manager.js +43 -19
  54. package/dist/flows.js +13 -7
  55. package/dist/logger.d.ts +7 -7
  56. package/dist/logger.js +116 -92
  57. package/dist/mailer.js +4 -2
  58. package/dist/middleware/cache.js +4 -2
  59. package/dist/middleware/check-ip.js +25 -6
  60. package/dist/middleware/cors.js +2 -1
  61. package/dist/middleware/error-handler.js +5 -5
  62. package/dist/middleware/rate-limiter-global.js +4 -2
  63. package/dist/middleware/rate-limiter-ip.js +2 -1
  64. package/dist/middleware/respond.js +4 -2
  65. package/dist/operations/log/index.js +2 -1
  66. package/dist/rate-limiter.d.ts +2 -1
  67. package/dist/rate-limiter.js +5 -2
  68. package/dist/redis/index.d.ts +3 -2
  69. package/dist/redis/index.js +3 -2
  70. package/dist/redis/{create-redis.js → lib/create-redis.js} +2 -2
  71. package/dist/redis/utils/redis-config-available.d.ts +4 -0
  72. package/dist/redis/utils/redis-config-available.js +8 -0
  73. package/dist/request/request-interceptor.js +7 -5
  74. package/dist/request/response-interceptor.js +2 -2
  75. package/dist/request/validate-ip.d.ts +1 -1
  76. package/dist/request/validate-ip.js +23 -7
  77. package/dist/server.js +11 -7
  78. package/dist/services/activity.js +5 -4
  79. package/dist/services/assets.d.ts +2 -0
  80. package/dist/services/assets.js +9 -4
  81. package/dist/services/authentication.js +17 -9
  82. package/dist/services/collections.js +5 -4
  83. package/dist/services/extensions.d.ts +15 -9
  84. package/dist/services/extensions.js +74 -39
  85. package/dist/services/fields.js +9 -4
  86. package/dist/services/files.d.ts +2 -2
  87. package/dist/services/files.js +22 -14
  88. package/dist/services/graphql/index.js +46 -3
  89. package/dist/services/graphql/subscription.js +2 -2
  90. package/dist/services/graphql/types/bigint.js +16 -5
  91. package/dist/services/graphql/utils/process-error.d.ts +4 -1
  92. package/dist/services/graphql/utils/process-error.js +10 -8
  93. package/dist/services/import-export/index.js +5 -3
  94. package/dist/services/items.js +12 -8
  95. package/dist/services/mail/index.js +4 -2
  96. package/dist/services/notifications.js +7 -3
  97. package/dist/services/relations.js +19 -10
  98. package/dist/services/server.js +5 -4
  99. package/dist/services/shares.js +3 -2
  100. package/dist/services/specifications.js +2 -1
  101. package/dist/services/users.js +20 -9
  102. package/dist/services/versions.js +6 -5
  103. package/dist/services/webhooks.d.ts +2 -2
  104. package/dist/services/webhooks.js +2 -2
  105. package/dist/services/websocket.d.ts +1 -1
  106. package/dist/services/websocket.js +4 -3
  107. package/dist/storage/register-drivers.js +2 -1
  108. package/dist/storage/register-locations.js +2 -1
  109. package/dist/synchronization.js +3 -1
  110. package/dist/telemetry/lib/get-report.js +1 -1
  111. package/dist/telemetry/lib/init-telemetry.js +2 -2
  112. package/dist/telemetry/lib/send-report.js +1 -1
  113. package/dist/telemetry/lib/track.js +2 -3
  114. package/dist/telemetry/utils/get-user-count.js +1 -1
  115. package/dist/types/assets.d.ts +2 -0
  116. package/dist/utils/apply-diff.js +2 -1
  117. package/dist/utils/apply-query.js +0 -11
  118. package/dist/utils/delete-from-require-cache.js +2 -1
  119. package/dist/utils/get-accountability-for-token.js +3 -2
  120. package/dist/utils/get-auth-providers.js +2 -1
  121. package/dist/utils/get-cache-headers.js +5 -2
  122. package/dist/utils/get-config-from-env.js +2 -1
  123. package/dist/utils/get-default-value.js +4 -3
  124. package/dist/utils/get-ip-from-req.js +4 -2
  125. package/dist/utils/get-permissions.js +5 -3
  126. package/dist/utils/get-schema.js +5 -2
  127. package/dist/utils/get-snapshot-diff.js +7 -9
  128. package/dist/utils/get-snapshot.js +4 -4
  129. package/dist/utils/ip-in-networks.d.ts +6 -0
  130. package/dist/utils/ip-in-networks.js +13 -0
  131. package/dist/utils/is-url-allowed.js +2 -1
  132. package/dist/utils/job-queue.d.ts +1 -0
  133. package/dist/utils/job-queue.js +3 -0
  134. package/dist/utils/sanitize-query.js +7 -2
  135. package/dist/utils/sanitize-schema.d.ts +1 -1
  136. package/dist/utils/should-clear-cache.js +2 -1
  137. package/dist/utils/should-skip-cache.js +2 -1
  138. package/dist/utils/transformations.js +95 -12
  139. package/dist/utils/validate-env.js +4 -2
  140. package/dist/utils/validate-query.js +7 -3
  141. package/dist/utils/validate-storage.js +4 -2
  142. package/dist/webhooks.js +4 -3
  143. package/dist/websocket/controllers/base.js +12 -6
  144. package/dist/websocket/controllers/graphql.js +4 -2
  145. package/dist/websocket/controllers/hooks.js +3 -2
  146. package/dist/websocket/controllers/index.js +4 -2
  147. package/dist/websocket/controllers/rest.js +4 -2
  148. package/dist/websocket/errors.js +2 -1
  149. package/dist/websocket/handlers/heartbeat.js +4 -3
  150. package/dist/websocket/handlers/subscribe.d.ts +2 -2
  151. package/dist/websocket/handlers/subscribe.js +5 -4
  152. package/package.json +57 -57
  153. package/dist/__utils__/items-utils.d.ts +0 -2
  154. package/dist/__utils__/items-utils.js +0 -31
  155. package/dist/__utils__/mock-env.d.ts +0 -18
  156. package/dist/__utils__/mock-env.js +0 -41
  157. package/dist/__utils__/schemas.d.ts +0 -13
  158. package/dist/__utils__/schemas.js +0 -301
  159. package/dist/__utils__/snapshots.d.ts +0 -5
  160. package/dist/__utils__/snapshots.js +0 -903
  161. package/dist/env.d.ts +0 -14
  162. package/dist/env.js +0 -511
  163. package/dist/messenger.d.ts +0 -24
  164. package/dist/messenger.js +0 -64
  165. package/dist/utils/to-boolean.d.ts +0 -4
  166. package/dist/utils/to-boolean.js +0 -6
  167. /package/dist/redis/{create-redis.d.ts → lib/create-redis.d.ts} +0 -0
  168. /package/dist/redis/{use-redis.d.ts → lib/use-redis.d.ts} +0 -0
  169. /package/dist/redis/{use-redis.js → lib/use-redis.js} +0 -0
@@ -1,31 +0,0 @@
1
- // dynamically adds fields to the sql strings as the schema grows
2
- export const sqlFieldFormatter = (schema, table) => {
3
- const fields = [];
4
- // Exclude alias fields, unable to selected in DB
5
- for (const field of Object.keys(schema['collections'][table].fields)) {
6
- if (schema['collections'][table].fields[field].type !== 'alias') {
7
- fields.push(field);
8
- }
9
- }
10
- let sql = '';
11
- for (const field of fields.slice(0, fields.length - 1)) {
12
- sql += `"${table}"."${field}", `;
13
- }
14
- sql += `"${table}"."${fields[fields.length - 1]}"`;
15
- return sql;
16
- };
17
- export const sqlFieldList = (schema, table) => {
18
- const fields = [];
19
- // Exclude alias fields, unable to selected in DB
20
- for (const field of Object.keys(schema['collections'][table].fields)) {
21
- if (schema['collections'][table].fields[field].type !== 'alias') {
22
- fields.push(field);
23
- }
24
- }
25
- let sql = '';
26
- for (const field of fields.slice(0, fields.length - 1)) {
27
- sql += `"${field}", `;
28
- }
29
- sql += `"${fields[fields.length - 1]}"`;
30
- return sql;
31
- };
@@ -1,18 +0,0 @@
1
- export declare function setEnv(newEnv: Record<string, string>): void;
2
- /** Static env mock - to be used inside `vi.mock` */
3
- export declare function mockEnv(options?: {
4
- env?: Record<string, string>;
5
- withDefaults?: boolean;
6
- }): Promise<{
7
- readonly default: Record<string, any>;
8
- }>;
9
- /** Dynamic env mock */
10
- export declare function doMockEnv(options?: {
11
- env?: Record<string, string>;
12
- withDefaults?: boolean;
13
- }): {
14
- env: {
15
- [x: string]: string;
16
- };
17
- setEnv: (newEnv: Record<string, string>) => void;
18
- };
@@ -1,41 +0,0 @@
1
- import { afterEach, vi } from 'vitest';
2
- let env = {};
3
- export function setEnv(newEnv) {
4
- env = { ...env, ...newEnv };
5
- }
6
- /** Static env mock - to be used inside `vi.mock` */
7
- export async function mockEnv(options) {
8
- const initialEnv = options?.env ?? {};
9
- const withDefaults = options && 'withDefaults' in options ? options.withDefaults : true;
10
- env = { ...initialEnv };
11
- afterEach(() => {
12
- env = { ...initialEnv };
13
- });
14
- const { defaults, processValues } = await vi.importActual('../env.js');
15
- return {
16
- get default() {
17
- return processValues({ ...(withDefaults && defaults), ...env });
18
- },
19
- };
20
- }
21
- /** Dynamic env mock */
22
- export function doMockEnv(options) {
23
- const initialEnv = options?.env ?? {};
24
- const withDefaults = options && 'withDefaults' in options ? options.withDefaults : true;
25
- let env = { ...initialEnv };
26
- vi.doMock('../env.js', async () => {
27
- const { defaults, processValues } = await vi.importActual('../env.js');
28
- return {
29
- get default() {
30
- return processValues({ ...(withDefaults && defaults), ...env });
31
- },
32
- };
33
- });
34
- afterEach(() => {
35
- env = { ...initialEnv };
36
- });
37
- return { env, setEnv };
38
- function setEnv(newEnv) {
39
- env = { ...env, ...newEnv };
40
- }
41
- }
@@ -1,13 +0,0 @@
1
- import type { CollectionsOverview, Relation } from '@directus/types';
2
- export declare const systemSchema: {
3
- collections: CollectionsOverview;
4
- relations: Relation[];
5
- };
6
- export declare const userSchema: {
7
- collections: CollectionsOverview;
8
- relations: Relation[];
9
- };
10
- export declare const snapshotApplyTestSchema: {
11
- collections: CollectionsOverview;
12
- relations: Relation[];
13
- };
@@ -1,301 +0,0 @@
1
- export const systemSchema = {
2
- collections: {
3
- directus_users: {
4
- collection: 'directus_users',
5
- primary: 'id',
6
- singleton: false,
7
- note: '$t:directus_collection.directus_users',
8
- sortField: null,
9
- accountability: null,
10
- fields: {
11
- id: {
12
- field: 'id',
13
- defaultValue: null,
14
- nullable: false,
15
- generated: false,
16
- type: 'uuid',
17
- dbType: 'uuid',
18
- precision: null,
19
- scale: null,
20
- special: [],
21
- note: null,
22
- alias: false,
23
- validation: null,
24
- },
25
- name: {
26
- field: 'name',
27
- defaultValue: "A User's Name",
28
- nullable: false,
29
- generated: false,
30
- type: 'uuid',
31
- dbType: 'uuid',
32
- precision: null,
33
- scale: null,
34
- special: [],
35
- note: null,
36
- alias: false,
37
- validation: null,
38
- },
39
- items: {
40
- field: 'items',
41
- defaultValue: null,
42
- nullable: true,
43
- generated: false,
44
- type: 'alias',
45
- dbType: null,
46
- precision: null,
47
- scale: null,
48
- special: ['o2m'],
49
- note: null,
50
- alias: true,
51
- validation: null,
52
- },
53
- },
54
- },
55
- directus_files: {
56
- collection: 'directus_files',
57
- primary: 'id',
58
- singleton: false,
59
- note: '$t:directus_collection.directus_files',
60
- sortField: null,
61
- accountability: null,
62
- fields: {
63
- id: {
64
- field: 'id',
65
- defaultValue: null,
66
- nullable: false,
67
- generated: false,
68
- type: 'uuid',
69
- dbType: 'uuid',
70
- precision: null,
71
- scale: null,
72
- special: [],
73
- note: null,
74
- alias: false,
75
- validation: null,
76
- },
77
- title: {
78
- field: 'title',
79
- defaultValue: "A File's Title",
80
- nullable: false,
81
- generated: false,
82
- type: 'string',
83
- dbType: 'text',
84
- precision: null,
85
- scale: null,
86
- special: [],
87
- note: null,
88
- alias: false,
89
- validation: null,
90
- },
91
- uploaded_by: {
92
- field: 'uploaded_by',
93
- defaultValue: null,
94
- nullable: true,
95
- generated: false,
96
- type: 'uuid',
97
- dbType: 'uuid',
98
- precision: null,
99
- scale: null,
100
- special: [],
101
- note: null,
102
- alias: false,
103
- validation: null,
104
- },
105
- },
106
- },
107
- },
108
- relations: [
109
- {
110
- collection: 'directus_files',
111
- field: 'uploaded_by',
112
- related_collection: 'directus_users',
113
- schema: {
114
- table: 'directus_files',
115
- column: 'uploaded_by',
116
- foreign_key_table: 'directus_users',
117
- foreign_key_column: 'id',
118
- on_update: 'NO ACTION',
119
- on_delete: 'NO ACTION',
120
- constraint_name: null,
121
- },
122
- meta: {
123
- system: true,
124
- many_collection: 'directus_files',
125
- many_field: 'uploaded_by',
126
- one_collection: 'directus_users',
127
- one_field: 'items',
128
- one_allowed_collections: null,
129
- one_collection_field: null,
130
- one_deselect_action: 'nullify',
131
- junction_field: null,
132
- sort_field: null,
133
- },
134
- },
135
- ],
136
- };
137
- export const userSchema = {
138
- collections: {
139
- authors: {
140
- collection: 'authors',
141
- primary: 'id',
142
- singleton: false,
143
- note: 'authors',
144
- sortField: null,
145
- accountability: null,
146
- fields: {
147
- id: {
148
- field: 'id',
149
- defaultValue: null,
150
- nullable: false,
151
- generated: false,
152
- type: 'uuid',
153
- dbType: 'uuid',
154
- precision: null,
155
- scale: null,
156
- special: [],
157
- note: null,
158
- alias: false,
159
- validation: null,
160
- },
161
- name: {
162
- field: 'name',
163
- defaultValue: "An Author's Name",
164
- nullable: false,
165
- generated: false,
166
- type: 'uuid',
167
- dbType: 'uuid',
168
- precision: null,
169
- scale: null,
170
- special: [],
171
- note: null,
172
- alias: false,
173
- validation: null,
174
- },
175
- items: {
176
- field: 'items',
177
- defaultValue: null,
178
- nullable: true,
179
- generated: false,
180
- type: 'alias',
181
- dbType: null,
182
- precision: null,
183
- scale: null,
184
- special: ['o2m'],
185
- note: null,
186
- alias: true,
187
- validation: null,
188
- },
189
- },
190
- },
191
- posts: {
192
- collection: 'posts',
193
- primary: 'id',
194
- singleton: false,
195
- note: 'posts',
196
- sortField: null,
197
- accountability: null,
198
- fields: {
199
- id: {
200
- field: 'id',
201
- defaultValue: null,
202
- nullable: false,
203
- generated: false,
204
- type: 'uuid',
205
- dbType: 'uuid',
206
- precision: null,
207
- scale: null,
208
- special: [],
209
- note: null,
210
- alias: false,
211
- validation: null,
212
- },
213
- title: {
214
- field: 'title',
215
- defaultValue: "A Post's Title",
216
- nullable: false,
217
- generated: false,
218
- type: 'string',
219
- dbType: 'text',
220
- precision: null,
221
- scale: null,
222
- special: [],
223
- note: null,
224
- alias: false,
225
- validation: null,
226
- },
227
- uploaded_by: {
228
- field: 'uploaded_by',
229
- defaultValue: null,
230
- nullable: true,
231
- generated: false,
232
- type: 'uuid',
233
- dbType: 'uuid',
234
- precision: null,
235
- scale: null,
236
- special: [],
237
- note: null,
238
- alias: false,
239
- validation: null,
240
- },
241
- },
242
- },
243
- },
244
- relations: [
245
- {
246
- collection: 'posts',
247
- field: 'uploaded_by',
248
- related_collection: 'authors',
249
- schema: {
250
- table: 'posts',
251
- column: 'uploaded_by',
252
- foreign_key_table: 'authors',
253
- foreign_key_column: 'id',
254
- on_update: 'NO ACTION',
255
- on_delete: 'SET NULL',
256
- constraint_name: null,
257
- },
258
- meta: {
259
- id: 11,
260
- many_collection: 'posts',
261
- many_field: 'uploaded_by',
262
- one_collection: 'authors',
263
- one_field: 'items',
264
- one_collection_field: null,
265
- one_allowed_collections: null,
266
- junction_field: null,
267
- sort_field: null,
268
- one_deselect_action: 'nullify',
269
- },
270
- },
271
- ],
272
- };
273
- export const snapshotApplyTestSchema = {
274
- collections: {
275
- test_table: {
276
- collection: 'test_table',
277
- primary: 'id',
278
- singleton: false,
279
- note: 'test_table',
280
- sortField: null,
281
- accountability: 'all',
282
- fields: {
283
- id: {
284
- field: 'id',
285
- defaultValue: null,
286
- nullable: false,
287
- generated: false,
288
- type: 'uuid',
289
- dbType: 'uuid',
290
- precision: null,
291
- scale: null,
292
- special: [],
293
- note: null,
294
- alias: false,
295
- validation: null,
296
- },
297
- },
298
- },
299
- },
300
- relations: [],
301
- };
@@ -1,5 +0,0 @@
1
- import type { Snapshot } from '../types/index.js';
2
- export declare const snapshotBeforeCreateCollection: Snapshot;
3
- export declare const snapshotCreateCollection: Snapshot;
4
- export declare const snapshotCreateCollectionNotNested: Snapshot;
5
- export declare const snapshotBeforeDeleteCollection: Snapshot;