directus 9.7.1 → 9.8.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.
- package/dist/cache.js +2 -2
- package/dist/database/helpers/date/dialects/default.d.ts +3 -0
- package/dist/database/helpers/date/dialects/default.js +7 -0
- package/dist/database/helpers/date/dialects/sqlite.d.ts +0 -9
- package/dist/database/helpers/date/dialects/sqlite.js +0 -24
- package/dist/database/helpers/date/index.d.ts +6 -6
- package/dist/database/helpers/date/index.js +13 -13
- package/dist/database/helpers/date/types.d.ts +0 -9
- package/dist/database/helpers/{date → fn}/dialects/mssql.d.ts +3 -2
- package/dist/database/helpers/{date → fn}/dialects/mssql.js +14 -3
- package/dist/database/helpers/{date → fn}/dialects/mysql.d.ts +3 -2
- package/dist/database/helpers/{date → fn}/dialects/mysql.js +14 -3
- package/dist/database/helpers/{date → fn}/dialects/oracle.d.ts +3 -2
- package/dist/database/helpers/{date → fn}/dialects/oracle.js +14 -3
- package/dist/database/helpers/{date → fn}/dialects/postgres.d.ts +3 -2
- package/dist/database/helpers/{date → fn}/dialects/postgres.js +14 -3
- package/dist/database/helpers/fn/dialects/sqlite.d.ts +13 -0
- package/dist/database/helpers/fn/dialects/sqlite.js +42 -0
- package/dist/database/helpers/fn/index.d.ts +7 -0
- package/dist/database/helpers/fn/index.js +17 -0
- package/dist/database/helpers/fn/types.d.ts +18 -0
- package/dist/database/helpers/fn/types.js +27 -0
- package/dist/database/helpers/index.d.ts +4 -1
- package/dist/database/helpers/index.js +7 -1
- package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +3 -0
- package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.js +17 -0
- package/dist/database/migrations/20220322A-rename-field-typecast-flags.js +6 -2
- package/dist/database/migrations/20220323A-add-field-validation.d.ts +3 -0
- package/dist/database/migrations/20220323A-add-field-validation.js +17 -0
- package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +3 -0
- package/dist/database/migrations/20220325A-fix-typecast-flags.js +49 -0
- package/dist/database/migrations/20220325B-add-default-language.d.ts +3 -0
- package/dist/database/migrations/20220325B-add-default-language.js +28 -0
- package/dist/database/run-ast.js +4 -2
- package/dist/database/system-data/fields/activity.yaml +4 -4
- package/dist/database/system-data/fields/fields.yaml +9 -0
- package/dist/database/system-data/fields/presets.yaml +14 -0
- package/dist/database/system-data/fields/settings.yaml +13 -1
- package/dist/logger.js +2 -1
- package/dist/services/activity.js +4 -1
- package/dist/services/authorization.d.ts +1 -1
- package/dist/services/authorization.js +128 -44
- package/dist/services/collections.js +222 -198
- package/dist/services/fields.js +184 -173
- package/dist/services/payload.js +8 -6
- package/dist/services/relations.js +93 -81
- package/dist/services/server.js +1 -0
- package/dist/services/shares.js +2 -1
- package/dist/services/users.js +3 -1
- package/dist/utils/apply-query.js +21 -3
- package/dist/utils/get-column.d.ts +6 -5
- package/dist/utils/get-column.js +16 -8
- package/dist/utils/get-schema.d.ts +1 -1
- package/dist/utils/get-schema.js +15 -10
- package/dist/utils/track.js +3 -2
- package/dist/utils/url.d.ts +1 -1
- package/dist/utils/url.js +1 -1
- package/dist/utils/validate-storage.js +3 -1
- package/package.json +12 -12
package/dist/services/shares.js
CHANGED
|
@@ -16,6 +16,7 @@ const users_1 = require("./users");
|
|
|
16
16
|
const mail_1 = require("./mail");
|
|
17
17
|
const user_name_1 = require("../utils/user-name");
|
|
18
18
|
const md_1 = require("../utils/md");
|
|
19
|
+
const url_1 = require("../utils/url");
|
|
19
20
|
class SharesService extends items_1.ItemsService {
|
|
20
21
|
constructor(options) {
|
|
21
22
|
super('directus_shares', options);
|
|
@@ -116,7 +117,7 @@ Hello!
|
|
|
116
117
|
|
|
117
118
|
${(0, user_name_1.userName)(userInfo)} has invited you to view an item in ${share.collection}.
|
|
118
119
|
|
|
119
|
-
[Open](${env_1.default.PUBLIC_URL
|
|
120
|
+
[Open](${new url_1.Url(env_1.default.PUBLIC_URL).addPath('admin', 'shared', payload.share).toString()})
|
|
120
121
|
`;
|
|
121
122
|
for (const email of payload.emails) {
|
|
122
123
|
await mailService.send({
|
package/dist/services/users.js
CHANGED
|
@@ -264,7 +264,9 @@ class UsersService extends items_1.ItemsService {
|
|
|
264
264
|
});
|
|
265
265
|
const payload = { email, scope: 'password-reset', hash: (0, utils_2.getSimpleHash)('' + user.password) };
|
|
266
266
|
const token = jsonwebtoken_1.default.sign(payload, env_1.default.SECRET, { expiresIn: '1d', issuer: 'directus' });
|
|
267
|
-
const acceptURL = url
|
|
267
|
+
const acceptURL = url
|
|
268
|
+
? new url_1.Url(url).setQuery('token', token).toString()
|
|
269
|
+
: new url_1.Url(env_1.default.PUBLIC_URL).addPath('admin', 'reset-password').setQuery('token', token);
|
|
268
270
|
const subjectLine = subject ? subject : 'Password Reset Request';
|
|
269
271
|
await mailService.send({
|
|
270
272
|
to: email,
|
|
@@ -11,6 +11,7 @@ const exceptions_1 = require("../exceptions");
|
|
|
11
11
|
const get_column_1 = require("./get-column");
|
|
12
12
|
const get_relation_type_1 = require("./get-relation-type");
|
|
13
13
|
const helpers_1 = require("../database/helpers");
|
|
14
|
+
const utils_1 = require("@directus/shared/utils");
|
|
14
15
|
const generateAlias = (0, nanoid_1.customAlphabet)('abcdefghijklmnopqrstuvwxyz', 5);
|
|
15
16
|
/**
|
|
16
17
|
* Apply the Query to a given Knex query builder instance
|
|
@@ -26,7 +27,7 @@ function applyQuery(knex, collection, dbQuery, query, schema, subQuery = false)
|
|
|
26
27
|
}
|
|
27
28
|
return {
|
|
28
29
|
order,
|
|
29
|
-
column: (0, get_column_1.getColumn)(knex, collection, column, false),
|
|
30
|
+
column: (0, get_column_1.getColumn)(knex, collection, column, false, schema),
|
|
30
31
|
};
|
|
31
32
|
}));
|
|
32
33
|
}
|
|
@@ -43,7 +44,7 @@ function applyQuery(knex, collection, dbQuery, query, schema, subQuery = false)
|
|
|
43
44
|
applySearch(schema, dbQuery, query.search, collection);
|
|
44
45
|
}
|
|
45
46
|
if (query.group) {
|
|
46
|
-
dbQuery.groupBy(query.group.map((column) => (0, get_column_1.getColumn)(knex, collection, column, false)));
|
|
47
|
+
dbQuery.groupBy(query.group.map((column) => (0, get_column_1.getColumn)(knex, collection, column, false, schema)));
|
|
47
48
|
}
|
|
48
49
|
if (query.aggregate) {
|
|
49
50
|
applyAggregate(dbQuery, query.aggregate, collection);
|
|
@@ -234,7 +235,7 @@ function applyFilter(knex, schema, rootQuery, rootFilter, collection, subQuery =
|
|
|
234
235
|
function applyFilterToQuery(key, operator, compareValue, logical = 'and') {
|
|
235
236
|
const [table, column] = key.split('.');
|
|
236
237
|
// Is processed through Knex.Raw, so should be safe to string-inject into these where queries
|
|
237
|
-
const selectionRaw = (0, get_column_1.getColumn)(knex, table, column, false);
|
|
238
|
+
const selectionRaw = (0, get_column_1.getColumn)(knex, table, column, false, schema);
|
|
238
239
|
// Knex supports "raw" in the columnName parameter, but isn't typed as such. Too bad..
|
|
239
240
|
// See https://github.com/knex/knex/issues/4518 @TODO remove as any once knex is updated
|
|
240
241
|
// These operators don't rely on a value, and can thus be used without one (eg `?filter[field][_null]`)
|
|
@@ -254,6 +255,15 @@ function applyFilter(knex, schema, rootQuery, rootFilter, collection, subQuery =
|
|
|
254
255
|
query.where(key, '!=', '');
|
|
255
256
|
});
|
|
256
257
|
}
|
|
258
|
+
// Cast filter value (compareValue) based on function used
|
|
259
|
+
if (column.includes('(') && column.includes(')')) {
|
|
260
|
+
const functionName = column.split('(')[0];
|
|
261
|
+
const type = (0, utils_1.getOutputTypeForFunction)(functionName);
|
|
262
|
+
if (['bigInteger', 'integer', 'float', 'decimal'].includes(type)) {
|
|
263
|
+
compareValue = Number(compareValue);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Cast filter value (compareValue) based on type of field being filtered against
|
|
257
267
|
const [collection, field] = key.split('.');
|
|
258
268
|
if (collection in schema.collections && field in schema.collections[collection].fields) {
|
|
259
269
|
const type = schema.collections[collection].fields[field].type;
|
|
@@ -265,6 +275,14 @@ function applyFilter(knex, schema, rootQuery, rootFilter, collection, subQuery =
|
|
|
265
275
|
compareValue = helpers.date.parse(compareValue);
|
|
266
276
|
}
|
|
267
277
|
}
|
|
278
|
+
if (['bigInteger', 'integer', 'float', 'decimal'].includes(type)) {
|
|
279
|
+
if (Array.isArray(compareValue)) {
|
|
280
|
+
compareValue = compareValue.map((val) => Number(val));
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
compareValue = Number(compareValue);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
268
286
|
}
|
|
269
287
|
// The following fields however, require a value to be run. If no value is passed, we
|
|
270
288
|
// ignore them. This allows easier use in GraphQL, where you wouldn't be able to
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { SchemaOverview } from '@directus/shared/types';
|
|
1
2
|
import { Knex } from 'knex';
|
|
2
3
|
/**
|
|
3
|
-
* Return column prefixed by table. If column includes functions (like `year(date_created)
|
|
4
|
-
* column is replaced with the appropriate SQL
|
|
4
|
+
* Return column prefixed by table. If column includes functions (like `year(date_created)`), the
|
|
5
|
+
* column is replaced with the appropriate SQL
|
|
5
6
|
*
|
|
6
7
|
* @param knex Current knex / transaction instance
|
|
7
|
-
* @param
|
|
8
|
-
* @param
|
|
8
|
+
* @param table Collection or alias in which column resides
|
|
9
|
+
* @param column name of the column
|
|
9
10
|
* @param alias Whether or not to add a SQL AS statement
|
|
10
11
|
* @returns Knex raw instance
|
|
11
12
|
*/
|
|
12
|
-
export declare function getColumn(knex: Knex, table: string, column: string, alias
|
|
13
|
+
export declare function getColumn(knex: Knex, table: string, column: string, alias: string | false | undefined, schema: SchemaOverview): Knex.Raw;
|
package/dist/utils/get-column.js
CHANGED
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getColumn = void 0;
|
|
4
|
-
const helpers_1 = require("../database/helpers");
|
|
5
4
|
const constants_1 = require("@directus/shared/constants");
|
|
5
|
+
const utils_1 = require("@directus/shared/utils");
|
|
6
|
+
const helpers_1 = require("../database/helpers");
|
|
7
|
+
const exceptions_1 = require("../exceptions");
|
|
6
8
|
const apply_function_to_column_name_1 = require("./apply-function-to-column-name");
|
|
7
9
|
/**
|
|
8
|
-
* Return column prefixed by table. If column includes functions (like `year(date_created)
|
|
9
|
-
* column is replaced with the appropriate SQL
|
|
10
|
+
* Return column prefixed by table. If column includes functions (like `year(date_created)`), the
|
|
11
|
+
* column is replaced with the appropriate SQL
|
|
10
12
|
*
|
|
11
13
|
* @param knex Current knex / transaction instance
|
|
12
|
-
* @param
|
|
13
|
-
* @param
|
|
14
|
+
* @param table Collection or alias in which column resides
|
|
15
|
+
* @param column name of the column
|
|
14
16
|
* @param alias Whether or not to add a SQL AS statement
|
|
15
17
|
* @returns Knex raw instance
|
|
16
18
|
*/
|
|
17
|
-
function getColumn(knex, table, column, alias = (0, apply_function_to_column_name_1.applyFunctionToColumnName)(column)) {
|
|
18
|
-
|
|
19
|
+
function getColumn(knex, table, column, alias = (0, apply_function_to_column_name_1.applyFunctionToColumnName)(column), schema) {
|
|
20
|
+
var _a, _b, _c, _d;
|
|
21
|
+
const fn = (0, helpers_1.getFunctions)(knex, schema);
|
|
19
22
|
if (column.includes('(') && column.includes(')')) {
|
|
20
23
|
const functionName = column.split('(')[0];
|
|
21
24
|
const columnName = column.match(constants_1.REGEX_BETWEEN_PARENS)[1];
|
|
22
25
|
if (functionName in fn) {
|
|
26
|
+
const type = (_d = (_c = (_b = (_a = schema === null || schema === void 0 ? void 0 : schema.collections[table]) === null || _a === void 0 ? void 0 : _a.fields) === null || _b === void 0 ? void 0 : _b[columnName]) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : 'unknown';
|
|
27
|
+
const allowedFunctions = (0, utils_1.getFunctionsForType)(type);
|
|
28
|
+
if (allowedFunctions.includes(functionName) === false) {
|
|
29
|
+
throw new exceptions_1.InvalidQueryException(`Invalid function specified "${functionName}"`);
|
|
30
|
+
}
|
|
23
31
|
const result = fn[functionName](table, columnName);
|
|
24
32
|
if (alias) {
|
|
25
33
|
return knex.raw(result + ' AS ??', [alias]);
|
|
@@ -27,7 +35,7 @@ function getColumn(knex, table, column, alias = (0, apply_function_to_column_nam
|
|
|
27
35
|
return result;
|
|
28
36
|
}
|
|
29
37
|
else {
|
|
30
|
-
throw new
|
|
38
|
+
throw new exceptions_1.InvalidQueryException(`Invalid function specified "${functionName}"`);
|
|
31
39
|
}
|
|
32
40
|
}
|
|
33
41
|
if (alias && column !== alias) {
|
package/dist/utils/get-schema.js
CHANGED
|
@@ -5,17 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getSchema = void 0;
|
|
7
7
|
const schema_1 = __importDefault(require("@directus/schema"));
|
|
8
|
+
const utils_1 = require("@directus/shared/utils");
|
|
8
9
|
const lodash_1 = require("lodash");
|
|
10
|
+
const cache_1 = require("../cache");
|
|
11
|
+
const database_1 = __importDefault(require("../database"));
|
|
9
12
|
const collections_1 = require("../database/system-data/collections");
|
|
10
13
|
const fields_1 = require("../database/system-data/fields");
|
|
14
|
+
const env_1 = __importDefault(require("../env"));
|
|
11
15
|
const logger_1 = __importDefault(require("../logger"));
|
|
12
16
|
const services_1 = require("../services");
|
|
13
|
-
const utils_1 = require("@directus/shared/utils");
|
|
14
17
|
const get_default_value_1 = __importDefault(require("./get-default-value"));
|
|
15
18
|
const get_local_type_1 = __importDefault(require("./get-local-type"));
|
|
16
|
-
const database_1 = __importDefault(require("../database"));
|
|
17
|
-
const cache_1 = require("../cache");
|
|
18
|
-
const env_1 = __importDefault(require("../env"));
|
|
19
19
|
async function getSchema(options) {
|
|
20
20
|
const database = (options === null || options === void 0 ? void 0 : options.database) || (0, database_1.default)();
|
|
21
21
|
const schemaInspector = (0, schema_1.default)(database);
|
|
@@ -49,7 +49,7 @@ async function getSchema(options) {
|
|
|
49
49
|
}
|
|
50
50
|
exports.getSchema = getSchema;
|
|
51
51
|
async function getDatabaseSchema(database, schemaInspector) {
|
|
52
|
-
var _a, _b, _c, _d;
|
|
52
|
+
var _a, _b, _c, _d, _e, _f;
|
|
53
53
|
const result = {
|
|
54
54
|
collections: {},
|
|
55
55
|
relations: [],
|
|
@@ -95,6 +95,7 @@ async function getDatabaseSchema(database, schemaInspector) {
|
|
|
95
95
|
scale: column.numeric_scale || null,
|
|
96
96
|
special: [],
|
|
97
97
|
note: null,
|
|
98
|
+
validation: null,
|
|
98
99
|
alias: false,
|
|
99
100
|
};
|
|
100
101
|
}),
|
|
@@ -102,7 +103,7 @@ async function getDatabaseSchema(database, schemaInspector) {
|
|
|
102
103
|
}
|
|
103
104
|
const fields = [
|
|
104
105
|
...(await database
|
|
105
|
-
.select('id', 'collection', 'field', 'special', 'note')
|
|
106
|
+
.select('id', 'collection', 'field', 'special', 'note', 'validation')
|
|
106
107
|
.from('directus_fields')),
|
|
107
108
|
...fields_1.systemFieldRows,
|
|
108
109
|
].filter((field) => (field.special ? (0, utils_1.toArray)(field.special) : []).includes('no-data') === false);
|
|
@@ -113,18 +114,22 @@ async function getDatabaseSchema(database, schemaInspector) {
|
|
|
113
114
|
const column = schemaOverview[field.collection].columns[field.field];
|
|
114
115
|
const special = field.special ? (0, utils_1.toArray)(field.special) : [];
|
|
115
116
|
const type = (existing && (0, get_local_type_1.default)(column, { special })) || 'alias';
|
|
117
|
+
let validation = (_a = field.validation) !== null && _a !== void 0 ? _a : null;
|
|
118
|
+
if (validation && typeof validation === 'string')
|
|
119
|
+
validation = JSON.parse(validation);
|
|
116
120
|
result.collections[field.collection].fields[field.field] = {
|
|
117
121
|
field: field.field,
|
|
118
|
-
defaultValue: (
|
|
119
|
-
nullable: (
|
|
120
|
-
generated: (
|
|
122
|
+
defaultValue: (_b = existing === null || existing === void 0 ? void 0 : existing.defaultValue) !== null && _b !== void 0 ? _b : null,
|
|
123
|
+
nullable: (_c = existing === null || existing === void 0 ? void 0 : existing.nullable) !== null && _c !== void 0 ? _c : true,
|
|
124
|
+
generated: (_d = existing === null || existing === void 0 ? void 0 : existing.generated) !== null && _d !== void 0 ? _d : false,
|
|
121
125
|
type: type,
|
|
122
126
|
dbType: (existing === null || existing === void 0 ? void 0 : existing.dbType) || null,
|
|
123
127
|
precision: (existing === null || existing === void 0 ? void 0 : existing.precision) || null,
|
|
124
128
|
scale: (existing === null || existing === void 0 ? void 0 : existing.scale) || null,
|
|
125
129
|
special: special,
|
|
126
130
|
note: field.note,
|
|
127
|
-
alias: (
|
|
131
|
+
alias: (_e = existing === null || existing === void 0 ? void 0 : existing.alias) !== null && _e !== void 0 ? _e : true,
|
|
132
|
+
validation: (_f = validation) !== null && _f !== void 0 ? _f : null,
|
|
128
133
|
};
|
|
129
134
|
}
|
|
130
135
|
const relationsService = new services_1.RelationsService({ knex: database, schema: result });
|
package/dist/utils/track.js
CHANGED
|
@@ -12,6 +12,7 @@ const os_1 = __importDefault(require("os"));
|
|
|
12
12
|
const package_json_1 = require("../../package.json");
|
|
13
13
|
const env_1 = __importDefault(require("../env"));
|
|
14
14
|
const logger_1 = __importDefault(require("../logger"));
|
|
15
|
+
const utils_1 = require("@directus/shared/utils");
|
|
15
16
|
async function track(event) {
|
|
16
17
|
if (env_1.default.TELEMETRY !== false) {
|
|
17
18
|
const info = await getEnvInfo(event);
|
|
@@ -60,7 +61,7 @@ async function getEnvInfo(event) {
|
|
|
60
61
|
transport: env_1.default.EMAIL_TRANSPORT,
|
|
61
62
|
},
|
|
62
63
|
auth: {
|
|
63
|
-
providers: env_1.default.AUTH_PROVIDERS
|
|
64
|
+
providers: (0, utils_1.toArray)(env_1.default.AUTH_PROVIDERS)
|
|
64
65
|
.map((v) => v.trim())
|
|
65
66
|
.filter((v) => v),
|
|
66
67
|
},
|
|
@@ -69,7 +70,7 @@ async function getEnvInfo(event) {
|
|
|
69
70
|
}
|
|
70
71
|
function getStorageDrivers() {
|
|
71
72
|
const drivers = [];
|
|
72
|
-
const locations = env_1.default.STORAGE_LOCATIONS
|
|
73
|
+
const locations = (0, utils_1.toArray)(env_1.default.STORAGE_LOCATIONS)
|
|
73
74
|
.map((v) => v.trim())
|
|
74
75
|
.filter((v) => v);
|
|
75
76
|
for (const location of locations) {
|
package/dist/utils/url.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare class Url {
|
|
|
9
9
|
isAbsolute(): boolean;
|
|
10
10
|
isProtocolRelative(): boolean;
|
|
11
11
|
isRootRelative(): boolean;
|
|
12
|
-
addPath(...paths: string[]): Url;
|
|
12
|
+
addPath(...paths: (string | number)[]): Url;
|
|
13
13
|
setQuery(key: string, value: string): Url;
|
|
14
14
|
toString({ rootRelative }?: {
|
|
15
15
|
rootRelative: boolean;
|
package/dist/utils/url.js
CHANGED
|
@@ -28,7 +28,7 @@ class Url {
|
|
|
28
28
|
return this.protocol === null && this.host === null;
|
|
29
29
|
}
|
|
30
30
|
addPath(...paths) {
|
|
31
|
-
const pathToAdd = paths.flatMap((p) => p.split('/')).filter((p) => p !== '');
|
|
31
|
+
const pathToAdd = paths.flatMap((p) => String(p).split('/')).filter((p) => p !== '');
|
|
32
32
|
for (const pathSegment of pathToAdd) {
|
|
33
33
|
if (pathSegment === '..') {
|
|
34
34
|
this.path.pop();
|
|
@@ -9,6 +9,7 @@ const logger_1 = __importDefault(require("../logger"));
|
|
|
9
9
|
const fs_extra_1 = require("fs-extra");
|
|
10
10
|
const fs_1 = require("fs");
|
|
11
11
|
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const utils_1 = require("@directus/shared/utils");
|
|
12
13
|
async function validateStorage() {
|
|
13
14
|
if (env_1.default.DB_CLIENT === 'sqlite3') {
|
|
14
15
|
try {
|
|
@@ -18,7 +19,8 @@ async function validateStorage() {
|
|
|
18
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
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`]);
|
|
23
|
+
if (usedStorageDrivers.includes('local')) {
|
|
22
24
|
try {
|
|
23
25
|
await (0, fs_extra_1.access)(env_1.default.STORAGE_LOCAL_ROOT, fs_1.constants.R_OK | fs_1.constants.W_OK);
|
|
24
26
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "directus",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.8.0",
|
|
4
4
|
"license": "GPL-3.0-only",
|
|
5
5
|
"homepage": "https://github.com/directus/directus#readme",
|
|
6
6
|
"description": "Directus is a real-time API and App dashboard for managing SQL database content.",
|
|
@@ -78,16 +78,16 @@
|
|
|
78
78
|
],
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"@aws-sdk/client-ses": "^3.40.0",
|
|
81
|
-
"@directus/app": "9.
|
|
82
|
-
"@directus/drive": "9.
|
|
83
|
-
"@directus/drive-azure": "9.
|
|
84
|
-
"@directus/drive-gcs": "9.
|
|
85
|
-
"@directus/drive-s3": "9.
|
|
86
|
-
"@directus/extensions-sdk": "9.
|
|
87
|
-
"@directus/format-title": "9.
|
|
88
|
-
"@directus/schema": "9.
|
|
89
|
-
"@directus/shared": "9.
|
|
90
|
-
"@directus/specs": "9.
|
|
81
|
+
"@directus/app": "9.8.0",
|
|
82
|
+
"@directus/drive": "9.8.0",
|
|
83
|
+
"@directus/drive-azure": "9.8.0",
|
|
84
|
+
"@directus/drive-gcs": "9.8.0",
|
|
85
|
+
"@directus/drive-s3": "9.8.0",
|
|
86
|
+
"@directus/extensions-sdk": "9.8.0",
|
|
87
|
+
"@directus/format-title": "9.8.0",
|
|
88
|
+
"@directus/schema": "9.8.0",
|
|
89
|
+
"@directus/shared": "9.8.0",
|
|
90
|
+
"@directus/specs": "9.8.0",
|
|
91
91
|
"@godaddy/terminus": "^4.9.0",
|
|
92
92
|
"@rollup/plugin-alias": "^3.1.9",
|
|
93
93
|
"@rollup/plugin-virtual": "^2.0.3",
|
|
@@ -173,7 +173,7 @@
|
|
|
173
173
|
"sqlite3": "^5.0.2",
|
|
174
174
|
"tedious": "^13.0.0"
|
|
175
175
|
},
|
|
176
|
-
"gitHead": "
|
|
176
|
+
"gitHead": "2a6db01c42dd1d7524962e7153d1d7e1bd63fb2f",
|
|
177
177
|
"devDependencies": {
|
|
178
178
|
"@types/async": "3.2.10",
|
|
179
179
|
"@types/body-parser": "1.19.2",
|