@directus/api 35.0.0 → 35.0.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/ai/chat/utils/chat-request-tool-to-ai-sdk-tool.js +3 -1
- package/dist/ai/mcp/server.js +4 -14
- package/dist/ai/tools/utils.js +23 -1
- package/dist/controllers/assets.js +56 -3
- package/dist/extensions/manager.js +31 -3
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.js +1 -1
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/chunks/benchmark.CYdenmiT.js +1 -1
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js +1 -1
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/chunks/index.CdQS2e2Q.js +1 -1
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/chunks/utils.XdZDrNZV.js +1 -1
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js +1 -1
- package/dist/node_modules/.pnpm/{vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.0.10_jiti@2.6.1_jsdom@2_4abc0aa80426c2cc5a9175f21e1d4ebb → vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768}/node_modules/vitest/dist/index.js +1 -1
- package/dist/services/assets.js +2 -0
- package/dist/services/files.js +10 -5
- package/dist/services/users.js +2 -2
- package/dist/test-utils/cache.js +2 -2
- package/dist/test-utils/controllers.js +2 -2
- package/dist/test-utils/database.js +2 -2
- package/dist/test-utils/emitter.js +2 -2
- package/dist/test-utils/env.js +2 -2
- package/dist/test-utils/knex.js +2 -2
- package/dist/test-utils/schema.js +2 -2
- package/dist/test-utils/services/fields-service.js +2 -2
- package/dist/test-utils/services/files-service.js +2 -2
- package/dist/test-utils/services/folders-service.js +2 -2
- package/dist/test-utils/services/items-service.js +2 -2
- package/dist/test-utils/storage.js +2 -2
- package/package.json +25 -25
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import "../../../packages/types/dist/index.js";
|
|
2
|
+
import { coerceJsonFields } from "../../tools/utils.js";
|
|
2
3
|
import { ALL_TOOLS } from "../../tools/index.js";
|
|
3
4
|
import { InvalidPayloadError } from "@directus/errors";
|
|
4
5
|
import { jsonSchema, tool, zodSchema } from "ai";
|
|
@@ -19,7 +20,8 @@ const chatRequestToolToAiSdkTool = ({ chatRequestTool, accountability, schema, t
|
|
|
19
20
|
inputSchema,
|
|
20
21
|
needsApproval,
|
|
21
22
|
execute: async (rawArgs) => {
|
|
22
|
-
const
|
|
23
|
+
const coercedArgs = coerceJsonFields(rawArgs);
|
|
24
|
+
const { error, data: args } = directusTool.validateSchema?.safeParse(coercedArgs) ?? { data: coercedArgs };
|
|
23
25
|
if (error) {
|
|
24
26
|
throw new InvalidPayloadError({ reason: fromZodError(error).message });
|
|
25
27
|
}
|
package/dist/ai/mcp/server.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { ItemsService } from "../../services/items.js";
|
|
2
|
+
import { coerceJsonFields } from "../tools/utils.js";
|
|
2
3
|
import { Url } from "../../utils/url.js";
|
|
3
4
|
import "../../services/index.js";
|
|
4
5
|
import { findMcpTool, getAllMcpTools } from "../tools/index.js";
|
|
5
6
|
import { DirectusTransport } from "./transport.js";
|
|
6
7
|
import { useEnv } from "@directus/env";
|
|
7
8
|
import { ForbiddenError, InvalidPayloadError, isDirectusError } from "@directus/errors";
|
|
8
|
-
import { isObject,
|
|
9
|
+
import { isObject, toArray } from "@directus/utils";
|
|
9
10
|
import { fromZodError } from "zod-validation-error";
|
|
10
11
|
import { z } from "zod";
|
|
11
12
|
import { render, tokenize } from "micromustache";
|
|
@@ -166,19 +167,8 @@ var DirectusMCP = class {
|
|
|
166
167
|
if (tool.name === "system-prompt") {
|
|
167
168
|
request.params.arguments = { promptOverride: this.systemPrompt };
|
|
168
169
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
"data",
|
|
172
|
-
"keys",
|
|
173
|
-
"query"
|
|
174
|
-
]) {
|
|
175
|
-
const arg = request.params.arguments[field];
|
|
176
|
-
if (typeof arg === "string") {
|
|
177
|
-
request.params.arguments[field] = parseJSON(arg);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
const { error, data: args } = tool.validateSchema?.safeParse(request.params.arguments) ?? { data: request.params.arguments };
|
|
170
|
+
const coercedArgs = request.params.arguments ? coerceJsonFields(request.params.arguments) : request.params.arguments;
|
|
171
|
+
const { error, data: args } = tool.validateSchema?.safeParse(coercedArgs) ?? { data: coercedArgs };
|
|
182
172
|
if (error) {
|
|
183
173
|
throw new InvalidPayloadError({ reason: fromZodError(error).message });
|
|
184
174
|
}
|
package/dist/ai/tools/utils.js
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import { sanitizeQuery } from "../../utils/sanitize-query.js";
|
|
2
|
+
import { parseJSON } from "@directus/utils";
|
|
2
3
|
|
|
3
4
|
//#region src/ai/tools/utils.ts
|
|
5
|
+
const JSON_COERCE_FIELDS = [
|
|
6
|
+
"data",
|
|
7
|
+
"keys",
|
|
8
|
+
"query",
|
|
9
|
+
"headers"
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* LLMs sometimes return object/array arguments as stringified JSON.
|
|
13
|
+
* Coerce known fields back to native values before validation.
|
|
14
|
+
*/
|
|
15
|
+
function coerceJsonFields(args) {
|
|
16
|
+
const coerced = { ...args };
|
|
17
|
+
for (const field of JSON_COERCE_FIELDS) {
|
|
18
|
+
if (typeof coerced[field] === "string") {
|
|
19
|
+
try {
|
|
20
|
+
coerced[field] = parseJSON(coerced[field]);
|
|
21
|
+
} catch {}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return coerced;
|
|
25
|
+
}
|
|
4
26
|
/**
|
|
5
27
|
* Build a sanitized query object from a tool's args payload.
|
|
6
28
|
* - Ensures fields defaults to '*' when not provided
|
|
@@ -19,4 +41,4 @@ async function buildSanitizedQueryFromArgs(args, schema, accountability) {
|
|
|
19
41
|
}
|
|
20
42
|
|
|
21
43
|
//#endregion
|
|
22
|
-
export { buildSanitizedQueryFromArgs };
|
|
44
|
+
export { buildSanitizedQueryFromArgs, coerceJsonFields };
|
|
@@ -24,6 +24,7 @@ const router = Router();
|
|
|
24
24
|
const env = useEnv();
|
|
25
25
|
router.use(use_collection_default("directus_files"));
|
|
26
26
|
router.post("/folder/:pk", async_handler_default(async (req, res) => {
|
|
27
|
+
const logger = useLogger();
|
|
27
28
|
const service = new AssetsService({
|
|
28
29
|
accountability: req.accountability,
|
|
29
30
|
schema: req.schema
|
|
@@ -32,10 +33,33 @@ router.post("/folder/:pk", async_handler_default(async (req, res) => {
|
|
|
32
33
|
res.setHeader("Content-Type", "application/zip");
|
|
33
34
|
const folderName = `folder-${metadata["name"] ? metadata["name"] : "unknown"}-${getDateTimeFormatted()}.zip`;
|
|
34
35
|
res.setHeader("Content-Disposition", contentDisposition(folderName, { type: "attachment" }));
|
|
36
|
+
res.on("close", () => {
|
|
37
|
+
if (!res.writableEnded) {
|
|
38
|
+
archive.destroy();
|
|
39
|
+
archive.abort();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
35
42
|
archive.pipe(res);
|
|
36
|
-
|
|
43
|
+
try {
|
|
44
|
+
await complete();
|
|
45
|
+
} catch (error) {
|
|
46
|
+
logger.error(error, `Couldn't archive folder ${req.params["pk"]} to the client`);
|
|
47
|
+
archive.destroy();
|
|
48
|
+
if (!res.headersSent) {
|
|
49
|
+
res.removeHeader("Content-Type");
|
|
50
|
+
res.removeHeader("Content-Disposition");
|
|
51
|
+
res.removeHeader("Cache-Control");
|
|
52
|
+
res.status(500).json({ errors: [{
|
|
53
|
+
message: "An unexpected error occurred.",
|
|
54
|
+
extensions: { code: "INTERNAL_SERVER_ERROR" }
|
|
55
|
+
}] });
|
|
56
|
+
} else {
|
|
57
|
+
res.end();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
37
60
|
}));
|
|
38
61
|
router.post("/files/", async_handler_default(async (req, res) => {
|
|
62
|
+
const logger = useLogger();
|
|
39
63
|
const service = new AssetsService({
|
|
40
64
|
accountability: req.accountability,
|
|
41
65
|
schema: req.schema
|
|
@@ -47,8 +71,30 @@ router.post("/files/", async_handler_default(async (req, res) => {
|
|
|
47
71
|
const { archive, complete } = await service.zipFiles(data.ids);
|
|
48
72
|
res.setHeader("Content-Type", "application/zip");
|
|
49
73
|
res.setHeader("Content-Disposition", `attachment; filename="files-${getDateTimeFormatted()}.zip"`);
|
|
74
|
+
res.on("close", () => {
|
|
75
|
+
if (!res.writableEnded) {
|
|
76
|
+
archive.destroy();
|
|
77
|
+
archive.abort();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
50
80
|
archive.pipe(res);
|
|
51
|
-
|
|
81
|
+
try {
|
|
82
|
+
await complete();
|
|
83
|
+
} catch (error$1) {
|
|
84
|
+
logger.error(error$1, `Couldn't archive files to the client`);
|
|
85
|
+
archive.destroy();
|
|
86
|
+
if (!res.headersSent) {
|
|
87
|
+
res.removeHeader("Content-Type");
|
|
88
|
+
res.removeHeader("Content-Disposition");
|
|
89
|
+
res.removeHeader("Cache-Control");
|
|
90
|
+
res.status(500).json({ errors: [{
|
|
91
|
+
message: "An unexpected error occurred.",
|
|
92
|
+
extensions: { code: "INTERNAL_SERVER_ERROR" }
|
|
93
|
+
}] });
|
|
94
|
+
} else {
|
|
95
|
+
res.end();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
52
98
|
}));
|
|
53
99
|
router.get("/:pk/:filename?", async_handler_default(async (req, res, next) => {
|
|
54
100
|
const payloadService = new PayloadService("directus_settings", { schema: req.schema });
|
|
@@ -183,8 +229,15 @@ router.get("/:pk/:filename?", async_handler_default(async (req, res, next) => {
|
|
|
183
229
|
res.setHeader("Content-Length", stat.size);
|
|
184
230
|
return res.end();
|
|
185
231
|
}
|
|
186
|
-
|
|
232
|
+
const sourceStream = await stream();
|
|
233
|
+
res.on("close", () => {
|
|
234
|
+
if (!res.writableEnded) {
|
|
235
|
+
sourceStream.destroy();
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
sourceStream.on("error", (error) => {
|
|
187
239
|
logger.error(error, `Couldn't stream file ${file.id} to the client`);
|
|
240
|
+
sourceStream.destroy();
|
|
188
241
|
if (!res.headersSent) {
|
|
189
242
|
res.removeHeader("Content-Type");
|
|
190
243
|
res.removeHeader("Content-Disposition");
|
|
@@ -331,15 +331,43 @@ var ExtensionManager = class {
|
|
|
331
331
|
};
|
|
332
332
|
}
|
|
333
333
|
/**
|
|
334
|
+
* Check if a file path matches a watched extension's dist entrypoint
|
|
335
|
+
* by looking up the folder name in the existing extension maps
|
|
336
|
+
*/
|
|
337
|
+
isWatchedExtensionPath(filePath) {
|
|
338
|
+
const extensionDir = path.resolve(getExtensionsPath());
|
|
339
|
+
const folderName = path.relative(extensionDir, filePath).split(path.sep).shift();
|
|
340
|
+
if (!folderName) return false;
|
|
341
|
+
const extension = this.localExtensions.get(folderName);
|
|
342
|
+
if (!extension) return false;
|
|
343
|
+
const resolvedPath = path.resolve(filePath);
|
|
344
|
+
if (isTypeIn(extension, HYBRID_EXTENSION_TYPES) || extension.type === "bundle") {
|
|
345
|
+
return path.resolve(extension.path, extension.entrypoint.app) === resolvedPath || path.resolve(extension.path, extension.entrypoint.api) === resolvedPath;
|
|
346
|
+
}
|
|
347
|
+
return path.resolve(extension.path, extension.entrypoint) === resolvedPath;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
334
350
|
* Start the chokidar watcher for extensions on the local filesystem
|
|
335
351
|
*/
|
|
336
352
|
initializeWatcher() {
|
|
337
353
|
const logger = useLogger();
|
|
338
354
|
logger.info("Watching extensions for changes...");
|
|
339
|
-
const
|
|
340
|
-
|
|
355
|
+
const extensionDirPath = pathToRelativeUrl(getExtensionsPath());
|
|
356
|
+
const resolvedExtDir = path.resolve(extensionDirPath);
|
|
357
|
+
this.watcher = chokidar.watch([path.resolve("package.json"), extensionDirPath], {
|
|
341
358
|
ignoreInitial: true,
|
|
342
|
-
|
|
359
|
+
depth: 1,
|
|
360
|
+
ignored: (val, stats) => {
|
|
361
|
+
if (val.includes("node_modules")) return true;
|
|
362
|
+
if (!stats || stats.isDirectory()) return false;
|
|
363
|
+
if (val.endsWith("package.json")) {
|
|
364
|
+
const resolvedVal = path.resolve(val);
|
|
365
|
+
if (!resolvedVal.startsWith(resolvedExtDir + path.sep)) return false;
|
|
366
|
+
return path.dirname(resolvedVal) === resolvedExtDir;
|
|
367
|
+
}
|
|
368
|
+
if (this.isWatchedExtensionPath(val)) return false;
|
|
369
|
+
return true;
|
|
370
|
+
},
|
|
343
371
|
followSymlinks: os.platform() === "darwin" ? false : true
|
|
344
372
|
});
|
|
345
373
|
this.watcher.on("add", debounce(() => this.reload(), 500)).on("change", debounce(() => this.reload(), 650)).on("unlink", debounce(() => this.reload(), 2e3));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
1
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.js
|
|
2
2
|
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
3
3
|
function getDefaultExportFromCjs(x) {
|
|
4
4
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
@@ -5,7 +5,7 @@ import "../../../../../@vitest_runner@3.2.4/node_modules/@vitest/runner/dist/ind
|
|
|
5
5
|
import "../../../../../@vitest_runner@3.2.4/node_modules/@vitest/runner/dist/utils.js";
|
|
6
6
|
import { getWorkerState } from "./utils.XdZDrNZV.js";
|
|
7
7
|
|
|
8
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
8
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/benchmark.CYdenmiT.js
|
|
9
9
|
const benchFns = /* @__PURE__ */ new WeakMap();
|
|
10
10
|
const benchOptsMap = /* @__PURE__ */ new WeakMap();
|
|
11
11
|
function getBenchOptions(key) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
1
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
|
|
2
2
|
const RealDate = Date;
|
|
3
3
|
let now = null;
|
|
4
4
|
var MockDate = class MockDate extends RealDate {
|
|
@@ -6,7 +6,7 @@ import { createExpect, globalExpect, inject, vi, vitest } from "./vi.bdSIJ99Y.js
|
|
|
6
6
|
import { bench } from "./benchmark.CYdenmiT.js";
|
|
7
7
|
import { require_dist } from "../../../../../expect-type@1.2.2/node_modules/expect-type/dist/index.js";
|
|
8
8
|
|
|
9
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
9
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/index.CdQS2e2Q.js
|
|
10
10
|
var import_dist = /* @__PURE__ */ __toESM(require_dist(), 1);
|
|
11
11
|
const assertType = function assertType$1() {};
|
|
12
12
|
var VitestIndex = /* @__PURE__ */ Object.freeze({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getSafeTimers } from "../../../../../@vitest_utils@3.2.4/node_modules/@vitest/utils/dist/index.js";
|
|
2
2
|
|
|
3
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
3
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/utils.XdZDrNZV.js
|
|
4
4
|
const NAME_WORKER_STATE = "__vitest_worker__";
|
|
5
5
|
function getWorkerState() {
|
|
6
6
|
const workerState = globalThis[NAME_WORKER_STATE];
|
|
@@ -13,7 +13,7 @@ import { commonjsGlobal, getDefaultExportFromCjs } from "./_commonjsHelpers.BFTU
|
|
|
13
13
|
import { SnapshotClient, addSerializer, stripSnapshotIndentation } from "../../../../../@vitest_snapshot@3.2.4/node_modules/@vitest/snapshot/dist/index.js";
|
|
14
14
|
import { RealDate, mockDate, resetDate } from "./date.Bq6ZW5rf.js";
|
|
15
15
|
|
|
16
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
16
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js
|
|
17
17
|
const unsupported = [
|
|
18
18
|
"matchSnapshot",
|
|
19
19
|
"toMatchSnapshot",
|
|
@@ -17,7 +17,7 @@ import { bench } from "./chunks/benchmark.CYdenmiT.js";
|
|
|
17
17
|
import { require_dist } from "../../../../expect-type@1.2.2/node_modules/expect-type/dist/index.js";
|
|
18
18
|
import { assertType } from "./chunks/index.CdQS2e2Q.js";
|
|
19
19
|
|
|
20
|
-
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.
|
|
20
|
+
//#region ../node_modules/.pnpm/vitest@3.2.4_@types+node@22.13.14_@vitest+ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js
|
|
21
21
|
var import_dist = /* @__PURE__ */ __toESM(require_dist(), 1);
|
|
22
22
|
|
|
23
23
|
//#endregion
|
package/dist/services/assets.js
CHANGED
|
@@ -59,6 +59,7 @@ var AssetsService = class {
|
|
|
59
59
|
const deduper = new NameDeduper();
|
|
60
60
|
const storage = await getStorage();
|
|
61
61
|
for (const { id, folder, filename_download } of options.files) {
|
|
62
|
+
if (archive.destroyed) break;
|
|
62
63
|
const file = await this.sudoFilesService.readOne(id, { fields: [
|
|
63
64
|
"id",
|
|
64
65
|
"storage",
|
|
@@ -84,6 +85,7 @@ var AssetsService = class {
|
|
|
84
85
|
}
|
|
85
86
|
if (options.folders) {
|
|
86
87
|
for (const [, folder] of options.folders) {
|
|
88
|
+
if (archive.destroyed) break;
|
|
87
89
|
archive.append("", { name: folder + "/" });
|
|
88
90
|
}
|
|
89
91
|
}
|
package/dist/services/files.js
CHANGED
|
@@ -39,10 +39,15 @@ var FilesService = class FilesService extends ItemsService {
|
|
|
39
39
|
* Check whether a filename is unique.
|
|
40
40
|
*
|
|
41
41
|
* @param filename - The filename
|
|
42
|
+
* @param excludeId - The id of the existing file to exclude from the check
|
|
42
43
|
* @throws ForbiddenError if a match is found
|
|
43
44
|
*/
|
|
44
|
-
async checkUniqueFilename(filename) {
|
|
45
|
-
const
|
|
45
|
+
async checkUniqueFilename(filename, excludeId) {
|
|
46
|
+
const query = this.knex.select("filename_disk").from("directus_files").where({ filename_disk: filename });
|
|
47
|
+
if (excludeId) {
|
|
48
|
+
query.whereNot("id", excludeId);
|
|
49
|
+
}
|
|
50
|
+
const existingFile = await query.first();
|
|
46
51
|
if (existingFile) {
|
|
47
52
|
throw new ForbiddenError();
|
|
48
53
|
}
|
|
@@ -227,12 +232,12 @@ var FilesService = class FilesService extends ItemsService {
|
|
|
227
232
|
throw new InvalidPayloadError({ reason: `"type" is required` });
|
|
228
233
|
}
|
|
229
234
|
if (data.filename_disk) {
|
|
235
|
+
data.filename_disk = this.generateFilenamePath(data.filename_disk);
|
|
230
236
|
try {
|
|
231
237
|
await this.checkUniqueFilename(data.filename_disk);
|
|
232
238
|
} catch (err) {
|
|
233
239
|
opts.preMutationError = err;
|
|
234
240
|
}
|
|
235
|
-
data.filename_disk = this.generateFilenamePath(data.filename_disk);
|
|
236
241
|
}
|
|
237
242
|
const key = await super.createOne(data, opts);
|
|
238
243
|
return key;
|
|
@@ -242,12 +247,12 @@ var FilesService = class FilesService extends ItemsService {
|
|
|
242
247
|
*/
|
|
243
248
|
async updateMany(keys, data, opts = {}) {
|
|
244
249
|
if (keys.length === 1 && data.filename_disk) {
|
|
250
|
+
data.filename_disk = this.generateFilenamePath(data.filename_disk);
|
|
245
251
|
try {
|
|
246
|
-
await this.checkUniqueFilename(data.filename_disk);
|
|
252
|
+
await this.checkUniqueFilename(data.filename_disk, keys[0]);
|
|
247
253
|
} catch (err) {
|
|
248
254
|
opts.preMutationError = err;
|
|
249
255
|
}
|
|
250
|
-
data.filename_disk = this.generateFilenamePath(data.filename_disk);
|
|
251
256
|
const sudoFilesItemsService = new FilesService({
|
|
252
257
|
knex: this.knex,
|
|
253
258
|
schema: this.schema
|
package/dist/services/users.js
CHANGED
|
@@ -14,7 +14,7 @@ import { verifyJWT } from "../utils/jwt.js";
|
|
|
14
14
|
import { stall } from "../utils/stall.js";
|
|
15
15
|
import { SettingsService } from "./settings.js";
|
|
16
16
|
import { useEnv } from "@directus/env";
|
|
17
|
-
import { ForbiddenError, InvalidPayloadError, RecordNotUniqueError } from "@directus/errors";
|
|
17
|
+
import { ForbiddenError, InvalidInviteError, InvalidPayloadError, RecordNotUniqueError } from "@directus/errors";
|
|
18
18
|
import { getSimpleHash, toArray, validatePayload } from "@directus/utils";
|
|
19
19
|
import { isEmpty } from "lodash-es";
|
|
20
20
|
import { performance } from "perf_hooks";
|
|
@@ -314,7 +314,7 @@ var UsersService = class UsersService extends ItemsService {
|
|
|
314
314
|
if (scope !== "invite") throw new ForbiddenError();
|
|
315
315
|
const user = await this.getUserByEmail(email);
|
|
316
316
|
if (user?.status !== "invited") {
|
|
317
|
-
throw new
|
|
317
|
+
throw new InvalidInviteError();
|
|
318
318
|
}
|
|
319
319
|
const service = new UsersService({
|
|
320
320
|
knex: this.knex,
|
package/dist/test-utils/cache.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
|
|
4
4
|
//#region src/test-utils/cache.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
|
|
4
4
|
//#region src/test-utils/controllers.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
import { createMockKnex } from "./knex.js";
|
|
4
4
|
|
|
5
5
|
//#region src/test-utils/database.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
|
|
4
4
|
//#region src/test-utils/emitter.ts
|
|
5
5
|
/**
|
package/dist/test-utils/env.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
|
|
4
4
|
//#region src/test-utils/env.ts
|
|
5
5
|
/**
|
package/dist/test-utils/knex.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __toESM } from "../_virtual/rolldown_runtime.js";
|
|
2
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
3
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
3
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
4
4
|
import { require_dist } from "../node_modules/.pnpm/knex-mock-client@3.0.2_knex@3.1.0_mysql2@3.15.3_pg@8.16.3_sqlite3@5.1.7_tedious@18.6.1_/node_modules/knex-mock-client/dist/index.js";
|
|
5
5
|
import knex from "knex";
|
|
6
6
|
import { systemCollectionNames } from "@directus/system-data";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
|
|
4
4
|
//#region src/test-utils/schema.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
import { mockItemsService } from "./items-service.js";
|
|
4
4
|
|
|
5
5
|
//#region src/test-utils/services/fields-service.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
import { mockItemsService } from "./items-service.js";
|
|
4
4
|
|
|
5
5
|
//#region src/test-utils/services/files-service.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
import { mockItemsService } from "./items-service.js";
|
|
4
4
|
|
|
5
5
|
//#region src/test-utils/services/folders-service.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
|
|
4
4
|
//#region src/test-utils/services/items-service.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
2
|
-
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.
|
|
1
|
+
import { vi } from "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js";
|
|
2
|
+
import "../node_modules/.pnpm/vitest@3.2.4_@types_node@22.13.14_@vitest_ui@3.2.4_happy-dom@20.8.9_jiti@2.6.1_jsdom@20_c24d183060b6f93f55300b66d0779768/node_modules/vitest/dist/index.js";
|
|
3
3
|
import { PassThrough } from "node:stream";
|
|
4
4
|
|
|
5
5
|
//#region src/test-utils/storage.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@directus/api",
|
|
3
|
-
"version": "35.0.
|
|
3
|
+
"version": "35.0.2",
|
|
4
4
|
"description": "Directus is a real-time API and App dashboard for managing SQL database content",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"directus",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"bytes": "3.1.2",
|
|
87
87
|
"camelcase": "8.0.0",
|
|
88
88
|
"chalk": "5.6.2",
|
|
89
|
-
"chokidar": "
|
|
89
|
+
"chokidar": "5.0.0",
|
|
90
90
|
"commander": "14.0.2",
|
|
91
91
|
"content-disposition": "0.5.4",
|
|
92
92
|
"cookie": "1.0.2",
|
|
@@ -122,11 +122,11 @@
|
|
|
122
122
|
"knex": "3.1.0",
|
|
123
123
|
"ldapts": "8.1.3",
|
|
124
124
|
"liquidjs": "10.25.0",
|
|
125
|
-
"lodash-es": "4.
|
|
125
|
+
"lodash-es": "4.18.1",
|
|
126
126
|
"marked": "16.4.1",
|
|
127
127
|
"micromustache": "8.0.3",
|
|
128
128
|
"mime-types": "3.0.1",
|
|
129
|
-
"minimatch": "10.2.
|
|
129
|
+
"minimatch": "10.2.4",
|
|
130
130
|
"mnemonist": "0.40.3",
|
|
131
131
|
"ms": "2.1.3",
|
|
132
132
|
"nanoid": "5.1.6",
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
"rate-limiter-flexible": "7.2.0",
|
|
152
152
|
"rolldown": "1.0.0-beta.31",
|
|
153
153
|
"rollup": "4.59.0",
|
|
154
|
-
"samlify": "2.
|
|
154
|
+
"samlify": "2.12.0",
|
|
155
155
|
"sanitize-filename": "1.6.3",
|
|
156
156
|
"sanitize-html": "2.17.0",
|
|
157
157
|
"sharp": "0.34.5",
|
|
@@ -166,30 +166,30 @@
|
|
|
166
166
|
"zod": "4.1.12",
|
|
167
167
|
"zod-validation-error": "4.0.2",
|
|
168
168
|
"@directus/ai": "1.3.1",
|
|
169
|
-
"@directus/app": "15.
|
|
169
|
+
"@directus/app": "15.8.0",
|
|
170
|
+
"@directus/env": "5.7.1",
|
|
170
171
|
"@directus/constants": "14.3.0",
|
|
171
|
-
"@directus/
|
|
172
|
-
"@directus/extensions": "3.0.
|
|
173
|
-
"@directus/extensions-sdk": "17.1.0",
|
|
174
|
-
"@directus/extensions-registry": "3.0.22",
|
|
175
|
-
"@directus/errors": "2.3.0",
|
|
172
|
+
"@directus/errors": "2.3.1",
|
|
173
|
+
"@directus/extensions-registry": "3.0.24",
|
|
176
174
|
"@directus/format-title": "12.1.2",
|
|
177
|
-
"@directus/
|
|
178
|
-
"@directus/
|
|
179
|
-
"@directus/pressure": "3.0.
|
|
180
|
-
"@directus/
|
|
175
|
+
"@directus/extensions": "3.0.23",
|
|
176
|
+
"@directus/memory": "3.1.7",
|
|
177
|
+
"@directus/pressure": "3.0.21",
|
|
178
|
+
"@directus/extensions-sdk": "17.1.2",
|
|
179
|
+
"@directus/schema": "13.0.7",
|
|
180
|
+
"@directus/schema-builder": "0.0.18",
|
|
181
181
|
"@directus/specs": "13.0.0",
|
|
182
182
|
"@directus/storage": "12.0.4",
|
|
183
|
-
"@directus/storage-driver-
|
|
184
|
-
"@directus/storage-driver-cloudinary": "12.0.
|
|
185
|
-
"@directus/storage-driver-
|
|
183
|
+
"@directus/storage-driver-gcs": "12.0.21",
|
|
184
|
+
"@directus/storage-driver-cloudinary": "12.0.21",
|
|
185
|
+
"@directus/storage-driver-azure": "12.0.21",
|
|
186
186
|
"@directus/storage-driver-local": "12.0.4",
|
|
187
|
-
"@directus/storage-driver-
|
|
187
|
+
"@directus/storage-driver-s3": "12.1.7",
|
|
188
|
+
"@directus/storage-driver-supabase": "3.0.21",
|
|
188
189
|
"@directus/system-data": "4.4.0",
|
|
189
|
-
"@directus/
|
|
190
|
-
"directus": "11.17.
|
|
191
|
-
"@directus/
|
|
192
|
-
"@directus/validation": "2.0.20"
|
|
190
|
+
"@directus/validation": "2.0.22",
|
|
191
|
+
"directus": "11.17.2",
|
|
192
|
+
"@directus/utils": "13.4.0"
|
|
193
193
|
},
|
|
194
194
|
"devDependencies": {
|
|
195
195
|
"@directus/tsconfig": "4.0.0",
|
|
@@ -231,8 +231,8 @@
|
|
|
231
231
|
"knex-mock-client": "3.0.2",
|
|
232
232
|
"typescript": "5.9.3",
|
|
233
233
|
"vitest": "3.2.4",
|
|
234
|
-
"@directus/schema-builder": "0.0.
|
|
235
|
-
"@directus/types": "15.0.
|
|
234
|
+
"@directus/schema-builder": "0.0.18",
|
|
235
|
+
"@directus/types": "15.0.1"
|
|
236
236
|
},
|
|
237
237
|
"optionalDependencies": {
|
|
238
238
|
"@keyv/redis": "3.0.1",
|