directus 9.23.3 → 9.24.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 (132) hide show
  1. package/dist/app.js +15 -15
  2. package/dist/auth/drivers/ldap.js +22 -22
  3. package/dist/auth/drivers/local.js +7 -7
  4. package/dist/auth/drivers/oauth2.js +27 -25
  5. package/dist/auth/drivers/openid.js +32 -30
  6. package/dist/auth/drivers/saml.js +10 -10
  7. package/dist/auth.js +4 -3
  8. package/dist/cache.js +16 -11
  9. package/dist/cli/commands/bootstrap/index.js +5 -4
  10. package/dist/cli/utils/create-db-connection.js +1 -1
  11. package/dist/cli/utils/create-env/index.js +1 -1
  12. package/dist/constants.d.ts +1 -0
  13. package/dist/constants.js +6 -5
  14. package/dist/controllers/activity.js +10 -10
  15. package/dist/controllers/assets.js +19 -18
  16. package/dist/controllers/auth.js +16 -16
  17. package/dist/controllers/collections.js +11 -11
  18. package/dist/controllers/dashboards.js +11 -11
  19. package/dist/controllers/extensions.js +3 -3
  20. package/dist/controllers/fields.js +17 -17
  21. package/dist/controllers/files.js +18 -17
  22. package/dist/controllers/flows.js +13 -13
  23. package/dist/controllers/folders.js +11 -11
  24. package/dist/controllers/graphql.js +6 -6
  25. package/dist/controllers/items.js +19 -19
  26. package/dist/controllers/notifications.js +11 -11
  27. package/dist/controllers/operations.js +11 -11
  28. package/dist/controllers/panels.js +11 -11
  29. package/dist/controllers/permissions.js +11 -11
  30. package/dist/controllers/presets.js +11 -11
  31. package/dist/controllers/relations.js +11 -11
  32. package/dist/controllers/revisions.js +3 -3
  33. package/dist/controllers/roles.js +11 -11
  34. package/dist/controllers/schema.js +5 -5
  35. package/dist/controllers/server.js +7 -7
  36. package/dist/controllers/settings.js +2 -2
  37. package/dist/controllers/shares.js +14 -14
  38. package/dist/controllers/users.js +16 -16
  39. package/dist/controllers/utils.js +7 -7
  40. package/dist/controllers/webhooks.js +11 -11
  41. package/dist/database/helpers/fn/types.d.ts +0 -1
  42. package/dist/database/helpers/fn/types.js +0 -2
  43. package/dist/database/helpers/index.d.ts +3 -3
  44. package/dist/database/index.js +5 -5
  45. package/dist/database/migrations/20210805B-change-image-metadata-structure.js +15 -15
  46. package/dist/database/migrations/run.js +1 -1
  47. package/dist/database/run-ast.js +6 -6
  48. package/dist/database/system-data/collections/index.js +2 -2
  49. package/dist/database/system-data/fields/index.js +3 -3
  50. package/dist/env.js +1 -1
  51. package/dist/exceptions/database/dialects/mssql.js +2 -2
  52. package/dist/exceptions/database/dialects/mysql.js +6 -6
  53. package/dist/exceptions/database/record-not-unique.d.ts +1 -1
  54. package/dist/extensions.js +10 -10
  55. package/dist/flows.js +33 -31
  56. package/dist/logger.d.ts +1 -0
  57. package/dist/logger.js +32 -32
  58. package/dist/mailer.js +16 -16
  59. package/dist/messenger.js +4 -4
  60. package/dist/middleware/authenticate.d.ts +1 -1
  61. package/dist/middleware/authenticate.js +2 -2
  62. package/dist/middleware/cache.js +11 -11
  63. package/dist/middleware/collection-exists.js +4 -4
  64. package/dist/middleware/cors.js +8 -8
  65. package/dist/middleware/error-handler.js +2 -2
  66. package/dist/middleware/extract-token.js +3 -3
  67. package/dist/middleware/get-permissions.js +1 -1
  68. package/dist/middleware/graphql.js +12 -6
  69. package/dist/middleware/rate-limiter-global.js +5 -5
  70. package/dist/middleware/rate-limiter-ip.js +2 -2
  71. package/dist/middleware/respond.js +16 -16
  72. package/dist/middleware/sanitize-query.js +1 -1
  73. package/dist/middleware/schema.js +1 -1
  74. package/dist/middleware/use-collection.js +1 -1
  75. package/dist/middleware/validate-batch.js +1 -1
  76. package/dist/operations/exec/index.js +2 -2
  77. package/dist/rate-limiter.js +1 -1
  78. package/dist/request/validate-ip.js +2 -2
  79. package/dist/server.js +4 -4
  80. package/dist/services/activity.js +14 -14
  81. package/dist/services/assets.js +6 -6
  82. package/dist/services/authentication.js +9 -9
  83. package/dist/services/collections.js +9 -9
  84. package/dist/services/fields.js +5 -5
  85. package/dist/services/files.js +18 -18
  86. package/dist/services/graphql/index.js +170 -116
  87. package/dist/services/import-export.js +6 -6
  88. package/dist/services/items.js +6 -6
  89. package/dist/services/mail/index.js +5 -5
  90. package/dist/services/meta.js +1 -0
  91. package/dist/services/notifications.js +4 -4
  92. package/dist/services/relations.js +4 -4
  93. package/dist/services/revisions.js +3 -3
  94. package/dist/services/roles.js +5 -5
  95. package/dist/services/server.js +27 -27
  96. package/dist/services/shares.js +9 -9
  97. package/dist/services/specifications.js +5 -3
  98. package/dist/services/users.d.ts +1 -5
  99. package/dist/services/users.js +24 -27
  100. package/dist/storage/register-locations.js +1 -1
  101. package/dist/utils/apply-diff.js +12 -12
  102. package/dist/utils/apply-query.js +3 -2
  103. package/dist/utils/dynamic-import.js +1 -1
  104. package/dist/utils/generate-hash.js +1 -1
  105. package/dist/utils/get-ast-from-query.js +2 -2
  106. package/dist/utils/get-auth-providers.js +1 -1
  107. package/dist/utils/get-cache-headers.js +3 -3
  108. package/dist/utils/get-collection-from-alias.js +1 -0
  109. package/dist/utils/get-column-path.js +2 -1
  110. package/dist/utils/get-default-value.js +1 -1
  111. package/dist/utils/get-ip-from-req.js +2 -2
  112. package/dist/utils/get-permissions.js +11 -11
  113. package/dist/utils/get-schema.js +5 -5
  114. package/dist/utils/get-snapshot-diff.js +1 -1
  115. package/dist/utils/is-url-allowed.js +5 -2
  116. package/dist/utils/parse-image-metadata.js +3 -3
  117. package/dist/utils/reduce-schema.js +5 -5
  118. package/dist/utils/sanitize-query.js +26 -26
  119. package/dist/utils/should-skip-cache.js +13 -4
  120. package/dist/utils/strip-function.js +1 -1
  121. package/dist/utils/telemetry.d.ts +1 -0
  122. package/dist/utils/telemetry.js +30 -0
  123. package/dist/utils/validate-keys.js +1 -1
  124. package/dist/utils/validate-query.js +1 -1
  125. package/dist/utils/validate-storage.js +8 -8
  126. package/dist/webhooks.js +2 -2
  127. package/package.json +13 -13
  128. package/dist/utils/redact-header-cookies.d.ts +0 -1
  129. package/dist/utils/redact-header-cookies.js +0 -11
  130. package/dist/utils/track.d.ts +0 -1
  131. package/dist/utils/track.js +0 -81
  132. /package/dist/{utils/redact-header-cookies.test.d.ts → logger.test.d.ts} +0 -0
