directus 9.23.1 → 9.23.4
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 +25 -21
- package/dist/auth/auth.d.ts +3 -3
- package/dist/auth/auth.js +2 -0
- package/dist/auth/drivers/ldap.d.ts +1 -1
- package/dist/auth/drivers/ldap.js +57 -46
- package/dist/auth/drivers/local.d.ts +1 -1
- package/dist/auth/drivers/local.js +20 -17
- package/dist/auth/drivers/oauth2.d.ts +1 -1
- package/dist/auth/drivers/oauth2.js +44 -35
- package/dist/auth/drivers/openid.d.ts +1 -1
- package/dist/auth/drivers/openid.js +50 -41
- package/dist/auth/drivers/saml.d.ts +1 -1
- package/dist/auth/drivers/saml.js +20 -17
- package/dist/auth.d.ts +1 -1
- package/dist/auth.js +8 -7
- package/dist/cache.d.ts +9 -1
- package/dist/cache.js +66 -18
- package/dist/cli/commands/bootstrap/index.js +7 -6
- package/dist/cli/commands/init/index.js +3 -3
- package/dist/cli/commands/schema/apply.js +14 -15
- package/dist/cli/commands/schema/snapshot.js +2 -2
- package/dist/cli/utils/create-db-connection.d.ts +1 -1
- package/dist/cli/utils/create-db-connection.js +3 -2
- package/dist/cli/utils/create-env/index.d.ts +2 -2
- package/dist/cli/utils/create-env/index.js +1 -1
- package/dist/cli/utils/drivers.d.ts +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.js +7 -7
- package/dist/controllers/activity.js +10 -11
- package/dist/controllers/assets.js +31 -25
- package/dist/controllers/auth.js +40 -26
- package/dist/controllers/collections.js +10 -10
- package/dist/controllers/dashboards.js +14 -11
- package/dist/controllers/extensions.js +3 -3
- package/dist/controllers/fields.js +20 -20
- package/dist/controllers/files.js +26 -20
- package/dist/controllers/flows.js +16 -13
- package/dist/controllers/folders.js +14 -11
- package/dist/controllers/graphql.js +6 -8
- package/dist/controllers/items.js +22 -19
- package/dist/controllers/not-found.d.ts +1 -1
- package/dist/controllers/not-found.js +1 -2
- package/dist/controllers/notifications.js +14 -11
- package/dist/controllers/operations.js +14 -11
- package/dist/controllers/panels.js +14 -11
- package/dist/controllers/permissions.js +14 -11
- package/dist/controllers/presets.js +14 -11
- package/dist/controllers/relations.js +10 -10
- package/dist/controllers/revisions.js +3 -3
- package/dist/controllers/roles.js +14 -11
- package/dist/controllers/schema.js +5 -5
- package/dist/controllers/server.js +7 -7
- package/dist/controllers/settings.js +2 -2
- package/dist/controllers/shares.js +21 -18
- package/dist/controllers/users.js +32 -36
- package/dist/controllers/utils.js +10 -15
- package/dist/controllers/webhooks.js +14 -11
- package/dist/database/helpers/fn/dialects/mssql.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/mssql.js +10 -11
- package/dist/database/helpers/fn/dialects/mysql.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/mysql.js +2 -3
- package/dist/database/helpers/fn/dialects/oracle.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/oracle.js +10 -11
- package/dist/database/helpers/fn/dialects/postgres.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/postgres.js +10 -11
- package/dist/database/helpers/fn/dialects/sqlite.d.ts +1 -1
- package/dist/database/helpers/fn/dialects/sqlite.js +10 -11
- package/dist/database/helpers/fn/types.d.ts +5 -6
- package/dist/database/helpers/fn/types.js +4 -5
- package/dist/database/helpers/geometry/dialects/mssql.d.ts +3 -3
- package/dist/database/helpers/geometry/dialects/mysql.d.ts +1 -1
- package/dist/database/helpers/geometry/dialects/oracle.d.ts +3 -3
- package/dist/database/helpers/geometry/dialects/postgres.d.ts +3 -3
- package/dist/database/helpers/geometry/dialects/postgres.js +1 -2
- package/dist/database/helpers/geometry/dialects/redshift.d.ts +2 -2
- package/dist/database/helpers/geometry/dialects/sqlite.d.ts +1 -1
- package/dist/database/helpers/geometry/types.d.ts +2 -2
- package/dist/database/helpers/geometry/types.js +1 -2
- package/dist/database/helpers/index.d.ts +5 -5
- package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mysql.d.ts +1 -1
- package/dist/database/helpers/schema/dialects/mysql.js +1 -2
- package/dist/database/helpers/schema/dialects/oracle.d.ts +2 -2
- package/dist/database/helpers/schema/dialects/oracle.js +4 -6
- package/dist/database/helpers/schema/types.d.ts +4 -4
- package/dist/database/helpers/types.d.ts +1 -1
- package/dist/database/helpers/types.js +1 -0
- package/dist/database/index.d.ts +1 -1
- package/dist/database/index.js +13 -13
- package/dist/database/migrations/20201028A-remove-collection-foreign-keys.d.ts +1 -1
- package/dist/database/migrations/20201029A-remove-system-relations.d.ts +1 -1
- package/dist/database/migrations/20201029B-remove-system-collections.d.ts +1 -1
- package/dist/database/migrations/20201029C-remove-system-fields.d.ts +1 -1
- package/dist/database/migrations/20201105A-add-cascade-system-relations.d.ts +1 -1
- package/dist/database/migrations/20201105B-change-webhook-url-type.d.ts +1 -1
- package/dist/database/migrations/20210225A-add-relations-sort-field.d.ts +1 -1
- package/dist/database/migrations/20210225A-add-relations-sort-field.js +1 -2
- package/dist/database/migrations/20210304A-remove-locked-fields.d.ts +1 -1
- package/dist/database/migrations/20210312A-webhooks-collections-text.d.ts +1 -1
- package/dist/database/migrations/20210331A-add-refresh-interval.d.ts +1 -1
- package/dist/database/migrations/20210415A-make-filesize-nullable.d.ts +1 -1
- package/dist/database/migrations/20210416A-add-collections-accountability.d.ts +1 -1
- package/dist/database/migrations/20210422A-remove-files-interface.d.ts +1 -1
- package/dist/database/migrations/20210506A-rename-interfaces.d.ts +1 -1
- package/dist/database/migrations/20210510A-restructure-relations.d.ts +1 -1
- package/dist/database/migrations/20210518A-add-foreign-key-constraints.d.ts +1 -1
- package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +1 -1
- package/dist/database/migrations/20210519A-add-system-fk-triggers.d.ts +1 -1
- package/dist/database/migrations/20210519A-add-system-fk-triggers.js +2 -2
- package/dist/database/migrations/20210521A-add-collections-icon-color.d.ts +1 -1
- package/dist/database/migrations/20210525A-add-insights.d.ts +1 -1
- package/dist/database/migrations/20210608A-add-deep-clone-config.d.ts +1 -1
- package/dist/database/migrations/20210626A-change-filesize-bigint.d.ts +1 -1
- package/dist/database/migrations/20210716A-add-conditions-to-fields.d.ts +1 -1
- package/dist/database/migrations/20210721A-add-default-folder.d.ts +1 -1
- package/dist/database/migrations/20210802A-replace-groups.d.ts +1 -1
- package/dist/database/migrations/20210803A-add-required-to-fields.d.ts +1 -1
- package/dist/database/migrations/20210805A-update-groups.d.ts +1 -1
- package/dist/database/migrations/20210805B-change-image-metadata-structure.d.ts +1 -1
- package/dist/database/migrations/20210805B-change-image-metadata-structure.js +15 -15
- package/dist/database/migrations/20210811A-add-geometry-config.d.ts +1 -1
- package/dist/database/migrations/20210831A-remove-limit-column.d.ts +1 -1
- package/dist/database/migrations/20210903A-add-auth-provider.d.ts +1 -1
- package/dist/database/migrations/20210907A-webhooks-collections-not-null.d.ts +1 -1
- package/dist/database/migrations/20210910A-move-module-setup.d.ts +1 -1
- package/dist/database/migrations/20210920A-webhooks-url-not-null.d.ts +1 -1
- package/dist/database/migrations/20210924A-add-collection-organization.d.ts +1 -1
- package/dist/database/migrations/20210927A-replace-fields-group.d.ts +1 -1
- package/dist/database/migrations/20210927B-replace-m2m-interface.d.ts +1 -1
- package/dist/database/migrations/20210929A-rename-login-action.d.ts +1 -1
- package/dist/database/migrations/20211007A-update-presets.d.ts +1 -1
- package/dist/database/migrations/20211007A-update-presets.js +7 -9
- package/dist/database/migrations/20211009A-add-auth-data.d.ts +1 -1
- package/dist/database/migrations/20211016A-add-webhook-headers.d.ts +1 -1
- package/dist/database/migrations/20211103A-set-unique-to-user-token.d.ts +1 -1
- package/dist/database/migrations/20211103B-update-special-geometry.d.ts +1 -1
- package/dist/database/migrations/20211104A-remove-collections-listing.d.ts +1 -1
- package/dist/database/migrations/20211118A-add-notifications.d.ts +1 -1
- package/dist/database/migrations/20211211A-add-shares.d.ts +1 -1
- package/dist/database/migrations/20211230A-add-project-descriptor.d.ts +1 -1
- package/dist/database/migrations/20220303A-remove-default-project-color.d.ts +1 -1
- package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +1 -1
- package/dist/database/migrations/20220314A-add-translation-strings.d.ts +1 -1
- package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +1 -1
- package/dist/database/migrations/20220323A-add-field-validation.d.ts +1 -1
- package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +1 -1
- package/dist/database/migrations/20220325B-add-default-language.d.ts +1 -1
- package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +1 -1
- package/dist/database/migrations/20220429A-add-flows.d.ts +1 -1
- package/dist/database/migrations/20220429B-add-color-to-insights-icon.d.ts +1 -1
- package/dist/database/migrations/20220429C-drop-non-null-from-ip-of-activity.d.ts +1 -1
- package/dist/database/migrations/20220429D-drop-non-null-from-sender-of-notifications.d.ts +1 -1
- package/dist/database/migrations/20220614A-rename-hook-trigger-to-event.d.ts +1 -1
- package/dist/database/migrations/20220801A-update-notifications-timestamp-column.d.ts +1 -1
- package/dist/database/migrations/20220802A-add-custom-aspect-ratios.d.ts +1 -1
- package/dist/database/migrations/20220826A-add-origin-to-accountability.d.ts +1 -1
- package/dist/database/migrations/run.d.ts +1 -1
- package/dist/database/migrations/run.js +1 -1
- package/dist/database/run-ast.d.ts +3 -3
- package/dist/database/run-ast.js +21 -30
- package/dist/database/seeds/run.d.ts +1 -1
- package/dist/database/seeds/run.js +1 -2
- package/dist/database/system-data/app-access-permissions/index.d.ts +1 -1
- package/dist/database/system-data/collections/index.d.ts +1 -1
- package/dist/database/system-data/collections/index.js +2 -2
- package/dist/database/system-data/fields/collections.yaml +2 -0
- package/dist/database/system-data/fields/index.d.ts +1 -1
- package/dist/database/system-data/fields/index.js +3 -4
- package/dist/database/system-data/fields/settings.yaml +4 -0
- package/dist/database/system-data/relations/index.d.ts +1 -1
- package/dist/emitter.d.ts +1 -1
- package/dist/emitter.js +3 -0
- package/dist/env.js +11 -3
- package/dist/exceptions/database/dialects/mssql.d.ts +1 -1
- package/dist/exceptions/database/dialects/mssql.js +5 -6
- package/dist/exceptions/database/dialects/mysql.d.ts +1 -1
- package/dist/exceptions/database/dialects/mysql.js +19 -25
- package/dist/exceptions/database/dialects/oracle.d.ts +1 -1
- package/dist/exceptions/database/dialects/postgres.d.ts +1 -1
- package/dist/exceptions/database/dialects/sqlite.d.ts +1 -1
- package/dist/exceptions/database/translate.d.ts +1 -1
- package/dist/exceptions/database/value-out-of-range.js +1 -1
- package/dist/exceptions/range-not-satisfiable.js +2 -3
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +43 -33
- package/dist/flows.js +65 -46
- package/dist/logger.d.ts +2 -1
- package/dist/logger.js +35 -19
- package/dist/logger.test.d.ts +1 -0
- package/dist/mailer.js +16 -16
- package/dist/messenger.js +9 -7
- package/dist/middleware/authenticate.d.ts +1 -1
- package/dist/middleware/authenticate.js +13 -6
- package/dist/middleware/cache.d.ts +1 -1
- package/dist/middleware/cache.js +16 -16
- package/dist/middleware/check-ip.d.ts +1 -1
- package/dist/middleware/check-ip.js +1 -1
- package/dist/middleware/collection-exists.d.ts +1 -1
- package/dist/middleware/collection-exists.js +5 -5
- package/dist/middleware/cors.d.ts +1 -1
- package/dist/middleware/cors.js +7 -7
- package/dist/middleware/error-handler.d.ts +1 -1
- package/dist/middleware/error-handler.js +11 -12
- package/dist/middleware/extract-token.d.ts +1 -1
- package/dist/middleware/extract-token.js +2 -2
- package/dist/middleware/get-permissions.d.ts +1 -1
- package/dist/middleware/graphql.d.ts +1 -1
- package/dist/middleware/graphql.js +15 -9
- package/dist/middleware/rate-limiter-global.d.ts +5 -0
- package/dist/middleware/rate-limiter-global.js +48 -0
- package/dist/middleware/{rate-limiter.d.ts → rate-limiter-ip.d.ts} +2 -2
- package/dist/middleware/{rate-limiter.js → rate-limiter-ip.js} +5 -5
- package/dist/middleware/respond.d.ts +1 -1
- package/dist/middleware/respond.js +18 -19
- package/dist/middleware/sanitize-query.d.ts +1 -1
- package/dist/middleware/sanitize-query.js +1 -1
- package/dist/middleware/schema.d.ts +1 -1
- package/dist/middleware/use-collection.d.ts +1 -1
- package/dist/operations/condition/index.d.ts +1 -1
- package/dist/operations/exec/index.js +15 -4
- package/dist/operations/item-create/index.js +1 -2
- package/dist/operations/item-delete/index.d.ts +1 -1
- package/dist/operations/item-read/index.d.ts +1 -1
- package/dist/operations/item-update/index.d.ts +1 -1
- package/dist/operations/item-update/index.js +1 -2
- package/dist/operations/notification/index.js +1 -2
- package/dist/operations/request/index.js +19 -19
- package/dist/operations/trigger/index.js +2 -3
- package/dist/rate-limiter.d.ts +1 -1
- package/dist/rate-limiter.js +9 -9
- package/dist/request/validate-ip.js +2 -2
- package/dist/server.js +12 -13
- package/dist/services/activity.d.ts +1 -1
- package/dist/services/activity.js +17 -16
- package/dist/services/assets.d.ts +3 -3
- package/dist/services/assets.js +35 -37
- package/dist/services/authentication.d.ts +2 -2
- package/dist/services/authentication.js +22 -19
- package/dist/services/authorization.d.ts +3 -3
- package/dist/services/authorization.js +27 -31
- package/dist/services/collections.d.ts +5 -5
- package/dist/services/collections.js +54 -50
- package/dist/services/dashboards.d.ts +1 -1
- package/dist/services/fields.d.ts +5 -5
- package/dist/services/fields.js +50 -50
- package/dist/services/files.d.ts +1 -2
- package/dist/services/files.js +33 -27
- package/dist/services/flows.d.ts +2 -2
- package/dist/services/folders.d.ts +1 -1
- package/dist/services/graphql/index.d.ts +4 -4
- package/dist/services/graphql/index.js +259 -252
- package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -2
- package/dist/services/graphql/utils/process-error.d.ts +2 -2
- package/dist/services/graphql/utils/process-error.js +11 -4
- package/dist/services/import-export.d.ts +3 -3
- package/dist/services/import-export.js +30 -27
- package/dist/services/items.d.ts +3 -3
- package/dist/services/items.js +42 -36
- package/dist/services/mail/index.d.ts +4 -4
- package/dist/services/mail/index.js +14 -10
- package/dist/services/meta.d.ts +3 -3
- package/dist/services/meta.js +11 -9
- package/dist/services/notifications.d.ts +3 -3
- package/dist/services/notifications.js +10 -9
- package/dist/services/operations.d.ts +2 -2
- package/dist/services/panels.d.ts +1 -1
- package/dist/services/payload.d.ts +3 -3
- package/dist/services/payload.js +124 -122
- package/dist/services/permissions.d.ts +3 -3
- package/dist/services/permissions.js +11 -11
- package/dist/services/presets.d.ts +1 -1
- package/dist/services/relations.d.ts +6 -6
- package/dist/services/relations.js +45 -43
- package/dist/services/revisions.d.ts +1 -1
- package/dist/services/revisions.js +3 -3
- package/dist/services/roles.d.ts +2 -2
- package/dist/services/roles.js +7 -7
- package/dist/services/schema.d.ts +3 -3
- package/dist/services/schema.js +9 -11
- package/dist/services/server.d.ts +3 -3
- package/dist/services/server.js +88 -32
- package/dist/services/settings.d.ts +1 -1
- package/dist/services/shares.d.ts +1 -1
- package/dist/services/shares.js +14 -15
- package/dist/services/specifications.d.ts +4 -4
- package/dist/services/specifications.js +137 -119
- package/dist/services/tfa.d.ts +2 -2
- package/dist/services/tfa.js +7 -5
- package/dist/services/users.d.ts +2 -6
- package/dist/services/users.js +37 -40
- package/dist/services/utils.d.ts +3 -3
- package/dist/services/utils.js +10 -8
- package/dist/services/webhooks.d.ts +2 -2
- package/dist/services/webhooks.js +2 -1
- package/dist/storage/register-locations.js +1 -1
- package/dist/types/assets.d.ts +1 -1
- package/dist/types/ast.d.ts +1 -1
- package/dist/types/auth.d.ts +2 -2
- package/dist/types/collection.d.ts +2 -2
- package/dist/types/events.d.ts +2 -2
- package/dist/types/graphql.d.ts +2 -2
- package/dist/types/items.d.ts +3 -3
- package/dist/types/services.d.ts +5 -5
- package/dist/types/snapshot.d.ts +4 -4
- package/dist/utils/apply-diff.d.ts +3 -3
- package/dist/utils/apply-diff.js +25 -28
- package/dist/utils/apply-query.d.ts +3 -3
- package/dist/utils/apply-query.js +10 -12
- package/dist/utils/apply-snapshot.d.ts +3 -3
- package/dist/utils/apply-snapshot.js +5 -6
- package/dist/utils/construct-flow-tree.d.ts +1 -1
- package/dist/utils/construct-flow-tree.js +2 -2
- package/dist/utils/dynamic-import.js +1 -1
- package/dist/utils/filter-items.d.ts +1 -1
- package/dist/utils/generate-hash.js +1 -1
- package/dist/utils/get-accountability-for-role.d.ts +2 -2
- package/dist/utils/get-accountability-for-role.js +1 -1
- package/dist/utils/get-ast-from-query.d.ts +3 -3
- package/dist/utils/get-ast-from-query.js +22 -28
- package/dist/utils/get-auth-providers.js +1 -1
- package/dist/utils/get-cache-headers.d.ts +1 -1
- package/dist/utils/get-cache-headers.js +6 -7
- package/dist/utils/get-cache-key.d.ts +1 -1
- package/dist/utils/get-cache-key.js +2 -3
- package/dist/utils/get-collection-from-alias.d.ts +1 -1
- package/dist/utils/get-collection-from-alias.js +1 -0
- package/dist/utils/get-column-path.d.ts +2 -2
- package/dist/utils/get-column-path.js +3 -4
- package/dist/utils/get-column.d.ts +4 -4
- package/dist/utils/get-column.js +4 -5
- package/dist/utils/get-default-value.d.ts +2 -2
- package/dist/utils/get-default-value.js +2 -3
- package/dist/utils/get-graphql-query-and-variables.d.ts +1 -1
- package/dist/utils/get-graphql-query-and-variables.js +1 -2
- package/dist/utils/get-graphql-type.d.ts +2 -2
- package/dist/utils/get-graphql-type.js +1 -1
- package/dist/utils/get-ip-from-req.d.ts +1 -1
- package/dist/utils/get-ip-from-req.js +2 -2
- package/dist/utils/get-local-type.d.ts +1 -1
- package/dist/utils/get-local-type.js +3 -3
- package/dist/utils/get-milliseconds.js +1 -2
- package/dist/utils/get-permissions.d.ts +1 -1
- package/dist/utils/get-permissions.js +12 -12
- package/dist/utils/get-relation-info.d.ts +1 -1
- package/dist/utils/get-relation-info.js +3 -5
- package/dist/utils/get-relation-type.d.ts +1 -1
- package/dist/utils/get-relation-type.js +3 -4
- package/dist/utils/get-schema.d.ts +2 -2
- package/dist/utils/get-schema.js +20 -22
- package/dist/utils/get-snapshot-diff.js +2 -3
- package/dist/utils/get-snapshot.d.ts +3 -3
- package/dist/utils/get-snapshot.js +6 -8
- package/dist/utils/is-directus-jwt.js +1 -1
- package/dist/utils/is-url-allowed.js +5 -2
- package/dist/utils/job-queue.js +2 -0
- package/dist/utils/jwt.d.ts +1 -1
- package/dist/utils/merge-permissions-for-share.d.ts +1 -1
- package/dist/utils/merge-permissions-for-share.js +3 -4
- package/dist/utils/merge-permissions.d.ts +3 -3
- package/dist/utils/reduce-schema.d.ts +1 -1
- package/dist/utils/reduce-schema.js +12 -12
- package/dist/utils/sanitize-query.d.ts +1 -1
- package/dist/utils/sanitize-query.js +27 -27
- package/dist/utils/sanitize-schema.d.ts +2 -2
- package/dist/utils/should-skip-cache.d.ts +7 -0
- package/dist/utils/should-skip-cache.js +21 -0
- package/dist/utils/should-skip-cache.test.d.ts +1 -0
- package/dist/utils/track.js +16 -16
- package/dist/utils/transformations.d.ts +1 -1
- package/dist/utils/transformations.js +2 -4
- package/dist/utils/url.js +7 -2
- package/dist/utils/user-name.d.ts +1 -1
- package/dist/utils/validate-diff.js +7 -8
- package/dist/utils/validate-keys.d.ts +2 -2
- package/dist/utils/validate-keys.js +1 -1
- package/dist/utils/validate-query.d.ts +1 -1
- package/dist/utils/validate-query.js +3 -3
- package/dist/utils/validate-storage.js +8 -8
- package/dist/webhooks.js +3 -3
- package/package.json +36 -37
- package/dist/utils/with-timeout.d.ts +0 -1
- package/dist/utils/with-timeout.js +0 -16
package/dist/cache.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getCacheValue = exports.setCacheValue = exports.getSystemCache = exports.setSystemCache = exports.clearSystemCache = exports.flushCaches = exports.getCache = void 0;
|
|
6
|
+
exports.getCacheValue = exports.setCacheValue = exports.getSchemaCache = exports.setSchemaCache = exports.getSystemCache = exports.setSystemCache = exports.clearSystemCache = exports.flushCaches = exports.getCache = void 0;
|
|
7
7
|
const keyv_1 = __importDefault(require("keyv"));
|
|
8
8
|
const env_1 = __importDefault(require("./env"));
|
|
9
9
|
const logger_1 = __importDefault(require("./logger"));
|
|
@@ -11,40 +11,67 @@ const compress_1 = require("./utils/compress");
|
|
|
11
11
|
const get_config_from_env_1 = require("./utils/get-config-from-env");
|
|
12
12
|
const get_milliseconds_1 = require("./utils/get-milliseconds");
|
|
13
13
|
const validate_env_1 = require("./utils/validate-env");
|
|
14
|
+
const messenger_1 = require("./messenger");
|
|
15
|
+
const utils_1 = require("@directus/shared/utils");
|
|
14
16
|
let cache = null;
|
|
15
17
|
let systemCache = null;
|
|
18
|
+
let localSchemaCache = null;
|
|
19
|
+
let sharedSchemaCache = null;
|
|
16
20
|
let lockCache = null;
|
|
21
|
+
let messengerSubscribed = false;
|
|
22
|
+
const messenger = (0, messenger_1.getMessenger)();
|
|
23
|
+
if (env_1.default['MESSENGER_STORE'] === 'redis' &&
|
|
24
|
+
env_1.default['CACHE_STORE'] === 'memory' &&
|
|
25
|
+
env_1.default['CACHE_AUTO_PURGE'] &&
|
|
26
|
+
!messengerSubscribed) {
|
|
27
|
+
messengerSubscribed = true;
|
|
28
|
+
messenger.subscribe('schemaChanged', async (opts) => {
|
|
29
|
+
if (cache && opts?.['autoPurgeCache'] !== false) {
|
|
30
|
+
await cache.clear();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
17
34
|
function getCache() {
|
|
18
|
-
if (env_1.default
|
|
35
|
+
if (env_1.default['CACHE_ENABLED'] === true && cache === null) {
|
|
19
36
|
(0, validate_env_1.validateEnv)(['CACHE_NAMESPACE', 'CACHE_TTL', 'CACHE_STORE']);
|
|
20
|
-
cache = getKeyvInstance((0, get_milliseconds_1.getMilliseconds)(env_1.default
|
|
37
|
+
cache = getKeyvInstance(env_1.default['CACHE_STORE'], (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_TTL']));
|
|
21
38
|
cache.on('error', (err) => logger_1.default.warn(err, `[cache] ${err}`));
|
|
22
39
|
}
|
|
23
40
|
if (systemCache === null) {
|
|
24
|
-
systemCache = getKeyvInstance((0, get_milliseconds_1.getMilliseconds)(env_1.default
|
|
25
|
-
systemCache.on('error', (err) => logger_1.default.warn(err, `[cache] ${err}`));
|
|
41
|
+
systemCache = getKeyvInstance(env_1.default['CACHE_STORE'], (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_SYSTEM_TTL']), '_system');
|
|
42
|
+
systemCache.on('error', (err) => logger_1.default.warn(err, `[system-cache] ${err}`));
|
|
43
|
+
}
|
|
44
|
+
if (sharedSchemaCache === null) {
|
|
45
|
+
sharedSchemaCache = getKeyvInstance(env_1.default['CACHE_STORE'], (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_SYSTEM_TTL']), '_schema_shared');
|
|
46
|
+
sharedSchemaCache.on('error', (err) => logger_1.default.warn(err, `[shared-schema-cache] ${err}`));
|
|
47
|
+
}
|
|
48
|
+
if (localSchemaCache === null) {
|
|
49
|
+
localSchemaCache = getKeyvInstance('memory', (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_SYSTEM_TTL']), '_schema');
|
|
50
|
+
localSchemaCache.on('error', (err) => logger_1.default.warn(err, `[schema-cache] ${err}`));
|
|
26
51
|
}
|
|
27
52
|
if (lockCache === null) {
|
|
28
|
-
lockCache = getKeyvInstance(undefined, '_lock');
|
|
29
|
-
lockCache.on('error', (err) => logger_1.default.warn(err, `[cache] ${err}`));
|
|
53
|
+
lockCache = getKeyvInstance(env_1.default['CACHE_STORE'], undefined, '_lock');
|
|
54
|
+
lockCache.on('error', (err) => logger_1.default.warn(err, `[lock-cache] ${err}`));
|
|
30
55
|
}
|
|
31
|
-
return { cache, systemCache, lockCache };
|
|
56
|
+
return { cache, systemCache, sharedSchemaCache, localSchemaCache, lockCache };
|
|
32
57
|
}
|
|
33
58
|
exports.getCache = getCache;
|
|
34
59
|
async function flushCaches(forced) {
|
|
35
60
|
const { cache } = getCache();
|
|
36
|
-
await clearSystemCache(forced);
|
|
37
|
-
await
|
|
61
|
+
await clearSystemCache({ forced });
|
|
62
|
+
await cache?.clear();
|
|
38
63
|
}
|
|
39
64
|
exports.flushCaches = flushCaches;
|
|
40
|
-
async function clearSystemCache(
|
|
41
|
-
const { systemCache, lockCache } = getCache();
|
|
65
|
+
async function clearSystemCache(opts) {
|
|
66
|
+
const { systemCache, localSchemaCache, lockCache } = getCache();
|
|
42
67
|
// Flush system cache when forced or when system cache lock not set
|
|
43
|
-
if (forced || !(await lockCache.get('system-cache-lock'))) {
|
|
68
|
+
if (opts?.forced || !(await lockCache.get('system-cache-lock'))) {
|
|
44
69
|
await lockCache.set('system-cache-lock', true, 10000);
|
|
45
70
|
await systemCache.clear();
|
|
46
71
|
await lockCache.delete('system-cache-lock');
|
|
47
72
|
}
|
|
73
|
+
await localSchemaCache.clear();
|
|
74
|
+
messenger.publish('schemaChanged', { autoPurgeCache: opts?.autoPurgeCache });
|
|
48
75
|
}
|
|
49
76
|
exports.clearSystemCache = clearSystemCache;
|
|
50
77
|
async function setSystemCache(key, value, ttl) {
|
|
@@ -59,6 +86,25 @@ async function getSystemCache(key) {
|
|
|
59
86
|
return await getCacheValue(systemCache, key);
|
|
60
87
|
}
|
|
61
88
|
exports.getSystemCache = getSystemCache;
|
|
89
|
+
async function setSchemaCache(schema) {
|
|
90
|
+
const { localSchemaCache, sharedSchemaCache } = getCache();
|
|
91
|
+
const schemaHash = await (0, utils_1.getSimpleHash)(JSON.stringify(schema));
|
|
92
|
+
await sharedSchemaCache.set('hash', schemaHash);
|
|
93
|
+
await localSchemaCache.set('schema', schema);
|
|
94
|
+
await localSchemaCache.set('hash', schemaHash);
|
|
95
|
+
}
|
|
96
|
+
exports.setSchemaCache = setSchemaCache;
|
|
97
|
+
async function getSchemaCache() {
|
|
98
|
+
const { localSchemaCache, sharedSchemaCache } = getCache();
|
|
99
|
+
const sharedSchemaHash = await sharedSchemaCache.get('hash');
|
|
100
|
+
if (!sharedSchemaHash)
|
|
101
|
+
return;
|
|
102
|
+
const localSchemaHash = await localSchemaCache.get('hash');
|
|
103
|
+
if (!localSchemaHash || localSchemaHash !== sharedSchemaHash)
|
|
104
|
+
return;
|
|
105
|
+
return await localSchemaCache.get('schema');
|
|
106
|
+
}
|
|
107
|
+
exports.getSchemaCache = getSchemaCache;
|
|
62
108
|
async function setCacheValue(cache, key, value, ttl) {
|
|
63
109
|
const compressed = await (0, compress_1.compress)(value);
|
|
64
110
|
await cache.set(key, compressed, ttl);
|
|
@@ -72,8 +118,8 @@ async function getCacheValue(cache, key) {
|
|
|
72
118
|
return decompressed;
|
|
73
119
|
}
|
|
74
120
|
exports.getCacheValue = getCacheValue;
|
|
75
|
-
function getKeyvInstance(ttl, namespaceSuffix) {
|
|
76
|
-
switch (
|
|
121
|
+
function getKeyvInstance(store, ttl, namespaceSuffix) {
|
|
122
|
+
switch (store) {
|
|
77
123
|
case 'redis':
|
|
78
124
|
return new keyv_1.default(getConfig('redis', ttl, namespaceSuffix));
|
|
79
125
|
case 'memcache':
|
|
@@ -85,18 +131,20 @@ function getKeyvInstance(ttl, namespaceSuffix) {
|
|
|
85
131
|
}
|
|
86
132
|
function getConfig(store = 'memory', ttl, namespaceSuffix = '') {
|
|
87
133
|
const config = {
|
|
88
|
-
namespace: `${env_1.default
|
|
134
|
+
namespace: `${env_1.default['CACHE_NAMESPACE']}${namespaceSuffix}`,
|
|
89
135
|
ttl,
|
|
90
136
|
};
|
|
91
137
|
if (store === 'redis') {
|
|
92
138
|
const KeyvRedis = require('@keyv/redis');
|
|
93
|
-
config.store = new KeyvRedis(env_1.default
|
|
139
|
+
config.store = new KeyvRedis(env_1.default['CACHE_REDIS'] || (0, get_config_from_env_1.getConfigFromEnv)('CACHE_REDIS_'));
|
|
94
140
|
}
|
|
95
141
|
if (store === 'memcache') {
|
|
96
142
|
const KeyvMemcache = require('keyv-memcache');
|
|
97
143
|
// keyv-memcache uses memjs which only accepts a comma separated string instead of an array,
|
|
98
144
|
// so we need to join array into a string when applicable. See #7986
|
|
99
|
-
const cacheMemcache = Array.isArray(env_1.default
|
|
145
|
+
const cacheMemcache = Array.isArray(env_1.default['CACHE_MEMCACHE'])
|
|
146
|
+
? env_1.default['CACHE_MEMCACHE'].join(',')
|
|
147
|
+
: env_1.default['CACHE_MEMCACHE'];
|
|
100
148
|
config.store = new KeyvMemcache(cacheMemcache);
|
|
101
149
|
}
|
|
102
150
|
return config;
|
|
@@ -26,13 +26,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const database_1 = __importStar(require("../../../database"));
|
|
29
30
|
const run_1 = __importDefault(require("../../../database/migrations/run"));
|
|
30
31
|
const run_2 = __importDefault(require("../../../database/seeds/run"));
|
|
31
32
|
const env_1 = __importDefault(require("../../../env"));
|
|
32
33
|
const logger_1 = __importDefault(require("../../../logger"));
|
|
33
|
-
const get_schema_1 = require("../../../utils/get-schema");
|
|
34
34
|
const services_1 = require("../../../services");
|
|
35
|
-
const
|
|
35
|
+
const get_schema_1 = require("../../../utils/get-schema");
|
|
36
36
|
const defaults_1 = require("../../utils/defaults");
|
|
37
37
|
async function bootstrap({ skipAdminInit }) {
|
|
38
38
|
logger_1.default.info('Initializing bootstrap...');
|
|
@@ -50,9 +50,9 @@ async function bootstrap({ skipAdminInit }) {
|
|
|
50
50
|
else {
|
|
51
51
|
logger_1.default.info('Skipping creation of default Admin user and role...');
|
|
52
52
|
}
|
|
53
|
-
if (env_1.default
|
|
53
|
+
if (env_1.default['PROJECT_NAME'] && typeof env_1.default['PROJECT_NAME'] === 'string' && env_1.default['PROJECT_NAME'].length > 0) {
|
|
54
54
|
const settingsService = new services_1.SettingsService({ schema });
|
|
55
|
-
await settingsService.upsertSingleton({ project_name: env_1.default
|
|
55
|
+
await settingsService.upsertSingleton({ project_name: env_1.default['PROJECT_NAME'] });
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
@@ -75,6 +75,7 @@ async function waitForDatabase(database) {
|
|
|
75
75
|
}
|
|
76
76
|
// This will throw and exit the process if the database is not available
|
|
77
77
|
await (0, database_1.validateDatabaseConnection)(database);
|
|
78
|
+
return database;
|
|
78
79
|
}
|
|
79
80
|
async function createDefaultAdmin(schema) {
|
|
80
81
|
const { nanoid } = await import('nanoid');
|
|
@@ -83,12 +84,12 @@ async function createDefaultAdmin(schema) {
|
|
|
83
84
|
const role = await rolesService.createOne(defaults_1.defaultAdminRole);
|
|
84
85
|
logger_1.default.info('Adding first admin user...');
|
|
85
86
|
const usersService = new services_1.UsersService({ schema });
|
|
86
|
-
let adminEmail = env_1.default
|
|
87
|
+
let adminEmail = env_1.default['ADMIN_EMAIL'];
|
|
87
88
|
if (!adminEmail) {
|
|
88
89
|
logger_1.default.info('No admin email provided. Defaulting to "admin@example.com"');
|
|
89
90
|
adminEmail = 'admin@example.com';
|
|
90
91
|
}
|
|
91
|
-
let adminPassword = env_1.default
|
|
92
|
+
let adminPassword = env_1.default['ADMIN_PASSWORD'];
|
|
92
93
|
if (!adminPassword) {
|
|
93
94
|
adminPassword = nanoid(12);
|
|
94
95
|
logger_1.default.info(`No admin password provided. Defaulting to "${adminPassword}"`);
|
|
@@ -6,17 +6,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const chalk_1 = __importDefault(require("chalk"));
|
|
7
7
|
const execa_1 = __importDefault(require("execa"));
|
|
8
8
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
|
+
const joi_1 = __importDefault(require("joi"));
|
|
9
10
|
const ora_1 = __importDefault(require("ora"));
|
|
10
11
|
const uuid_1 = require("uuid");
|
|
11
|
-
const joi_1 = __importDefault(require("joi"));
|
|
12
12
|
const run_1 = __importDefault(require("../../../database/migrations/run"));
|
|
13
13
|
const run_2 = __importDefault(require("../../../database/seeds/run"));
|
|
14
|
+
const generate_hash_1 = require("../../../utils/generate-hash");
|
|
14
15
|
const create_db_connection_1 = __importDefault(require("../../utils/create-db-connection"));
|
|
15
16
|
const create_env_1 = __importDefault(require("../../utils/create-env"));
|
|
17
|
+
const defaults_1 = require("../../utils/defaults");
|
|
16
18
|
const drivers_1 = require("../../utils/drivers");
|
|
17
19
|
const questions_1 = require("./questions");
|
|
18
|
-
const generate_hash_1 = require("../../../utils/generate-hash");
|
|
19
|
-
const defaults_1 = require("../../utils/defaults");
|
|
20
20
|
async function init() {
|
|
21
21
|
const rootPath = process.cwd();
|
|
22
22
|
const { client } = await inquirer_1.default.prompt([
|
|
@@ -41,7 +41,6 @@ const apply_snapshot_1 = require("../../../utils/apply-snapshot");
|
|
|
41
41
|
const get_snapshot_1 = require("../../../utils/get-snapshot");
|
|
42
42
|
const get_snapshot_diff_1 = require("../../../utils/get-snapshot-diff");
|
|
43
43
|
async function apply(snapshotPath, options) {
|
|
44
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
45
44
|
const filename = path_1.default.resolve(process.cwd(), snapshotPath);
|
|
46
45
|
const database = (0, database_1.default)();
|
|
47
46
|
await (0, database_1.validateDatabaseConnection)(database);
|
|
@@ -68,14 +67,14 @@ async function apply(snapshotPath, options) {
|
|
|
68
67
|
database.destroy();
|
|
69
68
|
process.exit(0);
|
|
70
69
|
}
|
|
71
|
-
const dryRun =
|
|
72
|
-
const promptForChanges = !dryRun &&
|
|
70
|
+
const dryRun = options?.dryRun === true;
|
|
71
|
+
const promptForChanges = !dryRun && options?.yes !== true;
|
|
73
72
|
if (dryRun || promptForChanges) {
|
|
74
73
|
let message = '';
|
|
75
74
|
if (snapshotDiff.collections.length > 0) {
|
|
76
75
|
message += chalk_1.default.black.underline.bold('Collections:');
|
|
77
76
|
for (const { collection, diff } of snapshotDiff.collections) {
|
|
78
|
-
if (
|
|
77
|
+
if (diff[0]?.kind === types_1.DiffKind.EDIT) {
|
|
79
78
|
message += `\n - ${chalk_1.default.blue('Update')} ${collection}`;
|
|
80
79
|
for (const change of diff) {
|
|
81
80
|
if (change.kind === types_1.DiffKind.EDIT) {
|
|
@@ -84,13 +83,13 @@ async function apply(snapshotPath, options) {
|
|
|
84
83
|
}
|
|
85
84
|
}
|
|
86
85
|
}
|
|
87
|
-
else if (
|
|
86
|
+
else if (diff[0]?.kind === types_1.DiffKind.DELETE) {
|
|
88
87
|
message += `\n - ${chalk_1.default.red('Delete')} ${collection}`;
|
|
89
88
|
}
|
|
90
|
-
else if (
|
|
89
|
+
else if (diff[0]?.kind === types_1.DiffKind.NEW) {
|
|
91
90
|
message += `\n - ${chalk_1.default.green('Create')} ${collection}`;
|
|
92
91
|
}
|
|
93
|
-
else if (
|
|
92
|
+
else if (diff[0]?.kind === types_1.DiffKind.ARRAY) {
|
|
94
93
|
message += `\n - ${chalk_1.default.blue('Update')} ${collection}`;
|
|
95
94
|
}
|
|
96
95
|
}
|
|
@@ -98,7 +97,7 @@ async function apply(snapshotPath, options) {
|
|
|
98
97
|
if (snapshotDiff.fields.length > 0) {
|
|
99
98
|
message += '\n\n' + chalk_1.default.black.underline.bold('Fields:');
|
|
100
99
|
for (const { collection, field, diff } of snapshotDiff.fields) {
|
|
101
|
-
if (
|
|
100
|
+
if (diff[0]?.kind === types_1.DiffKind.EDIT || (0, apply_diff_1.isNestedMetaUpdate)(diff[0])) {
|
|
102
101
|
message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
|
|
103
102
|
for (const change of diff) {
|
|
104
103
|
const path = change.path.slice(1).join('.');
|
|
@@ -113,13 +112,13 @@ async function apply(snapshotPath, options) {
|
|
|
113
112
|
}
|
|
114
113
|
}
|
|
115
114
|
}
|
|
116
|
-
else if (
|
|
115
|
+
else if (diff[0]?.kind === types_1.DiffKind.DELETE) {
|
|
117
116
|
message += `\n - ${chalk_1.default.red('Delete')} ${collection}.${field}`;
|
|
118
117
|
}
|
|
119
|
-
else if (
|
|
118
|
+
else if (diff[0]?.kind === types_1.DiffKind.NEW) {
|
|
120
119
|
message += `\n - ${chalk_1.default.green('Create')} ${collection}.${field}`;
|
|
121
120
|
}
|
|
122
|
-
else if (
|
|
121
|
+
else if (diff[0]?.kind === types_1.DiffKind.ARRAY) {
|
|
123
122
|
message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
|
|
124
123
|
}
|
|
125
124
|
}
|
|
@@ -127,7 +126,7 @@ async function apply(snapshotPath, options) {
|
|
|
127
126
|
if (snapshotDiff.relations.length > 0) {
|
|
128
127
|
message += '\n\n' + chalk_1.default.black.underline.bold('Relations:');
|
|
129
128
|
for (const { collection, field, related_collection, diff } of snapshotDiff.relations) {
|
|
130
|
-
if (
|
|
129
|
+
if (diff[0]?.kind === types_1.DiffKind.EDIT) {
|
|
131
130
|
message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
|
|
132
131
|
for (const change of diff) {
|
|
133
132
|
if (change.kind === types_1.DiffKind.EDIT) {
|
|
@@ -136,13 +135,13 @@ async function apply(snapshotPath, options) {
|
|
|
136
135
|
}
|
|
137
136
|
}
|
|
138
137
|
}
|
|
139
|
-
else if (
|
|
138
|
+
else if (diff[0]?.kind === types_1.DiffKind.DELETE) {
|
|
140
139
|
message += `\n - ${chalk_1.default.red('Delete')} ${collection}.${field}`;
|
|
141
140
|
}
|
|
142
|
-
else if (
|
|
141
|
+
else if (diff[0]?.kind === types_1.DiffKind.NEW) {
|
|
143
142
|
message += `\n - ${chalk_1.default.green('Create')} ${collection}.${field}`;
|
|
144
143
|
}
|
|
145
|
-
else if (
|
|
144
|
+
else if (diff[0]?.kind === types_1.DiffKind.ARRAY) {
|
|
146
145
|
message += `\n - ${chalk_1.default.blue('Update')} ${collection}.${field}`;
|
|
147
146
|
}
|
|
148
147
|
else {
|
|
@@ -16,7 +16,7 @@ async function snapshot(snapshotPath, options) {
|
|
|
16
16
|
try {
|
|
17
17
|
const snapshot = await (0, get_snapshot_1.getSnapshot)({ database });
|
|
18
18
|
let snapshotString;
|
|
19
|
-
if (
|
|
19
|
+
if (options?.format === 'yaml') {
|
|
20
20
|
snapshotString = (0, js_yaml_1.dump)(snapshot);
|
|
21
21
|
}
|
|
22
22
|
else {
|
|
@@ -32,7 +32,7 @@ async function snapshot(snapshotPath, options) {
|
|
|
32
32
|
catch {
|
|
33
33
|
snapshotExists = false;
|
|
34
34
|
}
|
|
35
|
-
if (snapshotExists &&
|
|
35
|
+
if (snapshotExists && options?.yes === false) {
|
|
36
36
|
const { overwrite } = await inquirer_1.default.prompt([
|
|
37
37
|
{
|
|
38
38
|
type: 'confirm',
|
|
@@ -25,11 +25,12 @@ function createDBConnection(client, credentials) {
|
|
|
25
25
|
};
|
|
26
26
|
if (client === 'pg' || client === 'cockroachdb') {
|
|
27
27
|
const { ssl } = credentials;
|
|
28
|
-
connection
|
|
28
|
+
connection.ssl = ssl;
|
|
29
29
|
}
|
|
30
30
|
if (client === 'mssql') {
|
|
31
31
|
const { options__encrypt } = credentials;
|
|
32
|
-
connection
|
|
32
|
+
connection = {
|
|
33
|
+
...connection,
|
|
33
34
|
encrypt: options__encrypt,
|
|
34
35
|
};
|
|
35
36
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Credentials } from '../create-db-connection';
|
|
2
|
-
import { drivers } from '../drivers';
|
|
1
|
+
import type { Credentials } from '../create-db-connection';
|
|
2
|
+
import type { drivers } from '../drivers';
|
|
3
3
|
export default function createEnv(client: keyof typeof drivers, credentials: Credentials, directory: string): Promise<void>;
|
|
@@ -27,7 +27,7 @@ async function createEnv(client, credentials, directory) {
|
|
|
27
27
|
},
|
|
28
28
|
};
|
|
29
29
|
for (const [key, value] of Object.entries(credentials)) {
|
|
30
|
-
config
|
|
30
|
+
config['database'][`DB_${key.toUpperCase()}`] = value;
|
|
31
31
|
}
|
|
32
32
|
const configAsStrings = {};
|
|
33
33
|
for (const [key, value] of Object.entries(config)) {
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CookieOptions } from 'express';
|
|
2
|
-
import { TransformationParams } from './types';
|
|
1
|
+
import type { CookieOptions } from 'express';
|
|
2
|
+
import type { TransformationParams } from './types';
|
|
3
3
|
export declare const SYSTEM_ASSET_ALLOW_LIST: TransformationParams[];
|
|
4
4
|
export declare const ASSET_TRANSFORM_QUERY_KEYS: string[];
|
|
5
5
|
export declare const FILTER_VARIABLES: string[];
|
|
@@ -10,3 +10,4 @@ export declare const GENERATE_SPECIAL: string[];
|
|
|
10
10
|
export declare const UUID_REGEX = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
11
11
|
export declare const COOKIE_OPTIONS: CookieOptions;
|
|
12
12
|
export declare const OAS_REQUIRED_SCHEMAS: string[];
|
|
13
|
+
export declare const REDACT_TEXT = "--redact--";
|
package/dist/constants.js
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
|
-
var _a;
|
|
6
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.OAS_REQUIRED_SCHEMAS = exports.COOKIE_OPTIONS = exports.UUID_REGEX = exports.GENERATE_SPECIAL = exports.COLUMN_TRANSFORMS = exports.DEFAULT_AUTH_PROVIDER = exports.ALIAS_TYPES = exports.FILTER_VARIABLES = exports.ASSET_TRANSFORM_QUERY_KEYS = exports.SYSTEM_ASSET_ALLOW_LIST = void 0;
|
|
6
|
+
exports.REDACT_TEXT = exports.OAS_REQUIRED_SCHEMAS = exports.COOKIE_OPTIONS = exports.UUID_REGEX = exports.GENERATE_SPECIAL = exports.COLUMN_TRANSFORMS = exports.DEFAULT_AUTH_PROVIDER = exports.ALIAS_TYPES = exports.FILTER_VARIABLES = exports.ASSET_TRANSFORM_QUERY_KEYS = exports.SYSTEM_ASSET_ALLOW_LIST = void 0;
|
|
8
7
|
const env_1 = __importDefault(require("./env"));
|
|
9
8
|
const get_milliseconds_1 = require("./utils/get-milliseconds");
|
|
10
9
|
exports.SYSTEM_ASSET_ALLOW_LIST = [
|
|
@@ -51,9 +50,10 @@ exports.GENERATE_SPECIAL = ['uuid', 'date-created', 'role-created', 'user-create
|
|
|
51
50
|
exports.UUID_REGEX = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
|
|
52
51
|
exports.COOKIE_OPTIONS = {
|
|
53
52
|
httpOnly: true,
|
|
54
|
-
domain: env_1.default
|
|
55
|
-
maxAge: (0, get_milliseconds_1.getMilliseconds)(env_1.default
|
|
56
|
-
secure:
|
|
57
|
-
sameSite: env_1.default
|
|
53
|
+
domain: env_1.default['REFRESH_TOKEN_COOKIE_DOMAIN'],
|
|
54
|
+
maxAge: (0, get_milliseconds_1.getMilliseconds)(env_1.default['REFRESH_TOKEN_TTL']),
|
|
55
|
+
secure: env_1.default['REFRESH_TOKEN_COOKIE_SECURE'] ?? false,
|
|
56
|
+
sameSite: env_1.default['REFRESH_TOKEN_COOKIE_SAME_SITE'] || 'strict',
|
|
58
57
|
};
|
|
59
|
-
exports.OAS_REQUIRED_SCHEMAS = ['Query', 'x-metadata'];
|
|
58
|
+
exports.OAS_REQUIRED_SCHEMAS = ['Diff', 'Schema', 'Query', 'x-metadata'];
|
|
59
|
+
exports.REDACT_TEXT = '--redact--';
|
|
@@ -35,7 +35,7 @@ const readHandler = (0, async_handler_1.default)(async (req, res, next) => {
|
|
|
35
35
|
result = await service.readByQuery(req.sanitizedQuery);
|
|
36
36
|
}
|
|
37
37
|
const meta = await metaService.getMetaForQuery('directus_activity', req.sanitizedQuery);
|
|
38
|
-
res.locals
|
|
38
|
+
res.locals['payload'] = {
|
|
39
39
|
data: result,
|
|
40
40
|
meta,
|
|
41
41
|
};
|
|
@@ -48,8 +48,8 @@ router.get('/:pk', (0, async_handler_1.default)(async (req, res, next) => {
|
|
|
48
48
|
accountability: req.accountability,
|
|
49
49
|
schema: req.schema,
|
|
50
50
|
});
|
|
51
|
-
const record = await service.readOne(req.params
|
|
52
|
-
res.locals
|
|
51
|
+
const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
|
|
52
|
+
res.locals['payload'] = {
|
|
53
53
|
data: record || null,
|
|
54
54
|
};
|
|
55
55
|
return next();
|
|
@@ -60,7 +60,6 @@ const createCommentSchema = joi_1.default.object({
|
|
|
60
60
|
item: [joi_1.default.number().required(), joi_1.default.string().required()],
|
|
61
61
|
});
|
|
62
62
|
router.post('/comment', (0, async_handler_1.default)(async (req, res, next) => {
|
|
63
|
-
var _a;
|
|
64
63
|
const service = new services_1.ActivityService({
|
|
65
64
|
accountability: req.accountability,
|
|
66
65
|
schema: req.schema,
|
|
@@ -72,14 +71,14 @@ router.post('/comment', (0, async_handler_1.default)(async (req, res, next) => {
|
|
|
72
71
|
const primaryKey = await service.createOne({
|
|
73
72
|
...req.body,
|
|
74
73
|
action: types_1.Action.COMMENT,
|
|
75
|
-
user:
|
|
74
|
+
user: req.accountability?.user,
|
|
76
75
|
ip: (0, get_ip_from_req_1.getIPFromReq)(req),
|
|
77
76
|
user_agent: req.get('user-agent'),
|
|
78
77
|
origin: req.get('origin'),
|
|
79
78
|
});
|
|
80
79
|
try {
|
|
81
80
|
const record = await service.readOne(primaryKey, req.sanitizedQuery);
|
|
82
|
-
res.locals
|
|
81
|
+
res.locals['payload'] = {
|
|
83
82
|
data: record || null,
|
|
84
83
|
};
|
|
85
84
|
}
|
|
@@ -103,10 +102,10 @@ router.patch('/comment/:pk', (0, async_handler_1.default)(async (req, res, next)
|
|
|
103
102
|
if (error) {
|
|
104
103
|
throw new exceptions_1.InvalidPayloadException(error.message);
|
|
105
104
|
}
|
|
106
|
-
const primaryKey = await service.updateOne(req.params
|
|
105
|
+
const primaryKey = await service.updateOne(req.params['pk'], req.body);
|
|
107
106
|
try {
|
|
108
107
|
const record = await service.readOne(primaryKey, req.sanitizedQuery);
|
|
109
|
-
res.locals
|
|
108
|
+
res.locals['payload'] = {
|
|
110
109
|
data: record || null,
|
|
111
110
|
};
|
|
112
111
|
}
|
|
@@ -126,11 +125,11 @@ router.delete('/comment/:pk', (0, async_handler_1.default)(async (req, res, next
|
|
|
126
125
|
const adminService = new services_1.ActivityService({
|
|
127
126
|
schema: req.schema,
|
|
128
127
|
});
|
|
129
|
-
const item = await adminService.readOne(req.params
|
|
130
|
-
if (!item || item
|
|
128
|
+
const item = await adminService.readOne(req.params['pk'], { fields: ['action'] });
|
|
129
|
+
if (!item || item['action'] !== 'comment') {
|
|
131
130
|
throw new exceptions_1.ForbiddenException();
|
|
132
131
|
}
|
|
133
|
-
await service.deleteOne(req.params
|
|
132
|
+
await service.deleteOne(req.params['pk']);
|
|
134
133
|
return next();
|
|
135
134
|
}), respond_1.respond);
|
|
136
135
|
exports.default = router;
|
|
@@ -52,8 +52,8 @@ router.get('/:pk/:filename?',
|
|
|
52
52
|
throw new exceptions_1.InvalidQueryException(`"transforms" Parameter needs to be a JSON array of allowed transformations.`);
|
|
53
53
|
}
|
|
54
54
|
// Check against ASSETS_TRANSFORM_MAX_OPERATIONS
|
|
55
|
-
if (transforms.length > Number(env_1.default
|
|
56
|
-
throw new exceptions_1.InvalidQueryException(`"transforms" Parameter is only allowed ${env_1.default
|
|
55
|
+
if (transforms.length > Number(env_1.default['ASSETS_TRANSFORM_MAX_OPERATIONS'])) {
|
|
56
|
+
throw new exceptions_1.InvalidQueryException(`"transforms" Parameter is only allowed ${env_1.default['ASSETS_TRANSFORM_MAX_OPERATIONS']} transformations.`);
|
|
57
57
|
}
|
|
58
58
|
// Check the transformations are valid
|
|
59
59
|
transforms.forEach((transform) => {
|
|
@@ -62,33 +62,33 @@ router.get('/:pk/:filename?',
|
|
|
62
62
|
throw new exceptions_1.InvalidQueryException(`"transforms" Parameter does not allow "${name}" as a transformation.`);
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
-
transformation
|
|
65
|
+
transformation['transforms'] = transforms;
|
|
66
66
|
}
|
|
67
|
-
const systemKeys = constants_1.SYSTEM_ASSET_ALLOW_LIST.map((transformation) => transformation
|
|
67
|
+
const systemKeys = constants_1.SYSTEM_ASSET_ALLOW_LIST.map((transformation) => transformation['key']);
|
|
68
68
|
const allKeys = [
|
|
69
69
|
...systemKeys,
|
|
70
|
-
...(assetSettings.storage_asset_presets || []).map((transformation) => transformation
|
|
70
|
+
...(assetSettings.storage_asset_presets || []).map((transformation) => transformation['key']),
|
|
71
71
|
];
|
|
72
72
|
// For use in the next request handler
|
|
73
|
-
res.locals
|
|
74
|
-
res.locals
|
|
73
|
+
res.locals['shortcuts'] = [...constants_1.SYSTEM_ASSET_ALLOW_LIST, ...(assetSettings.storage_asset_presets || [])];
|
|
74
|
+
res.locals['transformation'] = transformation;
|
|
75
75
|
if (Object.keys(transformation).length === 0 ||
|
|
76
|
-
('transforms' in transformation && transformation
|
|
76
|
+
('transforms' in transformation && transformation['transforms'].length === 0)) {
|
|
77
77
|
return next();
|
|
78
78
|
}
|
|
79
79
|
if (assetSettings.storage_asset_transform === 'all') {
|
|
80
|
-
if (transformation
|
|
81
|
-
throw new exceptions_1.InvalidQueryException(`Key "${transformation
|
|
80
|
+
if (transformation['key'] && allKeys.includes(transformation['key']) === false) {
|
|
81
|
+
throw new exceptions_1.InvalidQueryException(`Key "${transformation['key']}" isn't configured.`);
|
|
82
82
|
}
|
|
83
83
|
return next();
|
|
84
84
|
}
|
|
85
85
|
else if (assetSettings.storage_asset_transform === 'presets') {
|
|
86
|
-
if (allKeys.includes(transformation
|
|
86
|
+
if (allKeys.includes(transformation['key']))
|
|
87
87
|
return next();
|
|
88
88
|
throw new exceptions_1.InvalidQueryException(`Only configured presets can be used in asset generation.`);
|
|
89
89
|
}
|
|
90
90
|
else {
|
|
91
|
-
if (transformation
|
|
91
|
+
if (transformation['key'] && systemKeys.includes(transformation['key']))
|
|
92
92
|
return next();
|
|
93
93
|
throw new exceptions_1.InvalidQueryException(`Dynamic asset generation has been disabled for this project.`);
|
|
94
94
|
}
|
|
@@ -103,31 +103,36 @@ router.get('/:pk/:filename?',
|
|
|
103
103
|
}),
|
|
104
104
|
// Return file
|
|
105
105
|
(0, async_handler_1.default)(async (req, res) => {
|
|
106
|
-
|
|
107
|
-
const id = (_a = req.params.pk) === null || _a === void 0 ? void 0 : _a.substring(0, 36);
|
|
106
|
+
const id = req.params['pk']?.substring(0, 36);
|
|
108
107
|
const service = new services_1.AssetsService({
|
|
109
108
|
accountability: req.accountability,
|
|
110
109
|
schema: req.schema,
|
|
111
110
|
});
|
|
112
|
-
const transformation = res.locals
|
|
113
|
-
? res.locals
|
|
114
|
-
: res.locals
|
|
111
|
+
const transformation = res.locals['transformation'].key
|
|
112
|
+
? res.locals['shortcuts'].find((transformation) => transformation['key'] === res.locals['transformation'].key)
|
|
113
|
+
: res.locals['transformation'];
|
|
115
114
|
let range = undefined;
|
|
116
115
|
if (req.headers.range) {
|
|
117
116
|
const rangeParts = /bytes=([0-9]*)-([0-9]*)/.exec(req.headers.range);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
117
|
+
if (rangeParts && rangeParts.length > 1) {
|
|
118
|
+
range = {};
|
|
119
|
+
if (rangeParts[1]) {
|
|
120
|
+
range.start = Number(rangeParts[1]);
|
|
121
|
+
if (Number.isNaN(range.start))
|
|
122
|
+
throw new exceptions_1.RangeNotSatisfiableException(range);
|
|
123
|
+
}
|
|
124
|
+
if (rangeParts[2]) {
|
|
125
|
+
range.end = Number(rangeParts[2]);
|
|
126
|
+
if (Number.isNaN(range.end))
|
|
127
|
+
throw new exceptions_1.RangeNotSatisfiableException(range);
|
|
128
|
+
}
|
|
124
129
|
}
|
|
125
130
|
}
|
|
126
131
|
const { stream, file, stat } = await service.getAsset(id, transformation, range);
|
|
127
|
-
res.attachment(
|
|
132
|
+
res.attachment(req.params['filename'] ?? file.filename_download);
|
|
128
133
|
res.setHeader('Content-Type', file.type);
|
|
129
134
|
res.setHeader('Accept-Ranges', 'bytes');
|
|
130
|
-
res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, (0, get_milliseconds_1.getMilliseconds)(env_1.default
|
|
135
|
+
res.setHeader('Cache-Control', (0, get_cache_headers_1.getCacheControlHeader)(req, (0, get_milliseconds_1.getMilliseconds)(env_1.default['ASSETS_CACHE_TTL']), false, true));
|
|
131
136
|
const unixTime = Date.parse(file.modified_on);
|
|
132
137
|
if (!Number.isNaN(unixTime)) {
|
|
133
138
|
const lastModifiedDate = new Date(unixTime);
|
|
@@ -176,5 +181,6 @@ router.get('/:pk/:filename?',
|
|
|
176
181
|
});
|
|
177
182
|
}
|
|
178
183
|
});
|
|
184
|
+
return undefined;
|
|
179
185
|
}));
|
|
180
186
|
exports.default = router;
|