@directus/api 32.2.0 → 33.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/chat/lib/create-ui-stream.d.ts +1 -1
- package/dist/ai/tools/assets/index.js +1 -1
- package/dist/ai/tools/collections/index.js +2 -2
- package/dist/ai/tools/fields/index.js +2 -2
- package/dist/ai/tools/files/index.js +1 -1
- package/dist/ai/tools/flows/index.js +1 -1
- package/dist/ai/tools/folders/index.js +1 -1
- package/dist/ai/tools/items/index.js +2 -2
- package/dist/ai/tools/relations/index.js +1 -1
- package/dist/ai/tools/trigger-flow/index.js +1 -1
- package/dist/app.js +8 -8
- package/dist/auth/drivers/ldap.js +2 -2
- package/dist/auth/drivers/local.js +1 -1
- package/dist/auth/drivers/oauth2.d.ts +1 -2
- package/dist/auth/drivers/oauth2.js +22 -17
- package/dist/auth/drivers/openid.d.ts +1 -2
- package/dist/auth/drivers/openid.js +18 -13
- package/dist/auth/drivers/saml.js +3 -3
- package/dist/auth/utils/generate-callback-url.d.ts +11 -0
- package/dist/auth/utils/generate-callback-url.js +40 -0
- package/dist/auth/utils/is-login-redirect-allowed.d.ts +7 -0
- package/dist/{utils → auth/utils}/is-login-redirect-allowed.js +12 -9
- package/dist/cache.js +2 -2
- package/dist/cli/commands/bootstrap/index.js +2 -2
- package/dist/cli/commands/database/install.js +1 -1
- package/dist/cli/commands/database/migrate.js +1 -1
- package/dist/cli/commands/init/index.js +2 -2
- package/dist/cli/commands/roles/create.js +4 -4
- package/dist/cli/commands/schema/apply.js +3 -3
- package/dist/cli/commands/schema/snapshot.js +1 -1
- package/dist/cli/utils/create-db-connection.d.ts +1 -1
- package/dist/cli/utils/create-db-connection.js +1 -1
- package/dist/cli/utils/create-env/index.js +1 -1
- package/dist/constants.d.ts +7 -3
- package/dist/constants.js +7 -3
- package/dist/controllers/access.js +1 -1
- package/dist/controllers/assets.js +1 -1
- package/dist/controllers/extensions.js +1 -1
- package/dist/controllers/fields.js +2 -2
- package/dist/controllers/files.js +1 -1
- package/dist/controllers/items.js +1 -1
- package/dist/controllers/not-found.js +1 -1
- package/dist/controllers/relations.js +1 -1
- package/dist/database/errors/dialects/mysql.d.ts +1 -1
- package/dist/database/errors/dialects/postgres.d.ts +1 -1
- package/dist/database/errors/dialects/sqlite.d.ts +1 -1
- package/dist/database/errors/translate.d.ts +1 -1
- package/dist/database/errors/translate.js +1 -1
- package/dist/database/helpers/date/dialects/mssql.js +1 -1
- package/dist/database/helpers/date/dialects/mysql.js +1 -1
- package/dist/database/helpers/date/types.js +1 -1
- package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -0
- package/dist/database/helpers/schema/dialects/cockroachdb.js +24 -1
- package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mysql.d.ts +2 -1
- package/dist/database/helpers/schema/dialects/mysql.js +16 -3
- package/dist/database/helpers/schema/dialects/postgres.d.ts +1 -1
- package/dist/database/helpers/schema/types.d.ts +13 -0
- package/dist/database/helpers/schema/types.js +24 -0
- package/dist/database/index.js +4 -4
- package/dist/database/migrations/20220429A-add-flows.js +1 -1
- package/dist/database/migrations/20230526A-migrate-translation-strings.js +1 -1
- package/dist/database/migrations/20231009A-update-csv-fields-to-text.js +1 -1
- package/dist/database/migrations/20240204A-marketplace.js +9 -7
- package/dist/database/migrations/20240311A-deprecate-webhooks.d.ts +15 -0
- package/dist/database/migrations/20240311A-deprecate-webhooks.js +1 -1
- package/dist/database/migrations/20240806A-permissions-policies.js +2 -2
- package/dist/database/migrations/20240924A-migrate-legacy-comments.js +1 -1
- package/dist/database/migrations/20251014A-add-project-owner.js +1 -1
- package/dist/database/migrations/20251224A-remove-webhooks.d.ts +3 -0
- package/dist/database/migrations/20251224A-remove-webhooks.js +19 -0
- package/dist/database/migrations/20260113A-add-revisions-index.d.ts +3 -0
- package/dist/database/migrations/20260113A-add-revisions-index.js +41 -0
- package/dist/database/migrations/run.js +3 -3
- package/dist/database/run-ast/lib/apply-query/filter/get-filter-type.d.ts +2 -2
- package/dist/database/run-ast/lib/apply-query/filter/get-filter-type.js +1 -1
- package/dist/database/run-ast/lib/apply-query/filter/operator.js +1 -1
- package/dist/database/run-ast/lib/apply-query/sort.js +1 -1
- package/dist/database/run-ast/utils/get-column-pre-processor.js +2 -2
- package/dist/database/run-ast/utils/get-column.js +1 -1
- package/dist/database/seeds/run.js +3 -3
- package/dist/extensions/lib/get-extensions-path.js +1 -1
- package/dist/extensions/lib/get-extensions-settings.js +1 -1
- package/dist/extensions/lib/get-extensions.js +1 -1
- package/dist/extensions/lib/get-shared-deps-mapping.js +3 -3
- package/dist/extensions/lib/installation/manager.js +3 -3
- package/dist/extensions/lib/sandbox/register/route.d.ts +1 -1
- package/dist/extensions/lib/sync/status.js +1 -1
- package/dist/extensions/lib/sync/sync.js +7 -7
- package/dist/extensions/lib/sync/utils.js +2 -2
- package/dist/extensions/manager.d.ts +1 -1
- package/dist/extensions/manager.js +8 -8
- package/dist/flows.d.ts +1 -1
- package/dist/logger/index.js +1 -1
- package/dist/logger/logs-stream.d.ts +1 -1
- package/dist/logger/logs-stream.js +1 -1
- package/dist/mailer.js +1 -1
- package/dist/metrics/lib/create-metrics.js +2 -2
- package/dist/middleware/authenticate.js +3 -3
- package/dist/middleware/collection-exists.js +1 -1
- package/dist/middleware/extract-token.js +1 -1
- package/dist/middleware/graphql.js +2 -2
- package/dist/middleware/validate-batch.js +1 -1
- package/dist/operations/exec/index.js +2 -1
- package/dist/operations/mail/index.js +1 -1
- package/dist/operations/mail/rate-limiter.js +2 -2
- package/dist/permissions/cache.js +5 -0
- package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.js +1 -1
- package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.js +1 -1
- package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.js +2 -2
- package/dist/permissions/modules/process-ast/lib/inject-cases.js +1 -1
- package/dist/permissions/modules/process-ast/process-ast.js +1 -1
- package/dist/permissions/modules/process-payload/process-payload.js +1 -1
- package/dist/permissions/modules/validate-access/lib/validate-item-access.d.ts +13 -1
- package/dist/permissions/modules/validate-access/lib/validate-item-access.js +54 -6
- package/dist/permissions/modules/validate-access/validate-access.js +3 -2
- package/dist/rate-limiter.js +1 -1
- package/dist/request/is-denied-ip.js +1 -1
- package/dist/schedules/project.js +1 -1
- package/dist/schedules/telemetry.js +1 -1
- package/dist/schedules/tus.js +1 -1
- package/dist/server.js +4 -4
- package/dist/services/assets.d.ts +2 -1
- package/dist/services/assets.js +35 -8
- package/dist/services/authentication.js +2 -2
- package/dist/services/collections.js +1 -1
- package/dist/services/extensions.d.ts +1 -1
- package/dist/services/files/utils/get-metadata.d.ts +1 -1
- package/dist/services/files/utils/get-metadata.js +1 -1
- package/dist/services/files.d.ts +1 -1
- package/dist/services/files.js +4 -4
- package/dist/services/graphql/index.d.ts +1 -1
- package/dist/services/graphql/index.js +1 -1
- package/dist/services/graphql/resolvers/mutation.js +1 -1
- package/dist/services/graphql/schema/get-types.d.ts +1 -1
- package/dist/services/graphql/schema/read.js +1 -1
- package/dist/services/graphql/subscription.d.ts +1 -1
- package/dist/services/graphql/types/date.js +1 -1
- package/dist/services/graphql/types/hash.js +1 -1
- package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -1
- package/dist/services/import-export.d.ts +1 -1
- package/dist/services/import-export.js +2 -2
- package/dist/services/index.d.ts +0 -1
- package/dist/services/index.js +0 -1
- package/dist/services/mail/index.js +2 -2
- package/dist/services/mail/rate-limiter.js +2 -2
- package/dist/services/payload.js +2 -2
- package/dist/services/schema.js +1 -1
- package/dist/services/server.js +12 -4
- package/dist/services/settings.js +2 -2
- package/dist/services/tfa.js +1 -1
- package/dist/services/translations.js +1 -1
- package/dist/services/tus/data-store.d.ts +1 -3
- package/dist/services/tus/data-store.js +2 -5
- package/dist/services/tus/server.js +6 -6
- package/dist/services/users.js +4 -4
- package/dist/services/versions.js +1 -1
- package/dist/telemetry/lib/send-report.d.ts +1 -1
- package/dist/telemetry/lib/send-report.js +1 -1
- package/dist/telemetry/lib/track.js +1 -1
- package/dist/test-utils/knex.js +1 -1
- package/dist/types/collection.d.ts +1 -1
- package/dist/utils/async-handler.d.ts +1 -1
- package/dist/utils/calculate-field-depth.js +1 -1
- package/dist/utils/compress.js +1 -1
- package/dist/utils/deep-map-response.js +2 -2
- package/dist/utils/get-cache-key.js +1 -1
- package/dist/utils/get-field-system-rows.js +1 -1
- package/dist/utils/get-ip-from-req.d.ts +1 -1
- package/dist/utils/get-ip-from-req.js +1 -1
- package/dist/utils/get-local-type.js +7 -3
- package/dist/utils/get-service.js +1 -3
- package/dist/utils/get-snapshot-diff.js +1 -1
- package/dist/utils/is-url-allowed.js +1 -1
- package/dist/utils/jwt.js +1 -1
- package/dist/utils/sanitize-schema.d.ts +1 -1
- package/dist/utils/should-clear-cache.d.ts +1 -1
- package/dist/utils/should-skip-cache.js +2 -2
- package/dist/utils/validate-diff.js +1 -1
- package/dist/utils/validate-snapshot.js +3 -3
- package/dist/utils/validate-storage.js +2 -2
- package/dist/utils/verify-session-jwt.js +1 -1
- package/dist/utils/versioning/deep-map-with-schema.js +2 -2
- package/dist/websocket/controllers/base.d.ts +2 -2
- package/dist/websocket/controllers/base.js +3 -3
- package/dist/websocket/controllers/graphql.d.ts +1 -1
- package/dist/websocket/controllers/graphql.js +1 -1
- package/dist/websocket/controllers/logs.d.ts +1 -1
- package/dist/websocket/controllers/rest.d.ts +1 -1
- package/dist/websocket/controllers/rest.js +2 -2
- package/dist/websocket/handlers/heartbeat.js +1 -1
- package/dist/websocket/handlers/items.js +2 -2
- package/dist/websocket/handlers/subscribe.js +1 -1
- package/dist/websocket/types.d.ts +1 -1
- package/dist/websocket/utils/wait-for-message.js +1 -1
- package/package.json +24 -24
- package/dist/controllers/webhooks.d.ts +0 -2
- package/dist/controllers/webhooks.js +0 -74
- package/dist/services/webhooks.d.ts +0 -14
- package/dist/services/webhooks.js +0 -32
- package/dist/utils/is-login-redirect-allowed.d.ts +0 -4
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export async function up(knex) {
|
|
2
|
+
await knex.schema.dropTable('directus_webhooks');
|
|
3
|
+
}
|
|
4
|
+
export async function down(knex) {
|
|
5
|
+
await knex.schema.createTable('directus_webhooks', (table) => {
|
|
6
|
+
table.increments('id');
|
|
7
|
+
table.string('name', 255).notNullable();
|
|
8
|
+
table.string('method', 10).notNullable().defaultTo('POST');
|
|
9
|
+
table.text('url').notNullable();
|
|
10
|
+
table.string('status', 10).notNullable().defaultTo('active');
|
|
11
|
+
table.boolean('data').notNullable().defaultTo(true);
|
|
12
|
+
table.string('actions', 100).notNullable();
|
|
13
|
+
table.text('collections').notNullable();
|
|
14
|
+
table.json('headers');
|
|
15
|
+
table.boolean('was_active_before_deprecation').notNullable().defaultTo(false);
|
|
16
|
+
table.uuid('migrated_flow');
|
|
17
|
+
table.foreign('migrated_flow').references('directus_flows.id').onDelete('SET NULL');
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FieldsService } from '../../services/fields.js';
|
|
2
|
+
import { getSchema } from '../../utils/get-schema.js';
|
|
3
|
+
import { transaction } from '../../utils/transaction.js';
|
|
4
|
+
import { getHelpers } from '../helpers/index.js';
|
|
5
|
+
import { getDatabaseClient } from '../index.js';
|
|
6
|
+
const RETENTION_INDEXES = [
|
|
7
|
+
// MySQL and MariaDB are ignored because they already have an index on revisions.activity
|
|
8
|
+
{ collection: 'directus_revisions', field: 'activity', ignore: ['mysql', 'mariadb'] },
|
|
9
|
+
];
|
|
10
|
+
export async function up(knex) {
|
|
11
|
+
const client = getDatabaseClient(knex);
|
|
12
|
+
const helpers = getHelpers(knex);
|
|
13
|
+
const schema = await getSchema();
|
|
14
|
+
const service = new FieldsService({ knex, schema });
|
|
15
|
+
for (const { collection, field, ignore } of RETENTION_INDEXES) {
|
|
16
|
+
if (ignore.includes(client))
|
|
17
|
+
continue;
|
|
18
|
+
const existingColumn = await service.columnInfo(collection, field);
|
|
19
|
+
if (!existingColumn.is_indexed) {
|
|
20
|
+
await helpers.schema.createIndex(collection, field, { attemptConcurrentIndex: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function down(knex) {
|
|
25
|
+
const client = getDatabaseClient(knex);
|
|
26
|
+
const helpers = getHelpers(knex);
|
|
27
|
+
const schema = await getSchema();
|
|
28
|
+
const service = new FieldsService({ knex, schema });
|
|
29
|
+
for (const { collection, field, ignore } of RETENTION_INDEXES) {
|
|
30
|
+
if (ignore.includes(client))
|
|
31
|
+
continue;
|
|
32
|
+
const existingColumn = await service.columnInfo(collection, field);
|
|
33
|
+
if (existingColumn.is_indexed) {
|
|
34
|
+
await transaction(knex, async (trx) => {
|
|
35
|
+
await trx.schema.alterTable(collection, async (table) => {
|
|
36
|
+
table.dropIndex([field], helpers.schema.generateIndexName('index', collection, field));
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import path from 'path';
|
|
1
4
|
import { useEnv } from '@directus/env';
|
|
2
5
|
import formatTitle from '@directus/format-title';
|
|
3
6
|
import fse from 'fs-extra';
|
|
4
7
|
import { orderBy } from 'lodash-es';
|
|
5
|
-
import { dirname } from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
import path from 'path';
|
|
8
8
|
import { flushCaches } from '../../cache.js';
|
|
9
9
|
import { useLogger } from '../../logger/index.js';
|
|
10
10
|
import getModuleDefault from '../../utils/get-module-default.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { FieldOverview } from '@directus/types';
|
|
2
2
|
export declare function getFilterType(fields: Record<string, FieldOverview>, key: string, collection?: string): {
|
|
3
|
-
type: "string" | "boolean" | "binary" | "
|
|
3
|
+
type: "string" | "boolean" | "binary" | "text" | "unknown" | "integer" | "date" | "float" | "alias" | "uuid" | "time" | "dateTime" | "timestamp" | "bigInteger" | "decimal" | "json" | "hash" | "csv" | "geometry" | "geometry.Point" | "geometry.LineString" | "geometry.Polygon" | "geometry.MultiPoint" | "geometry.MultiLineString" | "geometry.MultiPolygon";
|
|
4
4
|
special?: never;
|
|
5
5
|
} | {
|
|
6
|
-
type: "string" | "boolean" | "binary" | "
|
|
6
|
+
type: "string" | "boolean" | "binary" | "text" | "unknown" | "integer" | "date" | "float" | "alias" | "uuid" | "time" | "dateTime" | "timestamp" | "bigInteger" | "decimal" | "json" | "hash" | "csv" | "geometry" | "geometry.Point" | "geometry.LineString" | "geometry.Polygon" | "geometry.MultiPoint" | "geometry.MultiLineString" | "geometry.MultiPolygon";
|
|
7
7
|
special: string[];
|
|
8
8
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { parseFilterKey } from '../../../../../utils/parse-filter-key.js';
|
|
2
1
|
import { InvalidQueryError } from '@directus/errors';
|
|
3
2
|
import { getFunctionsForType, getOutputTypeForFunction } from '@directus/utils';
|
|
3
|
+
import { parseFilterKey } from '../../../../../utils/parse-filter-key.js';
|
|
4
4
|
export function getFilterType(fields, key, collection = 'unknown') {
|
|
5
5
|
const { fieldName, functionName } = parseFilterKey(key);
|
|
6
6
|
const field = fields[fieldName];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getColumn } from '../../../utils/get-column.js';
|
|
2
1
|
import { getOutputTypeForFunction } from '@directus/utils';
|
|
3
2
|
import { getHelpers } from '../../../../helpers/index.js';
|
|
3
|
+
import { getColumn } from '../../../utils/get-column.js';
|
|
4
4
|
export function applyOperator(knex, dbQuery, schema, key, operator, compareValue, logical = 'and', originalCollectionName) {
|
|
5
5
|
const helpers = getHelpers(knex);
|
|
6
6
|
const [table, column] = key.split('.');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getColumnPath } from '../../../../utils/get-column-path.js';
|
|
2
|
-
import { getColumn } from '../../utils/get-column.js';
|
|
3
2
|
import { getRelationInfo } from '../../../../utils/get-relation-info.js';
|
|
3
|
+
import { getColumn } from '../../utils/get-column.js';
|
|
4
4
|
import { addJoin } from './add-join.js';
|
|
5
5
|
export function applySort(knex, schema, rootQuery, sort, aggregate, collection, aliasMap, returnRecords = false) {
|
|
6
6
|
const relations = schema.relations;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { joinFilterWithCases } from '../lib/apply-query/join-filter-with-cases.js';
|
|
2
|
-
import { getColumn } from './get-column.js';
|
|
3
1
|
import { parseFilterKey } from '../../../utils/parse-filter-key.js';
|
|
4
2
|
import { getHelpers } from '../../helpers/index.js';
|
|
3
|
+
import { joinFilterWithCases } from '../lib/apply-query/join-filter-with-cases.js';
|
|
5
4
|
import { applyCaseWhen } from './apply-case-when.js';
|
|
5
|
+
import { getColumn } from './get-column.js';
|
|
6
6
|
import { getNodeAlias } from './get-field-alias.js';
|
|
7
7
|
export function getColumnPreprocessor(knex, schema, table, cases, permissions, aliasMap, permissionsOnly) {
|
|
8
8
|
const helpers = getHelpers(knex);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { REGEX_BETWEEN_PARENS } from '@directus/constants';
|
|
2
|
+
import { InvalidQueryError } from '@directus/errors';
|
|
2
3
|
import { getFunctionsForType } from '@directus/utils';
|
|
3
4
|
import { getFunctions } from '../../helpers/index.js';
|
|
4
|
-
import { InvalidQueryError } from '@directus/errors';
|
|
5
5
|
import { applyFunctionToColumnName } from './apply-function-to-column-name.js';
|
|
6
6
|
/**
|
|
7
7
|
* Return column prefixed by table. If column includes functions (like `year(date_created)`), the
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import fse from 'fs-extra';
|
|
2
|
-
import yaml from 'js-yaml';
|
|
3
|
-
import { isObject } from 'lodash-es';
|
|
4
1
|
import { dirname } from 'node:path';
|
|
5
2
|
import { fileURLToPath } from 'node:url';
|
|
6
3
|
import path from 'path';
|
|
4
|
+
import fse from 'fs-extra';
|
|
5
|
+
import yaml from 'js-yaml';
|
|
6
|
+
import { isObject } from 'lodash-es';
|
|
7
7
|
import { getHelpers } from '../helpers/index.js';
|
|
8
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
export default async function runSeed(database) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { list } from '@directus/extensions-registry';
|
|
2
3
|
import getDatabase from '../../database/index.js';
|
|
3
4
|
import { ExtensionsService } from '../../services/extensions.js';
|
|
4
5
|
import { getSchema } from '../../utils/get-schema.js';
|
|
5
|
-
import { list } from '@directus/extensions-registry';
|
|
6
6
|
/**
|
|
7
7
|
* Loads stored settings for all extensions. Creates empty new rows in extensions tables for
|
|
8
8
|
* extensions that don't have settings yet, and remove any settings for extensions that are no
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
1
2
|
import { useEnv } from '@directus/env';
|
|
2
3
|
import { resolveFsExtensions, resolveModuleExtensions } from '@directus/extensions/node';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
4
|
import { getExtensionsPath } from './get-extensions-path.js';
|
|
5
5
|
export const getExtensions = async () => {
|
|
6
6
|
const env = useEnv();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { useEnv } from '@directus/env';
|
|
2
|
-
import { resolvePackage } from '@directus/utils/node';
|
|
3
|
-
import { escapeRegExp } from 'lodash-es';
|
|
4
1
|
import { readdir } from 'node:fs/promises';
|
|
5
2
|
import { dirname } from 'node:path';
|
|
6
3
|
import { fileURLToPath } from 'node:url';
|
|
7
4
|
import path from 'path';
|
|
5
|
+
import { useEnv } from '@directus/env';
|
|
6
|
+
import { resolvePackage } from '@directus/utils/node';
|
|
7
|
+
import { escapeRegExp } from 'lodash-es';
|
|
8
8
|
import { useLogger } from '../../logger/index.js';
|
|
9
9
|
import { Url } from '../../utils/url.js';
|
|
10
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { mkdir, readFile, rm } from 'node:fs/promises';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { join } from 'path';
|
|
1
4
|
import { useEnv } from '@directus/env';
|
|
2
5
|
import { ErrorCode, isDirectusError, ServiceUnavailableError } from '@directus/errors';
|
|
3
6
|
import { EXTENSION_PKG_KEY, ExtensionManifest } from '@directus/extensions';
|
|
4
7
|
import { download } from '@directus/extensions-registry';
|
|
5
8
|
import DriverLocal from '@directus/storage-driver-local';
|
|
6
9
|
import { move, remove } from 'fs-extra';
|
|
7
|
-
import { mkdir, readFile, rm } from 'node:fs/promises';
|
|
8
|
-
import { Readable } from 'node:stream';
|
|
9
10
|
import Queue from 'p-queue';
|
|
10
|
-
import { join } from 'path';
|
|
11
11
|
import { extract } from 'tar';
|
|
12
12
|
import { useLogger } from '../../../logger/index.js';
|
|
13
13
|
import { getStorage } from '../../../storage/index.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { IncomingHttpHeaders } from 'node:http';
|
|
1
2
|
import type { Router } from 'express';
|
|
2
3
|
import type { Reference } from 'isolated-vm';
|
|
3
|
-
import type { IncomingHttpHeaders } from 'node:http';
|
|
4
4
|
export declare function registerRouteGenerator(endpointName: string, endpointRouter: Router): {
|
|
5
5
|
register: (path: Reference<string>, method: Reference<"GET" | "POST" | "PUT" | "PATCH" | "DELETE">, cb: Reference<(req: {
|
|
6
6
|
url: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utility functions to write a `.status` file on the filesystem to indicate active synchronization
|
|
3
3
|
*/
|
|
4
|
+
import { rm, writeFile } from 'node:fs/promises';
|
|
4
5
|
import { join } from 'node:path';
|
|
5
6
|
import { exists } from 'fs-extra';
|
|
6
|
-
import { writeFile, rm } from 'node:fs/promises';
|
|
7
7
|
import { getExtensionsPath } from '../get-extensions-path.js';
|
|
8
8
|
export const SyncStatus = {
|
|
9
9
|
SYNCING: 'SYNCING',
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import Queue from 'p-queue';
|
|
2
|
-
import mid from 'node-machine-id';
|
|
3
|
-
import { useEnv } from '@directus/env';
|
|
4
1
|
import { createWriteStream } from 'node:fs';
|
|
5
2
|
import { mkdir, rm } from 'node:fs/promises';
|
|
6
|
-
import { pipeline } from 'node:stream/promises';
|
|
7
3
|
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
8
|
-
import {
|
|
4
|
+
import { pipeline } from 'node:stream/promises';
|
|
5
|
+
import { useEnv } from '@directus/env';
|
|
6
|
+
import { normalizePath } from '@directus/utils';
|
|
7
|
+
import mid from 'node-machine-id';
|
|
8
|
+
import Queue from 'p-queue';
|
|
9
9
|
import { useBus } from '../../../bus/index.js';
|
|
10
|
-
import { SyncFileTracker } from './tracker.js';
|
|
11
10
|
import { useLock } from '../../../lock/index.js';
|
|
12
11
|
import { useLogger } from '../../../logger/index.js';
|
|
13
12
|
import { getStorage } from '../../../storage/index.js';
|
|
14
13
|
import { getExtensionsPath } from '../get-extensions-path.js';
|
|
15
14
|
import { isSynchronizing, setSyncStatus, SyncStatus } from './status.js';
|
|
16
|
-
import {
|
|
15
|
+
import { SyncFileTracker } from './tracker.js';
|
|
16
|
+
import { compareFileMetadata, getSyncPaths } from './utils.js';
|
|
17
17
|
export async function syncExtensions(options) {
|
|
18
18
|
if (options?.skipSync === true)
|
|
19
19
|
return;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { join, relative, resolve, sep } from 'node:path';
|
|
2
1
|
import { stat } from 'node:fs/promises';
|
|
3
|
-
import {
|
|
2
|
+
import { join, relative, resolve, sep } from 'node:path';
|
|
4
3
|
import { useEnv } from '@directus/env';
|
|
5
4
|
import { normalizePath } from '@directus/utils';
|
|
5
|
+
import { getExtensionsPath } from '../get-extensions-path.js';
|
|
6
6
|
/**
|
|
7
7
|
* Returns the directory depth of the provided path
|
|
8
8
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { ReadStream } from 'node:fs';
|
|
1
2
|
import type { Extension, ExtensionManagerOptions } from '@directus/types';
|
|
2
3
|
import { Router } from 'express';
|
|
3
|
-
import type { ReadStream } from 'node:fs';
|
|
4
4
|
import { type ExtensionSyncOptions } from './lib/sync/sync.js';
|
|
5
5
|
export declare class ExtensionManager {
|
|
6
6
|
private options;
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { HYBRID_EXTENSION_TYPES } from '@directus/constants';
|
|
1
7
|
import { useEnv } from '@directus/env';
|
|
2
8
|
import { APP_SHARED_DEPS } from '@directus/extensions';
|
|
3
|
-
import { HYBRID_EXTENSION_TYPES } from '@directus/constants';
|
|
4
9
|
import { generateExtensionsEntrypoint } from '@directus/extensions/node';
|
|
10
|
+
import DriverLocal from '@directus/storage-driver-local';
|
|
5
11
|
import { isTypeIn, toBoolean } from '@directus/utils';
|
|
6
12
|
import { pathToRelativeUrl, processId } from '@directus/utils/node';
|
|
7
13
|
import aliasDefault from '@rollup/plugin-alias';
|
|
@@ -11,11 +17,6 @@ import chokidar, { FSWatcher } from 'chokidar';
|
|
|
11
17
|
import express, { Router } from 'express';
|
|
12
18
|
import ivm from 'isolated-vm';
|
|
13
19
|
import { clone, debounce, isPlainObject } from 'lodash-es';
|
|
14
|
-
import { readFile, readdir } from 'node:fs/promises';
|
|
15
|
-
import os from 'node:os';
|
|
16
|
-
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
17
|
-
import { fileURLToPath } from 'node:url';
|
|
18
|
-
import path from 'path';
|
|
19
20
|
import { rolldown } from 'rolldown';
|
|
20
21
|
import { rollup } from 'rollup';
|
|
21
22
|
import { useBus } from '../bus/index.js';
|
|
@@ -37,9 +38,8 @@ import { getSharedDepsMapping } from './lib/get-shared-deps-mapping.js';
|
|
|
37
38
|
import { getInstallationManager } from './lib/installation/index.js';
|
|
38
39
|
import { generateApiExtensionsSandboxEntrypoint } from './lib/sandbox/generate-api-extensions-sandbox-entrypoint.js';
|
|
39
40
|
import { instantiateSandboxSdk } from './lib/sandbox/sdk/instantiate.js';
|
|
40
|
-
import { wrapEmbeds } from './lib/wrap-embeds.js';
|
|
41
|
-
import DriverLocal from '@directus/storage-driver-local';
|
|
42
41
|
import { syncExtensions } from './lib/sync/sync.js';
|
|
42
|
+
import { wrapEmbeds } from './lib/wrap-embeds.js';
|
|
43
43
|
// Workaround for https://github.com/rollup/plugins/issues/1329
|
|
44
44
|
const virtual = virtualDefault;
|
|
45
45
|
const alias = aliasDefault;
|
package/dist/flows.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Accountability,
|
|
1
|
+
import type { Accountability, OperationHandler, SchemaOverview } from '@directus/types';
|
|
2
2
|
export declare function getFlowManager(): FlowManager;
|
|
3
3
|
declare class FlowManager {
|
|
4
4
|
private isLoaded;
|
package/dist/logger/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { URL } from 'node:url';
|
|
1
2
|
import { useEnv } from '@directus/env';
|
|
2
3
|
import { REDACTED_TEXT, toArray, toBoolean } from '@directus/utils';
|
|
3
4
|
import { merge } from 'lodash-es';
|
|
4
|
-
import { URL } from 'node:url';
|
|
5
5
|
import { pino } from 'pino';
|
|
6
6
|
import { pinoHttp, stdSerializers } from 'pino-http';
|
|
7
7
|
import { httpPrintFactory } from 'pino-http-print';
|
package/dist/mailer.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import { useEnv } from '@directus/env';
|
|
2
3
|
import nodemailer from 'nodemailer';
|
|
3
4
|
import { useLogger } from './logger/index.js';
|
|
4
5
|
import { getConfigFromEnv } from './utils/get-config-from-env.js';
|
|
5
|
-
import { createRequire } from 'node:module';
|
|
6
6
|
const require = createRequire(import.meta.url);
|
|
7
7
|
let transporter;
|
|
8
8
|
export default function getMailer() {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { useEnv } from '@directus/env';
|
|
2
|
-
import { toArray } from '@directus/utils';
|
|
3
1
|
import { randomUUID } from 'node:crypto';
|
|
4
2
|
import { Readable } from 'node:stream';
|
|
5
3
|
import { promisify } from 'node:util';
|
|
4
|
+
import { useEnv } from '@directus/env';
|
|
5
|
+
import { toArray } from '@directus/utils';
|
|
6
6
|
import pm2 from 'pm2';
|
|
7
7
|
import { AggregatorRegistry, Counter, Histogram, register } from 'prom-client';
|
|
8
8
|
import { getCache } from '../../cache.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { useEnv } from '@directus/env';
|
|
2
|
+
import { ErrorCode, isDirectusError } from '@directus/errors';
|
|
1
3
|
import { isEqual } from 'lodash-es';
|
|
4
|
+
import { SESSION_COOKIE_OPTIONS } from '../constants.js';
|
|
2
5
|
import getDatabase from '../database/index.js';
|
|
3
6
|
import emitter from '../emitter.js';
|
|
4
7
|
import { createDefaultAccountability } from '../permissions/utils/create-default-accountability.js';
|
|
5
8
|
import asyncHandler from '../utils/async-handler.js';
|
|
6
9
|
import { getAccountabilityForToken } from '../utils/get-accountability-for-token.js';
|
|
7
10
|
import { getIPFromReq } from '../utils/get-ip-from-req.js';
|
|
8
|
-
import { ErrorCode, isDirectusError } from '@directus/errors';
|
|
9
|
-
import { useEnv } from '@directus/env';
|
|
10
|
-
import { SESSION_COOKIE_OPTIONS } from '../constants.js';
|
|
11
11
|
/**
|
|
12
12
|
* Verify the passed JWT and assign the user ID and role to `req`
|
|
13
13
|
*/
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Check if requested collection exists, and save it to req.collection
|
|
3
3
|
*/
|
|
4
4
|
import { systemCollectionRows } from '@directus/system-data';
|
|
5
|
-
import asyncHandler from '../utils/async-handler.js';
|
|
6
5
|
import { createCollectionForbiddenError } from '../permissions/modules/process-ast/utils/validate-path/create-error.js';
|
|
6
|
+
import asyncHandler from '../utils/async-handler.js';
|
|
7
7
|
const collectionExists = asyncHandler(async (req, _res, next) => {
|
|
8
8
|
if (!req.params['collection'])
|
|
9
9
|
return next();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { useEnv } from '@directus/env';
|
|
2
|
+
import { InvalidPayloadError, InvalidQueryError, MethodNotAllowedError } from '@directus/errors';
|
|
1
3
|
import { parseJSON } from '@directus/utils';
|
|
2
4
|
import { getOperationAST, parse, Source } from 'graphql';
|
|
3
|
-
import { InvalidPayloadError, InvalidQueryError, MethodNotAllowedError } from '@directus/errors';
|
|
4
5
|
import { GraphQLValidationError } from '../services/graphql/errors/validation.js';
|
|
5
6
|
import asyncHandler from '../utils/async-handler.js';
|
|
6
|
-
import { useEnv } from '@directus/env';
|
|
7
7
|
export const parseGraphQL = asyncHandler(async (req, res, next) => {
|
|
8
8
|
if (req.method !== 'GET' && req.method !== 'POST') {
|
|
9
9
|
throw new MethodNotAllowedError({ allowed: ['GET', 'POST'], current: req.method });
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Joi from 'joi';
|
|
2
1
|
import { InvalidPayloadError } from '@directus/errors';
|
|
2
|
+
import Joi from 'joi';
|
|
3
3
|
import asyncHandler from '../utils/async-handler.js';
|
|
4
4
|
import { sanitizeQuery } from '../utils/sanitize-query.js';
|
|
5
5
|
import { validateQuery } from '../utils/validate-query.js';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { defineOperationApi } from '@directus/extensions';
|
|
2
1
|
import { createRequire } from 'node:module';
|
|
2
|
+
import { defineOperationApi } from '@directus/extensions';
|
|
3
|
+
// eslint-disable-next-line import/order
|
|
3
4
|
import { sieveFunctions } from '@directus/utils';
|
|
4
5
|
const require = createRequire(import.meta.url);
|
|
5
6
|
const ivm = require('isolated-vm');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineOperationApi } from '@directus/extensions';
|
|
2
|
+
import { useLogger } from '../../logger/index.js';
|
|
2
3
|
import { MailService } from '../../services/mail/index.js';
|
|
3
4
|
import { md } from '../../utils/md.js';
|
|
4
|
-
import { useLogger } from '../../logger/index.js';
|
|
5
5
|
import { useFlowsEmailRateLimiter } from './rate-limiter.js';
|
|
6
6
|
const logger = useLogger();
|
|
7
7
|
export default defineOperationApi({
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useEnv } from '@directus/env';
|
|
2
|
+
import { EmailLimitExceededError } from '@directus/errors';
|
|
3
|
+
import { toBoolean } from '@directus/utils';
|
|
2
4
|
import { RateLimiterMemory, RateLimiterRedis, RateLimiterRes } from 'rate-limiter-flexible';
|
|
3
5
|
import { createRateLimiter } from '../../rate-limiter.js';
|
|
4
|
-
import { toBoolean } from '@directus/utils';
|
|
5
|
-
import { EmailLimitExceededError } from '@directus/errors';
|
|
6
6
|
let emailRateLimiter;
|
|
7
7
|
const env = useEnv();
|
|
8
8
|
if (toBoolean(env['RATE_LIMITER_EMAIL_FLOWS_ENABLED']) === true) {
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { useEnv } from '@directus/env';
|
|
1
2
|
import { defineCache } from '@directus/memory';
|
|
2
3
|
import { redisConfigAvailable, useRedis } from '../redis/index.js';
|
|
4
|
+
import { getMilliseconds } from '../utils/get-milliseconds.js';
|
|
3
5
|
const localOnly = redisConfigAvailable() === false;
|
|
6
|
+
const env = useEnv();
|
|
7
|
+
const ttl = getMilliseconds(env['CACHE_SYSTEM_TTL']);
|
|
4
8
|
const config = localOnly
|
|
5
9
|
? {
|
|
6
10
|
type: 'local',
|
|
@@ -11,6 +15,7 @@ const config = localOnly
|
|
|
11
15
|
redis: {
|
|
12
16
|
namespace: 'permissions',
|
|
13
17
|
redis: useRedis(),
|
|
18
|
+
...(ttl !== undefined ? { ttl } : {}),
|
|
14
19
|
},
|
|
15
20
|
local: {
|
|
16
21
|
maxKeys: 100,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { uniq } from 'lodash-es';
|
|
2
|
-
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
3
2
|
import { fetchPermissions } from '../../lib/fetch-permissions.js';
|
|
3
|
+
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
4
4
|
export async function fetchAllowedCollections({ action, accountability }, { knex, schema }) {
|
|
5
5
|
if (accountability.admin) {
|
|
6
6
|
return Object.keys(schema.collections);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { uniq } from 'lodash-es';
|
|
2
|
-
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
3
2
|
import { fetchPermissions } from '../../lib/fetch-permissions.js';
|
|
3
|
+
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
4
4
|
export async function fetchAllowedFieldMap({ accountability, action }, { knex, schema }) {
|
|
5
5
|
const fieldMap = {};
|
|
6
6
|
if (accountability.admin) {
|
package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
1
|
+
import { difference, intersection, uniq } from 'lodash-es';
|
|
3
2
|
import { fetchPermissions } from '../../lib/fetch-permissions.js';
|
|
3
|
+
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
4
4
|
/**
|
|
5
5
|
* Fetch a field map for fields that may or may not be null based on item-by-item permissions.
|
|
6
6
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getUnaliasedFieldKey } from '../../../utils/get-unaliased-field-key.js';
|
|
2
1
|
import { uniq } from 'lodash-es';
|
|
2
|
+
import { getUnaliasedFieldKey } from '../../../utils/get-unaliased-field-key.js';
|
|
3
3
|
import { getCases } from './get-cases.js';
|
|
4
4
|
/**
|
|
5
5
|
* Mutates passed AST
|
|
@@ -3,8 +3,8 @@ import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
|
3
3
|
import { fieldMapFromAst } from './lib/field-map-from-ast.js';
|
|
4
4
|
import { injectCases } from './lib/inject-cases.js';
|
|
5
5
|
import { collectionsInFieldMap } from './utils/collections-in-field-map.js';
|
|
6
|
-
import { validatePathPermissions } from './utils/validate-path/validate-path-permissions.js';
|
|
7
6
|
import { validatePathExistence } from './utils/validate-path/validate-path-existence.js';
|
|
7
|
+
import { validatePathPermissions } from './utils/validate-path/validate-path-permissions.js';
|
|
8
8
|
export async function processAst(options, context) {
|
|
9
9
|
// FieldMap is a Map of paths in the AST, with each path containing the collection and fields in
|
|
10
10
|
// that collection that the AST path tries to access
|
|
@@ -6,8 +6,8 @@ import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
|
6
6
|
import { extractRequiredDynamicVariableContext } from '../../utils/extract-required-dynamic-variable-context.js';
|
|
7
7
|
import { fetchDynamicVariableData } from '../../utils/fetch-dynamic-variable-data.js';
|
|
8
8
|
import { contextHasDynamicVariables } from '../process-ast/utils/context-has-dynamic-variables.js';
|
|
9
|
-
import { isFieldNullable } from './lib/is-field-nullable.js';
|
|
10
9
|
import { createCollectionForbiddenError, createFieldsForbiddenError, } from '../process-ast/utils/validate-path/create-error.js';
|
|
10
|
+
import { isFieldNullable } from './lib/is-field-nullable.js';
|
|
11
11
|
/**
|
|
12
12
|
* @note this only validates the top-level fields. The expectation is that this function is called
|
|
13
13
|
* for each level of nested insert separately
|
|
@@ -6,5 +6,17 @@ export interface ValidateItemAccessOptions {
|
|
|
6
6
|
collection: string;
|
|
7
7
|
primaryKeys: PrimaryKey[];
|
|
8
8
|
fields?: string[];
|
|
9
|
+
returnAllowedRootFields?: boolean;
|
|
9
10
|
}
|
|
10
|
-
export
|
|
11
|
+
export interface ValidateItemAccessOptionsWithRootFields extends ValidateItemAccessOptions {
|
|
12
|
+
returnAllowedRootFields: true;
|
|
13
|
+
}
|
|
14
|
+
export interface ValidateItemAccessResult {
|
|
15
|
+
accessAllowed: boolean;
|
|
16
|
+
allowedRootFields?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface ValidateItemAccessResultWithRootFields extends ValidateItemAccessResult {
|
|
19
|
+
allowedRootFields: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function validateItemAccess(options: ValidateItemAccessOptionsWithRootFields, context: Context): Promise<ValidateItemAccessResultWithRootFields>;
|
|
22
|
+
export declare function validateItemAccess(options: ValidateItemAccessOptions, context: Context): Promise<ValidateItemAccessResult>;
|