@@ -10,49 +10,49 @@ const logger_1 = __importDefault(require("../logger"));
10
10
  const types_1 = require("../types");
11
11
  function sanitizeQuery(rawQuery, accountability) {
12
12
  const query = {};
13
- if (rawQuery.limit !== undefined) {
14
- const limit = sanitizeLimit(rawQuery.limit);
13
+ if (rawQuery['limit'] !== undefined) {
14
+ const limit = sanitizeLimit(rawQuery['limit']);
15
15
  if (typeof limit === 'number') {
16
16
  query.limit = limit;
17
17
  }
18
18
  }
19
- if (rawQuery.fields) {
20
- query.fields = sanitizeFields(rawQuery.fields);
19
+ if (rawQuery['fields']) {
20
+ query.fields = sanitizeFields(rawQuery['fields']);
21
21
  }
22
- if (rawQuery.groupBy) {
23
- query.group = sanitizeFields(rawQuery.groupBy);
22
+ if (rawQuery['groupBy']) {
23
+ query.group = sanitizeFields(rawQuery['groupBy']);
24
24
  }
25
- if (rawQuery.aggregate) {
26
- query.aggregate = sanitizeAggregate(rawQuery.aggregate);
25
+ if (rawQuery['aggregate']) {
26
+ query.aggregate = sanitizeAggregate(rawQuery['aggregate']);
27
27
  }
28
- if (rawQuery.sort) {
29
- query.sort = sanitizeSort(rawQuery.sort);
28
+ if (rawQuery['sort']) {
29
+ query.sort = sanitizeSort(rawQuery['sort']);
30
30
  }
31
- if (rawQuery.filter) {
32
- query.filter = sanitizeFilter(rawQuery.filter, accountability || null);
31
+ if (rawQuery['filter']) {
32
+ query.filter = sanitizeFilter(rawQuery['filter'], accountability || null);
33
33
  }
34
- if (rawQuery.offset) {
35
- query.offset = sanitizeOffset(rawQuery.offset);
34
+ if (rawQuery['offset']) {
35
+ query.offset = sanitizeOffset(rawQuery['offset']);
36
36
  }
37
- if (rawQuery.page) {
38
- query.page = sanitizePage(rawQuery.page);
37
+ if (rawQuery['page']) {
38
+ query.page = sanitizePage(rawQuery['page']);
39
39
  }
40
- if (rawQuery.meta) {
41
- query.meta = sanitizeMeta(rawQuery.meta);
40
+ if (rawQuery['meta']) {
41
+ query.meta = sanitizeMeta(rawQuery['meta']);
42
42
  }
43
- if (rawQuery.search && typeof rawQuery.search === 'string') {
44
- query.search = rawQuery.search;
43
+ if (rawQuery['search'] && typeof rawQuery['search'] === 'string') {
44
+ query.search = rawQuery['search'];
45
45
  }
46
- if (rawQuery.export) {
47
- query.export = rawQuery.export;
46
+ if (rawQuery['export']) {
47
+ query.export = rawQuery['export'];
48
48
  }
49
- if (rawQuery.deep) {
49
+ if (rawQuery['deep']) {
50
50
  if (!query.deep)
51
51
  query.deep = {};
52
- query.deep = sanitizeDeep(rawQuery.deep, accountability);
52
+ query.deep = sanitizeDeep(rawQuery['deep'], accountability);
53
53
  }
54
- if (rawQuery.alias) {
55
- query.alias = sanitizeAlias(rawQuery.alias);
54
+ if (rawQuery['alias']) {
55
+ query.alias = sanitizeAlias(rawQuery['alias']);
56
56
  }
57
57
  return query;
58
58
  }
@@ -11,10 +11,19 @@ const url_1 = require("./url");
11
11
  function shouldSkipCache(req) {
12
12
  const env = (0, env_1.getEnv)();
13
13
  // Always skip cache for requests coming from the data studio based on Referer header
14
- const adminUrl = new url_1.Url(env.PUBLIC_URL).addPath('admin').toString();
15
- if (req.get('Referer')?.startsWith(adminUrl))
16
- return true;
17
- if (env.CACHE_SKIP_ALLOWED && req.get('cache-control')?.includes('no-store'))
14
+ const referer = req.get('Referer');
15
+ if (referer) {
16
+ const adminUrl = new url_1.Url(env['PUBLIC_URL']).addPath('admin');
17
+ if (adminUrl.isRootRelative()) {
18
+ const refererUrl = new url_1.Url(referer);
19
+ if (refererUrl.path.join('/').startsWith(adminUrl.path.join('/')))
20
+ return true;
21
+ }
22
+ else if (referer.startsWith(adminUrl.toString())) {
23
+ return true;
24
+ }
25
+ }
26
+ if (env['CACHE_SKIP_ALLOWED'] && req.get('cache-control')?.includes('no-store'))
18
27
  return true;
19
28
  return false;
20
29
  }
@@ -7,7 +7,7 @@ const constants_1 = require("@directus/shared/constants");
7
7
  */
8
8
  function stripFunction(field) {
9
9
  if (field.includes('(') && field.includes(')')) {
10
- return field.match(constants_1.REGEX_BETWEEN_PARENS)[1].trim();
10
+ return field.match(constants_1.REGEX_BETWEEN_PARENS)?.[1]?.trim() ?? field;
11
11
  }
12
12
  else {
13
13
  return field;
@@ -0,0 +1 @@
1
+ export declare function collectTelemetry(): Promise<void>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.collectTelemetry = void 0;
7
+ const node_machine_id_1 = require("node-machine-id");
8
+ const package_json_1 = require("../../package.json");
9
+ const env_1 = __importDefault(require("../env"));
10
+ const logger_1 = __importDefault(require("../logger"));
11
+ async function collectTelemetry() {
12
+ const axios = (await import('axios')).default;
13
+ if (env_1.default['TELEMETRY'] !== false) {
14
+ try {
15
+ await axios.post('https://telemetry.directus.io/', {
16
+ version: package_json_1.version,
17
+ public_url: env_1.default['PUBLIC_URL'],
18
+ project_id: env_1.default['KEY'],
19
+ machine_id: await (0, node_machine_id_1.machineId)(),
20
+ db_client: env_1.default['DB_CLIENT'],
21
+ });
22
+ }
23
+ catch (err) {
24
+ if (env_1.default['NODE_ENV'] === 'development') {
25
+ logger_1.default.error(err);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ exports.collectTelemetry = collectTelemetry;
@@ -16,7 +16,7 @@ function validateKeys(schema, collection, keyField, keys) {
16
16
  }
17
17
  }
18
18
  else {
19
- const primaryKeyFieldType = schema.collections[collection].fields[keyField].type;
19
+ const primaryKeyFieldType = schema.collections[collection]?.fields[keyField]?.type;
20
20
  if (primaryKeyFieldType === 'uuid' && !(0, uuid_validate_1.default)(String(keys))) {
21
21
  throw new exceptions_1.ForbiddenException();
22
22
  }
@@ -157,7 +157,7 @@ function validateAlias(alias) {
157
157
  }
158
158
  }
159
159
  function validateRelationalDepth(query) {
160
- const maxRelationalDepth = Number(env_1.default.MAX_RELATIONAL_DEPTH) > 2 ? Number(env_1.default.MAX_RELATIONAL_DEPTH) : 2;
160
+ const maxRelationalDepth = Number(env_1.default['MAX_RELATIONAL_DEPTH']) > 2 ? Number(env_1.default['MAX_RELATIONAL_DEPTH']) : 2;
161
161
  // Process the fields in the same way as api/src/utils/get-ast-from-query.ts
162
162
  let fields = ['*'];
163
163
  if (query.fields) {
@@ -11,28 +11,28 @@ const fs_1 = require("fs");
11
11
  const path_1 = __importDefault(require("path"));
12
12
  const utils_1 = require("@directus/shared/utils");
13
13
  async function validateStorage() {
14
- if (env_1.default.DB_CLIENT === 'sqlite3') {
14
+ if (env_1.default['DB_CLIENT'] === 'sqlite3') {
15
15
  try {
16
- await (0, fs_extra_1.access)(path_1.default.dirname(env_1.default.DB_FILENAME), fs_1.constants.R_OK | fs_1.constants.W_OK);
16
+ await (0, fs_extra_1.access)(path_1.default.dirname(env_1.default['DB_FILENAME']), fs_1.constants.R_OK | fs_1.constants.W_OK);
17
17
  }
18
18
  catch {
19
- logger_1.default.warn(`Directory for SQLite database file (${path_1.default.resolve(path_1.default.dirname(env_1.default.DB_FILENAME))}) is not read/writeable!`);
19
+ logger_1.default.warn(`Directory for SQLite database file (${path_1.default.resolve(path_1.default.dirname(env_1.default['DB_FILENAME']))}) is not read/writeable!`);
20
20
  }
21
21
  }
22
- const usedStorageDrivers = (0, utils_1.toArray)(env_1.default.STORAGE_LOCATIONS).map((location) => env_1.default[`STORAGE_${location.toUpperCase()}_DRIVER`]);
22
+ const usedStorageDrivers = (0, utils_1.toArray)(env_1.default['STORAGE_LOCATIONS']).map((location) => env_1.default[`STORAGE_${location.toUpperCase()}_DRIVER`]);
23
23
  if (usedStorageDrivers.includes('local')) {
24
24
  try {
25
- await (0, fs_extra_1.access)(env_1.default.STORAGE_LOCAL_ROOT, fs_1.constants.R_OK | fs_1.constants.W_OK);
25
+ await (0, fs_extra_1.access)(env_1.default['STORAGE_LOCAL_ROOT'], fs_1.constants.R_OK | fs_1.constants.W_OK);
26
26
  }
27
27
  catch {
28
- logger_1.default.warn(`Upload directory (${path_1.default.resolve(env_1.default.STORAGE_LOCAL_ROOT)}) is not read/writeable!`);
28
+ logger_1.default.warn(`Upload directory (${path_1.default.resolve(env_1.default['STORAGE_LOCAL_ROOT'])}) is not read/writeable!`);
29
29
  }
30
30
  }
31
31
  try {
32
- await (0, fs_extra_1.access)(env_1.default.EXTENSIONS_PATH, fs_1.constants.R_OK);
32
+ await (0, fs_extra_1.access)(env_1.default['EXTENSIONS_PATH'], fs_1.constants.R_OK);
33
33
  }
34
34
  catch {
35
- logger_1.default.warn(`Extensions directory (${path_1.default.resolve(env_1.default.EXTENSIONS_PATH)}) is not readable!`);
35
+ logger_1.default.warn(`Extensions directory (${path_1.default.resolve(env_1.default['EXTENSIONS_PATH'])}) is not readable!`);
36
36
  }
37
37
  }
38
38
  exports.validateStorage = validateStorage;
package/dist/webhooks.js CHANGED
@@ -18,7 +18,7 @@ async function init() {
18
18
  await register();
19
19
  const messenger = (0, messenger_1.getMessenger)();
20
20
  messenger.subscribe('webhooks', (event) => {
21
- if (event.type === 'reload') {
21
+ if (event['type'] === 'reload') {
22
22
  reloadQueue.enqueue(async () => {
23
23
  await reload();
24
24
  });
@@ -53,7 +53,7 @@ function unregister() {
53
53
  exports.unregister = unregister;
54
54
  function createHandler(webhook, event) {
55
55
  return async (meta, context) => {
56
- if (webhook.collections.includes(meta.collection) === false)
56
+ if (webhook.collections.includes(meta['collection']) === false)
57
57
  return;
58
58
  const axios = await (0, index_1.getAxios)();
59
59
  const webhookPayload = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "directus",
3
- "version": "9.23.3",
3
+ "version": "9.24.0",
4
4
  "description": "Directus is a real-time API and App dashboard for managing SQL database content",
5
5
  "keywords": [
6
6
  "directus",
@@ -144,18 +144,18 @@
144
144
  "uuid-validate": "0.0.3",
145
145
  "vm2": "3.9.14",
146
146
  "wellknown": "0.5.0",
147
- "@directus/app": "9.23.3",
148
- "@directus/extensions-sdk": "9.23.3",
149
- "@directus/schema": "9.23.3",
150
- "@directus/shared": "9.23.3",
151
- "@directus/specs": "9.23.3",
152
- "@directus/storage": "9.23.3",
153
- "@directus/storage-driver-azure": "9.23.3",
154
- "@directus/storage-driver-cloudinary": "9.23.3",
155
- "@directus/storage-driver-gcs": "9.23.3",
156
- "@directus/storage-driver-local": "9.23.3",
157
- "@directus/storage-driver-s3": "9.23.3",
158
- "@directus/utils": "9.23.3"
147
+ "@directus/app": "9.24.0",
148
+ "@directus/extensions-sdk": "9.24.0",
149
+ "@directus/schema": "9.24.0",
150
+ "@directus/shared": "9.24.0",
151
+ "@directus/specs": "9.24.0",
152
+ "@directus/storage": "9.24.0",
153
+ "@directus/storage-driver-azure": "9.24.0",
154
+ "@directus/storage-driver-cloudinary": "9.24.0",
155
+ "@directus/storage-driver-gcs": "9.24.0",
156
+ "@directus/storage-driver-local": "9.24.0",
157
+ "@directus/storage-driver-s3": "9.24.0",
158
+ "@directus/utils": "9.24.0"
159
159
  },
160
160
  "devDependencies": {
161
161
  "@ngneat/falso": "6.4.0",
@@ -1 +0,0 @@
1
- export declare function redactHeaderCookie(cookieHeader: string, cookieNames: string[]): string;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.redactHeaderCookie = void 0;
4
- function redactHeaderCookie(cookieHeader, cookieNames) {
5
- for (const cookieName of cookieNames) {
6
- const re = new RegExp(`(${cookieName}=)([^;]+)`);
7
- cookieHeader = cookieHeader.replace(re, `$1--redacted--`);
8
- }
9
- return cookieHeader;
10
- }
11
- exports.redactHeaderCookie = redactHeaderCookie;
@@ -1 +0,0 @@
1
- export declare function track(event: string): Promise<void>;
@@ -1,81 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.track = void 0;
7
- const node_machine_id_1 = require("node-machine-id");
8
- const os_1 = __importDefault(require("os"));
9
- // @ts-ignore
10
- const utils_1 = require("@directus/shared/utils");
11
- const package_json_1 = require("../../package.json");
12
- const env_1 = __importDefault(require("../env"));
13
- const logger_1 = __importDefault(require("../logger"));
14
- const get_milliseconds_1 = require("./get-milliseconds");
15
- async function track(event) {
16
- const axios = (await import('axios')).default;
17
- if (env_1.default.TELEMETRY !== false) {
18
- const info = await getEnvInfo(event);
19
- try {
20
- await axios.post('https://telemetry.directus.io/', info);
21
- }
22
- catch (err) {
23
- if (env_1.default.NODE_ENV === 'development') {
24
- logger_1.default.error(err);
25
- }
26
- }
27
- }
28
- }
29
- exports.track = track;
30
- async function getEnvInfo(event) {
31
- return {
32
- version: package_json_1.version,
33
- event: event,
34
- project_id: env_1.default.KEY,
35
- machine_id: await (0, node_machine_id_1.machineId)(),
36
- environment: env_1.default.NODE_ENV,
37
- stack: 'node',
38
- os: {
39
- arch: os_1.default.arch(),
40
- platform: os_1.default.platform(),
41
- release: os_1.default.release(),
42
- },
43
- rate_limiter: {
44
- enabled: env_1.default.RATE_LIMITER_ENABLED,
45
- points: +env_1.default.RATE_LIMITER_POINTS,
46
- duration: +env_1.default.RATE_LIMITER_DURATION,
47
- store: env_1.default.RATE_LIMITER_STORE,
48
- },
49
- cache: {
50
- enabled: env_1.default.CACHE_ENABLED,
51
- ttl: (0, get_milliseconds_1.getMilliseconds)(env_1.default.CACHE_TTL),
52
- store: env_1.default.CACHE_STORE,
53
- },
54
- storage: {
55
- drivers: getStorageDrivers(),
56
- },
57
- cors: {
58
- enabled: env_1.default.CORS_ENABLED,
59
- },
60
- email: {
61
- transport: env_1.default.EMAIL_TRANSPORT,
62
- },
63
- auth: {
64
- providers: (0, utils_1.toArray)(env_1.default.AUTH_PROVIDERS)
65
- .map((v) => v.trim())
66
- .filter((v) => v),
67
- },
68
- db_client: env_1.default.DB_CLIENT,
69
- };
70
- }
71
- function getStorageDrivers() {
72
- const drivers = [];
73
- const locations = (0, utils_1.toArray)(env_1.default.STORAGE_LOCATIONS)
74
- .map((v) => v.trim())
75
- .filter((v) => v);
76
- for (const location of locations) {
77
- const driver = env_1.default[`STORAGE_${location.toUpperCase()}_DRIVER`];
78
- drivers.push(driver);
79
- }
80
- return drivers;
81
- }