directus 9.0.0 → 9.1.2
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/app.js +8 -4
- package/dist/auth/drivers/ldap.js +9 -13
- package/dist/auth/drivers/oauth2.d.ts +1 -1
- package/dist/auth/drivers/oauth2.js +3 -3
- package/dist/auth/drivers/openid.d.ts +1 -1
- package/dist/auth/drivers/openid.js +9 -3
- package/dist/controllers/notifications.d.ts +2 -0
- package/dist/controllers/notifications.js +147 -0
- package/dist/database/helpers/geometry.js +4 -1
- package/dist/database/migrations/20211103B-update-special-geometry.js +2 -2
- package/dist/database/migrations/20211118A-add-notifications.d.ts +3 -0
- package/dist/database/migrations/20211118A-add-notifications.js +28 -0
- package/dist/database/system-data/app-access-permissions/app-access-permissions.yaml +14 -0
- package/dist/database/system-data/collections/collections.yaml +2 -0
- package/dist/database/system-data/fields/notifications.yaml +12 -0
- package/dist/database/system-data/fields/settings.yaml +7 -7
- package/dist/database/system-data/fields/users.yaml +5 -0
- package/dist/database/system-data/fields/webhooks.yaml +4 -4
- package/dist/database/system-data/relations/relations.yaml +6 -0
- package/dist/mailer.js +12 -3
- package/dist/middleware/get-permissions.js +3 -102
- package/dist/server.js +2 -2
- package/dist/services/activity.d.ts +7 -5
- package/dist/services/activity.js +82 -3
- package/dist/services/authentication.js +15 -1
- package/dist/services/collections.js +12 -1
- package/dist/services/graphql.js +3 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +1 -0
- package/dist/services/mail/index.js +2 -2
- package/dist/services/mail/templates/base.liquid +153 -85
- package/dist/services/mail/templates/password-reset.liquid +3 -2
- package/dist/services/mail/templates/user-invitation.liquid +4 -4
- package/dist/services/notifications.d.ts +12 -0
- package/dist/services/notifications.js +41 -0
- package/dist/services/users.js +1 -0
- package/dist/types/collection.d.ts +1 -0
- package/dist/utils/apply-query.js +10 -7
- package/dist/utils/apply-snapshot.js +2 -2
- package/dist/utils/get-local-type.js +12 -7
- package/dist/utils/get-permissions.d.ts +3 -0
- package/dist/utils/get-permissions.js +106 -0
- package/dist/utils/md.d.ts +4 -0
- package/dist/utils/md.js +15 -0
- package/dist/utils/sanitize-query.js +3 -3
- package/dist/utils/user-name.d.ts +2 -0
- package/dist/utils/user-name.js +16 -0
- package/package.json +27 -23
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
{% block content %}
|
|
3
3
|
|
|
4
4
|
<p>
|
|
5
|
-
|
|
5
|
+
You have been invited to join <i>{{ projectName }}</i>. Please click the button below to accept this invitation and join the project:
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p style="text-align: center; padding: 20px 0;">
|
|
9
9
|
<a href="{{ url }}">
|
|
10
|
-
Join {{ projectName }}
|
|
10
|
+
<b>Join {{ projectName }}</b>
|
|
11
11
|
</a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
<p>
|
|
15
|
-
Thank
|
|
16
|
-
{{ projectName }}
|
|
15
|
+
Thank you,<br>
|
|
16
|
+
The {{ projectName }} Team
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
{% endblock %}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { UsersService, MailService } from '.';
|
|
2
|
+
import { AbstractServiceOptions, PrimaryKey } from '../types';
|
|
3
|
+
import { ItemsService, MutationOptions } from './items';
|
|
4
|
+
import { Notification } from '@directus/shared/types';
|
|
5
|
+
export declare class NotificationsService extends ItemsService {
|
|
6
|
+
usersService: UsersService;
|
|
7
|
+
mailService: MailService;
|
|
8
|
+
constructor(options: AbstractServiceOptions);
|
|
9
|
+
createOne(data: Partial<Notification>, opts?: MutationOptions): Promise<PrimaryKey>;
|
|
10
|
+
createMany(data: Partial<Notification>[], opts?: MutationOptions): Promise<PrimaryKey[]>;
|
|
11
|
+
sendEmail(data: Partial<Notification>): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotificationsService = void 0;
|
|
4
|
+
const _1 = require(".");
|
|
5
|
+
const items_1 = require("./items");
|
|
6
|
+
const md_1 = require("../utils/md");
|
|
7
|
+
class NotificationsService extends items_1.ItemsService {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
super('directus_notifications', options);
|
|
10
|
+
this.usersService = new _1.UsersService({ schema: this.schema });
|
|
11
|
+
this.mailService = new _1.MailService({ schema: this.schema, accountability: this.accountability });
|
|
12
|
+
}
|
|
13
|
+
async createOne(data, opts) {
|
|
14
|
+
await this.sendEmail(data);
|
|
15
|
+
return super.createOne(data, opts);
|
|
16
|
+
}
|
|
17
|
+
async createMany(data, opts) {
|
|
18
|
+
for (const notification of data) {
|
|
19
|
+
await this.sendEmail(notification);
|
|
20
|
+
}
|
|
21
|
+
return super.createMany(data, opts);
|
|
22
|
+
}
|
|
23
|
+
async sendEmail(data) {
|
|
24
|
+
if (data.recipient) {
|
|
25
|
+
const user = await this.usersService.readOne(data.recipient, { fields: ['email', 'email_notifications'] });
|
|
26
|
+
if (user.email && user.email_notifications === true) {
|
|
27
|
+
await this.mailService.send({
|
|
28
|
+
template: {
|
|
29
|
+
name: 'base',
|
|
30
|
+
data: {
|
|
31
|
+
html: data.message ? (0, md_1.md)(data.message) : '',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
to: user.email,
|
|
35
|
+
subject: data.subject,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.NotificationsService = NotificationsService;
|
package/dist/services/users.js
CHANGED
|
@@ -181,6 +181,7 @@ class UsersService extends items_1.ItemsService {
|
|
|
181
181
|
*/
|
|
182
182
|
async deleteMany(keys, opts) {
|
|
183
183
|
await this.checkRemainingAdminExistence(keys);
|
|
184
|
+
await this.knex('directus_notifications').update({ sender: null }).whereIn('sender', keys);
|
|
184
185
|
await super.deleteMany(keys, opts);
|
|
185
186
|
return keys;
|
|
186
187
|
}
|
|
@@ -9,6 +9,7 @@ export declare type CollectionMeta = {
|
|
|
9
9
|
translations: Record<string, string>;
|
|
10
10
|
item_duplication_fields: string[] | null;
|
|
11
11
|
accountability: 'all' | 'accountability' | null;
|
|
12
|
+
group: string | null;
|
|
12
13
|
};
|
|
13
14
|
export declare type Collection = {
|
|
14
15
|
collection: string;
|
|
@@ -53,18 +53,21 @@ function applyQuery(knex, collection, dbQuery, query, schema, subQuery = false)
|
|
|
53
53
|
if (query.union && query.union[1].length > 0) {
|
|
54
54
|
const [field, keys] = query.union;
|
|
55
55
|
const queries = keys.map((key) => {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
filter
|
|
56
|
+
const unionFilter = { [field]: { _eq: key } };
|
|
57
|
+
let filter = (0, lodash_1.cloneDeep)(query.filter);
|
|
58
|
+
if (filter) {
|
|
59
|
+
if ('_and' in filter) {
|
|
60
|
+
filter._and.push(unionFilter);
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
63
63
|
filter = {
|
|
64
|
-
_and: [
|
|
64
|
+
_and: [filter, unionFilter],
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
+
else {
|
|
69
|
+
filter = unionFilter;
|
|
70
|
+
}
|
|
68
71
|
return knex.select('*').from(applyFilter(knex, schema, dbQuery.clone(), filter, collection, subQuery).as('foo'));
|
|
69
72
|
});
|
|
70
73
|
dbQuery = knex.unionAll(queries);
|
|
@@ -164,7 +167,7 @@ function applyFilter(knex, schema, rootQuery, rootFilter, collection, subQuery =
|
|
|
164
167
|
}
|
|
165
168
|
dbQuery.leftJoin({ [alias]: pathScope }, (joinClause) => {
|
|
166
169
|
joinClause
|
|
167
|
-
.on(`${parentAlias || parentCollection}.${relation.field}`, '=', knex.raw(`CAST(?? AS
|
|
170
|
+
.on(`${parentAlias || parentCollection}.${relation.field}`, '=', knex.raw(`CAST(?? AS CHAR(255))`, `${alias}.${schema.collections[pathScope].primary}`))
|
|
168
171
|
.andOnVal(relation.meta.one_collection_field, '=', pathScope);
|
|
169
172
|
});
|
|
170
173
|
}
|
|
@@ -72,7 +72,7 @@ async function applySnapshot(snapshot, options) {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
const relationsService = new services_1.RelationsService({ knex: trx, schema: await (0, get_schema_1.getSchema)({ database: trx }) });
|
|
75
|
-
for (const { collection, field, diff } of snapshotDiff.relations) {
|
|
75
|
+
for (const { collection, field, diff, related_collection } of snapshotDiff.relations) {
|
|
76
76
|
if ((diff === null || diff === void 0 ? void 0 : diff[0].kind) === 'N') {
|
|
77
77
|
await relationsService.createOne(diff[0].rhs);
|
|
78
78
|
}
|
|
@@ -82,7 +82,7 @@ async function applySnapshot(snapshot, options) {
|
|
|
82
82
|
return acc;
|
|
83
83
|
(0, lodash_1.set)(acc, edit.path, edit.rhs);
|
|
84
84
|
return acc;
|
|
85
|
-
}, {});
|
|
85
|
+
}, { collection, field, related_collection });
|
|
86
86
|
await relationsService.updateOne(collection, field, updates);
|
|
87
87
|
}
|
|
88
88
|
if ((diff === null || diff === void 0 ? void 0 : diff[0].kind) === 'D') {
|
|
@@ -53,8 +53,10 @@ const localTypeMap = {
|
|
|
53
53
|
blob: 'binary',
|
|
54
54
|
mediumblob: 'binary',
|
|
55
55
|
'int unsigned': 'integer',
|
|
56
|
-
'tinyint
|
|
57
|
-
'
|
|
56
|
+
'tinyint unsigned': 'integer',
|
|
57
|
+
'smallint unsigned': 'integer',
|
|
58
|
+
'mediumint unsigned': 'integer',
|
|
59
|
+
'bigint unsigned': 'integer',
|
|
58
60
|
// MS SQL
|
|
59
61
|
bit: 'boolean',
|
|
60
62
|
smallmoney: 'float',
|
|
@@ -100,7 +102,10 @@ const localTypeMap = {
|
|
|
100
102
|
function getLocalType(column, field) {
|
|
101
103
|
const database = (0, database_2.default)();
|
|
102
104
|
const databaseClient = (0, database_1.getDatabaseClient)(database);
|
|
103
|
-
|
|
105
|
+
if (!column)
|
|
106
|
+
return 'alias';
|
|
107
|
+
const dataType = column.data_type.toLowerCase();
|
|
108
|
+
const type = localTypeMap[dataType.split('(')[0]];
|
|
104
109
|
const special = field === null || field === void 0 ? void 0 : field.special;
|
|
105
110
|
if (special) {
|
|
106
111
|
if (special.includes('json'))
|
|
@@ -111,20 +116,20 @@ function getLocalType(column, field) {
|
|
|
111
116
|
return 'csv';
|
|
112
117
|
if (special.includes('uuid'))
|
|
113
118
|
return 'uuid';
|
|
114
|
-
if (type.startsWith('geometry')) {
|
|
119
|
+
if (type === null || type === void 0 ? void 0 : type.startsWith('geometry')) {
|
|
115
120
|
return special[0] || 'geometry';
|
|
116
121
|
}
|
|
117
122
|
}
|
|
118
123
|
/** Handle Postgres numeric decimals */
|
|
119
|
-
if (
|
|
124
|
+
if (dataType === 'numeric' && column.numeric_precision !== null && column.numeric_scale !== null) {
|
|
120
125
|
return 'decimal';
|
|
121
126
|
}
|
|
122
127
|
/** Handle MS SQL varchar(MAX) (eg TEXT) types */
|
|
123
|
-
if (
|
|
128
|
+
if (dataType === 'nvarchar(MAX)') {
|
|
124
129
|
return 'text';
|
|
125
130
|
}
|
|
126
131
|
/** Handle Boolean as TINYINT and edgecase MySQL where it still is just tinyint */
|
|
127
|
-
if (
|
|
132
|
+
if (databaseClient === 'mysql' && dataType === 'tinyint(1)') {
|
|
128
133
|
return 'boolean';
|
|
129
134
|
}
|
|
130
135
|
return type !== null && type !== void 0 ? type : 'unknown';
|
|
@@ -0,0 +1,106 @@
|
|
|
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.getPermissions = void 0;
|
|
7
|
+
const utils_1 = require("@directus/shared/utils");
|
|
8
|
+
const lodash_1 = require("lodash");
|
|
9
|
+
const database_1 = __importDefault(require("../database"));
|
|
10
|
+
const app_access_permissions_1 = require("../database/system-data/app-access-permissions");
|
|
11
|
+
const merge_permissions_1 = require("../utils/merge-permissions");
|
|
12
|
+
const users_1 = require("../services/users");
|
|
13
|
+
const roles_1 = require("../services/roles");
|
|
14
|
+
const cache_1 = require("../cache");
|
|
15
|
+
const object_hash_1 = __importDefault(require("object-hash"));
|
|
16
|
+
const env_1 = __importDefault(require("../env"));
|
|
17
|
+
async function getPermissions(accountability, schema) {
|
|
18
|
+
const database = (0, database_1.default)();
|
|
19
|
+
const { systemCache } = (0, cache_1.getCache)();
|
|
20
|
+
let permissions = [];
|
|
21
|
+
const { user, role, app, admin } = accountability;
|
|
22
|
+
const cacheKey = `permissions-${(0, object_hash_1.default)({ user, role, app, admin })}`;
|
|
23
|
+
if (env_1.default.CACHE_PERMISSIONS !== false) {
|
|
24
|
+
const cachedPermissions = await systemCache.get(cacheKey);
|
|
25
|
+
if (cachedPermissions) {
|
|
26
|
+
return cachedPermissions;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (accountability.admin !== true) {
|
|
30
|
+
const permissionsForRole = await database
|
|
31
|
+
.select('*')
|
|
32
|
+
.from('directus_permissions')
|
|
33
|
+
.where({ role: accountability.role });
|
|
34
|
+
const requiredPermissionData = {
|
|
35
|
+
$CURRENT_USER: [],
|
|
36
|
+
$CURRENT_ROLE: [],
|
|
37
|
+
};
|
|
38
|
+
permissions = permissionsForRole.map((permissionRaw) => {
|
|
39
|
+
const permission = (0, lodash_1.cloneDeep)(permissionRaw);
|
|
40
|
+
if (permission.permissions && typeof permission.permissions === 'string') {
|
|
41
|
+
permission.permissions = JSON.parse(permission.permissions);
|
|
42
|
+
}
|
|
43
|
+
else if (permission.permissions === null) {
|
|
44
|
+
permission.permissions = {};
|
|
45
|
+
}
|
|
46
|
+
if (permission.validation && typeof permission.validation === 'string') {
|
|
47
|
+
permission.validation = JSON.parse(permission.validation);
|
|
48
|
+
}
|
|
49
|
+
else if (permission.validation === null) {
|
|
50
|
+
permission.validation = {};
|
|
51
|
+
}
|
|
52
|
+
if (permission.presets && typeof permission.presets === 'string') {
|
|
53
|
+
permission.presets = JSON.parse(permission.presets);
|
|
54
|
+
}
|
|
55
|
+
else if (permission.presets === null) {
|
|
56
|
+
permission.presets = {};
|
|
57
|
+
}
|
|
58
|
+
if (permission.fields && typeof permission.fields === 'string') {
|
|
59
|
+
permission.fields = permission.fields.split(',');
|
|
60
|
+
}
|
|
61
|
+
else if (permission.fields === null) {
|
|
62
|
+
permission.fields = [];
|
|
63
|
+
}
|
|
64
|
+
const extractPermissionData = (val) => {
|
|
65
|
+
if (typeof val === 'string' && val.startsWith('$CURRENT_USER.')) {
|
|
66
|
+
requiredPermissionData.$CURRENT_USER.push(val.replace('$CURRENT_USER.', ''));
|
|
67
|
+
}
|
|
68
|
+
if (typeof val === 'string' && val.startsWith('$CURRENT_ROLE.')) {
|
|
69
|
+
requiredPermissionData.$CURRENT_ROLE.push(val.replace('$CURRENT_ROLE.', ''));
|
|
70
|
+
}
|
|
71
|
+
return val;
|
|
72
|
+
};
|
|
73
|
+
(0, utils_1.deepMap)(permission.permissions, extractPermissionData);
|
|
74
|
+
(0, utils_1.deepMap)(permission.validation, extractPermissionData);
|
|
75
|
+
(0, utils_1.deepMap)(permission.presets, extractPermissionData);
|
|
76
|
+
return permission;
|
|
77
|
+
});
|
|
78
|
+
if (accountability.app === true) {
|
|
79
|
+
permissions = (0, merge_permissions_1.mergePermissions)(permissions, app_access_permissions_1.appAccessMinimalPermissions.map((perm) => ({ ...perm, role: accountability.role })));
|
|
80
|
+
}
|
|
81
|
+
const usersService = new users_1.UsersService({ schema });
|
|
82
|
+
const rolesService = new roles_1.RolesService({ schema });
|
|
83
|
+
const filterContext = {};
|
|
84
|
+
if (accountability.user && requiredPermissionData.$CURRENT_USER.length > 0) {
|
|
85
|
+
filterContext.$CURRENT_USER = await usersService.readOne(accountability.user, {
|
|
86
|
+
fields: requiredPermissionData.$CURRENT_USER,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (accountability.role && requiredPermissionData.$CURRENT_ROLE.length > 0) {
|
|
90
|
+
filterContext.$CURRENT_ROLE = await rolesService.readOne(accountability.role, {
|
|
91
|
+
fields: requiredPermissionData.$CURRENT_ROLE,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
permissions = permissions.map((permission) => {
|
|
95
|
+
permission.permissions = (0, utils_1.parseFilter)(permission.permissions, accountability, filterContext);
|
|
96
|
+
permission.validation = (0, utils_1.parseFilter)(permission.validation, accountability, filterContext);
|
|
97
|
+
permission.presets = (0, utils_1.parseFilter)(permission.presets, accountability, filterContext);
|
|
98
|
+
return permission;
|
|
99
|
+
});
|
|
100
|
+
if (env_1.default.CACHE_PERMISSIONS !== false) {
|
|
101
|
+
await systemCache.set(cacheKey, permissions);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return permissions;
|
|
105
|
+
}
|
|
106
|
+
exports.getPermissions = getPermissions;
|
package/dist/utils/md.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
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.md = void 0;
|
|
7
|
+
const marked_1 = require("marked");
|
|
8
|
+
const sanitize_html_1 = __importDefault(require("sanitize-html"));
|
|
9
|
+
/**
|
|
10
|
+
* Render and sanitize a markdown string
|
|
11
|
+
*/
|
|
12
|
+
function md(str) {
|
|
13
|
+
return (0, sanitize_html_1.default)((0, marked_1.parse)(str));
|
|
14
|
+
}
|
|
15
|
+
exports.md = md;
|
|
@@ -117,8 +117,7 @@ function sanitizeFilter(rawFilter, accountability) {
|
|
|
117
117
|
return val;
|
|
118
118
|
}
|
|
119
119
|
});
|
|
120
|
-
|
|
121
|
-
return filters;
|
|
120
|
+
return (0, utils_1.parseFilter)(filters, accountability);
|
|
122
121
|
}
|
|
123
122
|
function sanitizeLimit(rawLimit) {
|
|
124
123
|
if (rawLimit === undefined || rawLimit === null)
|
|
@@ -165,7 +164,8 @@ function sanitizeDeep(deep, accountability) {
|
|
|
165
164
|
const parsedSubQuery = sanitizeQuery({ [key.substring(1)]: value }, accountability);
|
|
166
165
|
// ...however we want to keep them for the nested structure of deep, otherwise there's no
|
|
167
166
|
// way of knowing when to keep nesting and when to stop
|
|
168
|
-
|
|
167
|
+
const [parsedKey, parsedValue] = Object.entries(parsedSubQuery)[0];
|
|
168
|
+
parsedLevel[`_${parsedKey}`] = parsedValue;
|
|
169
169
|
}
|
|
170
170
|
else {
|
|
171
171
|
parse(value, [...path, key]);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.userName = void 0;
|
|
4
|
+
function userName(user) {
|
|
5
|
+
if (user.first_name && user.last_name) {
|
|
6
|
+
return `${user.first_name} ${user.last_name}`;
|
|
7
|
+
}
|
|
8
|
+
if (user.first_name) {
|
|
9
|
+
return user.first_name;
|
|
10
|
+
}
|
|
11
|
+
if (user.email) {
|
|
12
|
+
return user.email;
|
|
13
|
+
}
|
|
14
|
+
return 'Unknown User';
|
|
15
|
+
}
|
|
16
|
+
exports.userName = userName;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "directus",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.1.2",
|
|
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.",
|
|
@@ -75,16 +75,17 @@
|
|
|
75
75
|
"example.env"
|
|
76
76
|
],
|
|
77
77
|
"dependencies": {
|
|
78
|
-
"@
|
|
79
|
-
"@directus/
|
|
80
|
-
"@directus/drive
|
|
81
|
-
"@directus/drive-
|
|
82
|
-
"@directus/drive-
|
|
83
|
-
"@directus/
|
|
84
|
-
"@directus/
|
|
85
|
-
"@directus/
|
|
86
|
-
"@directus/
|
|
87
|
-
"@directus/
|
|
78
|
+
"@aws-sdk/client-ses": "^3.40.0",
|
|
79
|
+
"@directus/app": "9.1.2",
|
|
80
|
+
"@directus/drive": "9.1.2",
|
|
81
|
+
"@directus/drive-azure": "9.1.2",
|
|
82
|
+
"@directus/drive-gcs": "9.1.2",
|
|
83
|
+
"@directus/drive-s3": "9.1.2",
|
|
84
|
+
"@directus/extensions-sdk": "9.1.2",
|
|
85
|
+
"@directus/format-title": "9.1.2",
|
|
86
|
+
"@directus/schema": "9.1.2",
|
|
87
|
+
"@directus/shared": "9.1.2",
|
|
88
|
+
"@directus/specs": "9.1.2",
|
|
88
89
|
"@godaddy/terminus": "^4.9.0",
|
|
89
90
|
"@rollup/plugin-alias": "^3.1.2",
|
|
90
91
|
"@rollup/plugin-virtual": "^2.0.3",
|
|
@@ -126,6 +127,7 @@
|
|
|
126
127
|
"liquidjs": "^9.25.0",
|
|
127
128
|
"lodash": "^4.17.21",
|
|
128
129
|
"macos-release": "^2.4.1",
|
|
130
|
+
"marked": "^4.0.3",
|
|
129
131
|
"mime-types": "^2.1.31",
|
|
130
132
|
"ms": "^2.1.3",
|
|
131
133
|
"nanoid": "^3.1.23",
|
|
@@ -144,6 +146,7 @@
|
|
|
144
146
|
"rate-limiter-flexible": "^2.2.2",
|
|
145
147
|
"resolve-cwd": "^3.0.0",
|
|
146
148
|
"rollup": "^2.52.1",
|
|
149
|
+
"sanitize-html": "^2.6.0",
|
|
147
150
|
"sharp": "^0.29.0",
|
|
148
151
|
"stream-json": "^1.7.1",
|
|
149
152
|
"supertest": "^6.1.6",
|
|
@@ -166,40 +169,41 @@
|
|
|
166
169
|
"sqlite3": "^5.0.2",
|
|
167
170
|
"tedious": "^13.0.0"
|
|
168
171
|
},
|
|
169
|
-
"gitHead": "
|
|
172
|
+
"gitHead": "9bf033c18dd5bdf6fe4058d915083fd5ca393b05",
|
|
170
173
|
"devDependencies": {
|
|
171
|
-
"@types/async": "3.2.
|
|
174
|
+
"@types/async": "3.2.10",
|
|
172
175
|
"@types/atob": "2.1.2",
|
|
173
|
-
"@types/body-parser": "1.19.
|
|
176
|
+
"@types/body-parser": "1.19.2",
|
|
174
177
|
"@types/busboy": "0.3.1",
|
|
175
178
|
"@types/cookie-parser": "1.4.2",
|
|
176
179
|
"@types/cors": "2.8.12",
|
|
177
180
|
"@types/deep-diff": "1.0.1",
|
|
178
181
|
"@types/destroy": "1.0.0",
|
|
179
182
|
"@types/express": "4.17.13",
|
|
180
|
-
"@types/express-pino-logger": "4.0.
|
|
183
|
+
"@types/express-pino-logger": "4.0.3",
|
|
181
184
|
"@types/express-session": "1.17.4",
|
|
182
185
|
"@types/flat": "5.0.2",
|
|
183
186
|
"@types/fs-extra": "9.0.13",
|
|
184
187
|
"@types/inquirer": "8.1.3",
|
|
185
|
-
"@types/jest": "27.0.
|
|
186
|
-
"@types/js-yaml": "4.0.
|
|
188
|
+
"@types/jest": "27.0.3",
|
|
189
|
+
"@types/js-yaml": "4.0.5",
|
|
187
190
|
"@types/json2csv": "5.0.3",
|
|
188
|
-
"@types/jsonwebtoken": "8.5.
|
|
191
|
+
"@types/jsonwebtoken": "8.5.6",
|
|
189
192
|
"@types/keyv": "3.1.3",
|
|
190
193
|
"@types/ldapjs": "2.2.2",
|
|
191
|
-
"@types/lodash": "4.14.
|
|
194
|
+
"@types/lodash": "4.14.177",
|
|
192
195
|
"@types/mime-types": "2.1.1",
|
|
193
196
|
"@types/ms": "0.7.31",
|
|
194
|
-
"@types/node": "16.11.
|
|
197
|
+
"@types/node": "16.11.9",
|
|
195
198
|
"@types/node-cron": "2.0.5",
|
|
196
199
|
"@types/nodemailer": "6.4.4",
|
|
197
200
|
"@types/object-hash": "2.2.1",
|
|
198
201
|
"@types/qs": "6.9.7",
|
|
199
|
-
"@types/
|
|
202
|
+
"@types/sanitize-html": "^2.5.0",
|
|
203
|
+
"@types/sharp": "0.29.4",
|
|
200
204
|
"@types/stream-json": "1.7.1",
|
|
201
205
|
"@types/supertest": "2.0.11",
|
|
202
|
-
"@types/uuid": "8.3.
|
|
206
|
+
"@types/uuid": "8.3.3",
|
|
203
207
|
"@types/uuid-validate": "0.0.1",
|
|
204
208
|
"@types/wellknown": "0.5.1",
|
|
205
209
|
"copyfiles": "2.4.1",
|
|
@@ -207,6 +211,6 @@
|
|
|
207
211
|
"jest": "27.3.1",
|
|
208
212
|
"ts-jest": "27.0.7",
|
|
209
213
|
"ts-node-dev": "1.1.8",
|
|
210
|
-
"typescript": "4.
|
|
214
|
+
"typescript": "4.5.2"
|
|
211
215
|
}
|
|
212
216
|
}
|