From 437aa2a92c460486564f44eafa98d9edd0374691 Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Mon, 16 Dec 2024 10:18:47 -0500 Subject: [PATCH 001/187] Move current to bak folder --- .editorconfig => bak/.editorconfig | 0 .env.example => bak/.env.example | 0 .../.github}/actions/prepare/action.yaml | 0 {.github => bak/.github}/workflows/lint-app.yaml | 0 {.github => bak/.github}/workflows/lint-oas.yaml | 0 {.github => bak/.github}/workflows/typecheck.yaml | 0 .gitignore => bak/.gitignore | 0 README.md => bak/README.md | 0 .../api-spec}/components/parameters.yaml | 0 .../api-spec}/components/responses.yaml | 0 .../api-spec}/components/schemas/_index.yaml | 0 .../api-spec}/components/schemas/activity.yaml | 0 .../api-spec}/components/schemas/collections.yaml | 0 .../api-spec}/components/schemas/comments.yaml | 0 .../api-spec}/components/schemas/dashboards.yaml | 0 .../api-spec}/components/schemas/diff.yaml | 0 .../api-spec}/components/schemas/extensions.yaml | 0 .../api-spec}/components/schemas/fields.yaml | 0 .../api-spec}/components/schemas/files.yaml | 0 .../api-spec}/components/schemas/flows.yaml | 0 .../api-spec}/components/schemas/folders.yaml | 0 .../api-spec}/components/schemas/items.yaml | 0 .../api-spec}/components/schemas/notifications.yaml | 0 .../api-spec}/components/schemas/operations.yaml | 0 .../api-spec}/components/schemas/panels.yaml | 0 .../api-spec}/components/schemas/permissions.yaml | 0 .../api-spec}/components/schemas/policies.yaml | 0 .../api-spec}/components/schemas/presets.yaml | 0 .../api-spec}/components/schemas/query.yaml | 0 .../api-spec}/components/schemas/relations.yaml | 0 .../api-spec}/components/schemas/revisions.yaml | 0 .../api-spec}/components/schemas/roles.yaml | 0 .../api-spec}/components/schemas/schema.yaml | 0 .../api-spec}/components/schemas/settings.yaml | 0 .../api-spec}/components/schemas/shares.yaml | 0 .../api-spec}/components/schemas/translations.yaml | 0 .../api-spec}/components/schemas/users.yaml | 0 .../api-spec}/components/schemas/versions.yaml | 0 .../api-spec}/components/schemas/x-metadata.yaml | 0 {api-spec => bak/api-spec}/components/security.yaml | 0 {api-spec => bak/api-spec}/index.yaml | 0 .../api-spec}/paths/activity/_id/getActivity.yaml | 0 .../api-spec}/paths/activity/_id/index.yaml | 0 .../api-spec}/paths/activity/getActivities.yaml | 0 .../api-spec}/paths/activity/index.yaml | 0 .../api-spec}/paths/assets/_id/getAsset.yaml | 0 .../api-spec}/paths/assets/_id/index.yaml | 0 .../api-spec}/paths/auth/login/index.yaml | 0 .../api-spec}/paths/auth/login/login.yaml | 0 .../api-spec}/paths/auth/logout/index.yaml | 0 .../api-spec}/paths/auth/logout/logout.yaml | 0 .../api-spec}/paths/auth/oauth/_provider/index.yaml | 0 .../paths/auth/oauth/_provider/oauthProvider.yaml | 0 .../api-spec}/paths/auth/oauth/index.yaml | 0 .../api-spec}/paths/auth/oauth/oauth.yaml | 0 .../paths/auth/password/request/index.yaml | 0 .../auth/password/request/passwordRequest.yaml | 0 .../api-spec}/paths/auth/password/reset/index.yaml | 0 .../paths/auth/password/reset/passwordReset.yaml | 0 .../api-spec}/paths/auth/refresh/index.yaml | 0 .../api-spec}/paths/auth/refresh/refresh.yaml | 0 .../paths/collections/_id/deleteCollection.yaml | 0 .../paths/collections/_id/getCollection.yaml | 0 .../api-spec}/paths/collections/_id/index.yaml | 0 .../paths/collections/_id/updateCollection.yaml | 0 .../paths/collections/createCollection.yaml | 0 .../api-spec}/paths/collections/getCollections.yaml | 0 .../api-spec}/paths/collections/index.yaml | 0 .../api-spec}/paths/comments/_id/deleteComment.yaml | 0 .../api-spec}/paths/comments/_id/getComment.yaml | 0 .../api-spec}/paths/comments/_id/index.yaml | 0 .../api-spec}/paths/comments/_id/updateComment.yaml | 0 .../api-spec}/paths/comments/createComments.yaml | 0 .../api-spec}/paths/comments/deleteComments.yaml | 0 .../api-spec}/paths/comments/getComments.yaml | 0 .../api-spec}/paths/comments/index.yaml | 0 .../api-spec}/paths/comments/updateComments.yaml | 0 .../paths/dashboards/_id/deleteDashboard.yaml | 0 .../paths/dashboards/_id/getDashboard.yaml | 0 .../api-spec}/paths/dashboards/_id/index.yaml | 0 .../paths/dashboards/_id/updateDashboard.yaml | 0 .../paths/dashboards/createDashboards.yaml | 0 .../paths/dashboards/deleteDashboards.yaml | 0 .../api-spec}/paths/dashboards/getDashboards.yaml | 0 .../api-spec}/paths/dashboards/index.yaml | 0 .../paths/dashboards/updateDashboards.yaml | 0 .../paths/extensions/_bundle/_name/index.yaml | 0 .../_bundle/_name/updateExtensionBundle.yaml | 0 .../api-spec}/paths/extensions/_name/index.yaml | 0 .../paths/extensions/_name/updateExtensions.yaml | 0 .../api-spec}/paths/extensions/index.yaml | 0 .../api-spec}/paths/extensions/listExtensions.yaml | 0 .../paths/fields/_collection/_id/deleteField.yaml | 0 .../fields/_collection/_id/getCollectionField.yaml | 0 .../paths/fields/_collection/_id/index.yaml | 0 .../paths/fields/_collection/_id/updateField.yaml | 0 .../paths/fields/_collection/createField.yaml | 0 .../fields/_collection/getCollectionFields.yaml | 0 .../api-spec}/paths/fields/_collection/index.yaml | 0 .../api-spec}/paths/fields/getFields.yaml | 0 {api-spec => bak/api-spec}/paths/fields/index.yaml | 0 .../api-spec}/paths/files/_id/deleteFile.yaml | 0 .../api-spec}/paths/files/_id/getFile.yaml | 0 .../api-spec}/paths/files/_id/index.yaml | 0 .../api-spec}/paths/files/_id/updateFile.yaml | 0 .../api-spec}/paths/files/deleteFiles.yaml | 0 .../api-spec}/paths/files/getFiles.yaml | 0 .../api-spec}/paths/files/import/importFile.yaml | 0 .../api-spec}/paths/files/import/index.yaml | 0 {api-spec => bak/api-spec}/paths/files/index.yaml | 0 .../api-spec}/paths/files/updateFiles.yaml | 0 .../api-spec}/paths/files/uploadFile.yaml | 0 .../api-spec}/paths/flows/_id/deleteFlow.yaml | 0 .../api-spec}/paths/flows/_id/getFlow.yaml | 0 .../api-spec}/paths/flows/_id/index.yaml | 0 .../api-spec}/paths/flows/_id/updateFlow.yaml | 0 .../api-spec}/paths/flows/createFlows.yaml | 0 .../api-spec}/paths/flows/deleteFlows.yaml | 0 .../api-spec}/paths/flows/getFlows.yaml | 0 {api-spec => bak/api-spec}/paths/flows/index.yaml | 0 .../api-spec}/paths/flows/trigger/_id/index.yaml | 0 .../paths/flows/trigger/_id/triggerFlowGET.yaml | 0 .../paths/flows/trigger/_id/triggerFlowPOST.yaml | 0 .../api-spec}/paths/flows/updateFlows.yaml | 0 .../api-spec}/paths/folders/_id/deleteFolder.yaml | 0 .../api-spec}/paths/folders/_id/getFolder.yaml | 0 .../api-spec}/paths/folders/_id/index.yaml | 0 .../api-spec}/paths/folders/_id/updateFolder.yaml | 0 .../api-spec}/paths/folders/createFolders.yaml | 0 .../api-spec}/paths/folders/deleteFolders.yaml | 0 .../api-spec}/paths/folders/getFolders.yaml | 0 {api-spec => bak/api-spec}/paths/folders/index.yaml | 0 .../api-spec}/paths/folders/updateFolders.yaml | 0 .../paths/items/_collection/_id/deleteItem.yaml | 0 .../items/_collection/_id/getCollectionItem.yaml | 0 .../paths/items/_collection/_id/index.yaml | 0 .../paths/items/_collection/_id/updateItem.yaml | 0 .../paths/items/_collection/createItems.yaml | 0 .../paths/items/_collection/deleteItems.yaml | 0 .../paths/items/_collection/getCollectionItems.yaml | 0 .../api-spec}/paths/items/_collection/index.yaml | 0 .../items/_collection/singleton/getSingleton.yaml | 0 .../paths/items/_collection/singleton/index.yaml | 0 .../_collection/singleton/updateSingleton.yaml | 0 .../paths/items/_collection/updateItems.yaml | 0 .../paths/notifications/_id/deleteNotification.yaml | 0 .../paths/notifications/_id/getNotification.yaml | 0 .../api-spec}/paths/notifications/_id/index.yaml | 0 .../paths/notifications/_id/updateNotification.yaml | 0 .../paths/notifications/createNotifications.yaml | 0 .../paths/notifications/deleteNotifications.yaml | 0 .../paths/notifications/getNotifications.yaml | 0 .../api-spec}/paths/notifications/index.yaml | 0 .../paths/notifications/updateNotifications.yaml | 0 .../paths/operations/_id/deleteOperation.yaml | 0 .../paths/operations/_id/getOperation.yaml | 0 .../api-spec}/paths/operations/_id/index.yaml | 0 .../paths/operations/_id/triggerOperation.yaml | 0 .../paths/operations/_id/updateOperation.yaml | 0 .../paths/operations/createOperations.yaml | 0 .../paths/operations/deleteOperations.yaml | 0 .../api-spec}/paths/operations/getOperations.yaml | 0 .../api-spec}/paths/operations/index.yaml | 0 .../paths/operations/updateOperations.yaml | 0 .../api-spec}/paths/panels/_id/deletePanel.yaml | 0 .../api-spec}/paths/panels/_id/getPanel.yaml | 0 .../api-spec}/paths/panels/_id/index.yaml | 0 .../api-spec}/paths/panels/_id/updatePanel.yaml | 0 .../api-spec}/paths/panels/createPanels.yaml | 0 .../api-spec}/paths/panels/deletePanels.yaml | 0 .../api-spec}/paths/panels/getPanels.yaml | 0 {api-spec => bak/api-spec}/paths/panels/index.yaml | 0 .../api-spec}/paths/panels/updatePanels.yaml | 0 .../paths/permissions/_id/deletePermission.yaml | 0 .../paths/permissions/_id/getPermission.yaml | 0 .../api-spec}/paths/permissions/_id/index.yaml | 0 .../paths/permissions/_id/updatePermission.yaml | 0 .../paths/permissions/createPermissions.yaml | 0 .../paths/permissions/deletePermissions.yaml | 0 .../api-spec}/paths/permissions/getPermissions.yaml | 0 .../api-spec}/paths/permissions/index.yaml | 0 .../me/_collection/_id/getItemPermissions.yaml | 0 .../paths/permissions/me/_collection/_id/index.yaml | 0 .../paths/permissions/me/getUserPermissions.yaml | 0 .../api-spec}/paths/permissions/me/index.yaml | 0 .../paths/permissions/updatePermissions.yaml | 0 .../api-spec}/paths/policies/_id/deletePolicy.yaml | 0 .../api-spec}/paths/policies/_id/getPolicy.yaml | 0 .../api-spec}/paths/policies/_id/index.yaml | 0 .../api-spec}/paths/policies/_id/updatePolicy.yaml | 0 .../api-spec}/paths/policies/createPolicies.yaml | 0 .../api-spec}/paths/policies/deletePolicies.yaml | 0 .../api-spec}/paths/policies/getPolicies.yaml | 0 .../api-spec}/paths/policies/index.yaml | 0 .../api-spec}/paths/policies/updatePolicies.yaml | 0 .../api-spec}/paths/presets/_id/deletePreset.yaml | 0 .../api-spec}/paths/presets/_id/getPreset.yaml | 0 .../api-spec}/paths/presets/_id/index.yaml | 0 .../api-spec}/paths/presets/_id/updatePreset.yaml | 0 .../api-spec}/paths/presets/createPresets.yaml | 0 .../api-spec}/paths/presets/deletePresets.yaml | 0 .../api-spec}/paths/presets/getPresets.yaml | 0 {api-spec => bak/api-spec}/paths/presets/index.yaml | 0 .../api-spec}/paths/presets/updatePresets.yaml | 0 .../_collection/getRelationByCollection.yaml | 0 .../paths/relations/_collection/index.yaml | 0 .../paths/relations/_id/deleteRelation.yaml | 0 .../api-spec}/paths/relations/_id/getRelation.yaml | 0 .../api-spec}/paths/relations/_id/index.yaml | 0 .../paths/relations/_id/updateRelation.yaml | 0 .../api-spec}/paths/relations/createRelation.yaml | 0 .../api-spec}/paths/relations/getRelations.yaml | 0 .../api-spec}/paths/relations/index.yaml | 0 .../api-spec}/paths/revisions/_id/getRevision.yaml | 0 .../api-spec}/paths/revisions/_id/index.yaml | 0 .../api-spec}/paths/revisions/getRevisions.yaml | 0 .../api-spec}/paths/revisions/index.yaml | 0 .../api-spec}/paths/roles/_id/deleteRole.yaml | 0 .../api-spec}/paths/roles/_id/getRole.yaml | 0 .../api-spec}/paths/roles/_id/index.yaml | 0 .../api-spec}/paths/roles/_id/updateRole.yaml | 0 .../api-spec}/paths/roles/createRoles.yaml | 0 .../api-spec}/paths/roles/deleteRoles.yaml | 0 .../api-spec}/paths/roles/getRoles.yaml | 0 {api-spec => bak/api-spec}/paths/roles/index.yaml | 0 .../api-spec}/paths/roles/updateRoles.yaml | 0 .../api-spec}/paths/schema/apply/index.yaml | 0 .../api-spec}/paths/schema/apply/schemaApply.yaml | 0 .../api-spec}/paths/schema/diff/index.yaml | 0 .../api-spec}/paths/schema/diff/schemaDiff.yaml | 0 .../api-spec}/paths/schema/snapshot/index.yaml | 0 .../paths/schema/snapshot/schemaSnapshot.yaml | 0 .../api-spec}/paths/server/health/index.yaml | 0 .../api-spec}/paths/server/health/serverHealth.yaml | 0 .../api-spec}/paths/server/info/index.yaml | 0 .../api-spec}/paths/server/info/serverInfo.yaml | 0 .../api-spec}/paths/server/ping/index.yaml | 0 .../api-spec}/paths/server/ping/ping.yaml | 0 .../api-spec}/paths/server/specs/graphql/index.yaml | 0 .../paths/server/specs/graphql/readGraphqlSdl.yaml | 0 .../api-spec}/paths/server/specs/oas/index.yaml | 0 .../paths/server/specs/oas/readOpenApiSpec.yaml | 0 .../api-spec}/paths/settings/getSettings.yaml | 0 .../api-spec}/paths/settings/index.yaml | 0 .../api-spec}/paths/settings/updateSettings.yaml | 0 .../api-spec}/paths/shares/_id/deleteShare.yaml | 0 .../api-spec}/paths/shares/_id/getShare.yaml | 0 .../api-spec}/paths/shares/_id/index.yaml | 0 .../api-spec}/paths/shares/_id/updateShare.yaml | 0 .../paths/shares/_share/getPublicShareInfo.yaml | 0 .../api-spec}/paths/shares/_share/index.yaml | 0 .../paths/shares/auth/authenticateShare.yaml | 0 .../api-spec}/paths/shares/auth/index.yaml | 0 .../api-spec}/paths/shares/createShares.yaml | 0 .../api-spec}/paths/shares/deleteShares.yaml | 0 .../api-spec}/paths/shares/getShares.yaml | 0 {api-spec => bak/api-spec}/paths/shares/index.yaml | 0 .../paths/shares/info/_id/getShareInfo.yaml | 0 .../api-spec}/paths/shares/info/_id/index.yaml | 0 .../api-spec}/paths/shares/invite/index.yaml | 0 .../api-spec}/paths/shares/invite/inviteShare.yaml | 0 .../api-spec}/paths/shares/updateShares.yaml | 0 .../paths/translations/_id/deleteTranslation.yaml | 0 .../paths/translations/_id/getTranslation.yaml | 0 .../api-spec}/paths/translations/_id/index.yaml | 0 .../paths/translations/_id/updateTranslation.yaml | 0 .../paths/translations/createTranslations.yaml | 0 .../paths/translations/deleteTranslations.yaml | 0 .../paths/translations/getTranslations.yaml | 0 .../api-spec}/paths/translations/index.yaml | 0 .../paths/translations/updateTranslations.yaml | 0 .../api-spec}/paths/users/_id/deleteUser.yaml | 0 .../api-spec}/paths/users/_id/getUser.yaml | 0 .../api-spec}/paths/users/_id/index.yaml | 0 .../api-spec}/paths/users/_id/updateUser.yaml | 0 .../api-spec}/paths/users/createUsers.yaml | 0 .../api-spec}/paths/users/deleteUsers.yaml | 0 .../api-spec}/paths/users/getUsers.yaml | 0 {api-spec => bak/api-spec}/paths/users/index.yaml | 0 .../paths/users/invite/accept/acceptInvite.yaml | 0 .../api-spec}/paths/users/invite/accept/index.yaml | 0 .../api-spec}/paths/users/invite/index.yaml | 0 .../api-spec}/paths/users/invite/invite.yaml | 0 .../api-spec}/paths/users/me/getMe.yaml | 0 .../api-spec}/paths/users/me/index.yaml | 0 .../api-spec}/paths/users/me/tfa/disable/index.yaml | 0 .../paths/users/me/tfa/disable/meTfaDisable.yaml | 0 .../api-spec}/paths/users/me/tfa/enable/index.yaml | 0 .../paths/users/me/tfa/enable/meTfaEnable.yaml | 0 .../me/tfa/generate/generateTwoFactorSecret.yaml | 0 .../paths/users/me/tfa/generate/index.yaml | 0 .../api-spec}/paths/users/me/track/page/index.yaml | 0 .../users/me/track/page/updateLastUsedPageMe.yaml | 0 .../api-spec}/paths/users/me/updateMe.yaml | 0 .../api-spec}/paths/users/register/index.yaml | 0 .../paths/users/register/registerUser.yaml | 0 .../users/register/verify-email/_token/index.yaml | 0 .../verify-email/_token/registerUserVerify.yaml | 0 .../api-spec}/paths/users/updateUsers.yaml | 0 .../paths/utils/cache/clear/clear-cache.yaml | 0 .../api-spec}/paths/utils/cache/clear/index.yaml | 0 .../paths/utils/export/_collection/export.yaml | 0 .../paths/utils/export/_collection/index.yaml | 0 .../paths/utils/hash/generate/hash-generate.yaml | 0 .../api-spec}/paths/utils/hash/generate/index.yaml | 0 .../paths/utils/hash/verify/hash-verify.yaml | 0 .../api-spec}/paths/utils/hash/verify/index.yaml | 0 .../paths/utils/import/_collection/import.yaml | 0 .../paths/utils/import/_collection/index.yaml | 0 .../api-spec}/paths/utils/random/string/index.yaml | 0 .../api-spec}/paths/utils/random/string/random.yaml | 0 .../paths/utils/sort/_collection/index.yaml | 0 .../paths/utils/sort/_collection/sort.yaml | 0 .../versions/_id/compare/compareContentVersion.yaml | 0 .../api-spec}/paths/versions/_id/compare/index.yaml | 0 .../paths/versions/_id/deleteContentVersion.yaml | 0 .../paths/versions/_id/getContentVersion.yaml | 0 .../api-spec}/paths/versions/_id/index.yaml | 0 .../api-spec}/paths/versions/_id/promote/index.yaml | 0 .../versions/_id/promote/promoteContentVersion.yaml | 0 .../api-spec}/paths/versions/_id/save/index.yaml | 0 .../paths/versions/_id/save/saveContentVersion.yaml | 0 .../paths/versions/_id/updateContentVersion.yaml | 0 .../paths/versions/createContentVersions.yaml | 0 .../paths/versions/deleteContentVersions.yaml | 0 .../paths/versions/getContentVersions.yaml | 0 .../api-spec}/paths/versions/index.yaml | 0 .../paths/versions/updateContentVersions.yaml | 0 {app => bak/app}/app.vue | 0 {app => bak/app}/assets/css/_reset.scss | 0 {app => bak/app}/assets/css/_vars.scss | 0 {app => bak/app}/assets/css/colors.scss | 0 {app => bak/app}/assets/css/main.scss | 0 .../app}/assets/icons/frameworks/angular.svg | 0 {app => bak/app}/assets/icons/frameworks/apple.svg | 0 {app => bak/app}/assets/icons/frameworks/astro.svg | 0 {app => bak/app}/assets/icons/frameworks/next.svg | 0 {app => bak/app}/assets/icons/frameworks/nuxt.svg | 0 {app => bak/app}/assets/icons/frameworks/react.svg | 0 {app => bak/app}/assets/icons/frameworks/remix.svg | 0 {app => bak/app}/assets/icons/frameworks/svelte.svg | 0 {app => bak/app}/assets/icons/frameworks/vue.svg | 0 .../app}/assets/icons/products/auth-pink.svg | 0 .../app}/assets/icons/products/auth-purple.svg | 0 .../app}/assets/icons/products/auth-white.svg | 0 {app => bak/app}/assets/icons/products/auth.svg | 0 .../app}/assets/icons/products/automate-pink.svg | 0 .../app}/assets/icons/products/automate-purple.svg | 0 .../app}/assets/icons/products/automate-white.svg | 0 {app => bak/app}/assets/icons/products/automate.svg | 0 .../app}/assets/icons/products/connect-pink.svg | 0 .../app}/assets/icons/products/connect-purple.svg | 0 .../app}/assets/icons/products/connect-white.svg | 0 {app => bak/app}/assets/icons/products/connect.svg | 0 .../app}/assets/icons/products/editor-pink.svg | 0 .../app}/assets/icons/products/editor-purple.svg | 0 .../app}/assets/icons/products/editor-white.svg | 0 {app => bak/app}/assets/icons/products/editor.svg | 0 .../app}/assets/icons/products/explore-pink.svg | 0 .../app}/assets/icons/products/explore-purple.svg | 0 .../app}/assets/icons/products/explore-white.svg | 0 {app => bak/app}/assets/icons/products/explore.svg | 0 .../app}/assets/icons/products/files-pink.svg | 0 .../app}/assets/icons/products/files-purple.svg | 0 .../app}/assets/icons/products/files-white.svg | 0 {app => bak/app}/assets/icons/products/files.svg | 0 .../app}/assets/icons/products/insights-pink.svg | 0 .../app}/assets/icons/products/insights-purple.svg | 0 .../app}/assets/icons/products/insights-white.svg | 0 {app => bak/app}/assets/icons/products/insights.svg | 0 .../app}/assets/icons/products/marketplace-pink.svg | 0 .../assets/icons/products/marketplace-purple.svg | 0 .../assets/icons/products/marketplace-white.svg | 0 .../app}/assets/icons/products/marketplace.svg | 0 .../app}/assets/icons/products/realtime-pink.svg | 0 .../app}/assets/icons/products/realtime-purple.svg | 0 .../app}/assets/icons/products/realtime-white.svg | 0 {app => bak/app}/assets/icons/products/realtime.svg | 0 {app => bak/app}/assets/img/cloud-cta-bg.svg | 0 {app => bak/app}/assets/img/cloud-logo.svg | 0 {app => bak/app}/assets/img/pink-cta-bg.svg | 0 {app => bak/app}/assets/img/purple-cta-bg.svg | 0 {app => bak/app}/assets/img/tv-logo.svg | 0 {app => bak/app}/components/Button.vue | 0 {app => bak/app}/components/DefaultLayout.vue | 0 {app => bak/app}/components/LayoutFooter.vue | 0 {app => bak/app}/components/NavTree.vue | 0 {app => bak/app}/components/OgImage/Default.vue | 0 .../app}/components/articles/ArticlesCard.vue | 0 .../components/articles/ArticlesCategoryNav.vue | 0 .../app}/components/articles/ArticlesGrid.vue | 0 .../app}/components/articles/ArticlesLayout.vue | 0 .../app}/components/articles/ArticlesTagsFilter.vue | 0 {app => bak/app}/components/aside/AsideFeedback.vue | 0 {app => bak/app}/components/aside/AsideNav.vue | 0 .../app}/components/aside/AsideNewsletter.vue | 0 .../app}/components/aside/AsideSlideover.vue | 0 .../app}/components/aside/AsideTableOfContents.vue | 0 {app => bak/app}/components/aside/AsideWidget.vue | 0 .../app}/components/content/ArticleCards.vue | 0 {app => bak/app}/components/content/Badge.vue | 0 {app => bak/app}/components/content/Box.vue | 0 {app => bak/app}/components/content/Callout.vue | 0 .../app}/components/content/DirectusCloud.vue | 0 .../app}/components/content/DirectusImage.vue | 0 .../app}/components/content/EngineStudioBox.vue | 0 .../app}/components/content/HeaderWithBadge.vue | 0 .../app}/components/content/ListChildren.vue | 0 {app => bak/app}/components/content/Partial.vue | 0 {app => bak/app}/components/content/ProductLink.vue | 0 {app => bak/app}/components/content/ProsePre.vue | 0 {app => bak/app}/components/content/ProseTable.vue | 0 {app => bak/app}/components/content/Snippets.vue | 0 {app => bak/app}/components/content/Tab.vue | 0 {app => bak/app}/components/content/Tabs.vue | 0 {app => bak/app}/components/content/VideoEmbed.vue | 0 {app => bak/app}/components/header/HeaderBanner.vue | 0 {app => bak/app}/components/header/HeaderHat.vue | 0 {app => bak/app}/components/header/HeaderHero.vue | 0 {app => bak/app}/components/header/HeaderLogo.vue | 0 {app => bak/app}/components/header/HeaderNav.vue | 0 .../app}/components/header/HeaderSlideover.vue | 0 .../app}/components/pages/ArticleArea.global.vue | 0 .../components/pages/ArticleCategory.global.vue | 0 .../app}/components/pages/ArticlePage.global.vue | 0 .../components/pages/DocumentationPage.global.vue | 0 .../app}/components/search/SearchButton.client.vue | 0 {app => bak/app}/composables/data.ts | 0 {app => bak/app}/composables/tags.ts | 0 {app => bak/app}/pages/[...slug].vue | 0 {app => bak/app}/pages/api/index.vue | 0 {app => bak/app}/plugins/format-title.ts | 0 {app => bak/app}/utils/directus.ts | 0 {app => bak/app}/utils/file-icons.ts | 0 {app => bak/app}/utils/product-links.ts | 0 {app => bak/app}/utils/products.ts | 0 .../content}/1.getting-started/0.home.md | 0 .../1.getting-started/0.platform-overview.md | 0 .../1.getting-started/1.create-a-project.md | 0 .../content}/1.getting-started/2.resources.md | 0 {content => bak/content}/1.getting-started/_dir.yml | 0 .../content}/10.extensions/0.overview.md | 0 .../content}/10.extensions/1.quickstart.md | 0 .../10.extensions/2.api-extensions/0.index.md | 0 .../10.extensions/2.api-extensions/1.hooks.md | 0 .../10.extensions/2.api-extensions/2.endpoints.md | 0 .../10.extensions/2.api-extensions/3.operations.md | 0 .../10.extensions/2.api-extensions/4.services.md | 0 .../10.extensions/2.api-extensions/5.sandbox.md | 0 .../10.extensions/3.app-extensions/0.index.md | 0 .../10.extensions/3.app-extensions/1.interfaces.md | 0 .../10.extensions/3.app-extensions/2.displays.md | 0 .../10.extensions/3.app-extensions/3.layouts.md | 0 .../10.extensions/3.app-extensions/4.panels.md | 0 .../10.extensions/3.app-extensions/5.modules.md | 0 .../10.extensions/3.app-extensions/6.themes.md | 0 .../10.extensions/3.app-extensions/7.ui-library.md | 0 .../10.extensions/3.app-extensions/8.composables.md | 0 {content => bak/content}/10.extensions/4.bundles.md | 0 .../content}/10.extensions/5.marketplace/0.index.md | 0 .../10.extensions/5.marketplace/1.publishing.md | 0 {content => bak/content}/10.extensions/_dir.yml | 0 .../content}/11.configuration/1.general.md | 0 .../content}/11.configuration/10.extensions.md | 0 .../content}/11.configuration/11.logging.md | 0 .../content}/11.configuration/12.email.md | 0 .../content}/11.configuration/13.migrations.md | 0 .../content}/11.configuration/14.theming.md | 0 .../content}/11.configuration/15.translations.md | 0 .../content}/11.configuration/2.database.md | 0 .../content}/11.configuration/3.files.md | 0 .../content}/11.configuration/4.synchronization.md | 0 .../content}/11.configuration/5.realtime.md | 0 .../content}/11.configuration/6.flows.md | 0 .../content}/11.configuration/7.security-limits.md | 0 .../content}/11.configuration/8.auth-sso.md | 0 {content => bak/content}/11.configuration/9.pm2.md | 0 {content => bak/content}/11.configuration/_dir.yml | 0 .../content}/12.self-hosting/1.overview.md | 0 .../content}/12.self-hosting/2.requirements.md | 0 .../content}/12.self-hosting/3.deploying.md | 0 .../content}/12.self-hosting/4.upgrading.md | 0 .../12.self-hosting/5.including-extensions.md | 0 {content => bak/content}/12.self-hosting/_dir.yml | 0 {content => bak/content}/13.releases/1.overview.md | 0 .../13.releases/2.breaking-changes/0.index.md | 0 .../13.releases/2.breaking-changes/1.version-10.md | 0 .../13.releases/2.breaking-changes/2.version-11.md | 0 {content => bak/content}/13.releases/3.changelog.md | 0 {content => bak/content}/13.releases/_dir.yml | 0 .../content}/2.data-modeling/1.quickstart.md | 0 .../content}/2.data-modeling/2.collections.md | 0 .../content}/2.data-modeling/3.fields.md | 0 .../content}/2.data-modeling/4.interfaces.md | 0 .../content}/2.data-modeling/5.relationships.md | 0 {content => bak/content}/2.data-modeling/_dir.yml | 0 {content => bak/content}/3.content/1.explore.md | 0 {content => bak/content}/3.content/2.editor.md | 0 {content => bak/content}/3.content/3.layouts.md | 0 .../content}/3.content/4.import-export.md | 0 .../content}/3.content/5.live-preview.md | 0 .../content}/3.content/6.content-versioning.md | 0 .../content}/3.content/7.translations.md | 0 {content => bak/content}/3.content/_dir.yml | 0 {content => bak/content}/4.auth/1.quickstart.md | 0 {content => bak/content}/4.auth/2.tokens-cookies.md | 0 {content => bak/content}/4.auth/3.access-control.md | 0 {content => bak/content}/4.auth/4.creating-users.md | 0 {content => bak/content}/4.auth/5.email-login.md | 0 {content => bak/content}/4.auth/6.2fa.md | 0 {content => bak/content}/4.auth/7.sso/1.index.md | 0 {content => bak/content}/4.auth/7.sso/2.seamless.md | 0 {content => bak/content}/4.auth/8.accountability.md | 0 {content => bak/content}/4.auth/_dir.yml | 0 {content => bak/content}/5.connect/1.quickstart.md | 0 .../content}/5.connect/2.authentication.md | 0 .../content}/5.connect/3.filter-rules.md | 0 .../content}/5.connect/4.query-parameters.md | 0 {content => bak/content}/5.connect/5.errors.md | 0 {content => bak/content}/5.connect/6.sdk.md | 0 {content => bak/content}/5.connect/_dir.yml | 0 {content => bak/content}/6.files/1.quickstart.md | 0 {content => bak/content}/6.files/2.upload.md | 0 {content => bak/content}/6.files/3.manage.md | 0 {content => bak/content}/6.files/4.access.md | 0 {content => bak/content}/6.files/5.transform.md | 0 {content => bak/content}/6.files/_dir.yml | 0 {content => bak/content}/7.automate/1.quickstart.md | 0 {content => bak/content}/7.automate/2.flows.md | 0 {content => bak/content}/7.automate/3.data-chain.md | 0 {content => bak/content}/7.automate/4.triggers.md | 0 {content => bak/content}/7.automate/5.operations.md | 0 {content => bak/content}/7.automate/_dir.yml | 0 {content => bak/content}/8.realtime/1.quickstart.md | 0 .../content}/8.realtime/2.authentication.md | 0 .../content}/8.realtime/3.subscriptions.md | 0 {content => bak/content}/8.realtime/4.actions.md | 0 {content => bak/content}/8.realtime/_dir.yml | 0 {content => bak/content}/9.insights/1.overview.md | 0 {content => bak/content}/9.insights/2.panels.md | 0 {content => bak/content}/9.insights/_dir.yml | 0 .../content}/_partials/authentication.md | 0 .../content}/_partials/config-env-vars.md | 0 .../content}/_partials/extension-hook-exceptions.md | 0 .../content}/_partials/extension-hook-footguns.md | 0 .../content}/_partials/extensions-api-internals.md | 0 .../content}/_partials/extensions-api.md | 0 .../content}/_partials/extensions-app-internals.md | 0 .../content}/_partials/extensions-app.md | 0 .../content}/_partials/extensions-theme.md | 0 .../content}/_partials/extensions-uid.md | 0 .../content}/_partials/home-hero/auth.md | 0 .../content}/_partials/home-hero/data.md | 0 .../content}/_partials/home-hero/file.md | 0 .../content}/_partials/home-hero/realtime.md | 0 {content => bak/content}/_partials/license.md | 0 .../content}/_partials/query-functions.md | 0 .../content}/_partials/quickstart-making-calls.md | 0 .../content}/_partials/snippet-auth-token.md | 0 eslint.config.mjs => bak/eslint.config.mjs | 0 nuxt.config.ts => bak/nuxt.config.ts | 0 package.json => bak/package.json | 0 pnpm-lock.yaml => bak/pnpm-lock.yaml | 0 {public => bak/public}/1.icon.png | Bin {public => bak/public}/2.icon.png | Bin {public => bak/public}/3.icon.png | Bin {public => bak/public}/4.icon.png | Bin {public => bak/public}/apple-touch-icon.png | Bin {public => bak/public}/browserconfig.xml | 0 {public => bak/public}/favicon.ico | Bin {public => bak/public}/favicon.svg | 0 {public => bak/public}/og-image-background.png | Bin {public => bak/public}/waves-dark.svg | 0 {public => bak/public}/waves.svg | 0 {server => bak/server}/tsconfig.json | 0 {server => bak/server}/utils/remote-content.ts | 0 bak/todo.md | 1 + tsconfig.json => bak/tsconfig.json | 0 {types => bak/types}/content.ts | 0 {types => bak/types}/directus.ts | 0 {types => bak/types}/posthog.d.ts | 0 {utils => bak/utils}/app-config.ts | 0 {utils => bak/utils}/directus.ts | 0 583 files changed, 1 insertion(+) rename .editorconfig => bak/.editorconfig (100%) rename .env.example => bak/.env.example (100%) rename {.github => bak/.github}/actions/prepare/action.yaml (100%) rename {.github => bak/.github}/workflows/lint-app.yaml (100%) rename {.github => bak/.github}/workflows/lint-oas.yaml (100%) rename {.github => bak/.github}/workflows/typecheck.yaml (100%) rename .gitignore => bak/.gitignore (100%) rename README.md => bak/README.md (100%) rename {api-spec => bak/api-spec}/components/parameters.yaml (100%) rename {api-spec => bak/api-spec}/components/responses.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/_index.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/activity.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/collections.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/comments.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/dashboards.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/diff.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/extensions.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/fields.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/files.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/flows.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/folders.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/items.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/notifications.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/operations.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/panels.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/permissions.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/policies.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/presets.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/query.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/relations.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/revisions.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/roles.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/schema.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/settings.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/shares.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/translations.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/users.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/versions.yaml (100%) rename {api-spec => bak/api-spec}/components/schemas/x-metadata.yaml (100%) rename {api-spec => bak/api-spec}/components/security.yaml (100%) rename {api-spec => bak/api-spec}/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/activity/_id/getActivity.yaml (100%) rename {api-spec => bak/api-spec}/paths/activity/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/activity/getActivities.yaml (100%) rename {api-spec => bak/api-spec}/paths/activity/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/assets/_id/getAsset.yaml (100%) rename {api-spec => bak/api-spec}/paths/assets/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/login/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/login/login.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/logout/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/logout/logout.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/oauth/_provider/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/oauth/_provider/oauthProvider.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/oauth/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/oauth/oauth.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/password/request/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/password/request/passwordRequest.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/password/reset/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/password/reset/passwordReset.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/refresh/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/auth/refresh/refresh.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/_id/deleteCollection.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/_id/getCollection.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/_id/updateCollection.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/createCollection.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/getCollections.yaml (100%) rename {api-spec => bak/api-spec}/paths/collections/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/_id/deleteComment.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/_id/getComment.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/_id/updateComment.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/createComments.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/deleteComments.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/getComments.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/comments/updateComments.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/_id/deleteDashboard.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/_id/getDashboard.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/_id/updateDashboard.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/createDashboards.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/deleteDashboards.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/getDashboards.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/dashboards/updateDashboards.yaml (100%) rename {api-spec => bak/api-spec}/paths/extensions/_bundle/_name/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/extensions/_bundle/_name/updateExtensionBundle.yaml (100%) rename {api-spec => bak/api-spec}/paths/extensions/_name/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/extensions/_name/updateExtensions.yaml (100%) rename {api-spec => bak/api-spec}/paths/extensions/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/extensions/listExtensions.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/_id/deleteField.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/_id/getCollectionField.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/_id/updateField.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/createField.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/getCollectionFields.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/_collection/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/getFields.yaml (100%) rename {api-spec => bak/api-spec}/paths/fields/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/_id/deleteFile.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/_id/getFile.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/_id/updateFile.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/deleteFiles.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/getFiles.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/import/importFile.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/import/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/updateFiles.yaml (100%) rename {api-spec => bak/api-spec}/paths/files/uploadFile.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/_id/deleteFlow.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/_id/getFlow.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/_id/updateFlow.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/createFlows.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/deleteFlows.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/getFlows.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/trigger/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/trigger/_id/triggerFlowGET.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/trigger/_id/triggerFlowPOST.yaml (100%) rename {api-spec => bak/api-spec}/paths/flows/updateFlows.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/_id/deleteFolder.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/_id/getFolder.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/_id/updateFolder.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/createFolders.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/deleteFolders.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/getFolders.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/folders/updateFolders.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/_id/deleteItem.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/_id/getCollectionItem.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/_id/updateItem.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/createItems.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/deleteItems.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/getCollectionItems.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/singleton/getSingleton.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/singleton/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/singleton/updateSingleton.yaml (100%) rename {api-spec => bak/api-spec}/paths/items/_collection/updateItems.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/_id/deleteNotification.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/_id/getNotification.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/_id/updateNotification.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/createNotifications.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/deleteNotifications.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/getNotifications.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/notifications/updateNotifications.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/_id/deleteOperation.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/_id/getOperation.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/_id/triggerOperation.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/_id/updateOperation.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/createOperations.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/deleteOperations.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/getOperations.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/operations/updateOperations.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/_id/deletePanel.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/_id/getPanel.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/_id/updatePanel.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/createPanels.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/deletePanels.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/getPanels.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/panels/updatePanels.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/_id/deletePermission.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/_id/getPermission.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/_id/updatePermission.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/createPermissions.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/deletePermissions.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/getPermissions.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/me/_collection/_id/getItemPermissions.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/me/_collection/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/me/getUserPermissions.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/me/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/permissions/updatePermissions.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/_id/deletePolicy.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/_id/getPolicy.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/_id/updatePolicy.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/createPolicies.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/deletePolicies.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/getPolicies.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/policies/updatePolicies.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/_id/deletePreset.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/_id/getPreset.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/_id/updatePreset.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/createPresets.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/deletePresets.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/getPresets.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/presets/updatePresets.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/_collection/getRelationByCollection.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/_collection/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/_id/deleteRelation.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/_id/getRelation.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/_id/updateRelation.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/createRelation.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/getRelations.yaml (100%) rename {api-spec => bak/api-spec}/paths/relations/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/revisions/_id/getRevision.yaml (100%) rename {api-spec => bak/api-spec}/paths/revisions/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/revisions/getRevisions.yaml (100%) rename {api-spec => bak/api-spec}/paths/revisions/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/_id/deleteRole.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/_id/getRole.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/_id/updateRole.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/createRoles.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/deleteRoles.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/getRoles.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/roles/updateRoles.yaml (100%) rename {api-spec => bak/api-spec}/paths/schema/apply/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/schema/apply/schemaApply.yaml (100%) rename {api-spec => bak/api-spec}/paths/schema/diff/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/schema/diff/schemaDiff.yaml (100%) rename {api-spec => bak/api-spec}/paths/schema/snapshot/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/schema/snapshot/schemaSnapshot.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/health/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/health/serverHealth.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/info/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/info/serverInfo.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/ping/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/ping/ping.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/specs/graphql/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/specs/graphql/readGraphqlSdl.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/specs/oas/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/server/specs/oas/readOpenApiSpec.yaml (100%) rename {api-spec => bak/api-spec}/paths/settings/getSettings.yaml (100%) rename {api-spec => bak/api-spec}/paths/settings/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/settings/updateSettings.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/_id/deleteShare.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/_id/getShare.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/_id/updateShare.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/_share/getPublicShareInfo.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/_share/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/auth/authenticateShare.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/auth/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/createShares.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/deleteShares.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/getShares.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/info/_id/getShareInfo.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/info/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/invite/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/invite/inviteShare.yaml (100%) rename {api-spec => bak/api-spec}/paths/shares/updateShares.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/_id/deleteTranslation.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/_id/getTranslation.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/_id/updateTranslation.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/createTranslations.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/deleteTranslations.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/getTranslations.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/translations/updateTranslations.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/_id/deleteUser.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/_id/getUser.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/_id/updateUser.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/createUsers.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/deleteUsers.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/getUsers.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/invite/accept/acceptInvite.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/invite/accept/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/invite/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/invite/invite.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/getMe.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/tfa/disable/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/tfa/disable/meTfaDisable.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/tfa/enable/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/tfa/enable/meTfaEnable.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/tfa/generate/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/track/page/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/track/page/updateLastUsedPageMe.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/me/updateMe.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/register/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/register/registerUser.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/register/verify-email/_token/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/register/verify-email/_token/registerUserVerify.yaml (100%) rename {api-spec => bak/api-spec}/paths/users/updateUsers.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/cache/clear/clear-cache.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/cache/clear/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/export/_collection/export.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/export/_collection/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/hash/generate/hash-generate.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/hash/generate/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/hash/verify/hash-verify.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/hash/verify/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/import/_collection/import.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/import/_collection/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/random/string/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/random/string/random.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/sort/_collection/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/utils/sort/_collection/sort.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/compare/compareContentVersion.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/compare/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/deleteContentVersion.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/getContentVersion.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/promote/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/promote/promoteContentVersion.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/save/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/save/saveContentVersion.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/_id/updateContentVersion.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/createContentVersions.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/deleteContentVersions.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/getContentVersions.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/index.yaml (100%) rename {api-spec => bak/api-spec}/paths/versions/updateContentVersions.yaml (100%) rename {app => bak/app}/app.vue (100%) rename {app => bak/app}/assets/css/_reset.scss (100%) rename {app => bak/app}/assets/css/_vars.scss (100%) rename {app => bak/app}/assets/css/colors.scss (100%) rename {app => bak/app}/assets/css/main.scss (100%) rename {app => bak/app}/assets/icons/frameworks/angular.svg (100%) rename {app => bak/app}/assets/icons/frameworks/apple.svg (100%) rename {app => bak/app}/assets/icons/frameworks/astro.svg (100%) rename {app => bak/app}/assets/icons/frameworks/next.svg (100%) rename {app => bak/app}/assets/icons/frameworks/nuxt.svg (100%) rename {app => bak/app}/assets/icons/frameworks/react.svg (100%) rename {app => bak/app}/assets/icons/frameworks/remix.svg (100%) rename {app => bak/app}/assets/icons/frameworks/svelte.svg (100%) rename {app => bak/app}/assets/icons/frameworks/vue.svg (100%) rename {app => bak/app}/assets/icons/products/auth-pink.svg (100%) rename {app => bak/app}/assets/icons/products/auth-purple.svg (100%) rename {app => bak/app}/assets/icons/products/auth-white.svg (100%) rename {app => bak/app}/assets/icons/products/auth.svg (100%) rename {app => bak/app}/assets/icons/products/automate-pink.svg (100%) rename {app => bak/app}/assets/icons/products/automate-purple.svg (100%) rename {app => bak/app}/assets/icons/products/automate-white.svg (100%) rename {app => bak/app}/assets/icons/products/automate.svg (100%) rename {app => bak/app}/assets/icons/products/connect-pink.svg (100%) rename {app => bak/app}/assets/icons/products/connect-purple.svg (100%) rename {app => bak/app}/assets/icons/products/connect-white.svg (100%) rename {app => bak/app}/assets/icons/products/connect.svg (100%) rename {app => bak/app}/assets/icons/products/editor-pink.svg (100%) rename {app => bak/app}/assets/icons/products/editor-purple.svg (100%) rename {app => bak/app}/assets/icons/products/editor-white.svg (100%) rename {app => bak/app}/assets/icons/products/editor.svg (100%) rename {app => bak/app}/assets/icons/products/explore-pink.svg (100%) rename {app => bak/app}/assets/icons/products/explore-purple.svg (100%) rename {app => bak/app}/assets/icons/products/explore-white.svg (100%) rename {app => bak/app}/assets/icons/products/explore.svg (100%) rename {app => bak/app}/assets/icons/products/files-pink.svg (100%) rename {app => bak/app}/assets/icons/products/files-purple.svg (100%) rename {app => bak/app}/assets/icons/products/files-white.svg (100%) rename {app => bak/app}/assets/icons/products/files.svg (100%) rename {app => bak/app}/assets/icons/products/insights-pink.svg (100%) rename {app => bak/app}/assets/icons/products/insights-purple.svg (100%) rename {app => bak/app}/assets/icons/products/insights-white.svg (100%) rename {app => bak/app}/assets/icons/products/insights.svg (100%) rename {app => bak/app}/assets/icons/products/marketplace-pink.svg (100%) rename {app => bak/app}/assets/icons/products/marketplace-purple.svg (100%) rename {app => bak/app}/assets/icons/products/marketplace-white.svg (100%) rename {app => bak/app}/assets/icons/products/marketplace.svg (100%) rename {app => bak/app}/assets/icons/products/realtime-pink.svg (100%) rename {app => bak/app}/assets/icons/products/realtime-purple.svg (100%) rename {app => bak/app}/assets/icons/products/realtime-white.svg (100%) rename {app => bak/app}/assets/icons/products/realtime.svg (100%) rename {app => bak/app}/assets/img/cloud-cta-bg.svg (100%) rename {app => bak/app}/assets/img/cloud-logo.svg (100%) rename {app => bak/app}/assets/img/pink-cta-bg.svg (100%) rename {app => bak/app}/assets/img/purple-cta-bg.svg (100%) rename {app => bak/app}/assets/img/tv-logo.svg (100%) rename {app => bak/app}/components/Button.vue (100%) rename {app => bak/app}/components/DefaultLayout.vue (100%) rename {app => bak/app}/components/LayoutFooter.vue (100%) rename {app => bak/app}/components/NavTree.vue (100%) rename {app => bak/app}/components/OgImage/Default.vue (100%) rename {app => bak/app}/components/articles/ArticlesCard.vue (100%) rename {app => bak/app}/components/articles/ArticlesCategoryNav.vue (100%) rename {app => bak/app}/components/articles/ArticlesGrid.vue (100%) rename {app => bak/app}/components/articles/ArticlesLayout.vue (100%) rename {app => bak/app}/components/articles/ArticlesTagsFilter.vue (100%) rename {app => bak/app}/components/aside/AsideFeedback.vue (100%) rename {app => bak/app}/components/aside/AsideNav.vue (100%) rename {app => bak/app}/components/aside/AsideNewsletter.vue (100%) rename {app => bak/app}/components/aside/AsideSlideover.vue (100%) rename {app => bak/app}/components/aside/AsideTableOfContents.vue (100%) rename {app => bak/app}/components/aside/AsideWidget.vue (100%) rename {app => bak/app}/components/content/ArticleCards.vue (100%) rename {app => bak/app}/components/content/Badge.vue (100%) rename {app => bak/app}/components/content/Box.vue (100%) rename {app => bak/app}/components/content/Callout.vue (100%) rename {app => bak/app}/components/content/DirectusCloud.vue (100%) rename {app => bak/app}/components/content/DirectusImage.vue (100%) rename {app => bak/app}/components/content/EngineStudioBox.vue (100%) rename {app => bak/app}/components/content/HeaderWithBadge.vue (100%) rename {app => bak/app}/components/content/ListChildren.vue (100%) rename {app => bak/app}/components/content/Partial.vue (100%) rename {app => bak/app}/components/content/ProductLink.vue (100%) rename {app => bak/app}/components/content/ProsePre.vue (100%) rename {app => bak/app}/components/content/ProseTable.vue (100%) rename {app => bak/app}/components/content/Snippets.vue (100%) rename {app => bak/app}/components/content/Tab.vue (100%) rename {app => bak/app}/components/content/Tabs.vue (100%) rename {app => bak/app}/components/content/VideoEmbed.vue (100%) rename {app => bak/app}/components/header/HeaderBanner.vue (100%) rename {app => bak/app}/components/header/HeaderHat.vue (100%) rename {app => bak/app}/components/header/HeaderHero.vue (100%) rename {app => bak/app}/components/header/HeaderLogo.vue (100%) rename {app => bak/app}/components/header/HeaderNav.vue (100%) rename {app => bak/app}/components/header/HeaderSlideover.vue (100%) rename {app => bak/app}/components/pages/ArticleArea.global.vue (100%) rename {app => bak/app}/components/pages/ArticleCategory.global.vue (100%) rename {app => bak/app}/components/pages/ArticlePage.global.vue (100%) rename {app => bak/app}/components/pages/DocumentationPage.global.vue (100%) rename {app => bak/app}/components/search/SearchButton.client.vue (100%) rename {app => bak/app}/composables/data.ts (100%) rename {app => bak/app}/composables/tags.ts (100%) rename {app => bak/app}/pages/[...slug].vue (100%) rename {app => bak/app}/pages/api/index.vue (100%) rename {app => bak/app}/plugins/format-title.ts (100%) rename {app => bak/app}/utils/directus.ts (100%) rename {app => bak/app}/utils/file-icons.ts (100%) rename {app => bak/app}/utils/product-links.ts (100%) rename {app => bak/app}/utils/products.ts (100%) rename {content => bak/content}/1.getting-started/0.home.md (100%) rename {content => bak/content}/1.getting-started/0.platform-overview.md (100%) rename {content => bak/content}/1.getting-started/1.create-a-project.md (100%) rename {content => bak/content}/1.getting-started/2.resources.md (100%) rename {content => bak/content}/1.getting-started/_dir.yml (100%) rename {content => bak/content}/10.extensions/0.overview.md (100%) rename {content => bak/content}/10.extensions/1.quickstart.md (100%) rename {content => bak/content}/10.extensions/2.api-extensions/0.index.md (100%) rename {content => bak/content}/10.extensions/2.api-extensions/1.hooks.md (100%) rename {content => bak/content}/10.extensions/2.api-extensions/2.endpoints.md (100%) rename {content => bak/content}/10.extensions/2.api-extensions/3.operations.md (100%) rename {content => bak/content}/10.extensions/2.api-extensions/4.services.md (100%) rename {content => bak/content}/10.extensions/2.api-extensions/5.sandbox.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/0.index.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/1.interfaces.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/2.displays.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/3.layouts.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/4.panels.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/5.modules.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/6.themes.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/7.ui-library.md (100%) rename {content => bak/content}/10.extensions/3.app-extensions/8.composables.md (100%) rename {content => bak/content}/10.extensions/4.bundles.md (100%) rename {content => bak/content}/10.extensions/5.marketplace/0.index.md (100%) rename {content => bak/content}/10.extensions/5.marketplace/1.publishing.md (100%) rename {content => bak/content}/10.extensions/_dir.yml (100%) rename {content => bak/content}/11.configuration/1.general.md (100%) rename {content => bak/content}/11.configuration/10.extensions.md (100%) rename {content => bak/content}/11.configuration/11.logging.md (100%) rename {content => bak/content}/11.configuration/12.email.md (100%) rename {content => bak/content}/11.configuration/13.migrations.md (100%) rename {content => bak/content}/11.configuration/14.theming.md (100%) rename {content => bak/content}/11.configuration/15.translations.md (100%) rename {content => bak/content}/11.configuration/2.database.md (100%) rename {content => bak/content}/11.configuration/3.files.md (100%) rename {content => bak/content}/11.configuration/4.synchronization.md (100%) rename {content => bak/content}/11.configuration/5.realtime.md (100%) rename {content => bak/content}/11.configuration/6.flows.md (100%) rename {content => bak/content}/11.configuration/7.security-limits.md (100%) rename {content => bak/content}/11.configuration/8.auth-sso.md (100%) rename {content => bak/content}/11.configuration/9.pm2.md (100%) rename {content => bak/content}/11.configuration/_dir.yml (100%) rename {content => bak/content}/12.self-hosting/1.overview.md (100%) rename {content => bak/content}/12.self-hosting/2.requirements.md (100%) rename {content => bak/content}/12.self-hosting/3.deploying.md (100%) rename {content => bak/content}/12.self-hosting/4.upgrading.md (100%) rename {content => bak/content}/12.self-hosting/5.including-extensions.md (100%) rename {content => bak/content}/12.self-hosting/_dir.yml (100%) rename {content => bak/content}/13.releases/1.overview.md (100%) rename {content => bak/content}/13.releases/2.breaking-changes/0.index.md (100%) rename {content => bak/content}/13.releases/2.breaking-changes/1.version-10.md (100%) rename {content => bak/content}/13.releases/2.breaking-changes/2.version-11.md (100%) rename {content => bak/content}/13.releases/3.changelog.md (100%) rename {content => bak/content}/13.releases/_dir.yml (100%) rename {content => bak/content}/2.data-modeling/1.quickstart.md (100%) rename {content => bak/content}/2.data-modeling/2.collections.md (100%) rename {content => bak/content}/2.data-modeling/3.fields.md (100%) rename {content => bak/content}/2.data-modeling/4.interfaces.md (100%) rename {content => bak/content}/2.data-modeling/5.relationships.md (100%) rename {content => bak/content}/2.data-modeling/_dir.yml (100%) rename {content => bak/content}/3.content/1.explore.md (100%) rename {content => bak/content}/3.content/2.editor.md (100%) rename {content => bak/content}/3.content/3.layouts.md (100%) rename {content => bak/content}/3.content/4.import-export.md (100%) rename {content => bak/content}/3.content/5.live-preview.md (100%) rename {content => bak/content}/3.content/6.content-versioning.md (100%) rename {content => bak/content}/3.content/7.translations.md (100%) rename {content => bak/content}/3.content/_dir.yml (100%) rename {content => bak/content}/4.auth/1.quickstart.md (100%) rename {content => bak/content}/4.auth/2.tokens-cookies.md (100%) rename {content => bak/content}/4.auth/3.access-control.md (100%) rename {content => bak/content}/4.auth/4.creating-users.md (100%) rename {content => bak/content}/4.auth/5.email-login.md (100%) rename {content => bak/content}/4.auth/6.2fa.md (100%) rename {content => bak/content}/4.auth/7.sso/1.index.md (100%) rename {content => bak/content}/4.auth/7.sso/2.seamless.md (100%) rename {content => bak/content}/4.auth/8.accountability.md (100%) rename {content => bak/content}/4.auth/_dir.yml (100%) rename {content => bak/content}/5.connect/1.quickstart.md (100%) rename {content => bak/content}/5.connect/2.authentication.md (100%) rename {content => bak/content}/5.connect/3.filter-rules.md (100%) rename {content => bak/content}/5.connect/4.query-parameters.md (100%) rename {content => bak/content}/5.connect/5.errors.md (100%) rename {content => bak/content}/5.connect/6.sdk.md (100%) rename {content => bak/content}/5.connect/_dir.yml (100%) rename {content => bak/content}/6.files/1.quickstart.md (100%) rename {content => bak/content}/6.files/2.upload.md (100%) rename {content => bak/content}/6.files/3.manage.md (100%) rename {content => bak/content}/6.files/4.access.md (100%) rename {content => bak/content}/6.files/5.transform.md (100%) rename {content => bak/content}/6.files/_dir.yml (100%) rename {content => bak/content}/7.automate/1.quickstart.md (100%) rename {content => bak/content}/7.automate/2.flows.md (100%) rename {content => bak/content}/7.automate/3.data-chain.md (100%) rename {content => bak/content}/7.automate/4.triggers.md (100%) rename {content => bak/content}/7.automate/5.operations.md (100%) rename {content => bak/content}/7.automate/_dir.yml (100%) rename {content => bak/content}/8.realtime/1.quickstart.md (100%) rename {content => bak/content}/8.realtime/2.authentication.md (100%) rename {content => bak/content}/8.realtime/3.subscriptions.md (100%) rename {content => bak/content}/8.realtime/4.actions.md (100%) rename {content => bak/content}/8.realtime/_dir.yml (100%) rename {content => bak/content}/9.insights/1.overview.md (100%) rename {content => bak/content}/9.insights/2.panels.md (100%) rename {content => bak/content}/9.insights/_dir.yml (100%) rename {content => bak/content}/_partials/authentication.md (100%) rename {content => bak/content}/_partials/config-env-vars.md (100%) rename {content => bak/content}/_partials/extension-hook-exceptions.md (100%) rename {content => bak/content}/_partials/extension-hook-footguns.md (100%) rename {content => bak/content}/_partials/extensions-api-internals.md (100%) rename {content => bak/content}/_partials/extensions-api.md (100%) rename {content => bak/content}/_partials/extensions-app-internals.md (100%) rename {content => bak/content}/_partials/extensions-app.md (100%) rename {content => bak/content}/_partials/extensions-theme.md (100%) rename {content => bak/content}/_partials/extensions-uid.md (100%) rename {content => bak/content}/_partials/home-hero/auth.md (100%) rename {content => bak/content}/_partials/home-hero/data.md (100%) rename {content => bak/content}/_partials/home-hero/file.md (100%) rename {content => bak/content}/_partials/home-hero/realtime.md (100%) rename {content => bak/content}/_partials/license.md (100%) rename {content => bak/content}/_partials/query-functions.md (100%) rename {content => bak/content}/_partials/quickstart-making-calls.md (100%) rename {content => bak/content}/_partials/snippet-auth-token.md (100%) rename eslint.config.mjs => bak/eslint.config.mjs (100%) rename nuxt.config.ts => bak/nuxt.config.ts (100%) rename package.json => bak/package.json (100%) rename pnpm-lock.yaml => bak/pnpm-lock.yaml (100%) rename {public => bak/public}/1.icon.png (100%) rename {public => bak/public}/2.icon.png (100%) rename {public => bak/public}/3.icon.png (100%) rename {public => bak/public}/4.icon.png (100%) rename {public => bak/public}/apple-touch-icon.png (100%) rename {public => bak/public}/browserconfig.xml (100%) rename {public => bak/public}/favicon.ico (100%) rename {public => bak/public}/favicon.svg (100%) rename {public => bak/public}/og-image-background.png (100%) rename {public => bak/public}/waves-dark.svg (100%) rename {public => bak/public}/waves.svg (100%) rename {server => bak/server}/tsconfig.json (100%) rename {server => bak/server}/utils/remote-content.ts (100%) create mode 100644 bak/todo.md rename tsconfig.json => bak/tsconfig.json (100%) rename {types => bak/types}/content.ts (100%) rename {types => bak/types}/directus.ts (100%) rename {types => bak/types}/posthog.d.ts (100%) rename {utils => bak/utils}/app-config.ts (100%) rename {utils => bak/utils}/directus.ts (100%) diff --git a/.editorconfig b/bak/.editorconfig similarity index 100% rename from .editorconfig rename to bak/.editorconfig diff --git a/.env.example b/bak/.env.example similarity index 100% rename from .env.example rename to bak/.env.example diff --git a/.github/actions/prepare/action.yaml b/bak/.github/actions/prepare/action.yaml similarity index 100% rename from .github/actions/prepare/action.yaml rename to bak/.github/actions/prepare/action.yaml diff --git a/.github/workflows/lint-app.yaml b/bak/.github/workflows/lint-app.yaml similarity index 100% rename from .github/workflows/lint-app.yaml rename to bak/.github/workflows/lint-app.yaml diff --git a/.github/workflows/lint-oas.yaml b/bak/.github/workflows/lint-oas.yaml similarity index 100% rename from .github/workflows/lint-oas.yaml rename to bak/.github/workflows/lint-oas.yaml diff --git a/.github/workflows/typecheck.yaml b/bak/.github/workflows/typecheck.yaml similarity index 100% rename from .github/workflows/typecheck.yaml rename to bak/.github/workflows/typecheck.yaml diff --git a/.gitignore b/bak/.gitignore similarity index 100% rename from .gitignore rename to bak/.gitignore diff --git a/README.md b/bak/README.md similarity index 100% rename from README.md rename to bak/README.md diff --git a/api-spec/components/parameters.yaml b/bak/api-spec/components/parameters.yaml similarity index 100% rename from api-spec/components/parameters.yaml rename to bak/api-spec/components/parameters.yaml diff --git a/api-spec/components/responses.yaml b/bak/api-spec/components/responses.yaml similarity index 100% rename from api-spec/components/responses.yaml rename to bak/api-spec/components/responses.yaml diff --git a/api-spec/components/schemas/_index.yaml b/bak/api-spec/components/schemas/_index.yaml similarity index 100% rename from api-spec/components/schemas/_index.yaml rename to bak/api-spec/components/schemas/_index.yaml diff --git a/api-spec/components/schemas/activity.yaml b/bak/api-spec/components/schemas/activity.yaml similarity index 100% rename from api-spec/components/schemas/activity.yaml rename to bak/api-spec/components/schemas/activity.yaml diff --git a/api-spec/components/schemas/collections.yaml b/bak/api-spec/components/schemas/collections.yaml similarity index 100% rename from api-spec/components/schemas/collections.yaml rename to bak/api-spec/components/schemas/collections.yaml diff --git a/api-spec/components/schemas/comments.yaml b/bak/api-spec/components/schemas/comments.yaml similarity index 100% rename from api-spec/components/schemas/comments.yaml rename to bak/api-spec/components/schemas/comments.yaml diff --git a/api-spec/components/schemas/dashboards.yaml b/bak/api-spec/components/schemas/dashboards.yaml similarity index 100% rename from api-spec/components/schemas/dashboards.yaml rename to bak/api-spec/components/schemas/dashboards.yaml diff --git a/api-spec/components/schemas/diff.yaml b/bak/api-spec/components/schemas/diff.yaml similarity index 100% rename from api-spec/components/schemas/diff.yaml rename to bak/api-spec/components/schemas/diff.yaml diff --git a/api-spec/components/schemas/extensions.yaml b/bak/api-spec/components/schemas/extensions.yaml similarity index 100% rename from api-spec/components/schemas/extensions.yaml rename to bak/api-spec/components/schemas/extensions.yaml diff --git a/api-spec/components/schemas/fields.yaml b/bak/api-spec/components/schemas/fields.yaml similarity index 100% rename from api-spec/components/schemas/fields.yaml rename to bak/api-spec/components/schemas/fields.yaml diff --git a/api-spec/components/schemas/files.yaml b/bak/api-spec/components/schemas/files.yaml similarity index 100% rename from api-spec/components/schemas/files.yaml rename to bak/api-spec/components/schemas/files.yaml diff --git a/api-spec/components/schemas/flows.yaml b/bak/api-spec/components/schemas/flows.yaml similarity index 100% rename from api-spec/components/schemas/flows.yaml rename to bak/api-spec/components/schemas/flows.yaml diff --git a/api-spec/components/schemas/folders.yaml b/bak/api-spec/components/schemas/folders.yaml similarity index 100% rename from api-spec/components/schemas/folders.yaml rename to bak/api-spec/components/schemas/folders.yaml diff --git a/api-spec/components/schemas/items.yaml b/bak/api-spec/components/schemas/items.yaml similarity index 100% rename from api-spec/components/schemas/items.yaml rename to bak/api-spec/components/schemas/items.yaml diff --git a/api-spec/components/schemas/notifications.yaml b/bak/api-spec/components/schemas/notifications.yaml similarity index 100% rename from api-spec/components/schemas/notifications.yaml rename to bak/api-spec/components/schemas/notifications.yaml diff --git a/api-spec/components/schemas/operations.yaml b/bak/api-spec/components/schemas/operations.yaml similarity index 100% rename from api-spec/components/schemas/operations.yaml rename to bak/api-spec/components/schemas/operations.yaml diff --git a/api-spec/components/schemas/panels.yaml b/bak/api-spec/components/schemas/panels.yaml similarity index 100% rename from api-spec/components/schemas/panels.yaml rename to bak/api-spec/components/schemas/panels.yaml diff --git a/api-spec/components/schemas/permissions.yaml b/bak/api-spec/components/schemas/permissions.yaml similarity index 100% rename from api-spec/components/schemas/permissions.yaml rename to bak/api-spec/components/schemas/permissions.yaml diff --git a/api-spec/components/schemas/policies.yaml b/bak/api-spec/components/schemas/policies.yaml similarity index 100% rename from api-spec/components/schemas/policies.yaml rename to bak/api-spec/components/schemas/policies.yaml diff --git a/api-spec/components/schemas/presets.yaml b/bak/api-spec/components/schemas/presets.yaml similarity index 100% rename from api-spec/components/schemas/presets.yaml rename to bak/api-spec/components/schemas/presets.yaml diff --git a/api-spec/components/schemas/query.yaml b/bak/api-spec/components/schemas/query.yaml similarity index 100% rename from api-spec/components/schemas/query.yaml rename to bak/api-spec/components/schemas/query.yaml diff --git a/api-spec/components/schemas/relations.yaml b/bak/api-spec/components/schemas/relations.yaml similarity index 100% rename from api-spec/components/schemas/relations.yaml rename to bak/api-spec/components/schemas/relations.yaml diff --git a/api-spec/components/schemas/revisions.yaml b/bak/api-spec/components/schemas/revisions.yaml similarity index 100% rename from api-spec/components/schemas/revisions.yaml rename to bak/api-spec/components/schemas/revisions.yaml diff --git a/api-spec/components/schemas/roles.yaml b/bak/api-spec/components/schemas/roles.yaml similarity index 100% rename from api-spec/components/schemas/roles.yaml rename to bak/api-spec/components/schemas/roles.yaml diff --git a/api-spec/components/schemas/schema.yaml b/bak/api-spec/components/schemas/schema.yaml similarity index 100% rename from api-spec/components/schemas/schema.yaml rename to bak/api-spec/components/schemas/schema.yaml diff --git a/api-spec/components/schemas/settings.yaml b/bak/api-spec/components/schemas/settings.yaml similarity index 100% rename from api-spec/components/schemas/settings.yaml rename to bak/api-spec/components/schemas/settings.yaml diff --git a/api-spec/components/schemas/shares.yaml b/bak/api-spec/components/schemas/shares.yaml similarity index 100% rename from api-spec/components/schemas/shares.yaml rename to bak/api-spec/components/schemas/shares.yaml diff --git a/api-spec/components/schemas/translations.yaml b/bak/api-spec/components/schemas/translations.yaml similarity index 100% rename from api-spec/components/schemas/translations.yaml rename to bak/api-spec/components/schemas/translations.yaml diff --git a/api-spec/components/schemas/users.yaml b/bak/api-spec/components/schemas/users.yaml similarity index 100% rename from api-spec/components/schemas/users.yaml rename to bak/api-spec/components/schemas/users.yaml diff --git a/api-spec/components/schemas/versions.yaml b/bak/api-spec/components/schemas/versions.yaml similarity index 100% rename from api-spec/components/schemas/versions.yaml rename to bak/api-spec/components/schemas/versions.yaml diff --git a/api-spec/components/schemas/x-metadata.yaml b/bak/api-spec/components/schemas/x-metadata.yaml similarity index 100% rename from api-spec/components/schemas/x-metadata.yaml rename to bak/api-spec/components/schemas/x-metadata.yaml diff --git a/api-spec/components/security.yaml b/bak/api-spec/components/security.yaml similarity index 100% rename from api-spec/components/security.yaml rename to bak/api-spec/components/security.yaml diff --git a/api-spec/index.yaml b/bak/api-spec/index.yaml similarity index 100% rename from api-spec/index.yaml rename to bak/api-spec/index.yaml diff --git a/api-spec/paths/activity/_id/getActivity.yaml b/bak/api-spec/paths/activity/_id/getActivity.yaml similarity index 100% rename from api-spec/paths/activity/_id/getActivity.yaml rename to bak/api-spec/paths/activity/_id/getActivity.yaml diff --git a/api-spec/paths/activity/_id/index.yaml b/bak/api-spec/paths/activity/_id/index.yaml similarity index 100% rename from api-spec/paths/activity/_id/index.yaml rename to bak/api-spec/paths/activity/_id/index.yaml diff --git a/api-spec/paths/activity/getActivities.yaml b/bak/api-spec/paths/activity/getActivities.yaml similarity index 100% rename from api-spec/paths/activity/getActivities.yaml rename to bak/api-spec/paths/activity/getActivities.yaml diff --git a/api-spec/paths/activity/index.yaml b/bak/api-spec/paths/activity/index.yaml similarity index 100% rename from api-spec/paths/activity/index.yaml rename to bak/api-spec/paths/activity/index.yaml diff --git a/api-spec/paths/assets/_id/getAsset.yaml b/bak/api-spec/paths/assets/_id/getAsset.yaml similarity index 100% rename from api-spec/paths/assets/_id/getAsset.yaml rename to bak/api-spec/paths/assets/_id/getAsset.yaml diff --git a/api-spec/paths/assets/_id/index.yaml b/bak/api-spec/paths/assets/_id/index.yaml similarity index 100% rename from api-spec/paths/assets/_id/index.yaml rename to bak/api-spec/paths/assets/_id/index.yaml diff --git a/api-spec/paths/auth/login/index.yaml b/bak/api-spec/paths/auth/login/index.yaml similarity index 100% rename from api-spec/paths/auth/login/index.yaml rename to bak/api-spec/paths/auth/login/index.yaml diff --git a/api-spec/paths/auth/login/login.yaml b/bak/api-spec/paths/auth/login/login.yaml similarity index 100% rename from api-spec/paths/auth/login/login.yaml rename to bak/api-spec/paths/auth/login/login.yaml diff --git a/api-spec/paths/auth/logout/index.yaml b/bak/api-spec/paths/auth/logout/index.yaml similarity index 100% rename from api-spec/paths/auth/logout/index.yaml rename to bak/api-spec/paths/auth/logout/index.yaml diff --git a/api-spec/paths/auth/logout/logout.yaml b/bak/api-spec/paths/auth/logout/logout.yaml similarity index 100% rename from api-spec/paths/auth/logout/logout.yaml rename to bak/api-spec/paths/auth/logout/logout.yaml diff --git a/api-spec/paths/auth/oauth/_provider/index.yaml b/bak/api-spec/paths/auth/oauth/_provider/index.yaml similarity index 100% rename from api-spec/paths/auth/oauth/_provider/index.yaml rename to bak/api-spec/paths/auth/oauth/_provider/index.yaml diff --git a/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml b/bak/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml similarity index 100% rename from api-spec/paths/auth/oauth/_provider/oauthProvider.yaml rename to bak/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml diff --git a/api-spec/paths/auth/oauth/index.yaml b/bak/api-spec/paths/auth/oauth/index.yaml similarity index 100% rename from api-spec/paths/auth/oauth/index.yaml rename to bak/api-spec/paths/auth/oauth/index.yaml diff --git a/api-spec/paths/auth/oauth/oauth.yaml b/bak/api-spec/paths/auth/oauth/oauth.yaml similarity index 100% rename from api-spec/paths/auth/oauth/oauth.yaml rename to bak/api-spec/paths/auth/oauth/oauth.yaml diff --git a/api-spec/paths/auth/password/request/index.yaml b/bak/api-spec/paths/auth/password/request/index.yaml similarity index 100% rename from api-spec/paths/auth/password/request/index.yaml rename to bak/api-spec/paths/auth/password/request/index.yaml diff --git a/api-spec/paths/auth/password/request/passwordRequest.yaml b/bak/api-spec/paths/auth/password/request/passwordRequest.yaml similarity index 100% rename from api-spec/paths/auth/password/request/passwordRequest.yaml rename to bak/api-spec/paths/auth/password/request/passwordRequest.yaml diff --git a/api-spec/paths/auth/password/reset/index.yaml b/bak/api-spec/paths/auth/password/reset/index.yaml similarity index 100% rename from api-spec/paths/auth/password/reset/index.yaml rename to bak/api-spec/paths/auth/password/reset/index.yaml diff --git a/api-spec/paths/auth/password/reset/passwordReset.yaml b/bak/api-spec/paths/auth/password/reset/passwordReset.yaml similarity index 100% rename from api-spec/paths/auth/password/reset/passwordReset.yaml rename to bak/api-spec/paths/auth/password/reset/passwordReset.yaml diff --git a/api-spec/paths/auth/refresh/index.yaml b/bak/api-spec/paths/auth/refresh/index.yaml similarity index 100% rename from api-spec/paths/auth/refresh/index.yaml rename to bak/api-spec/paths/auth/refresh/index.yaml diff --git a/api-spec/paths/auth/refresh/refresh.yaml b/bak/api-spec/paths/auth/refresh/refresh.yaml similarity index 100% rename from api-spec/paths/auth/refresh/refresh.yaml rename to bak/api-spec/paths/auth/refresh/refresh.yaml diff --git a/api-spec/paths/collections/_id/deleteCollection.yaml b/bak/api-spec/paths/collections/_id/deleteCollection.yaml similarity index 100% rename from api-spec/paths/collections/_id/deleteCollection.yaml rename to bak/api-spec/paths/collections/_id/deleteCollection.yaml diff --git a/api-spec/paths/collections/_id/getCollection.yaml b/bak/api-spec/paths/collections/_id/getCollection.yaml similarity index 100% rename from api-spec/paths/collections/_id/getCollection.yaml rename to bak/api-spec/paths/collections/_id/getCollection.yaml diff --git a/api-spec/paths/collections/_id/index.yaml b/bak/api-spec/paths/collections/_id/index.yaml similarity index 100% rename from api-spec/paths/collections/_id/index.yaml rename to bak/api-spec/paths/collections/_id/index.yaml diff --git a/api-spec/paths/collections/_id/updateCollection.yaml b/bak/api-spec/paths/collections/_id/updateCollection.yaml similarity index 100% rename from api-spec/paths/collections/_id/updateCollection.yaml rename to bak/api-spec/paths/collections/_id/updateCollection.yaml diff --git a/api-spec/paths/collections/createCollection.yaml b/bak/api-spec/paths/collections/createCollection.yaml similarity index 100% rename from api-spec/paths/collections/createCollection.yaml rename to bak/api-spec/paths/collections/createCollection.yaml diff --git a/api-spec/paths/collections/getCollections.yaml b/bak/api-spec/paths/collections/getCollections.yaml similarity index 100% rename from api-spec/paths/collections/getCollections.yaml rename to bak/api-spec/paths/collections/getCollections.yaml diff --git a/api-spec/paths/collections/index.yaml b/bak/api-spec/paths/collections/index.yaml similarity index 100% rename from api-spec/paths/collections/index.yaml rename to bak/api-spec/paths/collections/index.yaml diff --git a/api-spec/paths/comments/_id/deleteComment.yaml b/bak/api-spec/paths/comments/_id/deleteComment.yaml similarity index 100% rename from api-spec/paths/comments/_id/deleteComment.yaml rename to bak/api-spec/paths/comments/_id/deleteComment.yaml diff --git a/api-spec/paths/comments/_id/getComment.yaml b/bak/api-spec/paths/comments/_id/getComment.yaml similarity index 100% rename from api-spec/paths/comments/_id/getComment.yaml rename to bak/api-spec/paths/comments/_id/getComment.yaml diff --git a/api-spec/paths/comments/_id/index.yaml b/bak/api-spec/paths/comments/_id/index.yaml similarity index 100% rename from api-spec/paths/comments/_id/index.yaml rename to bak/api-spec/paths/comments/_id/index.yaml diff --git a/api-spec/paths/comments/_id/updateComment.yaml b/bak/api-spec/paths/comments/_id/updateComment.yaml similarity index 100% rename from api-spec/paths/comments/_id/updateComment.yaml rename to bak/api-spec/paths/comments/_id/updateComment.yaml diff --git a/api-spec/paths/comments/createComments.yaml b/bak/api-spec/paths/comments/createComments.yaml similarity index 100% rename from api-spec/paths/comments/createComments.yaml rename to bak/api-spec/paths/comments/createComments.yaml diff --git a/api-spec/paths/comments/deleteComments.yaml b/bak/api-spec/paths/comments/deleteComments.yaml similarity index 100% rename from api-spec/paths/comments/deleteComments.yaml rename to bak/api-spec/paths/comments/deleteComments.yaml diff --git a/api-spec/paths/comments/getComments.yaml b/bak/api-spec/paths/comments/getComments.yaml similarity index 100% rename from api-spec/paths/comments/getComments.yaml rename to bak/api-spec/paths/comments/getComments.yaml diff --git a/api-spec/paths/comments/index.yaml b/bak/api-spec/paths/comments/index.yaml similarity index 100% rename from api-spec/paths/comments/index.yaml rename to bak/api-spec/paths/comments/index.yaml diff --git a/api-spec/paths/comments/updateComments.yaml b/bak/api-spec/paths/comments/updateComments.yaml similarity index 100% rename from api-spec/paths/comments/updateComments.yaml rename to bak/api-spec/paths/comments/updateComments.yaml diff --git a/api-spec/paths/dashboards/_id/deleteDashboard.yaml b/bak/api-spec/paths/dashboards/_id/deleteDashboard.yaml similarity index 100% rename from api-spec/paths/dashboards/_id/deleteDashboard.yaml rename to bak/api-spec/paths/dashboards/_id/deleteDashboard.yaml diff --git a/api-spec/paths/dashboards/_id/getDashboard.yaml b/bak/api-spec/paths/dashboards/_id/getDashboard.yaml similarity index 100% rename from api-spec/paths/dashboards/_id/getDashboard.yaml rename to bak/api-spec/paths/dashboards/_id/getDashboard.yaml diff --git a/api-spec/paths/dashboards/_id/index.yaml b/bak/api-spec/paths/dashboards/_id/index.yaml similarity index 100% rename from api-spec/paths/dashboards/_id/index.yaml rename to bak/api-spec/paths/dashboards/_id/index.yaml diff --git a/api-spec/paths/dashboards/_id/updateDashboard.yaml b/bak/api-spec/paths/dashboards/_id/updateDashboard.yaml similarity index 100% rename from api-spec/paths/dashboards/_id/updateDashboard.yaml rename to bak/api-spec/paths/dashboards/_id/updateDashboard.yaml diff --git a/api-spec/paths/dashboards/createDashboards.yaml b/bak/api-spec/paths/dashboards/createDashboards.yaml similarity index 100% rename from api-spec/paths/dashboards/createDashboards.yaml rename to bak/api-spec/paths/dashboards/createDashboards.yaml diff --git a/api-spec/paths/dashboards/deleteDashboards.yaml b/bak/api-spec/paths/dashboards/deleteDashboards.yaml similarity index 100% rename from api-spec/paths/dashboards/deleteDashboards.yaml rename to bak/api-spec/paths/dashboards/deleteDashboards.yaml diff --git a/api-spec/paths/dashboards/getDashboards.yaml b/bak/api-spec/paths/dashboards/getDashboards.yaml similarity index 100% rename from api-spec/paths/dashboards/getDashboards.yaml rename to bak/api-spec/paths/dashboards/getDashboards.yaml diff --git a/api-spec/paths/dashboards/index.yaml b/bak/api-spec/paths/dashboards/index.yaml similarity index 100% rename from api-spec/paths/dashboards/index.yaml rename to bak/api-spec/paths/dashboards/index.yaml diff --git a/api-spec/paths/dashboards/updateDashboards.yaml b/bak/api-spec/paths/dashboards/updateDashboards.yaml similarity index 100% rename from api-spec/paths/dashboards/updateDashboards.yaml rename to bak/api-spec/paths/dashboards/updateDashboards.yaml diff --git a/api-spec/paths/extensions/_bundle/_name/index.yaml b/bak/api-spec/paths/extensions/_bundle/_name/index.yaml similarity index 100% rename from api-spec/paths/extensions/_bundle/_name/index.yaml rename to bak/api-spec/paths/extensions/_bundle/_name/index.yaml diff --git a/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml b/bak/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml similarity index 100% rename from api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml rename to bak/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml diff --git a/api-spec/paths/extensions/_name/index.yaml b/bak/api-spec/paths/extensions/_name/index.yaml similarity index 100% rename from api-spec/paths/extensions/_name/index.yaml rename to bak/api-spec/paths/extensions/_name/index.yaml diff --git a/api-spec/paths/extensions/_name/updateExtensions.yaml b/bak/api-spec/paths/extensions/_name/updateExtensions.yaml similarity index 100% rename from api-spec/paths/extensions/_name/updateExtensions.yaml rename to bak/api-spec/paths/extensions/_name/updateExtensions.yaml diff --git a/api-spec/paths/extensions/index.yaml b/bak/api-spec/paths/extensions/index.yaml similarity index 100% rename from api-spec/paths/extensions/index.yaml rename to bak/api-spec/paths/extensions/index.yaml diff --git a/api-spec/paths/extensions/listExtensions.yaml b/bak/api-spec/paths/extensions/listExtensions.yaml similarity index 100% rename from api-spec/paths/extensions/listExtensions.yaml rename to bak/api-spec/paths/extensions/listExtensions.yaml diff --git a/api-spec/paths/fields/_collection/_id/deleteField.yaml b/bak/api-spec/paths/fields/_collection/_id/deleteField.yaml similarity index 100% rename from api-spec/paths/fields/_collection/_id/deleteField.yaml rename to bak/api-spec/paths/fields/_collection/_id/deleteField.yaml diff --git a/api-spec/paths/fields/_collection/_id/getCollectionField.yaml b/bak/api-spec/paths/fields/_collection/_id/getCollectionField.yaml similarity index 100% rename from api-spec/paths/fields/_collection/_id/getCollectionField.yaml rename to bak/api-spec/paths/fields/_collection/_id/getCollectionField.yaml diff --git a/api-spec/paths/fields/_collection/_id/index.yaml b/bak/api-spec/paths/fields/_collection/_id/index.yaml similarity index 100% rename from api-spec/paths/fields/_collection/_id/index.yaml rename to bak/api-spec/paths/fields/_collection/_id/index.yaml diff --git a/api-spec/paths/fields/_collection/_id/updateField.yaml b/bak/api-spec/paths/fields/_collection/_id/updateField.yaml similarity index 100% rename from api-spec/paths/fields/_collection/_id/updateField.yaml rename to bak/api-spec/paths/fields/_collection/_id/updateField.yaml diff --git a/api-spec/paths/fields/_collection/createField.yaml b/bak/api-spec/paths/fields/_collection/createField.yaml similarity index 100% rename from api-spec/paths/fields/_collection/createField.yaml rename to bak/api-spec/paths/fields/_collection/createField.yaml diff --git a/api-spec/paths/fields/_collection/getCollectionFields.yaml b/bak/api-spec/paths/fields/_collection/getCollectionFields.yaml similarity index 100% rename from api-spec/paths/fields/_collection/getCollectionFields.yaml rename to bak/api-spec/paths/fields/_collection/getCollectionFields.yaml diff --git a/api-spec/paths/fields/_collection/index.yaml b/bak/api-spec/paths/fields/_collection/index.yaml similarity index 100% rename from api-spec/paths/fields/_collection/index.yaml rename to bak/api-spec/paths/fields/_collection/index.yaml diff --git a/api-spec/paths/fields/getFields.yaml b/bak/api-spec/paths/fields/getFields.yaml similarity index 100% rename from api-spec/paths/fields/getFields.yaml rename to bak/api-spec/paths/fields/getFields.yaml diff --git a/api-spec/paths/fields/index.yaml b/bak/api-spec/paths/fields/index.yaml similarity index 100% rename from api-spec/paths/fields/index.yaml rename to bak/api-spec/paths/fields/index.yaml diff --git a/api-spec/paths/files/_id/deleteFile.yaml b/bak/api-spec/paths/files/_id/deleteFile.yaml similarity index 100% rename from api-spec/paths/files/_id/deleteFile.yaml rename to bak/api-spec/paths/files/_id/deleteFile.yaml diff --git a/api-spec/paths/files/_id/getFile.yaml b/bak/api-spec/paths/files/_id/getFile.yaml similarity index 100% rename from api-spec/paths/files/_id/getFile.yaml rename to bak/api-spec/paths/files/_id/getFile.yaml diff --git a/api-spec/paths/files/_id/index.yaml b/bak/api-spec/paths/files/_id/index.yaml similarity index 100% rename from api-spec/paths/files/_id/index.yaml rename to bak/api-spec/paths/files/_id/index.yaml diff --git a/api-spec/paths/files/_id/updateFile.yaml b/bak/api-spec/paths/files/_id/updateFile.yaml similarity index 100% rename from api-spec/paths/files/_id/updateFile.yaml rename to bak/api-spec/paths/files/_id/updateFile.yaml diff --git a/api-spec/paths/files/deleteFiles.yaml b/bak/api-spec/paths/files/deleteFiles.yaml similarity index 100% rename from api-spec/paths/files/deleteFiles.yaml rename to bak/api-spec/paths/files/deleteFiles.yaml diff --git a/api-spec/paths/files/getFiles.yaml b/bak/api-spec/paths/files/getFiles.yaml similarity index 100% rename from api-spec/paths/files/getFiles.yaml rename to bak/api-spec/paths/files/getFiles.yaml diff --git a/api-spec/paths/files/import/importFile.yaml b/bak/api-spec/paths/files/import/importFile.yaml similarity index 100% rename from api-spec/paths/files/import/importFile.yaml rename to bak/api-spec/paths/files/import/importFile.yaml diff --git a/api-spec/paths/files/import/index.yaml b/bak/api-spec/paths/files/import/index.yaml similarity index 100% rename from api-spec/paths/files/import/index.yaml rename to bak/api-spec/paths/files/import/index.yaml diff --git a/api-spec/paths/files/index.yaml b/bak/api-spec/paths/files/index.yaml similarity index 100% rename from api-spec/paths/files/index.yaml rename to bak/api-spec/paths/files/index.yaml diff --git a/api-spec/paths/files/updateFiles.yaml b/bak/api-spec/paths/files/updateFiles.yaml similarity index 100% rename from api-spec/paths/files/updateFiles.yaml rename to bak/api-spec/paths/files/updateFiles.yaml diff --git a/api-spec/paths/files/uploadFile.yaml b/bak/api-spec/paths/files/uploadFile.yaml similarity index 100% rename from api-spec/paths/files/uploadFile.yaml rename to bak/api-spec/paths/files/uploadFile.yaml diff --git a/api-spec/paths/flows/_id/deleteFlow.yaml b/bak/api-spec/paths/flows/_id/deleteFlow.yaml similarity index 100% rename from api-spec/paths/flows/_id/deleteFlow.yaml rename to bak/api-spec/paths/flows/_id/deleteFlow.yaml diff --git a/api-spec/paths/flows/_id/getFlow.yaml b/bak/api-spec/paths/flows/_id/getFlow.yaml similarity index 100% rename from api-spec/paths/flows/_id/getFlow.yaml rename to bak/api-spec/paths/flows/_id/getFlow.yaml diff --git a/api-spec/paths/flows/_id/index.yaml b/bak/api-spec/paths/flows/_id/index.yaml similarity index 100% rename from api-spec/paths/flows/_id/index.yaml rename to bak/api-spec/paths/flows/_id/index.yaml diff --git a/api-spec/paths/flows/_id/updateFlow.yaml b/bak/api-spec/paths/flows/_id/updateFlow.yaml similarity index 100% rename from api-spec/paths/flows/_id/updateFlow.yaml rename to bak/api-spec/paths/flows/_id/updateFlow.yaml diff --git a/api-spec/paths/flows/createFlows.yaml b/bak/api-spec/paths/flows/createFlows.yaml similarity index 100% rename from api-spec/paths/flows/createFlows.yaml rename to bak/api-spec/paths/flows/createFlows.yaml diff --git a/api-spec/paths/flows/deleteFlows.yaml b/bak/api-spec/paths/flows/deleteFlows.yaml similarity index 100% rename from api-spec/paths/flows/deleteFlows.yaml rename to bak/api-spec/paths/flows/deleteFlows.yaml diff --git a/api-spec/paths/flows/getFlows.yaml b/bak/api-spec/paths/flows/getFlows.yaml similarity index 100% rename from api-spec/paths/flows/getFlows.yaml rename to bak/api-spec/paths/flows/getFlows.yaml diff --git a/api-spec/paths/flows/index.yaml b/bak/api-spec/paths/flows/index.yaml similarity index 100% rename from api-spec/paths/flows/index.yaml rename to bak/api-spec/paths/flows/index.yaml diff --git a/api-spec/paths/flows/trigger/_id/index.yaml b/bak/api-spec/paths/flows/trigger/_id/index.yaml similarity index 100% rename from api-spec/paths/flows/trigger/_id/index.yaml rename to bak/api-spec/paths/flows/trigger/_id/index.yaml diff --git a/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml b/bak/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml similarity index 100% rename from api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml rename to bak/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml diff --git a/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml b/bak/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml similarity index 100% rename from api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml rename to bak/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml diff --git a/api-spec/paths/flows/updateFlows.yaml b/bak/api-spec/paths/flows/updateFlows.yaml similarity index 100% rename from api-spec/paths/flows/updateFlows.yaml rename to bak/api-spec/paths/flows/updateFlows.yaml diff --git a/api-spec/paths/folders/_id/deleteFolder.yaml b/bak/api-spec/paths/folders/_id/deleteFolder.yaml similarity index 100% rename from api-spec/paths/folders/_id/deleteFolder.yaml rename to bak/api-spec/paths/folders/_id/deleteFolder.yaml diff --git a/api-spec/paths/folders/_id/getFolder.yaml b/bak/api-spec/paths/folders/_id/getFolder.yaml similarity index 100% rename from api-spec/paths/folders/_id/getFolder.yaml rename to bak/api-spec/paths/folders/_id/getFolder.yaml diff --git a/api-spec/paths/folders/_id/index.yaml b/bak/api-spec/paths/folders/_id/index.yaml similarity index 100% rename from api-spec/paths/folders/_id/index.yaml rename to bak/api-spec/paths/folders/_id/index.yaml diff --git a/api-spec/paths/folders/_id/updateFolder.yaml b/bak/api-spec/paths/folders/_id/updateFolder.yaml similarity index 100% rename from api-spec/paths/folders/_id/updateFolder.yaml rename to bak/api-spec/paths/folders/_id/updateFolder.yaml diff --git a/api-spec/paths/folders/createFolders.yaml b/bak/api-spec/paths/folders/createFolders.yaml similarity index 100% rename from api-spec/paths/folders/createFolders.yaml rename to bak/api-spec/paths/folders/createFolders.yaml diff --git a/api-spec/paths/folders/deleteFolders.yaml b/bak/api-spec/paths/folders/deleteFolders.yaml similarity index 100% rename from api-spec/paths/folders/deleteFolders.yaml rename to bak/api-spec/paths/folders/deleteFolders.yaml diff --git a/api-spec/paths/folders/getFolders.yaml b/bak/api-spec/paths/folders/getFolders.yaml similarity index 100% rename from api-spec/paths/folders/getFolders.yaml rename to bak/api-spec/paths/folders/getFolders.yaml diff --git a/api-spec/paths/folders/index.yaml b/bak/api-spec/paths/folders/index.yaml similarity index 100% rename from api-spec/paths/folders/index.yaml rename to bak/api-spec/paths/folders/index.yaml diff --git a/api-spec/paths/folders/updateFolders.yaml b/bak/api-spec/paths/folders/updateFolders.yaml similarity index 100% rename from api-spec/paths/folders/updateFolders.yaml rename to bak/api-spec/paths/folders/updateFolders.yaml diff --git a/api-spec/paths/items/_collection/_id/deleteItem.yaml b/bak/api-spec/paths/items/_collection/_id/deleteItem.yaml similarity index 100% rename from api-spec/paths/items/_collection/_id/deleteItem.yaml rename to bak/api-spec/paths/items/_collection/_id/deleteItem.yaml diff --git a/api-spec/paths/items/_collection/_id/getCollectionItem.yaml b/bak/api-spec/paths/items/_collection/_id/getCollectionItem.yaml similarity index 100% rename from api-spec/paths/items/_collection/_id/getCollectionItem.yaml rename to bak/api-spec/paths/items/_collection/_id/getCollectionItem.yaml diff --git a/api-spec/paths/items/_collection/_id/index.yaml b/bak/api-spec/paths/items/_collection/_id/index.yaml similarity index 100% rename from api-spec/paths/items/_collection/_id/index.yaml rename to bak/api-spec/paths/items/_collection/_id/index.yaml diff --git a/api-spec/paths/items/_collection/_id/updateItem.yaml b/bak/api-spec/paths/items/_collection/_id/updateItem.yaml similarity index 100% rename from api-spec/paths/items/_collection/_id/updateItem.yaml rename to bak/api-spec/paths/items/_collection/_id/updateItem.yaml diff --git a/api-spec/paths/items/_collection/createItems.yaml b/bak/api-spec/paths/items/_collection/createItems.yaml similarity index 100% rename from api-spec/paths/items/_collection/createItems.yaml rename to bak/api-spec/paths/items/_collection/createItems.yaml diff --git a/api-spec/paths/items/_collection/deleteItems.yaml b/bak/api-spec/paths/items/_collection/deleteItems.yaml similarity index 100% rename from api-spec/paths/items/_collection/deleteItems.yaml rename to bak/api-spec/paths/items/_collection/deleteItems.yaml diff --git a/api-spec/paths/items/_collection/getCollectionItems.yaml b/bak/api-spec/paths/items/_collection/getCollectionItems.yaml similarity index 100% rename from api-spec/paths/items/_collection/getCollectionItems.yaml rename to bak/api-spec/paths/items/_collection/getCollectionItems.yaml diff --git a/api-spec/paths/items/_collection/index.yaml b/bak/api-spec/paths/items/_collection/index.yaml similarity index 100% rename from api-spec/paths/items/_collection/index.yaml rename to bak/api-spec/paths/items/_collection/index.yaml diff --git a/api-spec/paths/items/_collection/singleton/getSingleton.yaml b/bak/api-spec/paths/items/_collection/singleton/getSingleton.yaml similarity index 100% rename from api-spec/paths/items/_collection/singleton/getSingleton.yaml rename to bak/api-spec/paths/items/_collection/singleton/getSingleton.yaml diff --git a/api-spec/paths/items/_collection/singleton/index.yaml b/bak/api-spec/paths/items/_collection/singleton/index.yaml similarity index 100% rename from api-spec/paths/items/_collection/singleton/index.yaml rename to bak/api-spec/paths/items/_collection/singleton/index.yaml diff --git a/api-spec/paths/items/_collection/singleton/updateSingleton.yaml b/bak/api-spec/paths/items/_collection/singleton/updateSingleton.yaml similarity index 100% rename from api-spec/paths/items/_collection/singleton/updateSingleton.yaml rename to bak/api-spec/paths/items/_collection/singleton/updateSingleton.yaml diff --git a/api-spec/paths/items/_collection/updateItems.yaml b/bak/api-spec/paths/items/_collection/updateItems.yaml similarity index 100% rename from api-spec/paths/items/_collection/updateItems.yaml rename to bak/api-spec/paths/items/_collection/updateItems.yaml diff --git a/api-spec/paths/notifications/_id/deleteNotification.yaml b/bak/api-spec/paths/notifications/_id/deleteNotification.yaml similarity index 100% rename from api-spec/paths/notifications/_id/deleteNotification.yaml rename to bak/api-spec/paths/notifications/_id/deleteNotification.yaml diff --git a/api-spec/paths/notifications/_id/getNotification.yaml b/bak/api-spec/paths/notifications/_id/getNotification.yaml similarity index 100% rename from api-spec/paths/notifications/_id/getNotification.yaml rename to bak/api-spec/paths/notifications/_id/getNotification.yaml diff --git a/api-spec/paths/notifications/_id/index.yaml b/bak/api-spec/paths/notifications/_id/index.yaml similarity index 100% rename from api-spec/paths/notifications/_id/index.yaml rename to bak/api-spec/paths/notifications/_id/index.yaml diff --git a/api-spec/paths/notifications/_id/updateNotification.yaml b/bak/api-spec/paths/notifications/_id/updateNotification.yaml similarity index 100% rename from api-spec/paths/notifications/_id/updateNotification.yaml rename to bak/api-spec/paths/notifications/_id/updateNotification.yaml diff --git a/api-spec/paths/notifications/createNotifications.yaml b/bak/api-spec/paths/notifications/createNotifications.yaml similarity index 100% rename from api-spec/paths/notifications/createNotifications.yaml rename to bak/api-spec/paths/notifications/createNotifications.yaml diff --git a/api-spec/paths/notifications/deleteNotifications.yaml b/bak/api-spec/paths/notifications/deleteNotifications.yaml similarity index 100% rename from api-spec/paths/notifications/deleteNotifications.yaml rename to bak/api-spec/paths/notifications/deleteNotifications.yaml diff --git a/api-spec/paths/notifications/getNotifications.yaml b/bak/api-spec/paths/notifications/getNotifications.yaml similarity index 100% rename from api-spec/paths/notifications/getNotifications.yaml rename to bak/api-spec/paths/notifications/getNotifications.yaml diff --git a/api-spec/paths/notifications/index.yaml b/bak/api-spec/paths/notifications/index.yaml similarity index 100% rename from api-spec/paths/notifications/index.yaml rename to bak/api-spec/paths/notifications/index.yaml diff --git a/api-spec/paths/notifications/updateNotifications.yaml b/bak/api-spec/paths/notifications/updateNotifications.yaml similarity index 100% rename from api-spec/paths/notifications/updateNotifications.yaml rename to bak/api-spec/paths/notifications/updateNotifications.yaml diff --git a/api-spec/paths/operations/_id/deleteOperation.yaml b/bak/api-spec/paths/operations/_id/deleteOperation.yaml similarity index 100% rename from api-spec/paths/operations/_id/deleteOperation.yaml rename to bak/api-spec/paths/operations/_id/deleteOperation.yaml diff --git a/api-spec/paths/operations/_id/getOperation.yaml b/bak/api-spec/paths/operations/_id/getOperation.yaml similarity index 100% rename from api-spec/paths/operations/_id/getOperation.yaml rename to bak/api-spec/paths/operations/_id/getOperation.yaml diff --git a/api-spec/paths/operations/_id/index.yaml b/bak/api-spec/paths/operations/_id/index.yaml similarity index 100% rename from api-spec/paths/operations/_id/index.yaml rename to bak/api-spec/paths/operations/_id/index.yaml diff --git a/api-spec/paths/operations/_id/triggerOperation.yaml b/bak/api-spec/paths/operations/_id/triggerOperation.yaml similarity index 100% rename from api-spec/paths/operations/_id/triggerOperation.yaml rename to bak/api-spec/paths/operations/_id/triggerOperation.yaml diff --git a/api-spec/paths/operations/_id/updateOperation.yaml b/bak/api-spec/paths/operations/_id/updateOperation.yaml similarity index 100% rename from api-spec/paths/operations/_id/updateOperation.yaml rename to bak/api-spec/paths/operations/_id/updateOperation.yaml diff --git a/api-spec/paths/operations/createOperations.yaml b/bak/api-spec/paths/operations/createOperations.yaml similarity index 100% rename from api-spec/paths/operations/createOperations.yaml rename to bak/api-spec/paths/operations/createOperations.yaml diff --git a/api-spec/paths/operations/deleteOperations.yaml b/bak/api-spec/paths/operations/deleteOperations.yaml similarity index 100% rename from api-spec/paths/operations/deleteOperations.yaml rename to bak/api-spec/paths/operations/deleteOperations.yaml diff --git a/api-spec/paths/operations/getOperations.yaml b/bak/api-spec/paths/operations/getOperations.yaml similarity index 100% rename from api-spec/paths/operations/getOperations.yaml rename to bak/api-spec/paths/operations/getOperations.yaml diff --git a/api-spec/paths/operations/index.yaml b/bak/api-spec/paths/operations/index.yaml similarity index 100% rename from api-spec/paths/operations/index.yaml rename to bak/api-spec/paths/operations/index.yaml diff --git a/api-spec/paths/operations/updateOperations.yaml b/bak/api-spec/paths/operations/updateOperations.yaml similarity index 100% rename from api-spec/paths/operations/updateOperations.yaml rename to bak/api-spec/paths/operations/updateOperations.yaml diff --git a/api-spec/paths/panels/_id/deletePanel.yaml b/bak/api-spec/paths/panels/_id/deletePanel.yaml similarity index 100% rename from api-spec/paths/panels/_id/deletePanel.yaml rename to bak/api-spec/paths/panels/_id/deletePanel.yaml diff --git a/api-spec/paths/panels/_id/getPanel.yaml b/bak/api-spec/paths/panels/_id/getPanel.yaml similarity index 100% rename from api-spec/paths/panels/_id/getPanel.yaml rename to bak/api-spec/paths/panels/_id/getPanel.yaml diff --git a/api-spec/paths/panels/_id/index.yaml b/bak/api-spec/paths/panels/_id/index.yaml similarity index 100% rename from api-spec/paths/panels/_id/index.yaml rename to bak/api-spec/paths/panels/_id/index.yaml diff --git a/api-spec/paths/panels/_id/updatePanel.yaml b/bak/api-spec/paths/panels/_id/updatePanel.yaml similarity index 100% rename from api-spec/paths/panels/_id/updatePanel.yaml rename to bak/api-spec/paths/panels/_id/updatePanel.yaml diff --git a/api-spec/paths/panels/createPanels.yaml b/bak/api-spec/paths/panels/createPanels.yaml similarity index 100% rename from api-spec/paths/panels/createPanels.yaml rename to bak/api-spec/paths/panels/createPanels.yaml diff --git a/api-spec/paths/panels/deletePanels.yaml b/bak/api-spec/paths/panels/deletePanels.yaml similarity index 100% rename from api-spec/paths/panels/deletePanels.yaml rename to bak/api-spec/paths/panels/deletePanels.yaml diff --git a/api-spec/paths/panels/getPanels.yaml b/bak/api-spec/paths/panels/getPanels.yaml similarity index 100% rename from api-spec/paths/panels/getPanels.yaml rename to bak/api-spec/paths/panels/getPanels.yaml diff --git a/api-spec/paths/panels/index.yaml b/bak/api-spec/paths/panels/index.yaml similarity index 100% rename from api-spec/paths/panels/index.yaml rename to bak/api-spec/paths/panels/index.yaml diff --git a/api-spec/paths/panels/updatePanels.yaml b/bak/api-spec/paths/panels/updatePanels.yaml similarity index 100% rename from api-spec/paths/panels/updatePanels.yaml rename to bak/api-spec/paths/panels/updatePanels.yaml diff --git a/api-spec/paths/permissions/_id/deletePermission.yaml b/bak/api-spec/paths/permissions/_id/deletePermission.yaml similarity index 100% rename from api-spec/paths/permissions/_id/deletePermission.yaml rename to bak/api-spec/paths/permissions/_id/deletePermission.yaml diff --git a/api-spec/paths/permissions/_id/getPermission.yaml b/bak/api-spec/paths/permissions/_id/getPermission.yaml similarity index 100% rename from api-spec/paths/permissions/_id/getPermission.yaml rename to bak/api-spec/paths/permissions/_id/getPermission.yaml diff --git a/api-spec/paths/permissions/_id/index.yaml b/bak/api-spec/paths/permissions/_id/index.yaml similarity index 100% rename from api-spec/paths/permissions/_id/index.yaml rename to bak/api-spec/paths/permissions/_id/index.yaml diff --git a/api-spec/paths/permissions/_id/updatePermission.yaml b/bak/api-spec/paths/permissions/_id/updatePermission.yaml similarity index 100% rename from api-spec/paths/permissions/_id/updatePermission.yaml rename to bak/api-spec/paths/permissions/_id/updatePermission.yaml diff --git a/api-spec/paths/permissions/createPermissions.yaml b/bak/api-spec/paths/permissions/createPermissions.yaml similarity index 100% rename from api-spec/paths/permissions/createPermissions.yaml rename to bak/api-spec/paths/permissions/createPermissions.yaml diff --git a/api-spec/paths/permissions/deletePermissions.yaml b/bak/api-spec/paths/permissions/deletePermissions.yaml similarity index 100% rename from api-spec/paths/permissions/deletePermissions.yaml rename to bak/api-spec/paths/permissions/deletePermissions.yaml diff --git a/api-spec/paths/permissions/getPermissions.yaml b/bak/api-spec/paths/permissions/getPermissions.yaml similarity index 100% rename from api-spec/paths/permissions/getPermissions.yaml rename to bak/api-spec/paths/permissions/getPermissions.yaml diff --git a/api-spec/paths/permissions/index.yaml b/bak/api-spec/paths/permissions/index.yaml similarity index 100% rename from api-spec/paths/permissions/index.yaml rename to bak/api-spec/paths/permissions/index.yaml diff --git a/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml b/bak/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml similarity index 100% rename from api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml rename to bak/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml diff --git a/api-spec/paths/permissions/me/_collection/_id/index.yaml b/bak/api-spec/paths/permissions/me/_collection/_id/index.yaml similarity index 100% rename from api-spec/paths/permissions/me/_collection/_id/index.yaml rename to bak/api-spec/paths/permissions/me/_collection/_id/index.yaml diff --git a/api-spec/paths/permissions/me/getUserPermissions.yaml b/bak/api-spec/paths/permissions/me/getUserPermissions.yaml similarity index 100% rename from api-spec/paths/permissions/me/getUserPermissions.yaml rename to bak/api-spec/paths/permissions/me/getUserPermissions.yaml diff --git a/api-spec/paths/permissions/me/index.yaml b/bak/api-spec/paths/permissions/me/index.yaml similarity index 100% rename from api-spec/paths/permissions/me/index.yaml rename to bak/api-spec/paths/permissions/me/index.yaml diff --git a/api-spec/paths/permissions/updatePermissions.yaml b/bak/api-spec/paths/permissions/updatePermissions.yaml similarity index 100% rename from api-spec/paths/permissions/updatePermissions.yaml rename to bak/api-spec/paths/permissions/updatePermissions.yaml diff --git a/api-spec/paths/policies/_id/deletePolicy.yaml b/bak/api-spec/paths/policies/_id/deletePolicy.yaml similarity index 100% rename from api-spec/paths/policies/_id/deletePolicy.yaml rename to bak/api-spec/paths/policies/_id/deletePolicy.yaml diff --git a/api-spec/paths/policies/_id/getPolicy.yaml b/bak/api-spec/paths/policies/_id/getPolicy.yaml similarity index 100% rename from api-spec/paths/policies/_id/getPolicy.yaml rename to bak/api-spec/paths/policies/_id/getPolicy.yaml diff --git a/api-spec/paths/policies/_id/index.yaml b/bak/api-spec/paths/policies/_id/index.yaml similarity index 100% rename from api-spec/paths/policies/_id/index.yaml rename to bak/api-spec/paths/policies/_id/index.yaml diff --git a/api-spec/paths/policies/_id/updatePolicy.yaml b/bak/api-spec/paths/policies/_id/updatePolicy.yaml similarity index 100% rename from api-spec/paths/policies/_id/updatePolicy.yaml rename to bak/api-spec/paths/policies/_id/updatePolicy.yaml diff --git a/api-spec/paths/policies/createPolicies.yaml b/bak/api-spec/paths/policies/createPolicies.yaml similarity index 100% rename from api-spec/paths/policies/createPolicies.yaml rename to bak/api-spec/paths/policies/createPolicies.yaml diff --git a/api-spec/paths/policies/deletePolicies.yaml b/bak/api-spec/paths/policies/deletePolicies.yaml similarity index 100% rename from api-spec/paths/policies/deletePolicies.yaml rename to bak/api-spec/paths/policies/deletePolicies.yaml diff --git a/api-spec/paths/policies/getPolicies.yaml b/bak/api-spec/paths/policies/getPolicies.yaml similarity index 100% rename from api-spec/paths/policies/getPolicies.yaml rename to bak/api-spec/paths/policies/getPolicies.yaml diff --git a/api-spec/paths/policies/index.yaml b/bak/api-spec/paths/policies/index.yaml similarity index 100% rename from api-spec/paths/policies/index.yaml rename to bak/api-spec/paths/policies/index.yaml diff --git a/api-spec/paths/policies/updatePolicies.yaml b/bak/api-spec/paths/policies/updatePolicies.yaml similarity index 100% rename from api-spec/paths/policies/updatePolicies.yaml rename to bak/api-spec/paths/policies/updatePolicies.yaml diff --git a/api-spec/paths/presets/_id/deletePreset.yaml b/bak/api-spec/paths/presets/_id/deletePreset.yaml similarity index 100% rename from api-spec/paths/presets/_id/deletePreset.yaml rename to bak/api-spec/paths/presets/_id/deletePreset.yaml diff --git a/api-spec/paths/presets/_id/getPreset.yaml b/bak/api-spec/paths/presets/_id/getPreset.yaml similarity index 100% rename from api-spec/paths/presets/_id/getPreset.yaml rename to bak/api-spec/paths/presets/_id/getPreset.yaml diff --git a/api-spec/paths/presets/_id/index.yaml b/bak/api-spec/paths/presets/_id/index.yaml similarity index 100% rename from api-spec/paths/presets/_id/index.yaml rename to bak/api-spec/paths/presets/_id/index.yaml diff --git a/api-spec/paths/presets/_id/updatePreset.yaml b/bak/api-spec/paths/presets/_id/updatePreset.yaml similarity index 100% rename from api-spec/paths/presets/_id/updatePreset.yaml rename to bak/api-spec/paths/presets/_id/updatePreset.yaml diff --git a/api-spec/paths/presets/createPresets.yaml b/bak/api-spec/paths/presets/createPresets.yaml similarity index 100% rename from api-spec/paths/presets/createPresets.yaml rename to bak/api-spec/paths/presets/createPresets.yaml diff --git a/api-spec/paths/presets/deletePresets.yaml b/bak/api-spec/paths/presets/deletePresets.yaml similarity index 100% rename from api-spec/paths/presets/deletePresets.yaml rename to bak/api-spec/paths/presets/deletePresets.yaml diff --git a/api-spec/paths/presets/getPresets.yaml b/bak/api-spec/paths/presets/getPresets.yaml similarity index 100% rename from api-spec/paths/presets/getPresets.yaml rename to bak/api-spec/paths/presets/getPresets.yaml diff --git a/api-spec/paths/presets/index.yaml b/bak/api-spec/paths/presets/index.yaml similarity index 100% rename from api-spec/paths/presets/index.yaml rename to bak/api-spec/paths/presets/index.yaml diff --git a/api-spec/paths/presets/updatePresets.yaml b/bak/api-spec/paths/presets/updatePresets.yaml similarity index 100% rename from api-spec/paths/presets/updatePresets.yaml rename to bak/api-spec/paths/presets/updatePresets.yaml diff --git a/api-spec/paths/relations/_collection/getRelationByCollection.yaml b/bak/api-spec/paths/relations/_collection/getRelationByCollection.yaml similarity index 100% rename from api-spec/paths/relations/_collection/getRelationByCollection.yaml rename to bak/api-spec/paths/relations/_collection/getRelationByCollection.yaml diff --git a/api-spec/paths/relations/_collection/index.yaml b/bak/api-spec/paths/relations/_collection/index.yaml similarity index 100% rename from api-spec/paths/relations/_collection/index.yaml rename to bak/api-spec/paths/relations/_collection/index.yaml diff --git a/api-spec/paths/relations/_id/deleteRelation.yaml b/bak/api-spec/paths/relations/_id/deleteRelation.yaml similarity index 100% rename from api-spec/paths/relations/_id/deleteRelation.yaml rename to bak/api-spec/paths/relations/_id/deleteRelation.yaml diff --git a/api-spec/paths/relations/_id/getRelation.yaml b/bak/api-spec/paths/relations/_id/getRelation.yaml similarity index 100% rename from api-spec/paths/relations/_id/getRelation.yaml rename to bak/api-spec/paths/relations/_id/getRelation.yaml diff --git a/api-spec/paths/relations/_id/index.yaml b/bak/api-spec/paths/relations/_id/index.yaml similarity index 100% rename from api-spec/paths/relations/_id/index.yaml rename to bak/api-spec/paths/relations/_id/index.yaml diff --git a/api-spec/paths/relations/_id/updateRelation.yaml b/bak/api-spec/paths/relations/_id/updateRelation.yaml similarity index 100% rename from api-spec/paths/relations/_id/updateRelation.yaml rename to bak/api-spec/paths/relations/_id/updateRelation.yaml diff --git a/api-spec/paths/relations/createRelation.yaml b/bak/api-spec/paths/relations/createRelation.yaml similarity index 100% rename from api-spec/paths/relations/createRelation.yaml rename to bak/api-spec/paths/relations/createRelation.yaml diff --git a/api-spec/paths/relations/getRelations.yaml b/bak/api-spec/paths/relations/getRelations.yaml similarity index 100% rename from api-spec/paths/relations/getRelations.yaml rename to bak/api-spec/paths/relations/getRelations.yaml diff --git a/api-spec/paths/relations/index.yaml b/bak/api-spec/paths/relations/index.yaml similarity index 100% rename from api-spec/paths/relations/index.yaml rename to bak/api-spec/paths/relations/index.yaml diff --git a/api-spec/paths/revisions/_id/getRevision.yaml b/bak/api-spec/paths/revisions/_id/getRevision.yaml similarity index 100% rename from api-spec/paths/revisions/_id/getRevision.yaml rename to bak/api-spec/paths/revisions/_id/getRevision.yaml diff --git a/api-spec/paths/revisions/_id/index.yaml b/bak/api-spec/paths/revisions/_id/index.yaml similarity index 100% rename from api-spec/paths/revisions/_id/index.yaml rename to bak/api-spec/paths/revisions/_id/index.yaml diff --git a/api-spec/paths/revisions/getRevisions.yaml b/bak/api-spec/paths/revisions/getRevisions.yaml similarity index 100% rename from api-spec/paths/revisions/getRevisions.yaml rename to bak/api-spec/paths/revisions/getRevisions.yaml diff --git a/api-spec/paths/revisions/index.yaml b/bak/api-spec/paths/revisions/index.yaml similarity index 100% rename from api-spec/paths/revisions/index.yaml rename to bak/api-spec/paths/revisions/index.yaml diff --git a/api-spec/paths/roles/_id/deleteRole.yaml b/bak/api-spec/paths/roles/_id/deleteRole.yaml similarity index 100% rename from api-spec/paths/roles/_id/deleteRole.yaml rename to bak/api-spec/paths/roles/_id/deleteRole.yaml diff --git a/api-spec/paths/roles/_id/getRole.yaml b/bak/api-spec/paths/roles/_id/getRole.yaml similarity index 100% rename from api-spec/paths/roles/_id/getRole.yaml rename to bak/api-spec/paths/roles/_id/getRole.yaml diff --git a/api-spec/paths/roles/_id/index.yaml b/bak/api-spec/paths/roles/_id/index.yaml similarity index 100% rename from api-spec/paths/roles/_id/index.yaml rename to bak/api-spec/paths/roles/_id/index.yaml diff --git a/api-spec/paths/roles/_id/updateRole.yaml b/bak/api-spec/paths/roles/_id/updateRole.yaml similarity index 100% rename from api-spec/paths/roles/_id/updateRole.yaml rename to bak/api-spec/paths/roles/_id/updateRole.yaml diff --git a/api-spec/paths/roles/createRoles.yaml b/bak/api-spec/paths/roles/createRoles.yaml similarity index 100% rename from api-spec/paths/roles/createRoles.yaml rename to bak/api-spec/paths/roles/createRoles.yaml diff --git a/api-spec/paths/roles/deleteRoles.yaml b/bak/api-spec/paths/roles/deleteRoles.yaml similarity index 100% rename from api-spec/paths/roles/deleteRoles.yaml rename to bak/api-spec/paths/roles/deleteRoles.yaml diff --git a/api-spec/paths/roles/getRoles.yaml b/bak/api-spec/paths/roles/getRoles.yaml similarity index 100% rename from api-spec/paths/roles/getRoles.yaml rename to bak/api-spec/paths/roles/getRoles.yaml diff --git a/api-spec/paths/roles/index.yaml b/bak/api-spec/paths/roles/index.yaml similarity index 100% rename from api-spec/paths/roles/index.yaml rename to bak/api-spec/paths/roles/index.yaml diff --git a/api-spec/paths/roles/updateRoles.yaml b/bak/api-spec/paths/roles/updateRoles.yaml similarity index 100% rename from api-spec/paths/roles/updateRoles.yaml rename to bak/api-spec/paths/roles/updateRoles.yaml diff --git a/api-spec/paths/schema/apply/index.yaml b/bak/api-spec/paths/schema/apply/index.yaml similarity index 100% rename from api-spec/paths/schema/apply/index.yaml rename to bak/api-spec/paths/schema/apply/index.yaml diff --git a/api-spec/paths/schema/apply/schemaApply.yaml b/bak/api-spec/paths/schema/apply/schemaApply.yaml similarity index 100% rename from api-spec/paths/schema/apply/schemaApply.yaml rename to bak/api-spec/paths/schema/apply/schemaApply.yaml diff --git a/api-spec/paths/schema/diff/index.yaml b/bak/api-spec/paths/schema/diff/index.yaml similarity index 100% rename from api-spec/paths/schema/diff/index.yaml rename to bak/api-spec/paths/schema/diff/index.yaml diff --git a/api-spec/paths/schema/diff/schemaDiff.yaml b/bak/api-spec/paths/schema/diff/schemaDiff.yaml similarity index 100% rename from api-spec/paths/schema/diff/schemaDiff.yaml rename to bak/api-spec/paths/schema/diff/schemaDiff.yaml diff --git a/api-spec/paths/schema/snapshot/index.yaml b/bak/api-spec/paths/schema/snapshot/index.yaml similarity index 100% rename from api-spec/paths/schema/snapshot/index.yaml rename to bak/api-spec/paths/schema/snapshot/index.yaml diff --git a/api-spec/paths/schema/snapshot/schemaSnapshot.yaml b/bak/api-spec/paths/schema/snapshot/schemaSnapshot.yaml similarity index 100% rename from api-spec/paths/schema/snapshot/schemaSnapshot.yaml rename to bak/api-spec/paths/schema/snapshot/schemaSnapshot.yaml diff --git a/api-spec/paths/server/health/index.yaml b/bak/api-spec/paths/server/health/index.yaml similarity index 100% rename from api-spec/paths/server/health/index.yaml rename to bak/api-spec/paths/server/health/index.yaml diff --git a/api-spec/paths/server/health/serverHealth.yaml b/bak/api-spec/paths/server/health/serverHealth.yaml similarity index 100% rename from api-spec/paths/server/health/serverHealth.yaml rename to bak/api-spec/paths/server/health/serverHealth.yaml diff --git a/api-spec/paths/server/info/index.yaml b/bak/api-spec/paths/server/info/index.yaml similarity index 100% rename from api-spec/paths/server/info/index.yaml rename to bak/api-spec/paths/server/info/index.yaml diff --git a/api-spec/paths/server/info/serverInfo.yaml b/bak/api-spec/paths/server/info/serverInfo.yaml similarity index 100% rename from api-spec/paths/server/info/serverInfo.yaml rename to bak/api-spec/paths/server/info/serverInfo.yaml diff --git a/api-spec/paths/server/ping/index.yaml b/bak/api-spec/paths/server/ping/index.yaml similarity index 100% rename from api-spec/paths/server/ping/index.yaml rename to bak/api-spec/paths/server/ping/index.yaml diff --git a/api-spec/paths/server/ping/ping.yaml b/bak/api-spec/paths/server/ping/ping.yaml similarity index 100% rename from api-spec/paths/server/ping/ping.yaml rename to bak/api-spec/paths/server/ping/ping.yaml diff --git a/api-spec/paths/server/specs/graphql/index.yaml b/bak/api-spec/paths/server/specs/graphql/index.yaml similarity index 100% rename from api-spec/paths/server/specs/graphql/index.yaml rename to bak/api-spec/paths/server/specs/graphql/index.yaml diff --git a/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml b/bak/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml similarity index 100% rename from api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml rename to bak/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml diff --git a/api-spec/paths/server/specs/oas/index.yaml b/bak/api-spec/paths/server/specs/oas/index.yaml similarity index 100% rename from api-spec/paths/server/specs/oas/index.yaml rename to bak/api-spec/paths/server/specs/oas/index.yaml diff --git a/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml b/bak/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml similarity index 100% rename from api-spec/paths/server/specs/oas/readOpenApiSpec.yaml rename to bak/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml diff --git a/api-spec/paths/settings/getSettings.yaml b/bak/api-spec/paths/settings/getSettings.yaml similarity index 100% rename from api-spec/paths/settings/getSettings.yaml rename to bak/api-spec/paths/settings/getSettings.yaml diff --git a/api-spec/paths/settings/index.yaml b/bak/api-spec/paths/settings/index.yaml similarity index 100% rename from api-spec/paths/settings/index.yaml rename to bak/api-spec/paths/settings/index.yaml diff --git a/api-spec/paths/settings/updateSettings.yaml b/bak/api-spec/paths/settings/updateSettings.yaml similarity index 100% rename from api-spec/paths/settings/updateSettings.yaml rename to bak/api-spec/paths/settings/updateSettings.yaml diff --git a/api-spec/paths/shares/_id/deleteShare.yaml b/bak/api-spec/paths/shares/_id/deleteShare.yaml similarity index 100% rename from api-spec/paths/shares/_id/deleteShare.yaml rename to bak/api-spec/paths/shares/_id/deleteShare.yaml diff --git a/api-spec/paths/shares/_id/getShare.yaml b/bak/api-spec/paths/shares/_id/getShare.yaml similarity index 100% rename from api-spec/paths/shares/_id/getShare.yaml rename to bak/api-spec/paths/shares/_id/getShare.yaml diff --git a/api-spec/paths/shares/_id/index.yaml b/bak/api-spec/paths/shares/_id/index.yaml similarity index 100% rename from api-spec/paths/shares/_id/index.yaml rename to bak/api-spec/paths/shares/_id/index.yaml diff --git a/api-spec/paths/shares/_id/updateShare.yaml b/bak/api-spec/paths/shares/_id/updateShare.yaml similarity index 100% rename from api-spec/paths/shares/_id/updateShare.yaml rename to bak/api-spec/paths/shares/_id/updateShare.yaml diff --git a/api-spec/paths/shares/_share/getPublicShareInfo.yaml b/bak/api-spec/paths/shares/_share/getPublicShareInfo.yaml similarity index 100% rename from api-spec/paths/shares/_share/getPublicShareInfo.yaml rename to bak/api-spec/paths/shares/_share/getPublicShareInfo.yaml diff --git a/api-spec/paths/shares/_share/index.yaml b/bak/api-spec/paths/shares/_share/index.yaml similarity index 100% rename from api-spec/paths/shares/_share/index.yaml rename to bak/api-spec/paths/shares/_share/index.yaml diff --git a/api-spec/paths/shares/auth/authenticateShare.yaml b/bak/api-spec/paths/shares/auth/authenticateShare.yaml similarity index 100% rename from api-spec/paths/shares/auth/authenticateShare.yaml rename to bak/api-spec/paths/shares/auth/authenticateShare.yaml diff --git a/api-spec/paths/shares/auth/index.yaml b/bak/api-spec/paths/shares/auth/index.yaml similarity index 100% rename from api-spec/paths/shares/auth/index.yaml rename to bak/api-spec/paths/shares/auth/index.yaml diff --git a/api-spec/paths/shares/createShares.yaml b/bak/api-spec/paths/shares/createShares.yaml similarity index 100% rename from api-spec/paths/shares/createShares.yaml rename to bak/api-spec/paths/shares/createShares.yaml diff --git a/api-spec/paths/shares/deleteShares.yaml b/bak/api-spec/paths/shares/deleteShares.yaml similarity index 100% rename from api-spec/paths/shares/deleteShares.yaml rename to bak/api-spec/paths/shares/deleteShares.yaml diff --git a/api-spec/paths/shares/getShares.yaml b/bak/api-spec/paths/shares/getShares.yaml similarity index 100% rename from api-spec/paths/shares/getShares.yaml rename to bak/api-spec/paths/shares/getShares.yaml diff --git a/api-spec/paths/shares/index.yaml b/bak/api-spec/paths/shares/index.yaml similarity index 100% rename from api-spec/paths/shares/index.yaml rename to bak/api-spec/paths/shares/index.yaml diff --git a/api-spec/paths/shares/info/_id/getShareInfo.yaml b/bak/api-spec/paths/shares/info/_id/getShareInfo.yaml similarity index 100% rename from api-spec/paths/shares/info/_id/getShareInfo.yaml rename to bak/api-spec/paths/shares/info/_id/getShareInfo.yaml diff --git a/api-spec/paths/shares/info/_id/index.yaml b/bak/api-spec/paths/shares/info/_id/index.yaml similarity index 100% rename from api-spec/paths/shares/info/_id/index.yaml rename to bak/api-spec/paths/shares/info/_id/index.yaml diff --git a/api-spec/paths/shares/invite/index.yaml b/bak/api-spec/paths/shares/invite/index.yaml similarity index 100% rename from api-spec/paths/shares/invite/index.yaml rename to bak/api-spec/paths/shares/invite/index.yaml diff --git a/api-spec/paths/shares/invite/inviteShare.yaml b/bak/api-spec/paths/shares/invite/inviteShare.yaml similarity index 100% rename from api-spec/paths/shares/invite/inviteShare.yaml rename to bak/api-spec/paths/shares/invite/inviteShare.yaml diff --git a/api-spec/paths/shares/updateShares.yaml b/bak/api-spec/paths/shares/updateShares.yaml similarity index 100% rename from api-spec/paths/shares/updateShares.yaml rename to bak/api-spec/paths/shares/updateShares.yaml diff --git a/api-spec/paths/translations/_id/deleteTranslation.yaml b/bak/api-spec/paths/translations/_id/deleteTranslation.yaml similarity index 100% rename from api-spec/paths/translations/_id/deleteTranslation.yaml rename to bak/api-spec/paths/translations/_id/deleteTranslation.yaml diff --git a/api-spec/paths/translations/_id/getTranslation.yaml b/bak/api-spec/paths/translations/_id/getTranslation.yaml similarity index 100% rename from api-spec/paths/translations/_id/getTranslation.yaml rename to bak/api-spec/paths/translations/_id/getTranslation.yaml diff --git a/api-spec/paths/translations/_id/index.yaml b/bak/api-spec/paths/translations/_id/index.yaml similarity index 100% rename from api-spec/paths/translations/_id/index.yaml rename to bak/api-spec/paths/translations/_id/index.yaml diff --git a/api-spec/paths/translations/_id/updateTranslation.yaml b/bak/api-spec/paths/translations/_id/updateTranslation.yaml similarity index 100% rename from api-spec/paths/translations/_id/updateTranslation.yaml rename to bak/api-spec/paths/translations/_id/updateTranslation.yaml diff --git a/api-spec/paths/translations/createTranslations.yaml b/bak/api-spec/paths/translations/createTranslations.yaml similarity index 100% rename from api-spec/paths/translations/createTranslations.yaml rename to bak/api-spec/paths/translations/createTranslations.yaml diff --git a/api-spec/paths/translations/deleteTranslations.yaml b/bak/api-spec/paths/translations/deleteTranslations.yaml similarity index 100% rename from api-spec/paths/translations/deleteTranslations.yaml rename to bak/api-spec/paths/translations/deleteTranslations.yaml diff --git a/api-spec/paths/translations/getTranslations.yaml b/bak/api-spec/paths/translations/getTranslations.yaml similarity index 100% rename from api-spec/paths/translations/getTranslations.yaml rename to bak/api-spec/paths/translations/getTranslations.yaml diff --git a/api-spec/paths/translations/index.yaml b/bak/api-spec/paths/translations/index.yaml similarity index 100% rename from api-spec/paths/translations/index.yaml rename to bak/api-spec/paths/translations/index.yaml diff --git a/api-spec/paths/translations/updateTranslations.yaml b/bak/api-spec/paths/translations/updateTranslations.yaml similarity index 100% rename from api-spec/paths/translations/updateTranslations.yaml rename to bak/api-spec/paths/translations/updateTranslations.yaml diff --git a/api-spec/paths/users/_id/deleteUser.yaml b/bak/api-spec/paths/users/_id/deleteUser.yaml similarity index 100% rename from api-spec/paths/users/_id/deleteUser.yaml rename to bak/api-spec/paths/users/_id/deleteUser.yaml diff --git a/api-spec/paths/users/_id/getUser.yaml b/bak/api-spec/paths/users/_id/getUser.yaml similarity index 100% rename from api-spec/paths/users/_id/getUser.yaml rename to bak/api-spec/paths/users/_id/getUser.yaml diff --git a/api-spec/paths/users/_id/index.yaml b/bak/api-spec/paths/users/_id/index.yaml similarity index 100% rename from api-spec/paths/users/_id/index.yaml rename to bak/api-spec/paths/users/_id/index.yaml diff --git a/api-spec/paths/users/_id/updateUser.yaml b/bak/api-spec/paths/users/_id/updateUser.yaml similarity index 100% rename from api-spec/paths/users/_id/updateUser.yaml rename to bak/api-spec/paths/users/_id/updateUser.yaml diff --git a/api-spec/paths/users/createUsers.yaml b/bak/api-spec/paths/users/createUsers.yaml similarity index 100% rename from api-spec/paths/users/createUsers.yaml rename to bak/api-spec/paths/users/createUsers.yaml diff --git a/api-spec/paths/users/deleteUsers.yaml b/bak/api-spec/paths/users/deleteUsers.yaml similarity index 100% rename from api-spec/paths/users/deleteUsers.yaml rename to bak/api-spec/paths/users/deleteUsers.yaml diff --git a/api-spec/paths/users/getUsers.yaml b/bak/api-spec/paths/users/getUsers.yaml similarity index 100% rename from api-spec/paths/users/getUsers.yaml rename to bak/api-spec/paths/users/getUsers.yaml diff --git a/api-spec/paths/users/index.yaml b/bak/api-spec/paths/users/index.yaml similarity index 100% rename from api-spec/paths/users/index.yaml rename to bak/api-spec/paths/users/index.yaml diff --git a/api-spec/paths/users/invite/accept/acceptInvite.yaml b/bak/api-spec/paths/users/invite/accept/acceptInvite.yaml similarity index 100% rename from api-spec/paths/users/invite/accept/acceptInvite.yaml rename to bak/api-spec/paths/users/invite/accept/acceptInvite.yaml diff --git a/api-spec/paths/users/invite/accept/index.yaml b/bak/api-spec/paths/users/invite/accept/index.yaml similarity index 100% rename from api-spec/paths/users/invite/accept/index.yaml rename to bak/api-spec/paths/users/invite/accept/index.yaml diff --git a/api-spec/paths/users/invite/index.yaml b/bak/api-spec/paths/users/invite/index.yaml similarity index 100% rename from api-spec/paths/users/invite/index.yaml rename to bak/api-spec/paths/users/invite/index.yaml diff --git a/api-spec/paths/users/invite/invite.yaml b/bak/api-spec/paths/users/invite/invite.yaml similarity index 100% rename from api-spec/paths/users/invite/invite.yaml rename to bak/api-spec/paths/users/invite/invite.yaml diff --git a/api-spec/paths/users/me/getMe.yaml b/bak/api-spec/paths/users/me/getMe.yaml similarity index 100% rename from api-spec/paths/users/me/getMe.yaml rename to bak/api-spec/paths/users/me/getMe.yaml diff --git a/api-spec/paths/users/me/index.yaml b/bak/api-spec/paths/users/me/index.yaml similarity index 100% rename from api-spec/paths/users/me/index.yaml rename to bak/api-spec/paths/users/me/index.yaml diff --git a/api-spec/paths/users/me/tfa/disable/index.yaml b/bak/api-spec/paths/users/me/tfa/disable/index.yaml similarity index 100% rename from api-spec/paths/users/me/tfa/disable/index.yaml rename to bak/api-spec/paths/users/me/tfa/disable/index.yaml diff --git a/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml b/bak/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml similarity index 100% rename from api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml rename to bak/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml diff --git a/api-spec/paths/users/me/tfa/enable/index.yaml b/bak/api-spec/paths/users/me/tfa/enable/index.yaml similarity index 100% rename from api-spec/paths/users/me/tfa/enable/index.yaml rename to bak/api-spec/paths/users/me/tfa/enable/index.yaml diff --git a/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml b/bak/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml similarity index 100% rename from api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml rename to bak/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml diff --git a/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml b/bak/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml similarity index 100% rename from api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml rename to bak/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml diff --git a/api-spec/paths/users/me/tfa/generate/index.yaml b/bak/api-spec/paths/users/me/tfa/generate/index.yaml similarity index 100% rename from api-spec/paths/users/me/tfa/generate/index.yaml rename to bak/api-spec/paths/users/me/tfa/generate/index.yaml diff --git a/api-spec/paths/users/me/track/page/index.yaml b/bak/api-spec/paths/users/me/track/page/index.yaml similarity index 100% rename from api-spec/paths/users/me/track/page/index.yaml rename to bak/api-spec/paths/users/me/track/page/index.yaml diff --git a/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml b/bak/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml similarity index 100% rename from api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml rename to bak/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml diff --git a/api-spec/paths/users/me/updateMe.yaml b/bak/api-spec/paths/users/me/updateMe.yaml similarity index 100% rename from api-spec/paths/users/me/updateMe.yaml rename to bak/api-spec/paths/users/me/updateMe.yaml diff --git a/api-spec/paths/users/register/index.yaml b/bak/api-spec/paths/users/register/index.yaml similarity index 100% rename from api-spec/paths/users/register/index.yaml rename to bak/api-spec/paths/users/register/index.yaml diff --git a/api-spec/paths/users/register/registerUser.yaml b/bak/api-spec/paths/users/register/registerUser.yaml similarity index 100% rename from api-spec/paths/users/register/registerUser.yaml rename to bak/api-spec/paths/users/register/registerUser.yaml diff --git a/api-spec/paths/users/register/verify-email/_token/index.yaml b/bak/api-spec/paths/users/register/verify-email/_token/index.yaml similarity index 100% rename from api-spec/paths/users/register/verify-email/_token/index.yaml rename to bak/api-spec/paths/users/register/verify-email/_token/index.yaml diff --git a/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml b/bak/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml similarity index 100% rename from api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml rename to bak/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml diff --git a/api-spec/paths/users/updateUsers.yaml b/bak/api-spec/paths/users/updateUsers.yaml similarity index 100% rename from api-spec/paths/users/updateUsers.yaml rename to bak/api-spec/paths/users/updateUsers.yaml diff --git a/api-spec/paths/utils/cache/clear/clear-cache.yaml b/bak/api-spec/paths/utils/cache/clear/clear-cache.yaml similarity index 100% rename from api-spec/paths/utils/cache/clear/clear-cache.yaml rename to bak/api-spec/paths/utils/cache/clear/clear-cache.yaml diff --git a/api-spec/paths/utils/cache/clear/index.yaml b/bak/api-spec/paths/utils/cache/clear/index.yaml similarity index 100% rename from api-spec/paths/utils/cache/clear/index.yaml rename to bak/api-spec/paths/utils/cache/clear/index.yaml diff --git a/api-spec/paths/utils/export/_collection/export.yaml b/bak/api-spec/paths/utils/export/_collection/export.yaml similarity index 100% rename from api-spec/paths/utils/export/_collection/export.yaml rename to bak/api-spec/paths/utils/export/_collection/export.yaml diff --git a/api-spec/paths/utils/export/_collection/index.yaml b/bak/api-spec/paths/utils/export/_collection/index.yaml similarity index 100% rename from api-spec/paths/utils/export/_collection/index.yaml rename to bak/api-spec/paths/utils/export/_collection/index.yaml diff --git a/api-spec/paths/utils/hash/generate/hash-generate.yaml b/bak/api-spec/paths/utils/hash/generate/hash-generate.yaml similarity index 100% rename from api-spec/paths/utils/hash/generate/hash-generate.yaml rename to bak/api-spec/paths/utils/hash/generate/hash-generate.yaml diff --git a/api-spec/paths/utils/hash/generate/index.yaml b/bak/api-spec/paths/utils/hash/generate/index.yaml similarity index 100% rename from api-spec/paths/utils/hash/generate/index.yaml rename to bak/api-spec/paths/utils/hash/generate/index.yaml diff --git a/api-spec/paths/utils/hash/verify/hash-verify.yaml b/bak/api-spec/paths/utils/hash/verify/hash-verify.yaml similarity index 100% rename from api-spec/paths/utils/hash/verify/hash-verify.yaml rename to bak/api-spec/paths/utils/hash/verify/hash-verify.yaml diff --git a/api-spec/paths/utils/hash/verify/index.yaml b/bak/api-spec/paths/utils/hash/verify/index.yaml similarity index 100% rename from api-spec/paths/utils/hash/verify/index.yaml rename to bak/api-spec/paths/utils/hash/verify/index.yaml diff --git a/api-spec/paths/utils/import/_collection/import.yaml b/bak/api-spec/paths/utils/import/_collection/import.yaml similarity index 100% rename from api-spec/paths/utils/import/_collection/import.yaml rename to bak/api-spec/paths/utils/import/_collection/import.yaml diff --git a/api-spec/paths/utils/import/_collection/index.yaml b/bak/api-spec/paths/utils/import/_collection/index.yaml similarity index 100% rename from api-spec/paths/utils/import/_collection/index.yaml rename to bak/api-spec/paths/utils/import/_collection/index.yaml diff --git a/api-spec/paths/utils/random/string/index.yaml b/bak/api-spec/paths/utils/random/string/index.yaml similarity index 100% rename from api-spec/paths/utils/random/string/index.yaml rename to bak/api-spec/paths/utils/random/string/index.yaml diff --git a/api-spec/paths/utils/random/string/random.yaml b/bak/api-spec/paths/utils/random/string/random.yaml similarity index 100% rename from api-spec/paths/utils/random/string/random.yaml rename to bak/api-spec/paths/utils/random/string/random.yaml diff --git a/api-spec/paths/utils/sort/_collection/index.yaml b/bak/api-spec/paths/utils/sort/_collection/index.yaml similarity index 100% rename from api-spec/paths/utils/sort/_collection/index.yaml rename to bak/api-spec/paths/utils/sort/_collection/index.yaml diff --git a/api-spec/paths/utils/sort/_collection/sort.yaml b/bak/api-spec/paths/utils/sort/_collection/sort.yaml similarity index 100% rename from api-spec/paths/utils/sort/_collection/sort.yaml rename to bak/api-spec/paths/utils/sort/_collection/sort.yaml diff --git a/api-spec/paths/versions/_id/compare/compareContentVersion.yaml b/bak/api-spec/paths/versions/_id/compare/compareContentVersion.yaml similarity index 100% rename from api-spec/paths/versions/_id/compare/compareContentVersion.yaml rename to bak/api-spec/paths/versions/_id/compare/compareContentVersion.yaml diff --git a/api-spec/paths/versions/_id/compare/index.yaml b/bak/api-spec/paths/versions/_id/compare/index.yaml similarity index 100% rename from api-spec/paths/versions/_id/compare/index.yaml rename to bak/api-spec/paths/versions/_id/compare/index.yaml diff --git a/api-spec/paths/versions/_id/deleteContentVersion.yaml b/bak/api-spec/paths/versions/_id/deleteContentVersion.yaml similarity index 100% rename from api-spec/paths/versions/_id/deleteContentVersion.yaml rename to bak/api-spec/paths/versions/_id/deleteContentVersion.yaml diff --git a/api-spec/paths/versions/_id/getContentVersion.yaml b/bak/api-spec/paths/versions/_id/getContentVersion.yaml similarity index 100% rename from api-spec/paths/versions/_id/getContentVersion.yaml rename to bak/api-spec/paths/versions/_id/getContentVersion.yaml diff --git a/api-spec/paths/versions/_id/index.yaml b/bak/api-spec/paths/versions/_id/index.yaml similarity index 100% rename from api-spec/paths/versions/_id/index.yaml rename to bak/api-spec/paths/versions/_id/index.yaml diff --git a/api-spec/paths/versions/_id/promote/index.yaml b/bak/api-spec/paths/versions/_id/promote/index.yaml similarity index 100% rename from api-spec/paths/versions/_id/promote/index.yaml rename to bak/api-spec/paths/versions/_id/promote/index.yaml diff --git a/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml b/bak/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml similarity index 100% rename from api-spec/paths/versions/_id/promote/promoteContentVersion.yaml rename to bak/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml diff --git a/api-spec/paths/versions/_id/save/index.yaml b/bak/api-spec/paths/versions/_id/save/index.yaml similarity index 100% rename from api-spec/paths/versions/_id/save/index.yaml rename to bak/api-spec/paths/versions/_id/save/index.yaml diff --git a/api-spec/paths/versions/_id/save/saveContentVersion.yaml b/bak/api-spec/paths/versions/_id/save/saveContentVersion.yaml similarity index 100% rename from api-spec/paths/versions/_id/save/saveContentVersion.yaml rename to bak/api-spec/paths/versions/_id/save/saveContentVersion.yaml diff --git a/api-spec/paths/versions/_id/updateContentVersion.yaml b/bak/api-spec/paths/versions/_id/updateContentVersion.yaml similarity index 100% rename from api-spec/paths/versions/_id/updateContentVersion.yaml rename to bak/api-spec/paths/versions/_id/updateContentVersion.yaml diff --git a/api-spec/paths/versions/createContentVersions.yaml b/bak/api-spec/paths/versions/createContentVersions.yaml similarity index 100% rename from api-spec/paths/versions/createContentVersions.yaml rename to bak/api-spec/paths/versions/createContentVersions.yaml diff --git a/api-spec/paths/versions/deleteContentVersions.yaml b/bak/api-spec/paths/versions/deleteContentVersions.yaml similarity index 100% rename from api-spec/paths/versions/deleteContentVersions.yaml rename to bak/api-spec/paths/versions/deleteContentVersions.yaml diff --git a/api-spec/paths/versions/getContentVersions.yaml b/bak/api-spec/paths/versions/getContentVersions.yaml similarity index 100% rename from api-spec/paths/versions/getContentVersions.yaml rename to bak/api-spec/paths/versions/getContentVersions.yaml diff --git a/api-spec/paths/versions/index.yaml b/bak/api-spec/paths/versions/index.yaml similarity index 100% rename from api-spec/paths/versions/index.yaml rename to bak/api-spec/paths/versions/index.yaml diff --git a/api-spec/paths/versions/updateContentVersions.yaml b/bak/api-spec/paths/versions/updateContentVersions.yaml similarity index 100% rename from api-spec/paths/versions/updateContentVersions.yaml rename to bak/api-spec/paths/versions/updateContentVersions.yaml diff --git a/app/app.vue b/bak/app/app.vue similarity index 100% rename from app/app.vue rename to bak/app/app.vue diff --git a/app/assets/css/_reset.scss b/bak/app/assets/css/_reset.scss similarity index 100% rename from app/assets/css/_reset.scss rename to bak/app/assets/css/_reset.scss diff --git a/app/assets/css/_vars.scss b/bak/app/assets/css/_vars.scss similarity index 100% rename from app/assets/css/_vars.scss rename to bak/app/assets/css/_vars.scss diff --git a/app/assets/css/colors.scss b/bak/app/assets/css/colors.scss similarity index 100% rename from app/assets/css/colors.scss rename to bak/app/assets/css/colors.scss diff --git a/app/assets/css/main.scss b/bak/app/assets/css/main.scss similarity index 100% rename from app/assets/css/main.scss rename to bak/app/assets/css/main.scss diff --git a/app/assets/icons/frameworks/angular.svg b/bak/app/assets/icons/frameworks/angular.svg similarity index 100% rename from app/assets/icons/frameworks/angular.svg rename to bak/app/assets/icons/frameworks/angular.svg diff --git a/app/assets/icons/frameworks/apple.svg b/bak/app/assets/icons/frameworks/apple.svg similarity index 100% rename from app/assets/icons/frameworks/apple.svg rename to bak/app/assets/icons/frameworks/apple.svg diff --git a/app/assets/icons/frameworks/astro.svg b/bak/app/assets/icons/frameworks/astro.svg similarity index 100% rename from app/assets/icons/frameworks/astro.svg rename to bak/app/assets/icons/frameworks/astro.svg diff --git a/app/assets/icons/frameworks/next.svg b/bak/app/assets/icons/frameworks/next.svg similarity index 100% rename from app/assets/icons/frameworks/next.svg rename to bak/app/assets/icons/frameworks/next.svg diff --git a/app/assets/icons/frameworks/nuxt.svg b/bak/app/assets/icons/frameworks/nuxt.svg similarity index 100% rename from app/assets/icons/frameworks/nuxt.svg rename to bak/app/assets/icons/frameworks/nuxt.svg diff --git a/app/assets/icons/frameworks/react.svg b/bak/app/assets/icons/frameworks/react.svg similarity index 100% rename from app/assets/icons/frameworks/react.svg rename to bak/app/assets/icons/frameworks/react.svg diff --git a/app/assets/icons/frameworks/remix.svg b/bak/app/assets/icons/frameworks/remix.svg similarity index 100% rename from app/assets/icons/frameworks/remix.svg rename to bak/app/assets/icons/frameworks/remix.svg diff --git a/app/assets/icons/frameworks/svelte.svg b/bak/app/assets/icons/frameworks/svelte.svg similarity index 100% rename from app/assets/icons/frameworks/svelte.svg rename to bak/app/assets/icons/frameworks/svelte.svg diff --git a/app/assets/icons/frameworks/vue.svg b/bak/app/assets/icons/frameworks/vue.svg similarity index 100% rename from app/assets/icons/frameworks/vue.svg rename to bak/app/assets/icons/frameworks/vue.svg diff --git a/app/assets/icons/products/auth-pink.svg b/bak/app/assets/icons/products/auth-pink.svg similarity index 100% rename from app/assets/icons/products/auth-pink.svg rename to bak/app/assets/icons/products/auth-pink.svg diff --git a/app/assets/icons/products/auth-purple.svg b/bak/app/assets/icons/products/auth-purple.svg similarity index 100% rename from app/assets/icons/products/auth-purple.svg rename to bak/app/assets/icons/products/auth-purple.svg diff --git a/app/assets/icons/products/auth-white.svg b/bak/app/assets/icons/products/auth-white.svg similarity index 100% rename from app/assets/icons/products/auth-white.svg rename to bak/app/assets/icons/products/auth-white.svg diff --git a/app/assets/icons/products/auth.svg b/bak/app/assets/icons/products/auth.svg similarity index 100% rename from app/assets/icons/products/auth.svg rename to bak/app/assets/icons/products/auth.svg diff --git a/app/assets/icons/products/automate-pink.svg b/bak/app/assets/icons/products/automate-pink.svg similarity index 100% rename from app/assets/icons/products/automate-pink.svg rename to bak/app/assets/icons/products/automate-pink.svg diff --git a/app/assets/icons/products/automate-purple.svg b/bak/app/assets/icons/products/automate-purple.svg similarity index 100% rename from app/assets/icons/products/automate-purple.svg rename to bak/app/assets/icons/products/automate-purple.svg diff --git a/app/assets/icons/products/automate-white.svg b/bak/app/assets/icons/products/automate-white.svg similarity index 100% rename from app/assets/icons/products/automate-white.svg rename to bak/app/assets/icons/products/automate-white.svg diff --git a/app/assets/icons/products/automate.svg b/bak/app/assets/icons/products/automate.svg similarity index 100% rename from app/assets/icons/products/automate.svg rename to bak/app/assets/icons/products/automate.svg diff --git a/app/assets/icons/products/connect-pink.svg b/bak/app/assets/icons/products/connect-pink.svg similarity index 100% rename from app/assets/icons/products/connect-pink.svg rename to bak/app/assets/icons/products/connect-pink.svg diff --git a/app/assets/icons/products/connect-purple.svg b/bak/app/assets/icons/products/connect-purple.svg similarity index 100% rename from app/assets/icons/products/connect-purple.svg rename to bak/app/assets/icons/products/connect-purple.svg diff --git a/app/assets/icons/products/connect-white.svg b/bak/app/assets/icons/products/connect-white.svg similarity index 100% rename from app/assets/icons/products/connect-white.svg rename to bak/app/assets/icons/products/connect-white.svg diff --git a/app/assets/icons/products/connect.svg b/bak/app/assets/icons/products/connect.svg similarity index 100% rename from app/assets/icons/products/connect.svg rename to bak/app/assets/icons/products/connect.svg diff --git a/app/assets/icons/products/editor-pink.svg b/bak/app/assets/icons/products/editor-pink.svg similarity index 100% rename from app/assets/icons/products/editor-pink.svg rename to bak/app/assets/icons/products/editor-pink.svg diff --git a/app/assets/icons/products/editor-purple.svg b/bak/app/assets/icons/products/editor-purple.svg similarity index 100% rename from app/assets/icons/products/editor-purple.svg rename to bak/app/assets/icons/products/editor-purple.svg diff --git a/app/assets/icons/products/editor-white.svg b/bak/app/assets/icons/products/editor-white.svg similarity index 100% rename from app/assets/icons/products/editor-white.svg rename to bak/app/assets/icons/products/editor-white.svg diff --git a/app/assets/icons/products/editor.svg b/bak/app/assets/icons/products/editor.svg similarity index 100% rename from app/assets/icons/products/editor.svg rename to bak/app/assets/icons/products/editor.svg diff --git a/app/assets/icons/products/explore-pink.svg b/bak/app/assets/icons/products/explore-pink.svg similarity index 100% rename from app/assets/icons/products/explore-pink.svg rename to bak/app/assets/icons/products/explore-pink.svg diff --git a/app/assets/icons/products/explore-purple.svg b/bak/app/assets/icons/products/explore-purple.svg similarity index 100% rename from app/assets/icons/products/explore-purple.svg rename to bak/app/assets/icons/products/explore-purple.svg diff --git a/app/assets/icons/products/explore-white.svg b/bak/app/assets/icons/products/explore-white.svg similarity index 100% rename from app/assets/icons/products/explore-white.svg rename to bak/app/assets/icons/products/explore-white.svg diff --git a/app/assets/icons/products/explore.svg b/bak/app/assets/icons/products/explore.svg similarity index 100% rename from app/assets/icons/products/explore.svg rename to bak/app/assets/icons/products/explore.svg diff --git a/app/assets/icons/products/files-pink.svg b/bak/app/assets/icons/products/files-pink.svg similarity index 100% rename from app/assets/icons/products/files-pink.svg rename to bak/app/assets/icons/products/files-pink.svg diff --git a/app/assets/icons/products/files-purple.svg b/bak/app/assets/icons/products/files-purple.svg similarity index 100% rename from app/assets/icons/products/files-purple.svg rename to bak/app/assets/icons/products/files-purple.svg diff --git a/app/assets/icons/products/files-white.svg b/bak/app/assets/icons/products/files-white.svg similarity index 100% rename from app/assets/icons/products/files-white.svg rename to bak/app/assets/icons/products/files-white.svg diff --git a/app/assets/icons/products/files.svg b/bak/app/assets/icons/products/files.svg similarity index 100% rename from app/assets/icons/products/files.svg rename to bak/app/assets/icons/products/files.svg diff --git a/app/assets/icons/products/insights-pink.svg b/bak/app/assets/icons/products/insights-pink.svg similarity index 100% rename from app/assets/icons/products/insights-pink.svg rename to bak/app/assets/icons/products/insights-pink.svg diff --git a/app/assets/icons/products/insights-purple.svg b/bak/app/assets/icons/products/insights-purple.svg similarity index 100% rename from app/assets/icons/products/insights-purple.svg rename to bak/app/assets/icons/products/insights-purple.svg diff --git a/app/assets/icons/products/insights-white.svg b/bak/app/assets/icons/products/insights-white.svg similarity index 100% rename from app/assets/icons/products/insights-white.svg rename to bak/app/assets/icons/products/insights-white.svg diff --git a/app/assets/icons/products/insights.svg b/bak/app/assets/icons/products/insights.svg similarity index 100% rename from app/assets/icons/products/insights.svg rename to bak/app/assets/icons/products/insights.svg diff --git a/app/assets/icons/products/marketplace-pink.svg b/bak/app/assets/icons/products/marketplace-pink.svg similarity index 100% rename from app/assets/icons/products/marketplace-pink.svg rename to bak/app/assets/icons/products/marketplace-pink.svg diff --git a/app/assets/icons/products/marketplace-purple.svg b/bak/app/assets/icons/products/marketplace-purple.svg similarity index 100% rename from app/assets/icons/products/marketplace-purple.svg rename to bak/app/assets/icons/products/marketplace-purple.svg diff --git a/app/assets/icons/products/marketplace-white.svg b/bak/app/assets/icons/products/marketplace-white.svg similarity index 100% rename from app/assets/icons/products/marketplace-white.svg rename to bak/app/assets/icons/products/marketplace-white.svg diff --git a/app/assets/icons/products/marketplace.svg b/bak/app/assets/icons/products/marketplace.svg similarity index 100% rename from app/assets/icons/products/marketplace.svg rename to bak/app/assets/icons/products/marketplace.svg diff --git a/app/assets/icons/products/realtime-pink.svg b/bak/app/assets/icons/products/realtime-pink.svg similarity index 100% rename from app/assets/icons/products/realtime-pink.svg rename to bak/app/assets/icons/products/realtime-pink.svg diff --git a/app/assets/icons/products/realtime-purple.svg b/bak/app/assets/icons/products/realtime-purple.svg similarity index 100% rename from app/assets/icons/products/realtime-purple.svg rename to bak/app/assets/icons/products/realtime-purple.svg diff --git a/app/assets/icons/products/realtime-white.svg b/bak/app/assets/icons/products/realtime-white.svg similarity index 100% rename from app/assets/icons/products/realtime-white.svg rename to bak/app/assets/icons/products/realtime-white.svg diff --git a/app/assets/icons/products/realtime.svg b/bak/app/assets/icons/products/realtime.svg similarity index 100% rename from app/assets/icons/products/realtime.svg rename to bak/app/assets/icons/products/realtime.svg diff --git a/app/assets/img/cloud-cta-bg.svg b/bak/app/assets/img/cloud-cta-bg.svg similarity index 100% rename from app/assets/img/cloud-cta-bg.svg rename to bak/app/assets/img/cloud-cta-bg.svg diff --git a/app/assets/img/cloud-logo.svg b/bak/app/assets/img/cloud-logo.svg similarity index 100% rename from app/assets/img/cloud-logo.svg rename to bak/app/assets/img/cloud-logo.svg diff --git a/app/assets/img/pink-cta-bg.svg b/bak/app/assets/img/pink-cta-bg.svg similarity index 100% rename from app/assets/img/pink-cta-bg.svg rename to bak/app/assets/img/pink-cta-bg.svg diff --git a/app/assets/img/purple-cta-bg.svg b/bak/app/assets/img/purple-cta-bg.svg similarity index 100% rename from app/assets/img/purple-cta-bg.svg rename to bak/app/assets/img/purple-cta-bg.svg diff --git a/app/assets/img/tv-logo.svg b/bak/app/assets/img/tv-logo.svg similarity index 100% rename from app/assets/img/tv-logo.svg rename to bak/app/assets/img/tv-logo.svg diff --git a/app/components/Button.vue b/bak/app/components/Button.vue similarity index 100% rename from app/components/Button.vue rename to bak/app/components/Button.vue diff --git a/app/components/DefaultLayout.vue b/bak/app/components/DefaultLayout.vue similarity index 100% rename from app/components/DefaultLayout.vue rename to bak/app/components/DefaultLayout.vue diff --git a/app/components/LayoutFooter.vue b/bak/app/components/LayoutFooter.vue similarity index 100% rename from app/components/LayoutFooter.vue rename to bak/app/components/LayoutFooter.vue diff --git a/app/components/NavTree.vue b/bak/app/components/NavTree.vue similarity index 100% rename from app/components/NavTree.vue rename to bak/app/components/NavTree.vue diff --git a/app/components/OgImage/Default.vue b/bak/app/components/OgImage/Default.vue similarity index 100% rename from app/components/OgImage/Default.vue rename to bak/app/components/OgImage/Default.vue diff --git a/app/components/articles/ArticlesCard.vue b/bak/app/components/articles/ArticlesCard.vue similarity index 100% rename from app/components/articles/ArticlesCard.vue rename to bak/app/components/articles/ArticlesCard.vue diff --git a/app/components/articles/ArticlesCategoryNav.vue b/bak/app/components/articles/ArticlesCategoryNav.vue similarity index 100% rename from app/components/articles/ArticlesCategoryNav.vue rename to bak/app/components/articles/ArticlesCategoryNav.vue diff --git a/app/components/articles/ArticlesGrid.vue b/bak/app/components/articles/ArticlesGrid.vue similarity index 100% rename from app/components/articles/ArticlesGrid.vue rename to bak/app/components/articles/ArticlesGrid.vue diff --git a/app/components/articles/ArticlesLayout.vue b/bak/app/components/articles/ArticlesLayout.vue similarity index 100% rename from app/components/articles/ArticlesLayout.vue rename to bak/app/components/articles/ArticlesLayout.vue diff --git a/app/components/articles/ArticlesTagsFilter.vue b/bak/app/components/articles/ArticlesTagsFilter.vue similarity index 100% rename from app/components/articles/ArticlesTagsFilter.vue rename to bak/app/components/articles/ArticlesTagsFilter.vue diff --git a/app/components/aside/AsideFeedback.vue b/bak/app/components/aside/AsideFeedback.vue similarity index 100% rename from app/components/aside/AsideFeedback.vue rename to bak/app/components/aside/AsideFeedback.vue diff --git a/app/components/aside/AsideNav.vue b/bak/app/components/aside/AsideNav.vue similarity index 100% rename from app/components/aside/AsideNav.vue rename to bak/app/components/aside/AsideNav.vue diff --git a/app/components/aside/AsideNewsletter.vue b/bak/app/components/aside/AsideNewsletter.vue similarity index 100% rename from app/components/aside/AsideNewsletter.vue rename to bak/app/components/aside/AsideNewsletter.vue diff --git a/app/components/aside/AsideSlideover.vue b/bak/app/components/aside/AsideSlideover.vue similarity index 100% rename from app/components/aside/AsideSlideover.vue rename to bak/app/components/aside/AsideSlideover.vue diff --git a/app/components/aside/AsideTableOfContents.vue b/bak/app/components/aside/AsideTableOfContents.vue similarity index 100% rename from app/components/aside/AsideTableOfContents.vue rename to bak/app/components/aside/AsideTableOfContents.vue diff --git a/app/components/aside/AsideWidget.vue b/bak/app/components/aside/AsideWidget.vue similarity index 100% rename from app/components/aside/AsideWidget.vue rename to bak/app/components/aside/AsideWidget.vue diff --git a/app/components/content/ArticleCards.vue b/bak/app/components/content/ArticleCards.vue similarity index 100% rename from app/components/content/ArticleCards.vue rename to bak/app/components/content/ArticleCards.vue diff --git a/app/components/content/Badge.vue b/bak/app/components/content/Badge.vue similarity index 100% rename from app/components/content/Badge.vue rename to bak/app/components/content/Badge.vue diff --git a/app/components/content/Box.vue b/bak/app/components/content/Box.vue similarity index 100% rename from app/components/content/Box.vue rename to bak/app/components/content/Box.vue diff --git a/app/components/content/Callout.vue b/bak/app/components/content/Callout.vue similarity index 100% rename from app/components/content/Callout.vue rename to bak/app/components/content/Callout.vue diff --git a/app/components/content/DirectusCloud.vue b/bak/app/components/content/DirectusCloud.vue similarity index 100% rename from app/components/content/DirectusCloud.vue rename to bak/app/components/content/DirectusCloud.vue diff --git a/app/components/content/DirectusImage.vue b/bak/app/components/content/DirectusImage.vue similarity index 100% rename from app/components/content/DirectusImage.vue rename to bak/app/components/content/DirectusImage.vue diff --git a/app/components/content/EngineStudioBox.vue b/bak/app/components/content/EngineStudioBox.vue similarity index 100% rename from app/components/content/EngineStudioBox.vue rename to bak/app/components/content/EngineStudioBox.vue diff --git a/app/components/content/HeaderWithBadge.vue b/bak/app/components/content/HeaderWithBadge.vue similarity index 100% rename from app/components/content/HeaderWithBadge.vue rename to bak/app/components/content/HeaderWithBadge.vue diff --git a/app/components/content/ListChildren.vue b/bak/app/components/content/ListChildren.vue similarity index 100% rename from app/components/content/ListChildren.vue rename to bak/app/components/content/ListChildren.vue diff --git a/app/components/content/Partial.vue b/bak/app/components/content/Partial.vue similarity index 100% rename from app/components/content/Partial.vue rename to bak/app/components/content/Partial.vue diff --git a/app/components/content/ProductLink.vue b/bak/app/components/content/ProductLink.vue similarity index 100% rename from app/components/content/ProductLink.vue rename to bak/app/components/content/ProductLink.vue diff --git a/app/components/content/ProsePre.vue b/bak/app/components/content/ProsePre.vue similarity index 100% rename from app/components/content/ProsePre.vue rename to bak/app/components/content/ProsePre.vue diff --git a/app/components/content/ProseTable.vue b/bak/app/components/content/ProseTable.vue similarity index 100% rename from app/components/content/ProseTable.vue rename to bak/app/components/content/ProseTable.vue diff --git a/app/components/content/Snippets.vue b/bak/app/components/content/Snippets.vue similarity index 100% rename from app/components/content/Snippets.vue rename to bak/app/components/content/Snippets.vue diff --git a/app/components/content/Tab.vue b/bak/app/components/content/Tab.vue similarity index 100% rename from app/components/content/Tab.vue rename to bak/app/components/content/Tab.vue diff --git a/app/components/content/Tabs.vue b/bak/app/components/content/Tabs.vue similarity index 100% rename from app/components/content/Tabs.vue rename to bak/app/components/content/Tabs.vue diff --git a/app/components/content/VideoEmbed.vue b/bak/app/components/content/VideoEmbed.vue similarity index 100% rename from app/components/content/VideoEmbed.vue rename to bak/app/components/content/VideoEmbed.vue diff --git a/app/components/header/HeaderBanner.vue b/bak/app/components/header/HeaderBanner.vue similarity index 100% rename from app/components/header/HeaderBanner.vue rename to bak/app/components/header/HeaderBanner.vue diff --git a/app/components/header/HeaderHat.vue b/bak/app/components/header/HeaderHat.vue similarity index 100% rename from app/components/header/HeaderHat.vue rename to bak/app/components/header/HeaderHat.vue diff --git a/app/components/header/HeaderHero.vue b/bak/app/components/header/HeaderHero.vue similarity index 100% rename from app/components/header/HeaderHero.vue rename to bak/app/components/header/HeaderHero.vue diff --git a/app/components/header/HeaderLogo.vue b/bak/app/components/header/HeaderLogo.vue similarity index 100% rename from app/components/header/HeaderLogo.vue rename to bak/app/components/header/HeaderLogo.vue diff --git a/app/components/header/HeaderNav.vue b/bak/app/components/header/HeaderNav.vue similarity index 100% rename from app/components/header/HeaderNav.vue rename to bak/app/components/header/HeaderNav.vue diff --git a/app/components/header/HeaderSlideover.vue b/bak/app/components/header/HeaderSlideover.vue similarity index 100% rename from app/components/header/HeaderSlideover.vue rename to bak/app/components/header/HeaderSlideover.vue diff --git a/app/components/pages/ArticleArea.global.vue b/bak/app/components/pages/ArticleArea.global.vue similarity index 100% rename from app/components/pages/ArticleArea.global.vue rename to bak/app/components/pages/ArticleArea.global.vue diff --git a/app/components/pages/ArticleCategory.global.vue b/bak/app/components/pages/ArticleCategory.global.vue similarity index 100% rename from app/components/pages/ArticleCategory.global.vue rename to bak/app/components/pages/ArticleCategory.global.vue diff --git a/app/components/pages/ArticlePage.global.vue b/bak/app/components/pages/ArticlePage.global.vue similarity index 100% rename from app/components/pages/ArticlePage.global.vue rename to bak/app/components/pages/ArticlePage.global.vue diff --git a/app/components/pages/DocumentationPage.global.vue b/bak/app/components/pages/DocumentationPage.global.vue similarity index 100% rename from app/components/pages/DocumentationPage.global.vue rename to bak/app/components/pages/DocumentationPage.global.vue diff --git a/app/components/search/SearchButton.client.vue b/bak/app/components/search/SearchButton.client.vue similarity index 100% rename from app/components/search/SearchButton.client.vue rename to bak/app/components/search/SearchButton.client.vue diff --git a/app/composables/data.ts b/bak/app/composables/data.ts similarity index 100% rename from app/composables/data.ts rename to bak/app/composables/data.ts diff --git a/app/composables/tags.ts b/bak/app/composables/tags.ts similarity index 100% rename from app/composables/tags.ts rename to bak/app/composables/tags.ts diff --git a/app/pages/[...slug].vue b/bak/app/pages/[...slug].vue similarity index 100% rename from app/pages/[...slug].vue rename to bak/app/pages/[...slug].vue diff --git a/app/pages/api/index.vue b/bak/app/pages/api/index.vue similarity index 100% rename from app/pages/api/index.vue rename to bak/app/pages/api/index.vue diff --git a/app/plugins/format-title.ts b/bak/app/plugins/format-title.ts similarity index 100% rename from app/plugins/format-title.ts rename to bak/app/plugins/format-title.ts diff --git a/app/utils/directus.ts b/bak/app/utils/directus.ts similarity index 100% rename from app/utils/directus.ts rename to bak/app/utils/directus.ts diff --git a/app/utils/file-icons.ts b/bak/app/utils/file-icons.ts similarity index 100% rename from app/utils/file-icons.ts rename to bak/app/utils/file-icons.ts diff --git a/app/utils/product-links.ts b/bak/app/utils/product-links.ts similarity index 100% rename from app/utils/product-links.ts rename to bak/app/utils/product-links.ts diff --git a/app/utils/products.ts b/bak/app/utils/products.ts similarity index 100% rename from app/utils/products.ts rename to bak/app/utils/products.ts diff --git a/content/1.getting-started/0.home.md b/bak/content/1.getting-started/0.home.md similarity index 100% rename from content/1.getting-started/0.home.md rename to bak/content/1.getting-started/0.home.md diff --git a/content/1.getting-started/0.platform-overview.md b/bak/content/1.getting-started/0.platform-overview.md similarity index 100% rename from content/1.getting-started/0.platform-overview.md rename to bak/content/1.getting-started/0.platform-overview.md diff --git a/content/1.getting-started/1.create-a-project.md b/bak/content/1.getting-started/1.create-a-project.md similarity index 100% rename from content/1.getting-started/1.create-a-project.md rename to bak/content/1.getting-started/1.create-a-project.md diff --git a/content/1.getting-started/2.resources.md b/bak/content/1.getting-started/2.resources.md similarity index 100% rename from content/1.getting-started/2.resources.md rename to bak/content/1.getting-started/2.resources.md diff --git a/content/1.getting-started/_dir.yml b/bak/content/1.getting-started/_dir.yml similarity index 100% rename from content/1.getting-started/_dir.yml rename to bak/content/1.getting-started/_dir.yml diff --git a/content/10.extensions/0.overview.md b/bak/content/10.extensions/0.overview.md similarity index 100% rename from content/10.extensions/0.overview.md rename to bak/content/10.extensions/0.overview.md diff --git a/content/10.extensions/1.quickstart.md b/bak/content/10.extensions/1.quickstart.md similarity index 100% rename from content/10.extensions/1.quickstart.md rename to bak/content/10.extensions/1.quickstart.md diff --git a/content/10.extensions/2.api-extensions/0.index.md b/bak/content/10.extensions/2.api-extensions/0.index.md similarity index 100% rename from content/10.extensions/2.api-extensions/0.index.md rename to bak/content/10.extensions/2.api-extensions/0.index.md diff --git a/content/10.extensions/2.api-extensions/1.hooks.md b/bak/content/10.extensions/2.api-extensions/1.hooks.md similarity index 100% rename from content/10.extensions/2.api-extensions/1.hooks.md rename to bak/content/10.extensions/2.api-extensions/1.hooks.md diff --git a/content/10.extensions/2.api-extensions/2.endpoints.md b/bak/content/10.extensions/2.api-extensions/2.endpoints.md similarity index 100% rename from content/10.extensions/2.api-extensions/2.endpoints.md rename to bak/content/10.extensions/2.api-extensions/2.endpoints.md diff --git a/content/10.extensions/2.api-extensions/3.operations.md b/bak/content/10.extensions/2.api-extensions/3.operations.md similarity index 100% rename from content/10.extensions/2.api-extensions/3.operations.md rename to bak/content/10.extensions/2.api-extensions/3.operations.md diff --git a/content/10.extensions/2.api-extensions/4.services.md b/bak/content/10.extensions/2.api-extensions/4.services.md similarity index 100% rename from content/10.extensions/2.api-extensions/4.services.md rename to bak/content/10.extensions/2.api-extensions/4.services.md diff --git a/content/10.extensions/2.api-extensions/5.sandbox.md b/bak/content/10.extensions/2.api-extensions/5.sandbox.md similarity index 100% rename from content/10.extensions/2.api-extensions/5.sandbox.md rename to bak/content/10.extensions/2.api-extensions/5.sandbox.md diff --git a/content/10.extensions/3.app-extensions/0.index.md b/bak/content/10.extensions/3.app-extensions/0.index.md similarity index 100% rename from content/10.extensions/3.app-extensions/0.index.md rename to bak/content/10.extensions/3.app-extensions/0.index.md diff --git a/content/10.extensions/3.app-extensions/1.interfaces.md b/bak/content/10.extensions/3.app-extensions/1.interfaces.md similarity index 100% rename from content/10.extensions/3.app-extensions/1.interfaces.md rename to bak/content/10.extensions/3.app-extensions/1.interfaces.md diff --git a/content/10.extensions/3.app-extensions/2.displays.md b/bak/content/10.extensions/3.app-extensions/2.displays.md similarity index 100% rename from content/10.extensions/3.app-extensions/2.displays.md rename to bak/content/10.extensions/3.app-extensions/2.displays.md diff --git a/content/10.extensions/3.app-extensions/3.layouts.md b/bak/content/10.extensions/3.app-extensions/3.layouts.md similarity index 100% rename from content/10.extensions/3.app-extensions/3.layouts.md rename to bak/content/10.extensions/3.app-extensions/3.layouts.md diff --git a/content/10.extensions/3.app-extensions/4.panels.md b/bak/content/10.extensions/3.app-extensions/4.panels.md similarity index 100% rename from content/10.extensions/3.app-extensions/4.panels.md rename to bak/content/10.extensions/3.app-extensions/4.panels.md diff --git a/content/10.extensions/3.app-extensions/5.modules.md b/bak/content/10.extensions/3.app-extensions/5.modules.md similarity index 100% rename from content/10.extensions/3.app-extensions/5.modules.md rename to bak/content/10.extensions/3.app-extensions/5.modules.md diff --git a/content/10.extensions/3.app-extensions/6.themes.md b/bak/content/10.extensions/3.app-extensions/6.themes.md similarity index 100% rename from content/10.extensions/3.app-extensions/6.themes.md rename to bak/content/10.extensions/3.app-extensions/6.themes.md diff --git a/content/10.extensions/3.app-extensions/7.ui-library.md b/bak/content/10.extensions/3.app-extensions/7.ui-library.md similarity index 100% rename from content/10.extensions/3.app-extensions/7.ui-library.md rename to bak/content/10.extensions/3.app-extensions/7.ui-library.md diff --git a/content/10.extensions/3.app-extensions/8.composables.md b/bak/content/10.extensions/3.app-extensions/8.composables.md similarity index 100% rename from content/10.extensions/3.app-extensions/8.composables.md rename to bak/content/10.extensions/3.app-extensions/8.composables.md diff --git a/content/10.extensions/4.bundles.md b/bak/content/10.extensions/4.bundles.md similarity index 100% rename from content/10.extensions/4.bundles.md rename to bak/content/10.extensions/4.bundles.md diff --git a/content/10.extensions/5.marketplace/0.index.md b/bak/content/10.extensions/5.marketplace/0.index.md similarity index 100% rename from content/10.extensions/5.marketplace/0.index.md rename to bak/content/10.extensions/5.marketplace/0.index.md diff --git a/content/10.extensions/5.marketplace/1.publishing.md b/bak/content/10.extensions/5.marketplace/1.publishing.md similarity index 100% rename from content/10.extensions/5.marketplace/1.publishing.md rename to bak/content/10.extensions/5.marketplace/1.publishing.md diff --git a/content/10.extensions/_dir.yml b/bak/content/10.extensions/_dir.yml similarity index 100% rename from content/10.extensions/_dir.yml rename to bak/content/10.extensions/_dir.yml diff --git a/content/11.configuration/1.general.md b/bak/content/11.configuration/1.general.md similarity index 100% rename from content/11.configuration/1.general.md rename to bak/content/11.configuration/1.general.md diff --git a/content/11.configuration/10.extensions.md b/bak/content/11.configuration/10.extensions.md similarity index 100% rename from content/11.configuration/10.extensions.md rename to bak/content/11.configuration/10.extensions.md diff --git a/content/11.configuration/11.logging.md b/bak/content/11.configuration/11.logging.md similarity index 100% rename from content/11.configuration/11.logging.md rename to bak/content/11.configuration/11.logging.md diff --git a/content/11.configuration/12.email.md b/bak/content/11.configuration/12.email.md similarity index 100% rename from content/11.configuration/12.email.md rename to bak/content/11.configuration/12.email.md diff --git a/content/11.configuration/13.migrations.md b/bak/content/11.configuration/13.migrations.md similarity index 100% rename from content/11.configuration/13.migrations.md rename to bak/content/11.configuration/13.migrations.md diff --git a/content/11.configuration/14.theming.md b/bak/content/11.configuration/14.theming.md similarity index 100% rename from content/11.configuration/14.theming.md rename to bak/content/11.configuration/14.theming.md diff --git a/content/11.configuration/15.translations.md b/bak/content/11.configuration/15.translations.md similarity index 100% rename from content/11.configuration/15.translations.md rename to bak/content/11.configuration/15.translations.md diff --git a/content/11.configuration/2.database.md b/bak/content/11.configuration/2.database.md similarity index 100% rename from content/11.configuration/2.database.md rename to bak/content/11.configuration/2.database.md diff --git a/content/11.configuration/3.files.md b/bak/content/11.configuration/3.files.md similarity index 100% rename from content/11.configuration/3.files.md rename to bak/content/11.configuration/3.files.md diff --git a/content/11.configuration/4.synchronization.md b/bak/content/11.configuration/4.synchronization.md similarity index 100% rename from content/11.configuration/4.synchronization.md rename to bak/content/11.configuration/4.synchronization.md diff --git a/content/11.configuration/5.realtime.md b/bak/content/11.configuration/5.realtime.md similarity index 100% rename from content/11.configuration/5.realtime.md rename to bak/content/11.configuration/5.realtime.md diff --git a/content/11.configuration/6.flows.md b/bak/content/11.configuration/6.flows.md similarity index 100% rename from content/11.configuration/6.flows.md rename to bak/content/11.configuration/6.flows.md diff --git a/content/11.configuration/7.security-limits.md b/bak/content/11.configuration/7.security-limits.md similarity index 100% rename from content/11.configuration/7.security-limits.md rename to bak/content/11.configuration/7.security-limits.md diff --git a/content/11.configuration/8.auth-sso.md b/bak/content/11.configuration/8.auth-sso.md similarity index 100% rename from content/11.configuration/8.auth-sso.md rename to bak/content/11.configuration/8.auth-sso.md diff --git a/content/11.configuration/9.pm2.md b/bak/content/11.configuration/9.pm2.md similarity index 100% rename from content/11.configuration/9.pm2.md rename to bak/content/11.configuration/9.pm2.md diff --git a/content/11.configuration/_dir.yml b/bak/content/11.configuration/_dir.yml similarity index 100% rename from content/11.configuration/_dir.yml rename to bak/content/11.configuration/_dir.yml diff --git a/content/12.self-hosting/1.overview.md b/bak/content/12.self-hosting/1.overview.md similarity index 100% rename from content/12.self-hosting/1.overview.md rename to bak/content/12.self-hosting/1.overview.md diff --git a/content/12.self-hosting/2.requirements.md b/bak/content/12.self-hosting/2.requirements.md similarity index 100% rename from content/12.self-hosting/2.requirements.md rename to bak/content/12.self-hosting/2.requirements.md diff --git a/content/12.self-hosting/3.deploying.md b/bak/content/12.self-hosting/3.deploying.md similarity index 100% rename from content/12.self-hosting/3.deploying.md rename to bak/content/12.self-hosting/3.deploying.md diff --git a/content/12.self-hosting/4.upgrading.md b/bak/content/12.self-hosting/4.upgrading.md similarity index 100% rename from content/12.self-hosting/4.upgrading.md rename to bak/content/12.self-hosting/4.upgrading.md diff --git a/content/12.self-hosting/5.including-extensions.md b/bak/content/12.self-hosting/5.including-extensions.md similarity index 100% rename from content/12.self-hosting/5.including-extensions.md rename to bak/content/12.self-hosting/5.including-extensions.md diff --git a/content/12.self-hosting/_dir.yml b/bak/content/12.self-hosting/_dir.yml similarity index 100% rename from content/12.self-hosting/_dir.yml rename to bak/content/12.self-hosting/_dir.yml diff --git a/content/13.releases/1.overview.md b/bak/content/13.releases/1.overview.md similarity index 100% rename from content/13.releases/1.overview.md rename to bak/content/13.releases/1.overview.md diff --git a/content/13.releases/2.breaking-changes/0.index.md b/bak/content/13.releases/2.breaking-changes/0.index.md similarity index 100% rename from content/13.releases/2.breaking-changes/0.index.md rename to bak/content/13.releases/2.breaking-changes/0.index.md diff --git a/content/13.releases/2.breaking-changes/1.version-10.md b/bak/content/13.releases/2.breaking-changes/1.version-10.md similarity index 100% rename from content/13.releases/2.breaking-changes/1.version-10.md rename to bak/content/13.releases/2.breaking-changes/1.version-10.md diff --git a/content/13.releases/2.breaking-changes/2.version-11.md b/bak/content/13.releases/2.breaking-changes/2.version-11.md similarity index 100% rename from content/13.releases/2.breaking-changes/2.version-11.md rename to bak/content/13.releases/2.breaking-changes/2.version-11.md diff --git a/content/13.releases/3.changelog.md b/bak/content/13.releases/3.changelog.md similarity index 100% rename from content/13.releases/3.changelog.md rename to bak/content/13.releases/3.changelog.md diff --git a/content/13.releases/_dir.yml b/bak/content/13.releases/_dir.yml similarity index 100% rename from content/13.releases/_dir.yml rename to bak/content/13.releases/_dir.yml diff --git a/content/2.data-modeling/1.quickstart.md b/bak/content/2.data-modeling/1.quickstart.md similarity index 100% rename from content/2.data-modeling/1.quickstart.md rename to bak/content/2.data-modeling/1.quickstart.md diff --git a/content/2.data-modeling/2.collections.md b/bak/content/2.data-modeling/2.collections.md similarity index 100% rename from content/2.data-modeling/2.collections.md rename to bak/content/2.data-modeling/2.collections.md diff --git a/content/2.data-modeling/3.fields.md b/bak/content/2.data-modeling/3.fields.md similarity index 100% rename from content/2.data-modeling/3.fields.md rename to bak/content/2.data-modeling/3.fields.md diff --git a/content/2.data-modeling/4.interfaces.md b/bak/content/2.data-modeling/4.interfaces.md similarity index 100% rename from content/2.data-modeling/4.interfaces.md rename to bak/content/2.data-modeling/4.interfaces.md diff --git a/content/2.data-modeling/5.relationships.md b/bak/content/2.data-modeling/5.relationships.md similarity index 100% rename from content/2.data-modeling/5.relationships.md rename to bak/content/2.data-modeling/5.relationships.md diff --git a/content/2.data-modeling/_dir.yml b/bak/content/2.data-modeling/_dir.yml similarity index 100% rename from content/2.data-modeling/_dir.yml rename to bak/content/2.data-modeling/_dir.yml diff --git a/content/3.content/1.explore.md b/bak/content/3.content/1.explore.md similarity index 100% rename from content/3.content/1.explore.md rename to bak/content/3.content/1.explore.md diff --git a/content/3.content/2.editor.md b/bak/content/3.content/2.editor.md similarity index 100% rename from content/3.content/2.editor.md rename to bak/content/3.content/2.editor.md diff --git a/content/3.content/3.layouts.md b/bak/content/3.content/3.layouts.md similarity index 100% rename from content/3.content/3.layouts.md rename to bak/content/3.content/3.layouts.md diff --git a/content/3.content/4.import-export.md b/bak/content/3.content/4.import-export.md similarity index 100% rename from content/3.content/4.import-export.md rename to bak/content/3.content/4.import-export.md diff --git a/content/3.content/5.live-preview.md b/bak/content/3.content/5.live-preview.md similarity index 100% rename from content/3.content/5.live-preview.md rename to bak/content/3.content/5.live-preview.md diff --git a/content/3.content/6.content-versioning.md b/bak/content/3.content/6.content-versioning.md similarity index 100% rename from content/3.content/6.content-versioning.md rename to bak/content/3.content/6.content-versioning.md diff --git a/content/3.content/7.translations.md b/bak/content/3.content/7.translations.md similarity index 100% rename from content/3.content/7.translations.md rename to bak/content/3.content/7.translations.md diff --git a/content/3.content/_dir.yml b/bak/content/3.content/_dir.yml similarity index 100% rename from content/3.content/_dir.yml rename to bak/content/3.content/_dir.yml diff --git a/content/4.auth/1.quickstart.md b/bak/content/4.auth/1.quickstart.md similarity index 100% rename from content/4.auth/1.quickstart.md rename to bak/content/4.auth/1.quickstart.md diff --git a/content/4.auth/2.tokens-cookies.md b/bak/content/4.auth/2.tokens-cookies.md similarity index 100% rename from content/4.auth/2.tokens-cookies.md rename to bak/content/4.auth/2.tokens-cookies.md diff --git a/content/4.auth/3.access-control.md b/bak/content/4.auth/3.access-control.md similarity index 100% rename from content/4.auth/3.access-control.md rename to bak/content/4.auth/3.access-control.md diff --git a/content/4.auth/4.creating-users.md b/bak/content/4.auth/4.creating-users.md similarity index 100% rename from content/4.auth/4.creating-users.md rename to bak/content/4.auth/4.creating-users.md diff --git a/content/4.auth/5.email-login.md b/bak/content/4.auth/5.email-login.md similarity index 100% rename from content/4.auth/5.email-login.md rename to bak/content/4.auth/5.email-login.md diff --git a/content/4.auth/6.2fa.md b/bak/content/4.auth/6.2fa.md similarity index 100% rename from content/4.auth/6.2fa.md rename to bak/content/4.auth/6.2fa.md diff --git a/content/4.auth/7.sso/1.index.md b/bak/content/4.auth/7.sso/1.index.md similarity index 100% rename from content/4.auth/7.sso/1.index.md rename to bak/content/4.auth/7.sso/1.index.md diff --git a/content/4.auth/7.sso/2.seamless.md b/bak/content/4.auth/7.sso/2.seamless.md similarity index 100% rename from content/4.auth/7.sso/2.seamless.md rename to bak/content/4.auth/7.sso/2.seamless.md diff --git a/content/4.auth/8.accountability.md b/bak/content/4.auth/8.accountability.md similarity index 100% rename from content/4.auth/8.accountability.md rename to bak/content/4.auth/8.accountability.md diff --git a/content/4.auth/_dir.yml b/bak/content/4.auth/_dir.yml similarity index 100% rename from content/4.auth/_dir.yml rename to bak/content/4.auth/_dir.yml diff --git a/content/5.connect/1.quickstart.md b/bak/content/5.connect/1.quickstart.md similarity index 100% rename from content/5.connect/1.quickstart.md rename to bak/content/5.connect/1.quickstart.md diff --git a/content/5.connect/2.authentication.md b/bak/content/5.connect/2.authentication.md similarity index 100% rename from content/5.connect/2.authentication.md rename to bak/content/5.connect/2.authentication.md diff --git a/content/5.connect/3.filter-rules.md b/bak/content/5.connect/3.filter-rules.md similarity index 100% rename from content/5.connect/3.filter-rules.md rename to bak/content/5.connect/3.filter-rules.md diff --git a/content/5.connect/4.query-parameters.md b/bak/content/5.connect/4.query-parameters.md similarity index 100% rename from content/5.connect/4.query-parameters.md rename to bak/content/5.connect/4.query-parameters.md diff --git a/content/5.connect/5.errors.md b/bak/content/5.connect/5.errors.md similarity index 100% rename from content/5.connect/5.errors.md rename to bak/content/5.connect/5.errors.md diff --git a/content/5.connect/6.sdk.md b/bak/content/5.connect/6.sdk.md similarity index 100% rename from content/5.connect/6.sdk.md rename to bak/content/5.connect/6.sdk.md diff --git a/content/5.connect/_dir.yml b/bak/content/5.connect/_dir.yml similarity index 100% rename from content/5.connect/_dir.yml rename to bak/content/5.connect/_dir.yml diff --git a/content/6.files/1.quickstart.md b/bak/content/6.files/1.quickstart.md similarity index 100% rename from content/6.files/1.quickstart.md rename to bak/content/6.files/1.quickstart.md diff --git a/content/6.files/2.upload.md b/bak/content/6.files/2.upload.md similarity index 100% rename from content/6.files/2.upload.md rename to bak/content/6.files/2.upload.md diff --git a/content/6.files/3.manage.md b/bak/content/6.files/3.manage.md similarity index 100% rename from content/6.files/3.manage.md rename to bak/content/6.files/3.manage.md diff --git a/content/6.files/4.access.md b/bak/content/6.files/4.access.md similarity index 100% rename from content/6.files/4.access.md rename to bak/content/6.files/4.access.md diff --git a/content/6.files/5.transform.md b/bak/content/6.files/5.transform.md similarity index 100% rename from content/6.files/5.transform.md rename to bak/content/6.files/5.transform.md diff --git a/content/6.files/_dir.yml b/bak/content/6.files/_dir.yml similarity index 100% rename from content/6.files/_dir.yml rename to bak/content/6.files/_dir.yml diff --git a/content/7.automate/1.quickstart.md b/bak/content/7.automate/1.quickstart.md similarity index 100% rename from content/7.automate/1.quickstart.md rename to bak/content/7.automate/1.quickstart.md diff --git a/content/7.automate/2.flows.md b/bak/content/7.automate/2.flows.md similarity index 100% rename from content/7.automate/2.flows.md rename to bak/content/7.automate/2.flows.md diff --git a/content/7.automate/3.data-chain.md b/bak/content/7.automate/3.data-chain.md similarity index 100% rename from content/7.automate/3.data-chain.md rename to bak/content/7.automate/3.data-chain.md diff --git a/content/7.automate/4.triggers.md b/bak/content/7.automate/4.triggers.md similarity index 100% rename from content/7.automate/4.triggers.md rename to bak/content/7.automate/4.triggers.md diff --git a/content/7.automate/5.operations.md b/bak/content/7.automate/5.operations.md similarity index 100% rename from content/7.automate/5.operations.md rename to bak/content/7.automate/5.operations.md diff --git a/content/7.automate/_dir.yml b/bak/content/7.automate/_dir.yml similarity index 100% rename from content/7.automate/_dir.yml rename to bak/content/7.automate/_dir.yml diff --git a/content/8.realtime/1.quickstart.md b/bak/content/8.realtime/1.quickstart.md similarity index 100% rename from content/8.realtime/1.quickstart.md rename to bak/content/8.realtime/1.quickstart.md diff --git a/content/8.realtime/2.authentication.md b/bak/content/8.realtime/2.authentication.md similarity index 100% rename from content/8.realtime/2.authentication.md rename to bak/content/8.realtime/2.authentication.md diff --git a/content/8.realtime/3.subscriptions.md b/bak/content/8.realtime/3.subscriptions.md similarity index 100% rename from content/8.realtime/3.subscriptions.md rename to bak/content/8.realtime/3.subscriptions.md diff --git a/content/8.realtime/4.actions.md b/bak/content/8.realtime/4.actions.md similarity index 100% rename from content/8.realtime/4.actions.md rename to bak/content/8.realtime/4.actions.md diff --git a/content/8.realtime/_dir.yml b/bak/content/8.realtime/_dir.yml similarity index 100% rename from content/8.realtime/_dir.yml rename to bak/content/8.realtime/_dir.yml diff --git a/content/9.insights/1.overview.md b/bak/content/9.insights/1.overview.md similarity index 100% rename from content/9.insights/1.overview.md rename to bak/content/9.insights/1.overview.md diff --git a/content/9.insights/2.panels.md b/bak/content/9.insights/2.panels.md similarity index 100% rename from content/9.insights/2.panels.md rename to bak/content/9.insights/2.panels.md diff --git a/content/9.insights/_dir.yml b/bak/content/9.insights/_dir.yml similarity index 100% rename from content/9.insights/_dir.yml rename to bak/content/9.insights/_dir.yml diff --git a/content/_partials/authentication.md b/bak/content/_partials/authentication.md similarity index 100% rename from content/_partials/authentication.md rename to bak/content/_partials/authentication.md diff --git a/content/_partials/config-env-vars.md b/bak/content/_partials/config-env-vars.md similarity index 100% rename from content/_partials/config-env-vars.md rename to bak/content/_partials/config-env-vars.md diff --git a/content/_partials/extension-hook-exceptions.md b/bak/content/_partials/extension-hook-exceptions.md similarity index 100% rename from content/_partials/extension-hook-exceptions.md rename to bak/content/_partials/extension-hook-exceptions.md diff --git a/content/_partials/extension-hook-footguns.md b/bak/content/_partials/extension-hook-footguns.md similarity index 100% rename from content/_partials/extension-hook-footguns.md rename to bak/content/_partials/extension-hook-footguns.md diff --git a/content/_partials/extensions-api-internals.md b/bak/content/_partials/extensions-api-internals.md similarity index 100% rename from content/_partials/extensions-api-internals.md rename to bak/content/_partials/extensions-api-internals.md diff --git a/content/_partials/extensions-api.md b/bak/content/_partials/extensions-api.md similarity index 100% rename from content/_partials/extensions-api.md rename to bak/content/_partials/extensions-api.md diff --git a/content/_partials/extensions-app-internals.md b/bak/content/_partials/extensions-app-internals.md similarity index 100% rename from content/_partials/extensions-app-internals.md rename to bak/content/_partials/extensions-app-internals.md diff --git a/content/_partials/extensions-app.md b/bak/content/_partials/extensions-app.md similarity index 100% rename from content/_partials/extensions-app.md rename to bak/content/_partials/extensions-app.md diff --git a/content/_partials/extensions-theme.md b/bak/content/_partials/extensions-theme.md similarity index 100% rename from content/_partials/extensions-theme.md rename to bak/content/_partials/extensions-theme.md diff --git a/content/_partials/extensions-uid.md b/bak/content/_partials/extensions-uid.md similarity index 100% rename from content/_partials/extensions-uid.md rename to bak/content/_partials/extensions-uid.md diff --git a/content/_partials/home-hero/auth.md b/bak/content/_partials/home-hero/auth.md similarity index 100% rename from content/_partials/home-hero/auth.md rename to bak/content/_partials/home-hero/auth.md diff --git a/content/_partials/home-hero/data.md b/bak/content/_partials/home-hero/data.md similarity index 100% rename from content/_partials/home-hero/data.md rename to bak/content/_partials/home-hero/data.md diff --git a/content/_partials/home-hero/file.md b/bak/content/_partials/home-hero/file.md similarity index 100% rename from content/_partials/home-hero/file.md rename to bak/content/_partials/home-hero/file.md diff --git a/content/_partials/home-hero/realtime.md b/bak/content/_partials/home-hero/realtime.md similarity index 100% rename from content/_partials/home-hero/realtime.md rename to bak/content/_partials/home-hero/realtime.md diff --git a/content/_partials/license.md b/bak/content/_partials/license.md similarity index 100% rename from content/_partials/license.md rename to bak/content/_partials/license.md diff --git a/content/_partials/query-functions.md b/bak/content/_partials/query-functions.md similarity index 100% rename from content/_partials/query-functions.md rename to bak/content/_partials/query-functions.md diff --git a/content/_partials/quickstart-making-calls.md b/bak/content/_partials/quickstart-making-calls.md similarity index 100% rename from content/_partials/quickstart-making-calls.md rename to bak/content/_partials/quickstart-making-calls.md diff --git a/content/_partials/snippet-auth-token.md b/bak/content/_partials/snippet-auth-token.md similarity index 100% rename from content/_partials/snippet-auth-token.md rename to bak/content/_partials/snippet-auth-token.md diff --git a/eslint.config.mjs b/bak/eslint.config.mjs similarity index 100% rename from eslint.config.mjs rename to bak/eslint.config.mjs diff --git a/nuxt.config.ts b/bak/nuxt.config.ts similarity index 100% rename from nuxt.config.ts rename to bak/nuxt.config.ts diff --git a/package.json b/bak/package.json similarity index 100% rename from package.json rename to bak/package.json diff --git a/pnpm-lock.yaml b/bak/pnpm-lock.yaml similarity index 100% rename from pnpm-lock.yaml rename to bak/pnpm-lock.yaml diff --git a/public/1.icon.png b/bak/public/1.icon.png similarity index 100% rename from public/1.icon.png rename to bak/public/1.icon.png diff --git a/public/2.icon.png b/bak/public/2.icon.png similarity index 100% rename from public/2.icon.png rename to bak/public/2.icon.png diff --git a/public/3.icon.png b/bak/public/3.icon.png similarity index 100% rename from public/3.icon.png rename to bak/public/3.icon.png diff --git a/public/4.icon.png b/bak/public/4.icon.png similarity index 100% rename from public/4.icon.png rename to bak/public/4.icon.png diff --git a/public/apple-touch-icon.png b/bak/public/apple-touch-icon.png similarity index 100% rename from public/apple-touch-icon.png rename to bak/public/apple-touch-icon.png diff --git a/public/browserconfig.xml b/bak/public/browserconfig.xml similarity index 100% rename from public/browserconfig.xml rename to bak/public/browserconfig.xml diff --git a/public/favicon.ico b/bak/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to bak/public/favicon.ico diff --git a/public/favicon.svg b/bak/public/favicon.svg similarity index 100% rename from public/favicon.svg rename to bak/public/favicon.svg diff --git a/public/og-image-background.png b/bak/public/og-image-background.png similarity index 100% rename from public/og-image-background.png rename to bak/public/og-image-background.png diff --git a/public/waves-dark.svg b/bak/public/waves-dark.svg similarity index 100% rename from public/waves-dark.svg rename to bak/public/waves-dark.svg diff --git a/public/waves.svg b/bak/public/waves.svg similarity index 100% rename from public/waves.svg rename to bak/public/waves.svg diff --git a/server/tsconfig.json b/bak/server/tsconfig.json similarity index 100% rename from server/tsconfig.json rename to bak/server/tsconfig.json diff --git a/server/utils/remote-content.ts b/bak/server/utils/remote-content.ts similarity index 100% rename from server/utils/remote-content.ts rename to bak/server/utils/remote-content.ts diff --git a/bak/todo.md b/bak/todo.md new file mode 100644 index 00000000..05826688 --- /dev/null +++ b/bak/todo.md @@ -0,0 +1 @@ +- [ ] Add algolia / posthog diff --git a/tsconfig.json b/bak/tsconfig.json similarity index 100% rename from tsconfig.json rename to bak/tsconfig.json diff --git a/types/content.ts b/bak/types/content.ts similarity index 100% rename from types/content.ts rename to bak/types/content.ts diff --git a/types/directus.ts b/bak/types/directus.ts similarity index 100% rename from types/directus.ts rename to bak/types/directus.ts diff --git a/types/posthog.d.ts b/bak/types/posthog.d.ts similarity index 100% rename from types/posthog.d.ts rename to bak/types/posthog.d.ts diff --git a/utils/app-config.ts b/bak/utils/app-config.ts similarity index 100% rename from utils/app-config.ts rename to bak/utils/app-config.ts diff --git a/utils/directus.ts b/bak/utils/directus.ts similarity index 100% rename from utils/directus.ts rename to bak/utils/directus.ts From 271a3be918e7efcd3aab3af5bb54b52d83fa8cd2 Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Mon, 16 Dec 2024 10:20:31 -0500 Subject: [PATCH 002/187] Install fresh nuxt --- .gitignore | 24 + README.md | 75 + app.vue | 6 + nuxt.config.ts | 5 + package.json | 17 + pnpm-lock.yaml | 6350 ++++++++++++++++++++++++++++++++++++++++++ public/favicon.ico | Bin 0 -> 4286 bytes public/robots.txt | 1 + server/tsconfig.json | 3 + tsconfig.json | 4 + 10 files changed, 6485 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app.vue create mode 100644 nuxt.config.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 server/tsconfig.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..4a7f73a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/README.md b/README.md new file mode 100644 index 00000000..25b58212 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# Nuxt Minimal Starter + +Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. + +## Setup + +Make sure to install dependencies: + +```bash +# npm +npm install + +# pnpm +pnpm install + +# yarn +yarn install + +# bun +bun install +``` + +## Development Server + +Start the development server on `http://localhost:3000`: + +```bash +# npm +npm run dev + +# pnpm +pnpm dev + +# yarn +yarn dev + +# bun +bun run dev +``` + +## Production + +Build the application for production: + +```bash +# npm +npm run build + +# pnpm +pnpm build + +# yarn +yarn build + +# bun +bun run build +``` + +Locally preview production build: + +```bash +# npm +npm run preview + +# pnpm +pnpm preview + +# yarn +yarn preview + +# bun +bun run preview +``` + +Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. diff --git a/app.vue b/app.vue new file mode 100644 index 00000000..09f935bb --- /dev/null +++ b/app.vue @@ -0,0 +1,6 @@ + diff --git a/nuxt.config.ts b/nuxt.config.ts new file mode 100644 index 00000000..8ae12e6c --- /dev/null +++ b/nuxt.config.ts @@ -0,0 +1,5 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + compatibilityDate: '2024-11-01', + devtools: { enabled: true } +}) diff --git a/package.json b/package.json new file mode 100644 index 00000000..400269f7 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "nuxt-app", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "nuxt": "^3.14.1592", + "vue": "latest", + "vue-router": "latest" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..21761036 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6350 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + nuxt: + specifier: ^3.14.1592 + version: 3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(ioredis@5.4.1)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + vue: + specifier: latest + version: 3.5.13(typescript@5.7.2) + vue-router: + specifier: latest + version: 4.5.0(vue@3.5.13(typescript@5.7.2)) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.25.9': + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.25.9': + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/standalone@7.26.4': + resolution: {integrity: sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} + + '@cloudflare/kv-asset-handler@0.3.4': + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} + engines: {node: '>=16.13'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@mapbox/node-pre-gyp@2.0.0-rc.0': + resolution: {integrity: sha512-nhSMNprz3WmeRvd8iUs5JqkKr0Ncx46JtPxM3AhXes84XpSJfmIwKeWXRpsr53S7kqPkQfPhzrMFUxSNb23qSA==} + engines: {node: '>=18'} + hasBin: true + + '@netlify/functions@2.8.2': + resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==} + engines: {node: '>=14.0.0'} + + '@netlify/node-cookies@0.1.0': + resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/serverless-functions-api@1.26.1': + resolution: {integrity: sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==} + engines: {node: '>=18.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nuxt/devalue@2.0.2': + resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} + + '@nuxt/devtools-kit@1.6.4': + resolution: {integrity: sha512-jpLYrXFm8T74j8ZjU6lheghe3gdr7PcNluvh/KOl+t6l7AtsQilkTmCZ4YoaiaWLM+5c5mkc72qd7ECgZb0tCw==} + peerDependencies: + vite: '*' + + '@nuxt/devtools-wizard@1.6.4': + resolution: {integrity: sha512-YTInHKL3SnRjczZDIhN8kXaiYf8+ddBMU5nwShPxmutcaVQZ8FMiJHRIzyWnS10AxayPKGVzJh3fLF/BiUwgcg==} + hasBin: true + + '@nuxt/devtools@1.6.4': + resolution: {integrity: sha512-uzHFXVEQnmxcbtbcpXjDEyILMp/jJNF1DN2/wSBm0r7UD82qaD2Aa66gX7dTY2+E0HG6aSNkZky3Ck8ehSk8nQ==} + hasBin: true + peerDependencies: + vite: '*' + + '@nuxt/kit@3.14.1592': + resolution: {integrity: sha512-r9r8bISBBisvfcNgNL3dSIQHSBe0v5YkX5zwNblIC2T0CIEgxEVoM5rq9O5wqgb5OEydsHTtT2hL57vdv6VT2w==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/schema@3.14.1592': + resolution: {integrity: sha512-A1d/08ueX8stTXNkvGqnr1eEXZgvKn+vj6s7jXhZNWApUSqMgItU4VK28vrrdpKbjIPwq2SwhnGOHUYvN9HwCQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/telemetry@2.6.0': + resolution: {integrity: sha512-h4YJ1d32cU7tDKjjhjtIIEck4WF/w3DTQBT348E9Pz85YLttnLqktLM0Ez9Xc2LzCeUgBDQv1el7Ob/zT3KUqg==} + hasBin: true + + '@nuxt/vite-builder@3.14.1592': + resolution: {integrity: sha512-GVS7vkBJAGv13ghmjgGrS2QVyzoqxQ5+cAUrMeMjKbY7GnRY7/uOkoLmznYx8E/U9HBUyHQa+wSN2ZfcSiEytQ==} + engines: {node: ^14.18.0 || >=16.10.0} + peerDependencies: + vue: ^3.3.4 + + '@parcel/watcher-android-arm64@2.5.0': + resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.0': + resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.0': + resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.0': + resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.0': + resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.0': + resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.0': + resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-wasm@2.5.0': + resolution: {integrity: sha512-Z4ouuR8Pfggk1EYYbTaIoxc+Yv4o7cGQnH0Xy8+pQ+HbiW+ZnwhcD2LPf/prfq1nIWpAxjOkQ8uSMFWMtBLiVQ==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-win32-arm64@2.5.0': + resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.0': + resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.0': + resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.0': + resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.17.1': + resolution: {integrity: sha512-CEmvaJuG7pm2ylQg53emPmtgm4nW2nxBgwXzbVEHpGas/lGnMyN8Zlkgiz6rPw0unASg6VW3wlz27SOL5XFHYQ==} + + '@redocly/openapi-core@1.26.0': + resolution: {integrity: sha512-8Ofu6WpBp7eoLmf1qQ4+T0W4LRr8es+4Drw/RJG+acPXmaT2TmHk2B2v+3+1R9GqSIj6kx3N7JmQkxAPCnvDLw==} + engines: {node: '>=14.19.0', npm: '>=7.0.0'} + + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@28.0.2': + resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.28.1': + resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.28.1': + resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.28.1': + resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.28.1': + resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.28.1': + resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.28.1': + resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.28.1': + resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.28.1': + resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.28.1': + resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.28.1': + resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.28.1': + resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.28.1': + resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.28.1': + resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.28.1': + resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.28.1': + resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + cpu: [x64] + os: [win32] + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@unhead/dom@1.11.14': + resolution: {integrity: sha512-FaHCWo9JR4h7PCpSRaXuMC6ifXOuBzlI0PD1MmUcxND2ayDl1d6DauIbN8TUf9TDRxNkrK1Ehb0OCXjC1ZJtrg==} + + '@unhead/schema@1.11.14': + resolution: {integrity: sha512-V9W9u5tF1/+TiLqxu+Qvh1ShoMDkPEwHoEo4DKdDG6ko7YlbzFfDxV6el9JwCren45U/4Vy/4Xi7j8OH02wsiA==} + + '@unhead/shared@1.11.14': + resolution: {integrity: sha512-41Qt4PJKYVrEGOTXgBJLRYrEu3S7n5stoB4TFC6312CIBVedXqg7voHQurn32LVDjpfJftjLa2ggCjpqdqoRDw==} + + '@unhead/ssr@1.11.14': + resolution: {integrity: sha512-JBF2f5PWPtpqBx/dan+4vL/dartSp8Nmd011zkT9qPYmizxO+/fsB1WQalbis1KszkfFatb6c4rO+hm0d6acOA==} + + '@unhead/vue@1.11.14': + resolution: {integrity: sha512-6nfi7FsZ936gscmj+1nUB1pybiFMFbnuEFo7B/OY2klpLWsYDUOVvpsJhbu7C3u7wkTlJXglmAk6jdd8I7WgZA==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@vercel/nft@0.27.9': + resolution: {integrity: sha512-pTs7OchHQmSYJPR0puVQCWw/NqzuvAtnAhBurz21lq4Y4KqWoMpYKqmikkETG5r1bHNCM/hQMZ5JiRr9mhOkyg==} + engines: {node: '>=16'} + hasBin: true + + '@vitejs/plugin-vue-jsx@4.1.1': + resolution: {integrity: sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue-macros/common@1.15.1': + resolution: {integrity: sha512-O0ZXaladWXwHplQnSjxLbB/G1KpdWCUNJPNYVHIxHonGex1BGpoB4fBZZLgddHgAiy18VZG/Iu5L0kwG+SV7JQ==} + engines: {node: '>=16.14.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + + '@vue/babel-helper-vue-transform-on@1.2.5': + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + + '@vue/babel-plugin-jsx@1.2.5': + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.5': + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-core@7.6.8': + resolution: {integrity: sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@7.6.8': + resolution: {integrity: sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==} + + '@vue/devtools-shared@7.6.8': + resolution: {integrity: sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + ast-kit@1.3.2: + resolution: {integrity: sha512-gdvX700WVC6sHCJQ7bJGfDvtuKAh6Sa6weIZROxfzUZKP7BjvB8y0SMlM/o4omSQ3L60PQSJROBJsb0vEViVnA==} + engines: {node: '>=16.14.0'} + + ast-walker-scope@0.6.2: + resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==} + engines: {node: '>=16.14.0'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + c12@2.0.1: + resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001689: + resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + clear@0.1.0: + resolution: {integrity: sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compatx@0.1.8: + resolution: {integrity: sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + croner@9.0.0: + resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} + engines: {node: '>=18.0'} + + cronstrue@2.52.0: + resolution: {integrity: sha512-NKgHbWkSZXJUcaBHSsyzC8eegD6bBd4O0oCI6XMIJ+y4Bq3v4w7sY3wfWoKPuVlq9pQHRB6od0lmKpIqi8TlKA==} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.1: + resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@7.0.6: + resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@5.0.0: + resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano@7.0.6: + resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + db0@0.2.1: + resolution: {integrity: sha512-BWSFmLaCkfyqbSEZBQINMVNjCVfrogi7GQ2RSy1tmtfK9OXlsup6lUMwLsqSD7FbAjD04eWFdXowSHHUp6SE/Q==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true + mysql2: + optional: true + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.73: + resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + + errx@0.1.0: + resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + externality@1.0.2: + resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-npm-meta@0.2.2: + resolution: {integrity: sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true + + git-config-path@2.0.0: + resolution: {integrity: sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==} + engines: {node: '>=4'} + + git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + + git-url-parse@15.0.0: + resolution: {integrity: sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + h3@1.13.0: + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + httpxy@0.1.5: + resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + + image-meta@0.2.1: + resolution: {integrity: sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==} + + impound@0.2.0: + resolution: {integrity: sha512-gXgeSyp9Hf7qG2/PLKmywHXyQf2xFrw+mJGpoj9DsAB9L7/MIKn+DeEx98UryWXdmbv8wUUPdcQof6qXnZoCGg==} + + index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + engines: {node: '>=18'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + engines: {node: '>=12.22.0'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.0: + resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jiti@2.4.1: + resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==} + hasBin: true + + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.2.0: + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + listhen@1.9.0: + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + hasBin: true + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string-ast@0.6.3: + resolution: {integrity: sha512-C9sgUzVZtUtzCBoMdYtwrIRQ4IucGRFGgdhkjL7PXsVfPYmTuWtewqzk7dlipaCMWH/gOYehW9rgMoa4Oebtpw==} + engines: {node: '>=16.14.0'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mime@4.0.4: + resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} + engines: {node: '>=16'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.9: + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + engines: {node: ^18 || >=20} + hasBin: true + + nanotar@0.1.1: + resolution: {integrity: sha512-AiJsGsSF3O0havL1BydvI4+wR76sKT+okKRwWIaK96cZUnXqH0uNBOsHlbwZq3+m2BR1VKqHDVudl3gO4mYjpQ==} + + nitropack@2.10.4: + resolution: {integrity: sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g==} + engines: {node: ^16.11.0 || >=17.0.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@8.0.0: + resolution: {integrity: sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nuxi@3.16.0: + resolution: {integrity: sha512-t9m4zTq44R0/icuzQXJHEyPRM3YbgTPMpytyb6YW2LOL/3mwZ3Bmte1FIlCoigzDvxBJRbcchZGc689+Syyu8w==} + engines: {node: ^16.10.0 || >=18.0.0} + hasBin: true + + nuxt@3.14.1592: + resolution: {integrity: sha512-roWAQH4Mb6WY72cNos+YVw0DgTCNAhNygiAMCedM7hbX6ESTR2n3VH7tU0yIWDPe/hfFdii4M4wWTTNHOtS44g==} + engines: {node: ^14.18.0 || >=16.10.0} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + '@types/node': ^14.18.0 || >=16.10.0 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + '@types/node': + optional: true + + nypm@0.3.12: + resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + nypm@0.4.1: + resolution: {integrity: sha512-1b9mihliBh8UCcKtcGRu//G50iHpjxIQVUqkdhPT/SDVE7KdJKoHXLS0heuYTQCx95dFqiyUbXZB9r8ikn+93g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + openapi-typescript@7.4.4: + resolution: {integrity: sha512-7j3nktnRzlQdlHnHsrcr6Gqz8f80/RhfA2I8s1clPI+jkY0hLNmnYVKBfuUEli5EEgK1B6M+ibdS5REasPlsUw==} + hasBin: true + peerDependencies: + typescript: ^5.x + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.7: + resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} + + parse-git-config@3.0.0: + resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} + engines: {node: '>=8'} + + parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + engines: {node: '>=18'} + + parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + + parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-calc@10.0.2: + resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@7.0.2: + resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@7.0.4: + resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-comments@7.0.3: + resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@7.0.1: + resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@7.0.0: + resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@7.0.0: + resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-longhand@7.0.4: + resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@7.0.4: + resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@7.0.0: + resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@7.0.0: + resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@7.0.2: + resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@7.0.4: + resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-charset@7.0.0: + resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@7.0.0: + resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@7.0.0: + resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@7.0.0: + resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@7.0.0: + resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@7.0.0: + resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@7.0.2: + resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@7.0.0: + resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@7.0.0: + resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-ordered-values@7.0.1: + resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-initial@7.0.2: + resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@7.0.0: + resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-svgo@7.0.1: + resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@7.0.3: + resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.9: + resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + + rollup@4.28.1: + resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-placeholder@2.0.2: + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.27.0: + resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + streamx@2.21.1: + resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + stylehacks@7.0.4: + resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.30.1: + resolution: {integrity: sha512-ojFL7eDMX2NF0xMbDwPZJ8sb7ckqtlAi1GsmgsFXvErT9kFTk1r0DuQKvrCh73M6D4nngeHJmvogF9OluXs7Hw==} + engines: {node: '>=16'} + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + ultrahtml@1.5.3: + resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + unctx@2.4.0: + resolution: {integrity: sha512-VSwGlVn3teRLkFS9OH4JoZ25ky133vVPQkS6qHv/itYVrqHBa+7SO46Yh07Zve1WEi9A1X135g9DR6KMv6ZsJg==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + unhead@1.11.14: + resolution: {integrity: sha512-XmXW0aZyX9kGk9ejCKCSvv/J4T3Rt4hoAe2EofM+nhG+zwZ7AArUMK/0F/fj6FTkfgY0u0/JryE00qUDULgygA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unimport@3.14.5: + resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-vue-router@0.10.9: + resolution: {integrity: sha512-DXmC0GMcROOnCmN56GRvi1bkkG1BnVs4xJqNvucBUeZkmB245URvtxOfbo3H6q4SOUQQbLPYWd6InzvjRh363A==} + peerDependencies: + vue-router: ^4.4.0 + peerDependenciesMeta: + vue-router: + optional: true + + unplugin@1.16.0: + resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==} + engines: {node: '>=14.0.0'} + + unplugin@2.0.0-beta.1: + resolution: {integrity: sha512-2qzQo5LN2DmUZXkWDHvGKLF5BP0WN+KthD6aPnPJ8plRBIjv4lh5O07eYcSxgO2znNw9s4MNhEO1sB+JDllDbQ==} + engines: {node: '>=18.12.0'} + + unplugin@2.1.0: + resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==} + engines: {node: '>=18.12.0'} + + unstorage@1.13.1: + resolution: {integrity: sha512-ELexQHUrG05QVIM/iUeQNdl9FXDZhqLJ4yP59fnmn2jGUh0TEulwOgov1ubOb3Gt2ZGK/VMchJwPDNVEGWQpRg==} + peerDependencies: + '@azure/app-configuration': ^1.7.0 + '@azure/cosmos': ^4.1.1 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^4.5.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.25.0 + '@capacitor/preferences': ^6.0.2 + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/kv': ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.4.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + + untyped@1.5.2: + resolution: {integrity: sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==} + hasBin: true + + unwasm@0.3.9: + resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-hot-client@0.2.4: + resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-checker@0.8.0: + resolution: {integrity: sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g==} + engines: {node: '>=14.16'} + peerDependencies: + '@biomejs/biome': '>=1.7' + eslint: '>=7' + meow: ^9.0.0 + optionator: ^0.9.1 + stylelint: '>=13' + typescript: '*' + vite: '>=2.0.0' + vls: '*' + vti: '*' + vue-tsc: ~2.1.6 + peerDependenciesMeta: + '@biomejs/biome': + optional: true + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite-plugin-inspect@0.8.9: + resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-inspector@5.1.3: + resolution: {integrity: sha512-pMrseXIDP1Gb38mOevY+BvtNGNqiqmqa2pKB99lnLsADQww9w9xMbAfT4GB6RUoaOkSPrtlXqpq2Fq+Dj2AgFg==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-languageclient@7.0.0: + resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} + engines: {vscode: ^1.52.0} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-bundle-renderer@2.1.1: + resolution: {integrity: sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==} + + vue-devtools-stub@0.1.0: + resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} + + vue-router@4.5.0: + resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} + peerDependencies: + vue: ^3.2.0 + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + zhead@2.2.4: + resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/utils@0.7.10': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.3': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@9.4.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.3 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.3 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/standalone@7.26.4': {} + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0(supports-color@9.4.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@cloudflare/kv-asset-handler@0.3.4': + dependencies: + mime: 3.0.0 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.24.0': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.24.0': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.24.0': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.24.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.24.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.24.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.24.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.24.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.24.0': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.24.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.24.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.24.0': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.24.0': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.24.0': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.24.0': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.24.0': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.24.0': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.24.0': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.24.0': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.24.0': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.24.0': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.24.0': + optional: true + + '@ioredis/commands@1.2.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.0(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@mapbox/node-pre-gyp@2.0.0-rc.0': + dependencies: + consola: 3.2.3 + detect-libc: 2.0.3 + https-proxy-agent: 7.0.6(supports-color@9.4.0) + node-fetch: 2.7.0 + nopt: 8.0.0 + semver: 7.6.3 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@netlify/functions@2.8.2': + dependencies: + '@netlify/serverless-functions-api': 1.26.1 + + '@netlify/node-cookies@0.1.0': {} + + '@netlify/serverless-functions-api@1.26.1': + dependencies: + '@netlify/node-cookies': 0.1.0 + urlpattern-polyfill: 8.0.2 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nuxt/devalue@2.0.2': {} + + '@nuxt/devtools-kit@1.6.4(magicast@0.3.5)(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': + dependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + execa: 7.2.0 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/devtools-wizard@1.6.4': + dependencies: + consola: 3.2.3 + diff: 7.0.0 + execa: 7.2.0 + global-directory: 4.0.1 + magicast: 0.3.5 + pathe: 1.1.2 + pkg-types: 1.2.1 + prompts: 2.4.2 + rc9: 2.1.2 + semver: 7.6.3 + + '@nuxt/devtools@1.6.4(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@antfu/utils': 0.7.10 + '@nuxt/devtools-kit': 1.6.4(magicast@0.3.5)(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + '@nuxt/devtools-wizard': 1.6.4 + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@vue/devtools-core': 7.6.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) + '@vue/devtools-kit': 7.6.8 + birpc: 0.2.19 + consola: 3.2.3 + cronstrue: 2.52.0 + destr: 2.0.3 + error-stack-parser-es: 0.1.5 + execa: 7.2.0 + fast-npm-meta: 0.2.2 + flatted: 3.3.2 + get-port-please: 3.1.2 + hookable: 5.5.3 + image-meta: 0.2.1 + is-installed-globally: 1.0.0 + launch-editor: 2.9.1 + local-pkg: 0.5.1 + magicast: 0.3.5 + nypm: 0.4.1 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + rc9: 2.1.2 + scule: 1.3.0 + semver: 7.6.3 + simple-git: 3.27.0 + sirv: 3.0.0 + tinyglobby: 0.2.10 + unimport: 3.14.5(rollup@4.28.1) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.28.1))(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + vite-plugin-vue-inspector: 5.1.3(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + which: 3.0.1 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - rollup + - supports-color + - utf-8-validate + - vue + + '@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.28.1)': + dependencies: + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + c12: 2.0.1(magicast@0.3.5) + consola: 3.2.3 + defu: 6.1.4 + destr: 2.0.3 + globby: 14.0.2 + hash-sum: 2.0.0 + ignore: 6.0.2 + jiti: 2.4.1 + klona: 2.0.6 + knitwork: 1.2.0 + mlly: 1.7.3 + pathe: 1.1.2 + pkg-types: 1.2.1 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.4 + unctx: 2.4.0 + unimport: 3.14.5(rollup@4.28.1) + untyped: 1.5.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.28.1)': + dependencies: + c12: 2.0.1(magicast@0.3.5) + compatx: 0.1.8 + consola: 3.2.3 + defu: 6.1.4 + hookable: 5.5.3 + pathe: 1.1.2 + pkg-types: 1.2.1 + scule: 1.3.0 + std-env: 3.8.0 + ufo: 1.5.4 + uncrypto: 0.1.3 + unimport: 3.14.5(rollup@4.28.1) + untyped: 1.5.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/telemetry@2.6.0(magicast@0.3.5)(rollup@4.28.1)': + dependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + ci-info: 4.1.0 + consola: 3.2.3 + create-require: 1.1.1 + defu: 6.1.4 + destr: 2.0.3 + dotenv: 16.4.7 + git-url-parse: 15.0.0 + is-docker: 3.0.0 + jiti: 1.21.6 + mri: 1.2.0 + nanoid: 5.0.9 + ofetch: 1.4.1 + package-manager-detector: 0.2.7 + parse-git-config: 3.0.0 + pathe: 1.1.2 + rc9: 2.1.2 + std-env: 3.8.0 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/vite-builder@3.14.1592(@types/node@22.10.2)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@rollup/plugin-replace': 6.0.2(rollup@4.28.1) + '@vitejs/plugin-vue': 5.2.1(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) + '@vitejs/plugin-vue-jsx': 4.1.1(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) + autoprefixer: 10.4.20(postcss@8.4.49) + clear: 0.1.0 + consola: 3.2.3 + cssnano: 7.0.6(postcss@8.4.49) + defu: 6.1.4 + esbuild: 0.24.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + externality: 1.0.2 + get-port-please: 3.1.2 + h3: 1.13.0 + jiti: 2.4.1 + knitwork: 1.2.0 + magic-string: 0.30.17 + mlly: 1.7.3 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + postcss: 8.4.49 + rollup-plugin-visualizer: 5.12.0(rollup@4.28.1) + std-env: 3.8.0 + strip-literal: 2.1.1 + ufo: 1.5.4 + unenv: 1.10.0 + unplugin: 1.16.0 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vite-node: 2.1.8(@types/node@22.10.2)(terser@5.37.0) + vite-plugin-checker: 0.8.0(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + vue: 3.5.13(typescript@5.7.2) + vue-bundle-renderer: 2.1.1 + transitivePeerDependencies: + - '@biomejs/biome' + - '@types/node' + - eslint + - less + - lightningcss + - magicast + - meow + - optionator + - rollup + - sass + - sass-embedded + - stylelint + - stylus + - sugarss + - supports-color + - terser + - typescript + - vls + - vti + - vue-tsc + + '@parcel/watcher-android-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-x64@2.5.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.0': + optional: true + + '@parcel/watcher-wasm@2.5.0': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 + + '@parcel/watcher-win32-arm64@2.5.0': + optional: true + + '@parcel/watcher-win32-ia32@2.5.0': + optional: true + + '@parcel/watcher-win32-x64@2.5.0': + optional: true + + '@parcel/watcher@2.5.0': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.0 + '@parcel/watcher-darwin-arm64': 2.5.0 + '@parcel/watcher-darwin-x64': 2.5.0 + '@parcel/watcher-freebsd-x64': 2.5.0 + '@parcel/watcher-linux-arm-glibc': 2.5.0 + '@parcel/watcher-linux-arm-musl': 2.5.0 + '@parcel/watcher-linux-arm64-glibc': 2.5.0 + '@parcel/watcher-linux-arm64-musl': 2.5.0 + '@parcel/watcher-linux-x64-glibc': 2.5.0 + '@parcel/watcher-linux-x64-musl': 2.5.0 + '@parcel/watcher-win32-arm64': 2.5.0 + '@parcel/watcher-win32-ia32': 2.5.0 + '@parcel/watcher-win32-x64': 2.5.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.28': {} + + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.17.1': {} + + '@redocly/openapi-core@1.26.0(supports-color@9.4.0)': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.17.1 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@9.4.0) + js-levenshtein: 1.1.6 + js-yaml: 4.1.0 + lodash.isequal: 4.5.0 + minimatch: 5.1.6 + node-fetch: 2.7.0 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - encoding + - supports-color + + '@rollup/plugin-alias@5.1.1(rollup@4.28.1)': + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-commonjs@28.0.2(rollup@4.28.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.2(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-inject@5.0.5(rollup@4.28.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-json@6.1.0(rollup@4.28.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-node-resolve@15.3.1(rollup@4.28.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.9 + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-replace@6.0.2(rollup@4.28.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-terser@0.4.4(rollup@4.28.1)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.37.0 + optionalDependencies: + rollup: 4.28.1 + + '@rollup/pluginutils@5.1.4(rollup@4.28.1)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.28.1 + + '@rollup/rollup-android-arm-eabi@4.28.1': + optional: true + + '@rollup/rollup-android-arm64@4.28.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.28.1': + optional: true + + '@rollup/rollup-darwin-x64@4.28.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.28.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.28.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.28.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.28.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.28.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.28.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.28.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.28.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.28.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.28.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.28.1': + optional: true + + '@sindresorhus/merge-streams@2.3.0': {} + + '@trysound/sax@0.2.0': {} + + '@types/estree@1.0.6': {} + + '@types/http-proxy@1.17.15': + dependencies: + '@types/node': 22.10.2 + + '@types/node@22.10.2': + dependencies: + undici-types: 6.20.0 + + '@types/resolve@1.20.2': {} + + '@unhead/dom@1.11.14': + dependencies: + '@unhead/schema': 1.11.14 + '@unhead/shared': 1.11.14 + + '@unhead/schema@1.11.14': + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + + '@unhead/shared@1.11.14': + dependencies: + '@unhead/schema': 1.11.14 + + '@unhead/ssr@1.11.14': + dependencies: + '@unhead/schema': 1.11.14 + '@unhead/shared': 1.11.14 + + '@unhead/vue@1.11.14(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@unhead/schema': 1.11.14 + '@unhead/shared': 1.11.14 + defu: 6.1.4 + hookable: 5.5.3 + unhead: 1.11.14 + vue: 3.5.13(typescript@5.7.2) + + '@vercel/nft@0.27.9(rollup@4.28.1)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0-rc.0 + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vitejs/plugin-vue-jsx@4.1.1(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vue: 3.5.13(typescript@5.7.2) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.1(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2))': + dependencies: + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vue: 3.5.13(typescript@5.7.2) + + '@vue-macros/common@1.15.1(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@babel/types': 7.26.3 + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@vue/compiler-sfc': 3.5.13 + ast-kit: 1.3.2 + local-pkg: 0.5.1 + magic-string-ast: 0.6.3 + optionalDependencies: + vue: 3.5.13(typescript@5.7.2) + transitivePeerDependencies: + - rollup + + '@vue/babel-helper-vue-transform-on@1.2.5': {} + + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/parser': 7.26.3 + '@vue/compiler-sfc': 3.5.13 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.3 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.3 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-core@7.6.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@vue/devtools-kit': 7.6.8 + '@vue/devtools-shared': 7.6.8 + mitt: 3.0.1 + nanoid: 5.0.9 + pathe: 1.1.2 + vite-hot-client: 0.2.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + vue: 3.5.13(typescript@5.7.2) + transitivePeerDependencies: + - vite + + '@vue/devtools-kit@7.6.8': + dependencies: + '@vue/devtools-shared': 7.6.8 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@7.6.8': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.2) + + '@vue/shared@3.5.13': {} + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@7.1.3: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + argparse@2.0.1: {} + + ast-kit@1.3.2: + dependencies: + '@babel/parser': 7.26.3 + pathe: 1.1.2 + + ast-walker-scope@0.6.2: + dependencies: + '@babel/parser': 7.26.3 + ast-kit: 1.3.2 + + async-sema@3.1.1: {} + + async@3.2.6: {} + + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + caniuse-lite: 1.0.30001689 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + b4a@1.6.7: {} + + balanced-match@1.0.2: {} + + bare-events@2.5.0: + optional: true + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + birpc@0.2.19: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001689 + electron-to-chromium: 1.5.73 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + + buffer-crc32@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + c12@2.0.1(magicast@0.3.5): + dependencies: + chokidar: 4.0.1 + confbox: 0.1.8 + defu: 6.1.4 + dotenv: 16.4.7 + giget: 1.2.3 + jiti: 2.4.1 + mlly: 1.7.3 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + + cac@6.7.14: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.24.3 + caniuse-lite: 1.0.30001689 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001689: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case@5.4.4: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + ci-info@4.1.0: {} + + citty@0.1.6: + dependencies: + consola: 3.2.3 + + clear@0.1.0: {} + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cluster-key-slot@1.1.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@1.4.0: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + commondir@1.0.1: {} + + compatx@0.1.8: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.2.3: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + + create-require@1.1.1: {} + + croner@9.0.0: {} + + cronstrue@2.52.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.1: + dependencies: + uncrypto: 0.1.3 + + css-declaration-sorter@7.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@7.0.6(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + css-declaration-sorter: 7.2.0(postcss@8.4.49) + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-calc: 10.0.2(postcss@8.4.49) + postcss-colormin: 7.0.2(postcss@8.4.49) + postcss-convert-values: 7.0.4(postcss@8.4.49) + postcss-discard-comments: 7.0.3(postcss@8.4.49) + postcss-discard-duplicates: 7.0.1(postcss@8.4.49) + postcss-discard-empty: 7.0.0(postcss@8.4.49) + postcss-discard-overridden: 7.0.0(postcss@8.4.49) + postcss-merge-longhand: 7.0.4(postcss@8.4.49) + postcss-merge-rules: 7.0.4(postcss@8.4.49) + postcss-minify-font-values: 7.0.0(postcss@8.4.49) + postcss-minify-gradients: 7.0.0(postcss@8.4.49) + postcss-minify-params: 7.0.2(postcss@8.4.49) + postcss-minify-selectors: 7.0.4(postcss@8.4.49) + postcss-normalize-charset: 7.0.0(postcss@8.4.49) + postcss-normalize-display-values: 7.0.0(postcss@8.4.49) + postcss-normalize-positions: 7.0.0(postcss@8.4.49) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.49) + postcss-normalize-string: 7.0.0(postcss@8.4.49) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.49) + postcss-normalize-unicode: 7.0.2(postcss@8.4.49) + postcss-normalize-url: 7.0.0(postcss@8.4.49) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.49) + postcss-ordered-values: 7.0.1(postcss@8.4.49) + postcss-reduce-initial: 7.0.2(postcss@8.4.49) + postcss-reduce-transforms: 7.0.0(postcss@8.4.49) + postcss-svgo: 7.0.1(postcss@8.4.49) + postcss-unique-selectors: 7.0.3(postcss@8.4.49) + + cssnano-utils@5.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + cssnano@7.0.6(postcss@8.4.49): + dependencies: + cssnano-preset-default: 7.0.6(postcss@8.4.49) + lilconfig: 3.1.3 + postcss: 8.4.49 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.1.3: {} + + db0@0.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0(supports-color@9.4.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 9.4.0 + + deepmerge@4.3.1: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-lazy-prop@2.0.0: {} + + define-lazy-prop@3.0.0: {} + + defu@6.1.4: {} + + denque@2.1.0: {} + + depd@2.0.0: {} + + destr@2.0.3: {} + + destroy@1.2.0: {} + + detect-libc@1.0.3: {} + + detect-libc@2.0.3: {} + + devalue@5.1.1: {} + + diff@7.0.0: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.30.1 + + dotenv@16.4.7: {} + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.73: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-stack-parser-es@0.1.5: {} + + errx@0.1.0: {} + + es-module-lexer@1.5.4: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@7.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + externality@1.0.2: + dependencies: + enhanced-resolve: 5.17.1 + mlly: 1.7.3 + pathe: 1.1.2 + ufo: 1.5.4 + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-npm-meta@0.2.2: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flatted@3.3.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-port-please@3.1.2: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + giget@1.2.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + defu: 6.1.4 + node-fetch-native: 1.6.4 + nypm: 0.3.12 + ohash: 1.1.4 + pathe: 1.1.2 + tar: 6.2.1 + + git-config-path@2.0.0: {} + + git-up@7.0.0: + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + + git-url-parse@15.0.0: + dependencies: + git-up: 7.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globals@11.12.0: {} + + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.2 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + graceful-fs@4.2.11: {} + + gzip-size@7.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.13.0: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.1 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + unenv: 1.10.0 + + has-flag@4.0.0: {} + + hash-sum@2.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookable@5.5.3: {} + + html-tags@3.3.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-shutdown@1.2.2: {} + + https-proxy-agent@7.0.6(supports-color@9.4.0): + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + + httpxy@0.1.5: {} + + human-signals@4.3.1: {} + + human-signals@5.0.0: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@6.0.2: {} + + image-meta@0.2.1: {} + + impound@0.2.0(rollup@4.28.1): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + mlly: 1.7.3 + pathe: 1.1.2 + unenv: 1.10.0 + unplugin: 1.16.0 + transitivePeerDependencies: + - rollup + + index-to-position@0.1.2: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + ioredis@5.4.1: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.4.0(supports-color@9.4.0) + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + iron-webcrypto@1.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.0: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.6 + + is-ssh@1.4.0: + dependencies: + protocols: 2.0.1 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-what@4.1.16: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + jiti@2.4.1: {} + + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + klona@2.0.6: {} + + knitwork@1.2.0: {} + + kolorist@1.8.0: {} + + launch-editor@2.9.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.2 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lilconfig@3.1.3: {} + + listhen@1.9.0: + dependencies: + '@parcel/watcher': 2.5.0 + '@parcel/watcher-wasm': 2.5.0 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.2.3 + crossws: 0.3.1 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.13.0 + http-shutdown: 1.2.2 + jiti: 2.4.1 + mlly: 1.7.3 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.8.0 + ufo: 1.5.4 + untun: 0.1.3 + uqr: 0.1.2 + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.3 + pkg-types: 1.2.1 + + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.isequal@4.5.0: {} + + lodash.memoize@4.1.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string-ast@0.6.3: + dependencies: + magic-string: 0.30.17 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + source-map-js: 1.2.1 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime@1.6.0: {} + + mime@3.0.0: {} + + mime@4.0.4: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + + mitt@3.0.1: {} + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.8: {} + + nanoid@5.0.9: {} + + nanotar@0.1.1: {} + + nitropack@2.10.4(typescript@5.7.2): + dependencies: + '@cloudflare/kv-asset-handler': 0.3.4 + '@netlify/functions': 2.8.2 + '@rollup/plugin-alias': 5.1.1(rollup@4.28.1) + '@rollup/plugin-commonjs': 28.0.2(rollup@4.28.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.28.1) + '@rollup/plugin-json': 6.1.0(rollup@4.28.1) + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.28.1) + '@rollup/plugin-replace': 6.0.2(rollup@4.28.1) + '@rollup/plugin-terser': 0.4.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@types/http-proxy': 1.17.15 + '@vercel/nft': 0.27.9(rollup@4.28.1) + archiver: 7.0.1 + c12: 2.0.1(magicast@0.3.5) + chokidar: 3.6.0 + citty: 0.1.6 + compatx: 0.1.8 + confbox: 0.1.8 + consola: 3.2.3 + cookie-es: 1.2.2 + croner: 9.0.0 + crossws: 0.3.1 + db0: 0.2.1 + defu: 6.1.4 + destr: 2.0.3 + dot-prop: 9.0.0 + esbuild: 0.24.0 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + fs-extra: 11.2.0 + globby: 14.0.2 + gzip-size: 7.0.0 + h3: 1.13.0 + hookable: 5.5.3 + httpxy: 0.1.5 + ioredis: 5.4.1 + jiti: 2.4.1 + klona: 2.0.6 + knitwork: 1.2.0 + listhen: 1.9.0 + magic-string: 0.30.17 + magicast: 0.3.5 + mime: 4.0.4 + mlly: 1.7.3 + node-fetch-native: 1.6.4 + ofetch: 1.4.1 + ohash: 1.1.4 + openapi-typescript: 7.4.4(typescript@5.7.2) + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + pretty-bytes: 6.1.1 + radix3: 1.1.2 + rollup: 4.28.1 + rollup-plugin-visualizer: 5.12.0(rollup@4.28.1) + scule: 1.3.0 + semver: 7.6.3 + serve-placeholder: 2.0.2 + serve-static: 1.16.2 + std-env: 3.8.0 + ufo: 1.5.4 + uncrypto: 0.1.3 + unctx: 2.4.0 + unenv: 1.10.0 + unimport: 3.14.5(rollup@4.28.1) + unstorage: 1.13.1(ioredis@5.4.1) + untyped: 1.5.2 + unwasm: 0.3.9 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - supports-color + - typescript + + node-addon-api@7.1.1: {} + + node-fetch-native@1.6.4: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.4: {} + + node-releases@2.0.19: {} + + nopt@8.0.0: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nuxi@3.16.0: {} + + nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(ioredis@5.4.1)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + dependencies: + '@nuxt/devalue': 2.0.2 + '@nuxt/devtools': 1.6.4(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@nuxt/telemetry': 2.6.0(magicast@0.3.5)(rollup@4.28.1) + '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.2)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) + '@unhead/dom': 1.11.14 + '@unhead/shared': 1.11.14 + '@unhead/ssr': 1.11.14 + '@unhead/vue': 1.11.14(vue@3.5.13(typescript@5.7.2)) + '@vue/shared': 3.5.13 + acorn: 8.14.0 + c12: 2.0.1(magicast@0.3.5) + chokidar: 4.0.1 + compatx: 0.1.8 + consola: 3.2.3 + cookie-es: 1.2.2 + defu: 6.1.4 + destr: 2.0.3 + devalue: 5.1.1 + errx: 0.1.0 + esbuild: 0.24.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + globby: 14.0.2 + h3: 1.13.0 + hookable: 5.5.3 + ignore: 6.0.2 + impound: 0.2.0(rollup@4.28.1) + jiti: 2.4.1 + klona: 2.0.6 + knitwork: 1.2.0 + magic-string: 0.30.17 + mlly: 1.7.3 + nanotar: 0.1.1 + nitropack: 2.10.4(typescript@5.7.2) + nuxi: 3.16.0 + nypm: 0.3.12 + ofetch: 1.4.1 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + radix3: 1.1.2 + scule: 1.3.0 + semver: 7.6.3 + std-env: 3.8.0 + strip-literal: 2.1.1 + tinyglobby: 0.2.10 + ufo: 1.5.4 + ultrahtml: 1.5.3 + uncrypto: 0.1.3 + unctx: 2.4.0 + unenv: 1.10.0 + unhead: 1.11.14 + unimport: 3.14.5(rollup@4.28.1) + unplugin: 1.16.0 + unplugin-vue-router: 0.10.9(rollup@4.28.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2)) + unstorage: 1.13.1(ioredis@5.4.1) + untyped: 1.5.2 + vue: 3.5.13(typescript@5.7.2) + vue-bundle-renderer: 2.1.1 + vue-devtools-stub: 0.1.0 + vue-router: 4.5.0(vue@3.5.13(typescript@5.7.2)) + optionalDependencies: + '@parcel/watcher': 2.5.0 + '@types/node': 22.10.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@biomejs/biome' + - '@capacitor/preferences' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - better-sqlite3 + - bufferutil + - drizzle-orm + - encoding + - eslint + - idb-keyval + - ioredis + - less + - lightningcss + - magicast + - meow + - mysql2 + - optionator + - rollup + - sass + - sass-embedded + - stylelint + - stylus + - sugarss + - supports-color + - terser + - typescript + - utf-8-validate + - vite + - vls + - vti + - vue-tsc + - xml2js + + nypm@0.3.12: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + execa: 8.0.1 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + + nypm@0.4.1: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + pathe: 1.1.2 + pkg-types: 1.2.1 + tinyexec: 0.3.1 + ufo: 1.5.4 + + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + openapi-typescript@7.4.4(typescript@5.7.2): + dependencies: + '@redocly/openapi-core': 1.26.0(supports-color@9.4.0) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.1.0 + supports-color: 9.4.0 + typescript: 5.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - encoding + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.7: {} + + parse-git-config@3.0.0: + dependencies: + git-config-path: 2.0.0 + ini: 1.3.8 + + parse-json@8.1.0: + dependencies: + '@babel/code-frame': 7.26.2 + index-to-position: 0.1.2 + type-fest: 4.30.1 + + parse-path@7.0.0: + dependencies: + protocols: 2.0.1 + + parse-url@8.1.0: + dependencies: + parse-path: 7.0.0 + + parseurl@1.3.3: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@5.0.0: {} + + pathe@1.1.2: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + + pluralize@8.0.0: {} + + postcss-calc@10.0.2(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.4(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.3(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-discard-duplicates@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-discard-empty@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-discard-overridden@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-merge-longhand@7.0.4(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.4(postcss@8.4.49) + + postcss-merge-rules@7.0.4(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.0(postcss@8.4.49): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.4(postcss@8.4.49): + dependencies: + cssesc: 3.0.0 + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-normalize-charset@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-normalize-display-values@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.1(postcss@8.4.49): + dependencies: + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + caniuse-api: 3.0.0 + postcss: 8.4.49 + + postcss-reduce-transforms@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@7.0.3(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-bytes@6.1.1: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + protocols@2.0.1: {} + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.3 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.0.2: {} + + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + resolve@1.22.9: + dependencies: + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rollup-plugin-visualizer@5.12.0(rollup@4.28.1): + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.28.1 + + rollup@4.28.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.28.1 + '@rollup/rollup-android-arm64': 4.28.1 + '@rollup/rollup-darwin-arm64': 4.28.1 + '@rollup/rollup-darwin-x64': 4.28.1 + '@rollup/rollup-freebsd-arm64': 4.28.1 + '@rollup/rollup-freebsd-x64': 4.28.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 + '@rollup/rollup-linux-arm-musleabihf': 4.28.1 + '@rollup/rollup-linux-arm64-gnu': 4.28.1 + '@rollup/rollup-linux-arm64-musl': 4.28.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 + '@rollup/rollup-linux-riscv64-gnu': 4.28.1 + '@rollup/rollup-linux-s390x-gnu': 4.28.1 + '@rollup/rollup-linux-x64-gnu': 4.28.1 + '@rollup/rollup-linux-x64-musl': 4.28.1 + '@rollup/rollup-win32-arm64-msvc': 4.28.1 + '@rollup/rollup-win32-ia32-msvc': 4.28.1 + '@rollup/rollup-win32-x64-msvc': 4.28.1 + fsevents: 2.3.3 + + run-applescript@7.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-placeholder@2.0.2: + dependencies: + defu: 6.1.4 + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-git@3.27.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.4.0(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slash@5.1.0: {} + + smob@1.5.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + speakingurl@14.0.1: {} + + standard-as-callback@2.1.0: {} + + statuses@2.0.1: {} + + std-env@3.8.0: {} + + streamx@2.21.1: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@3.0.0: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + stylehacks@7.0.4(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@9.4.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + + system-architecture@0.1.0: {} + + tapable@2.2.1: {} + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.21.1 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + tiny-invariant@1.3.3: {} + + tinyexec@0.3.1: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + tr46@0.0.3: {} + + type-fest@0.21.3: {} + + type-fest@4.30.1: {} + + typescript@5.7.2: {} + + ufo@1.5.4: {} + + ultrahtml@1.5.3: {} + + uncrypto@0.1.3: {} + + unctx@2.4.0: + dependencies: + acorn: 8.14.0 + estree-walker: 3.0.3 + magic-string: 0.30.17 + unplugin: 2.1.0 + + undici-types@6.20.0: {} + + unenv@1.10.0: + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + + unhead@1.11.14: + dependencies: + '@unhead/dom': 1.11.14 + '@unhead/schema': 1.11.14 + '@unhead/shared': 1.11.14 + hookable: 5.5.3 + + unicorn-magic@0.1.0: {} + + unimport@3.14.5(rollup@4.28.1): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.2 + local-pkg: 0.5.1 + magic-string: 0.30.17 + mlly: 1.7.3 + pathe: 1.1.2 + picomatch: 4.0.2 + pkg-types: 1.2.1 + scule: 1.3.0 + strip-literal: 2.1.1 + unplugin: 1.16.0 + transitivePeerDependencies: + - rollup + + universalify@2.0.1: {} + + unplugin-vue-router@0.10.9(rollup@4.28.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2)): + dependencies: + '@babel/types': 7.26.3 + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@vue-macros/common': 1.15.1(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2)) + ast-walker-scope: 0.6.2 + chokidar: 3.6.0 + fast-glob: 3.3.2 + json5: 2.2.3 + local-pkg: 0.5.1 + magic-string: 0.30.17 + mlly: 1.7.3 + pathe: 1.1.2 + scule: 1.3.0 + unplugin: 2.0.0-beta.1 + yaml: 2.6.1 + optionalDependencies: + vue-router: 4.5.0(vue@3.5.13(typescript@5.7.2)) + transitivePeerDependencies: + - rollup + - vue + + unplugin@1.16.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + unplugin@2.0.0-beta.1: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + unplugin@2.1.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + unstorage@1.13.1(ioredis@5.4.1): + dependencies: + anymatch: 3.1.3 + chokidar: 3.6.0 + citty: 0.1.6 + destr: 2.0.3 + h3: 1.13.0 + listhen: 1.9.0 + lru-cache: 10.4.3 + node-fetch-native: 1.6.4 + ofetch: 1.4.1 + ufo: 1.5.4 + optionalDependencies: + ioredis: 5.4.1 + + untun@0.1.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + pathe: 1.1.2 + + untyped@1.5.2: + dependencies: + '@babel/core': 7.26.0 + '@babel/standalone': 7.26.4 + '@babel/types': 7.26.3 + citty: 0.1.6 + defu: 6.1.4 + jiti: 2.4.1 + knitwork: 1.2.0 + scule: 1.3.0 + transitivePeerDependencies: + - supports-color + + unwasm@0.3.9: + dependencies: + knitwork: 1.2.0 + magic-string: 0.30.17 + mlly: 1.7.3 + pathe: 1.1.2 + pkg-types: 1.2.1 + unplugin: 1.16.0 + + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + uqr@0.1.2: {} + + uri-js-replace@1.0.1: {} + + urlpattern-polyfill@8.0.2: {} + + util-deprecate@1.0.2: {} + + vite-hot-client@0.2.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + dependencies: + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + + vite-node@2.1.8(@types/node@22.10.2)(terser@5.37.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0(supports-color@9.4.0) + es-module-lexer: 1.5.4 + pathe: 1.1.2 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-checker@0.8.0(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + dependencies: + '@babel/code-frame': 7.26.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 8.3.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + npm-run-path: 4.0.1 + strip-ansi: 6.0.1 + tiny-invariant: 1.3.3 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vscode-languageclient: 7.0.0 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + optionalDependencies: + typescript: 5.7.2 + + vite-plugin-inspect@0.8.9(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.28.1))(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + debug: 4.4.0(supports-color@9.4.0) + error-stack-parser-es: 0.1.5 + fs-extra: 11.2.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.1.1 + sirv: 3.0.0 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + optionalDependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-vue-inspector@5.1.3(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) + '@vue/compiler-dom': 3.5.13 + kolorist: 1.8.0 + magic-string: 0.30.17 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + transitivePeerDependencies: + - supports-color + + vite@5.4.11(@types/node@22.10.2)(terser@5.37.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.28.1 + optionalDependencies: + '@types/node': 22.10.2 + fsevents: 2.3.3 + terser: 5.37.0 + + vscode-jsonrpc@6.0.0: {} + + vscode-languageclient@7.0.0: + dependencies: + minimatch: 3.1.2 + semver: 7.6.3 + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-uri@3.0.8: {} + + vue-bundle-renderer@2.1.1: + dependencies: + ufo: 1.5.4 + + vue-devtools-stub@0.1.0: {} + + vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.7.2) + + vue@3.5.13(typescript@5.7.2): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.2 + + webidl-conversions@3.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@3.0.1: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml-ast-parser@0.0.43: {} + + yaml@2.6.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + zhead@2.2.4: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18993ad91cfd43e03b074dd0b5cc3f37ab38e49c GIT binary patch literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e Date: Mon, 16 Dec 2024 10:22:17 -0500 Subject: [PATCH 003/187] Install eslint module --- eslint.config.mjs | 4 + nuxt.config.ts | 10 +- package.json | 3 + pnpm-lock.yaml | 1540 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 1545 insertions(+), 12 deletions(-) create mode 100644 eslint.config.mjs diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..69822c66 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,4 @@ +// @ts-check +import withNuxt from './.nuxt/eslint.config.mjs'; + +export default withNuxt(); diff --git a/nuxt.config.ts b/nuxt.config.ts index 8ae12e6c..299a64ab 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,5 +1,9 @@ // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ - compatibilityDate: '2024-11-01', - devtools: { enabled: true } -}) + compatibilityDate: "2024-11-01", + devtools: { enabled: true }, + future: { + compatibilityVersion: 4, + }, + modules: ["@nuxt/eslint"], +}); diff --git a/package.json b/package.json index 400269f7..d211245a 100644 --- a/package.json +++ b/package.json @@ -13,5 +13,8 @@ "nuxt": "^3.14.1592", "vue": "latest", "vue-router": "latest" + }, + "devDependencies": { + "@nuxt/eslint": "0.7.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21761036..9dc350b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,17 @@ importers: dependencies: nuxt: specifier: ^3.14.1592 - version: 3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(ioredis@5.4.1)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + version: 3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) vue: specifier: latest version: 3.5.13(typescript@5.7.2) vue-router: specifier: latest version: 4.5.0(vue@3.5.13(typescript@5.7.2)) + devDependencies: + '@nuxt/eslint': + specifier: 0.7.3 + version: 0.7.3(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1))(magicast@0.3.5)(rollup@4.28.1)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) packages: @@ -24,9 +28,16 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@0.5.0': + resolution: {integrity: sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==} + '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@apidevtools/json-schema-ref-parser@11.7.3': + resolution: {integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==} + engines: {node: '>= 16'} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -167,10 +178,20 @@ packages: resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} + '@clack/core@0.3.5': + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + + '@clack/prompts@0.8.2': + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} + '@cloudflare/kv-asset-handler@0.3.4': resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} + '@es-joy/jsdoccomment@0.49.0': + resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} + engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -453,6 +474,75 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.2.4': + resolution: {integrity: sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-inspector@0.6.0': + resolution: {integrity: sha512-sN+ddom8AjUC5Zc/0uUVf11lpVudN+4cGVxA0ET6TsqE7Gezeug7NN6M8zonTpqsVSnaexGApwGUo0+6MsWfQQ==} + hasBin: true + peerDependencies: + eslint: ^8.50.0 || ^9.0.0 + + '@eslint/core@0.9.1': + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.4': + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -485,6 +575,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -512,14 +605,26 @@ packages: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} + '@nodelib/fs.scandir@3.0.0': + resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} + engines: {node: '>=16.14.0'} + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + '@nodelib/fs.stat@3.0.0': + resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} + engines: {node: '>=16.14.0'} + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nodelib/fs.walk@2.0.0': + resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} + engines: {node: '>=16.14.0'} + '@nuxt/devalue@2.0.2': resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} @@ -538,6 +643,32 @@ packages: peerDependencies: vite: '*' + '@nuxt/eslint-config@0.7.3': + resolution: {integrity: sha512-8udO5d+AUhKdn+CkJ5EO9gRvG8a3qwjXqBFnhExW/VE9vSyLTtjxopCgWvAngtkdotCM0zr9vkVp2Eg+VqBLag==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + eslint-plugin-format: '*' + peerDependenciesMeta: + eslint-plugin-format: + optional: true + + '@nuxt/eslint-plugin@0.7.3': + resolution: {integrity: sha512-yKaZGitmjAJ3peXZXDT8bDUT1wyC+VlaPuj6gm1GGBGyZP4cBnZVZmqMtR9YPT+rfcWkRt3T2628xYtv/hWNcQ==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@nuxt/eslint@0.7.3': + resolution: {integrity: sha512-EFq0W9hYklUcjt7/wNP+Fm+Wz3DZZ2eJS1l45GQU6g3CfAXdbpozu7L6FLeFatoVbWfNZtzjGmDbOI8UJVGrlw==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + eslint-webpack-plugin: ^4.1.0 + vite-plugin-eslint2: ^4.4.0 || ^5.0.0 + peerDependenciesMeta: + eslint-webpack-plugin: + optional: true + vite-plugin-eslint2: + optional: true + '@nuxt/kit@3.14.1592': resolution: {integrity: sha512-r9r8bISBBisvfcNgNL3dSIQHSBe0v5YkX5zwNblIC2T0CIEgxEVoM5rq9O5wqgb5OEydsHTtT2hL57vdv6VT2w==} engines: {node: ^14.18.0 || >=16.10.0} @@ -648,6 +779,10 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -832,6 +967,12 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@stylistic/eslint-plugin@2.12.1': + resolution: {integrity: sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.40.0' + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -842,12 +983,65 @@ packages: '@types/http-proxy@1.17.15': resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@typescript-eslint/eslint-plugin@8.18.0': + resolution: {integrity: sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/parser@8.18.0': + resolution: {integrity: sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/scope-manager@8.18.0': + resolution: {integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.18.0': + resolution: {integrity: sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/types@8.18.0': + resolution: {integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.18.0': + resolution: {integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/utils@8.18.0': + resolution: {integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/visitor-keys@8.18.0': + resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unhead/dom@1.11.14': resolution: {integrity: sha512-FaHCWo9JR4h7PCpSRaXuMC6ifXOuBzlI0PD1MmUcxND2ayDl1d6DauIbN8TUf9TDRxNkrK1Ehb0OCXjC1ZJtrg==} @@ -884,6 +1078,12 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 + '@voxpelli/config-array-find-files@1.2.1': + resolution: {integrity: sha512-mRqVGLcK+yU+fQyaHAL9Xbhw633spi+VGurX1+gwSiZS8SzX63WzOmGi3qXO7mn4cozJcExyzIC5WmbUFJWQOw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@eslint/config-array': '>=0.16.0' + '@vue-macros/common@1.15.1': resolution: {integrity: sha512-O0ZXaladWXwHplQnSjxLbB/G1KpdWCUNJPNYVHIxHonGex1BGpoB4fBZZLgddHgAiy18VZG/Iu5L0kwG+SV7JQ==} engines: {node: '>=16.14.0'} @@ -965,6 +1165,11 @@ packages: peerDependencies: acorn: ^8 + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -974,6 +1179,9 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1010,6 +1218,10 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1084,10 +1296,20 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + c12@2.0.1: resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} peerDependencies: @@ -1100,6 +1322,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -1136,6 +1362,10 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + clear@0.1.0: resolution: {integrity: sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==} @@ -1175,6 +1405,10 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -1205,6 +1439,9 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1314,6 +1551,14 @@ packages: supports-color: optional: true + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -1323,6 +1568,9 @@ packages: supports-color: optional: true + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1377,6 +1625,10 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1432,6 +1684,9 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser-es@0.1.5: resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} @@ -1458,16 +1713,129 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + eslint-config-flat-gitignore@0.2.0: + resolution: {integrity: sha512-s4lsQLYX+76FCt3PZPwdLwWlqssa5SLufl2gopFmCo3PETOLY3OW5IrD3/l2R0FfYEJvd9BRJ19yJ+yfc5oW3g==} + + eslint-flat-config-utils@0.4.0: + resolution: {integrity: sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-merge-processors@0.1.0: + resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} + peerDependencies: + eslint: '*' + + eslint-plugin-import-x@4.5.0: + resolution: {integrity: sha512-l0OTfnPF8RwmSXfjT75N8d6ZYLVrVYWpaGlgvVkVqFERCI5SyBfDP7QEMr3kt0zWi2sOa9EQ47clbdFsHkF83Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + eslint-plugin-jsdoc@50.6.1: + resolution: {integrity: sha512-UWyaYi6iURdSfdVVqvfOs2vdCVz0J40O/z/HTsv2sFjdjmdlUI/qlKLOTmwbPQ2tAfQnE5F9vqx+B+poF71DBQ==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-regexp@2.7.0: + resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==} + engines: {node: ^18 || >=20} + peerDependencies: + eslint: '>=8.44.0' + + eslint-plugin-unicorn@56.0.1: + resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} + engines: {node: '>=18.18'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-processor-vue-blocks@0.1.2: + resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} + peerDependencies: + '@vue/compiler-sfc': ^3.3.0 + eslint: ^8.50.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-typegen@0.3.2: + resolution: {integrity: sha512-YD/flDDDYoBszomo6wVAJ01HcEWTLfOb04+Mwir8/oR66t2bnajw+qUI6JfBoBQO3HbebcCmEtgjKgWVB67ggQ==} + peerDependencies: + eslint: ^8.45.0 || ^9.0.0 + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -1501,6 +1869,12 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-npm-meta@0.2.2: resolution: {integrity: sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==} @@ -1515,6 +1889,10 @@ packages: picomatch: optional: true + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -1522,6 +1900,26 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} @@ -1574,6 +1972,9 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true @@ -1592,6 +1993,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -1608,6 +2013,18 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + engines: {node: '>=18'} + globby@14.0.2: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} @@ -1615,6 +2032,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gzip-size@7.0.0: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1636,6 +2056,9 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -1677,9 +2100,21 @@ packages: image-meta@0.2.1: resolution: {integrity: sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + impound@0.2.0: resolution: {integrity: sha512-gXgeSyp9Hf7qG2/PLKmywHXyQf2xFrw+mJGpoj9DsAB9L7/MIKn+DeEx98UryWXdmbv8wUUPdcQof6qXnZoCGg==} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + index-to-position@0.1.2: resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} engines: {node: '>=18'} @@ -1705,10 +2140,17 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + is-core-module@2.16.0: resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} engines: {node: '>= 0.4'} @@ -1816,14 +2258,37 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-to-typescript-lite@14.1.0: + resolution: {integrity: sha512-b8K6P3aiLgiYKYcHacgZKrwPXPyjekqRPV5vkNfBt0EoohcOSXEbcuGzgi6KQmsAhuy5Mh2KMxofXodRhMxURA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1832,6 +2297,9 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -1853,18 +2321,41 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + listhen@1.9.0: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + local-pkg@0.5.1: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -1877,6 +2368,9 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -1935,6 +2429,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2009,6 +2507,9 @@ packages: nanotar@0.1.1: resolution: {integrity: sha512-AiJsGsSF3O0havL1BydvI4+wR76sKT+okKRwWIaK96cZUnXqH0uNBOsHlbwZq3+m2BR1VKqHDVudl3gO4mYjpQ==} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + nitropack@2.10.4: resolution: {integrity: sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g==} engines: {node: ^16.11.0 || >=17.0.0} @@ -2050,6 +2551,9 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2128,16 +2632,60 @@ packages: peerDependencies: typescript: ^5.x + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} package-manager-detector@0.2.7: resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-git-config@3.0.0: resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} engines: {node: '>=8'} + parse-imports@2.2.1: + resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} + engines: {node: '>= 18'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-json@8.1.0: resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} engines: {node: '>=18'} @@ -2152,6 +2700,14 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -2372,6 +2928,10 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -2390,6 +2950,10 @@ packages: protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2409,6 +2973,14 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2435,6 +3007,22 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2443,10 +3031,17 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.9: resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} hasBin: true @@ -2490,9 +3085,17 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2552,6 +3155,9 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} @@ -2570,10 +3176,28 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -2613,6 +3237,14 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} @@ -2646,6 +3278,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -2698,9 +3334,34 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} type-fest@4.30.1: resolution: {integrity: sha512-ojFL7eDMX2NF0xMbDwPZJ8sb7ckqtlAi1GsmgsFXvErT9kFTk1r0DuQKvrCh73M6D4nngeHJmvogF9OluXs7Hw==} @@ -2830,12 +3491,18 @@ packages: uri-js-replace@1.0.1: resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vite-hot-client@0.2.4: resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} peerDependencies: @@ -2956,6 +3623,12 @@ packages: vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + vue-router@4.5.0: resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} peerDependencies: @@ -2988,6 +3661,10 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3011,6 +3688,10 @@ packages: utf-8-validate: optional: true + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3041,6 +3722,14 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + zhead@2.2.4: resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} @@ -3055,8 +3744,19 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@antfu/install-pkg@0.5.0': + dependencies: + package-manager-detector: 0.2.7 + tinyexec: 0.3.1 + '@antfu/utils@0.7.10': {} + '@apidevtools/json-schema-ref-parser@11.7.3': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -3248,10 +3948,27 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@clack/core@0.3.5': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.8.2': + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@cloudflare/kv-asset-handler@0.3.4': dependencies: mime: 3.0.0 + '@es-joy/jsdoccomment@0.49.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.1.0 + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -3393,6 +4110,88 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.1))': + dependencies: + eslint: 9.17.0(jiti@2.4.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.4(eslint@9.17.0(jiti@2.4.1))': + optionalDependencies: + eslint: 9.17.0(jiti@2.4.1) + + '@eslint/config-array@0.19.1': + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.4.0(supports-color@9.4.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-inspector@0.6.0(eslint@9.17.0(jiti@2.4.1))': + dependencies: + '@eslint/config-array': 0.19.1 + '@voxpelli/config-array-find-files': 1.2.1(@eslint/config-array@0.19.1) + bundle-require: 5.0.0(esbuild@0.24.0) + cac: 6.7.14 + chokidar: 4.0.1 + esbuild: 0.24.0 + eslint: 9.17.0(jiti@2.4.1) + fast-glob: 3.3.2 + find-up: 7.0.0 + get-port-please: 3.1.2 + h3: 1.13.0 + minimatch: 9.0.5 + mlly: 1.7.3 + mrmime: 2.0.0 + open: 10.1.0 + picocolors: 1.1.1 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@eslint/core@0.9.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0(supports-color@9.4.0) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.17.0': {} + + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.4': + dependencies: + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -3430,6 +4229,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsdevtools/ono@7.1.3': {} + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.4.0(supports-color@9.4.0) @@ -3467,13 +4268,25 @@ snapshots: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + '@nodelib/fs.scandir@3.0.0': + dependencies: + '@nodelib/fs.stat': 3.0.0 + run-parallel: 1.2.0 + '@nodelib/fs.stat@2.0.5': {} + '@nodelib/fs.stat@3.0.0': {} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nodelib/fs.walk@2.0.0': + dependencies: + '@nodelib/fs.scandir': 3.0.0 + fastq: 1.17.1 + '@nuxt/devalue@2.0.2': {} '@nuxt/devtools-kit@1.6.4(magicast@0.3.5)(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': @@ -3547,6 +4360,70 @@ snapshots: - utf-8-validate - vue + '@nuxt/eslint-config@0.7.3(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@antfu/install-pkg': 0.5.0 + '@clack/prompts': 0.8.2 + '@eslint/js': 9.17.0 + '@nuxt/eslint-plugin': 0.7.3(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@stylistic/eslint-plugin': 2.12.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.1) + eslint-config-flat-gitignore: 0.2.0(eslint@9.17.0(jiti@2.4.1)) + eslint-flat-config-utils: 0.4.0 + eslint-merge-processors: 0.1.0(eslint@9.17.0(jiti@2.4.1)) + eslint-plugin-import-x: 4.5.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + eslint-plugin-jsdoc: 50.6.1(eslint@9.17.0(jiti@2.4.1)) + eslint-plugin-regexp: 2.7.0(eslint@9.17.0(jiti@2.4.1)) + eslint-plugin-unicorn: 56.0.1(eslint@9.17.0(jiti@2.4.1)) + eslint-plugin-vue: 9.32.0(eslint@9.17.0(jiti@2.4.1)) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1)) + globals: 15.13.0 + local-pkg: 0.5.1 + pathe: 1.1.2 + vue-eslint-parser: 9.4.3(eslint@9.17.0(jiti@2.4.1)) + transitivePeerDependencies: + - '@vue/compiler-sfc' + - supports-color + - typescript + + '@nuxt/eslint-plugin@0.7.3(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.18.0 + '@typescript-eslint/utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.1) + transitivePeerDependencies: + - supports-color + - typescript + + '@nuxt/eslint@0.7.3(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1))(magicast@0.3.5)(rollup@4.28.1)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': + dependencies: + '@eslint/config-inspector': 0.6.0(eslint@9.17.0(jiti@2.4.1)) + '@nuxt/devtools-kit': 1.6.4(magicast@0.3.5)(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + '@nuxt/eslint-config': 0.7.3(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@nuxt/eslint-plugin': 0.7.3(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + chokidar: 4.0.1 + eslint: 9.17.0(jiti@2.4.1) + eslint-flat-config-utils: 0.4.0 + eslint-typegen: 0.3.2(eslint@9.17.0(jiti@2.4.1)) + find-up: 7.0.0 + get-port-please: 3.1.2 + mlly: 1.7.3 + pathe: 1.1.2 + unimport: 3.14.5(rollup@4.28.1) + transitivePeerDependencies: + - '@vue/compiler-sfc' + - bufferutil + - eslint-plugin-format + - magicast + - rollup + - supports-color + - typescript + - utf-8-validate + - vite + '@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.28.1)': dependencies: '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) @@ -3619,7 +4496,7 @@ snapshots: - rollup - supports-color - '@nuxt/vite-builder@3.14.1592(@types/node@22.10.2)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))': + '@nuxt/vite-builder@3.14.1592(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))': dependencies: '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) '@rollup/plugin-replace': 6.0.2(rollup@4.28.1) @@ -3653,7 +4530,7 @@ snapshots: unplugin: 1.16.0 vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) vite-node: 2.1.8(@types/node@22.10.2)(terser@5.37.0) - vite-plugin-checker: 0.8.0(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + vite-plugin-checker: 0.8.0(eslint@9.17.0(jiti@2.4.1))(optionator@0.9.4)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) vue: 3.5.13(typescript@5.7.2) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -3746,6 +4623,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.1.1': {} + '@polka/url@1.0.0-next.28': {} '@redocly/ajv@8.11.2': @@ -3896,6 +4775,18 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@stylistic/eslint-plugin@2.12.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.1) + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + estraverse: 5.3.0 + picomatch: 4.0.2 + transitivePeerDependencies: + - supports-color + - typescript + '@trysound/sax@0.2.0': {} '@types/estree@1.0.6': {} @@ -3904,12 +4795,93 @@ snapshots: dependencies: '@types/node': 22.10.2 + '@types/json-schema@7.0.15': {} + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 + '@types/normalize-package-data@2.4.4': {} + '@types/resolve@1.20.2': {} + '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.0 + '@typescript-eslint/type-utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.0 + eslint: 9.17.0(jiti@2.4.1) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.18.0 + '@typescript-eslint/types': 8.18.0 + '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.0 + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.1) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.18.0': + dependencies: + '@typescript-eslint/types': 8.18.0 + '@typescript-eslint/visitor-keys': 8.18.0 + + '@typescript-eslint/type-utils@8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.1) + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.18.0': {} + + '@typescript-eslint/typescript-estree@8.18.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.18.0 + '@typescript-eslint/visitor-keys': 8.18.0 + debug: 4.4.0(supports-color@9.4.0) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + '@typescript-eslint/scope-manager': 8.18.0 + '@typescript-eslint/types': 8.18.0 + '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.1) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.18.0': + dependencies: + '@typescript-eslint/types': 8.18.0 + eslint-visitor-keys: 4.2.0 + '@unhead/dom@1.11.14': dependencies: '@unhead/schema': 1.11.14 @@ -3972,6 +4944,11 @@ snapshots: vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) vue: 3.5.13(typescript@5.7.2) + '@voxpelli/config-array-find-files@1.2.1(@eslint/config-array@0.19.1)': + dependencies: + '@eslint/config-array': 0.19.1 + '@nodelib/fs.walk': 2.0.0 + '@vue-macros/common@1.15.1(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2))': dependencies: '@babel/types': 7.26.3 @@ -4107,10 +5084,21 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@8.14.0: {} agent-base@7.1.3: {} + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -4152,6 +5140,8 @@ snapshots: tar-stream: 3.1.7 zip-stream: 6.0.1 + are-docs-informative@0.0.2: {} + argparse@2.0.1: {} ast-kit@1.3.2: @@ -4226,10 +5216,17 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + builtin-modules@3.3.0: {} + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 + bundle-require@5.0.0(esbuild@0.24.0): + dependencies: + esbuild: 0.24.0 + load-tsconfig: 0.2.5 + c12@2.0.1(magicast@0.3.5): dependencies: chokidar: 4.0.1 @@ -4249,6 +5246,8 @@ snapshots: cac@6.7.14: {} + callsites@3.1.0: {} + caniuse-api@3.0.0: dependencies: browserslist: 4.24.3 @@ -4291,6 +5290,10 @@ snapshots: dependencies: consola: 3.2.3 + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + clear@0.1.0: {} clipboardy@4.0.0: @@ -4323,6 +5326,8 @@ snapshots: commander@8.3.0: {} + comment-parser@1.4.1: {} + commondir@1.0.1: {} compatx@0.1.8: {} @@ -4349,6 +5354,10 @@ snapshots: dependencies: is-what: 4.1.16 + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.3 + core-util-is@1.0.3: {} crc-32@1.2.2: {} @@ -4456,12 +5465,18 @@ snapshots: dependencies: ms: 2.0.0 + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@9.4.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 9.4.0 + deep-is@0.1.4: {} + deepmerge@4.3.1: {} default-browser-id@5.0.0: {} @@ -4493,6 +5508,10 @@ snapshots: diff@7.0.0: {} + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -4540,6 +5559,10 @@ snapshots: entities@4.5.0: {} + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + error-stack-parser-es@0.1.5: {} errx@0.1.0: {} @@ -4603,14 +5626,211 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + eslint-config-flat-gitignore@0.2.0(eslint@9.17.0(jiti@2.4.1)): + dependencies: + '@eslint/compat': 1.2.4(eslint@9.17.0(jiti@2.4.1)) + find-up-simple: 1.0.0 + transitivePeerDependencies: + - eslint + + eslint-flat-config-utils@0.4.0: + dependencies: + pathe: 1.1.2 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.0 + resolve: 1.22.9 + transitivePeerDependencies: + - supports-color + + eslint-merge-processors@0.1.0(eslint@9.17.0(jiti@2.4.1)): + dependencies: + eslint: 9.17.0(jiti@2.4.1) + + eslint-plugin-import-x@4.5.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2): + dependencies: + '@typescript-eslint/scope-manager': 8.18.0 + '@typescript-eslint/utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + debug: 4.4.0(supports-color@9.4.0) + doctrine: 3.0.0 + eslint: 9.17.0(jiti@2.4.1) + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.8.1 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + stable-hash: 0.0.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsdoc@50.6.1(eslint@9.17.0(jiti@2.4.1)): + dependencies: + '@es-joy/jsdoccomment': 0.49.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.0(supports-color@9.4.0) + escape-string-regexp: 4.0.0 + eslint: 9.17.0(jiti@2.4.1) + espree: 10.3.0 + esquery: 1.6.0 + parse-imports: 2.2.1 + semver: 7.6.3 + spdx-expression-parse: 4.0.0 + synckit: 0.9.2 + transitivePeerDependencies: + - supports-color + + eslint-plugin-regexp@2.7.0(eslint@9.17.0(jiti@2.4.1)): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + '@eslint-community/regexpp': 4.12.1 + comment-parser: 1.4.1 + eslint: 9.17.0(jiti@2.4.1) + jsdoc-type-pratt-parser: 4.1.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 + + eslint-plugin-unicorn@56.0.1(eslint@9.17.0(jiti@2.4.1)): + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + ci-info: 4.1.0 + clean-regexp: 1.0.0 + core-js-compat: 3.39.0 + eslint: 9.17.0(jiti@2.4.1) + esquery: 1.6.0 + globals: 15.13.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.3 + strip-indent: 3.0.0 + + eslint-plugin-vue@9.32.0(eslint@9.17.0(jiti@2.4.1)): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + eslint: 9.17.0(jiti@2.4.1) + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@9.17.0(jiti@2.4.1)) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1)): + dependencies: + '@vue/compiler-sfc': 3.5.13 + eslint: 9.17.0(jiti@2.4.1) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-typegen@0.3.2(eslint@9.17.0(jiti@2.4.1)): + dependencies: + eslint: 9.17.0(jiti@2.4.1) + json-schema-to-typescript-lite: 14.1.0 + ohash: 1.1.4 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.17.0(jiti@2.4.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@9.4.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.1 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.6 + esutils@2.0.3: {} + etag@1.8.1: {} event-target-shim@5.0.1: {} @@ -4660,6 +5880,10 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fast-npm-meta@0.2.2: {} fastq@1.17.1: @@ -4670,12 +5894,39 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-uri-to-path@1.0.0: {} fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-up-simple@1.0.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + flatted@3.3.2: {} foreground-child@3.3.0: @@ -4714,6 +5965,10 @@ snapshots: get-stream@8.0.1: {} + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + giget@1.2.3: dependencies: citty: 0.1.6 @@ -4740,6 +5995,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@10.4.5: dependencies: foreground-child: 3.3.0 @@ -4764,6 +6023,14 @@ snapshots: globals@11.12.0: {} + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.13.0: {} + globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -4775,6 +6042,8 @@ snapshots: graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + gzip-size@7.0.0: dependencies: duplexer: 0.1.2 @@ -4802,6 +6071,8 @@ snapshots: hookable@5.5.3: {} + hosted-git-info@2.8.9: {} + html-tags@3.3.1: {} http-errors@2.0.0: @@ -4835,6 +6106,11 @@ snapshots: image-meta@0.2.1: {} + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + impound@0.2.0(rollup@4.28.1): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.28.1) @@ -4845,6 +6121,10 @@ snapshots: transitivePeerDependencies: - rollup + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + index-to-position@0.1.2: {} inflight@1.0.6: @@ -4874,10 +6154,16 @@ snapshots: iron-webcrypto@1.2.1: {} + is-arrayish@0.2.1: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + is-core-module@2.16.0: dependencies: hasown: 2.0.2 @@ -4959,10 +6245,27 @@ snapshots: dependencies: argparse: 2.0.1 + jsdoc-type-pratt-parser@4.1.0: {} + + jsesc@0.5.0: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-to-typescript-lite@14.1.0: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.3 + '@types/json-schema': 7.0.15 + + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} jsonfile@6.1.0: @@ -4971,6 +6274,10 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kleur@3.0.3: {} klona@2.0.6: {} @@ -4988,8 +6295,15 @@ snapshots: dependencies: readable-stream: 2.3.8 + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} + listhen@1.9.0: dependencies: '@parcel/watcher': 2.5.0 @@ -5011,11 +6325,25 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 + load-tsconfig@0.2.5: {} + local-pkg@0.5.1: dependencies: mlly: 1.7.3 pkg-types: 1.2.1 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} @@ -5024,6 +6352,8 @@ snapshots: lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.uniq@4.5.0: {} lodash@4.17.21: {} @@ -5069,6 +6399,8 @@ snapshots: mimic-fn@4.0.0: {} + min-indent@1.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5126,6 +6458,8 @@ snapshots: nanotar@0.1.1: {} + natural-compare@1.4.0: {} + nitropack@2.10.4(typescript@5.7.2): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 @@ -5236,6 +6570,13 @@ snapshots: dependencies: abbrev: 2.0.0 + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.9 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -5254,14 +6595,14 @@ snapshots: nuxi@3.16.0: {} - nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(ioredis@5.4.1)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/devtools': 1.6.4(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) '@nuxt/telemetry': 2.6.0(magicast@0.3.5)(rollup@4.28.1) - '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.2)(magicast@0.3.5)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) + '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) '@unhead/dom': 1.11.14 '@unhead/shared': 1.11.14 '@unhead/ssr': 1.11.14 @@ -5430,15 +6771,66 @@ snapshots: transitivePeerDependencies: - encoding + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} package-manager-detector@0.2.7: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-git-config@3.0.0: dependencies: git-config-path: 2.0.0 ini: 1.3.8 + parse-imports@2.2.1: + dependencies: + es-module-lexer: 1.5.4 + slashes: 3.0.12 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-json@8.1.0: dependencies: '@babel/code-frame': 7.26.2 @@ -5455,6 +6847,10 @@ snapshots: parseurl@1.3.3: {} + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -5650,6 +7046,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + pretty-bytes@6.1.1: {} process-nextick-args@2.0.1: {} @@ -5663,6 +7061,8 @@ snapshots: protocols@2.0.1: {} + punycode@2.3.1: {} + queue-microtask@1.2.3: {} queue-tick@1.0.1: {} @@ -5680,6 +7080,19 @@ snapshots: defu: 6.1.4 destr: 2.0.3 + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -5714,12 +7127,31 @@ snapshots: dependencies: redis-errors: 1.2.0 + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + + regexp-tree@0.1.27: {} + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.9: dependencies: is-core-module: 2.16.0 @@ -5778,8 +7210,16 @@ snapshots: safe-buffer@5.2.1: {} + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scule@1.3.0: {} + semver@5.7.2: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -5851,6 +7291,8 @@ snapshots: slash@5.1.0: {} + slashes@3.0.12: {} + smob@1.5.0: {} source-map-js@1.2.1: {} @@ -5864,8 +7306,29 @@ snapshots: source-map@0.7.4: {} + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + speakingurl@14.0.1: {} + stable-hash@0.0.4: {} + standard-as-callback@2.1.0: {} statuses@2.0.1: {} @@ -5910,6 +7373,12 @@ snapshots: strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + strip-literal@2.1.1: dependencies: js-tokens: 9.0.1 @@ -5944,6 +7413,11 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + system-architecture@0.1.0: {} tapable@2.2.1: {} @@ -6002,8 +7476,24 @@ snapshots: tr46@0.0.3: {} + ts-api-utils@1.4.3(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + type-fest@0.21.3: {} + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + type-fest@4.30.1: {} typescript@5.7.2: {} @@ -6151,10 +7641,19 @@ snapshots: uri-js-replace@1.0.1: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + urlpattern-polyfill@8.0.2: {} util-deprecate@1.0.2: {} + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + vite-hot-client@0.2.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): dependencies: vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) @@ -6177,7 +7676,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.8.0(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): + vite-plugin-checker@0.8.0(eslint@9.17.0(jiti@2.4.1))(optionator@0.9.4)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): dependencies: '@babel/code-frame': 7.26.2 ansi-escapes: 4.3.2 @@ -6195,6 +7694,8 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: + eslint: 9.17.0(jiti@2.4.1) + optionator: 0.9.4 typescript: 5.7.2 vite-plugin-inspect@0.8.9(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.28.1))(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): @@ -6269,6 +7770,19 @@ snapshots: vue-devtools-stub@0.1.0: {} + vue-eslint-parser@9.4.3(eslint@9.17.0(jiti@2.4.1)): + dependencies: + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.1) + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)): dependencies: '@vue/devtools-api': 6.6.4 @@ -6301,6 +7815,8 @@ snapshots: dependencies: isexe: 2.0.0 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -6317,6 +7833,8 @@ snapshots: ws@8.18.0: {} + xml-name-validator@4.0.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -6341,6 +7859,10 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + zhead@2.2.4: {} zip-stream@6.0.1: From c122e0e287c5f43ea29020743fe8a3ad32d701b4 Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Mon, 16 Dec 2024 10:23:16 -0500 Subject: [PATCH 004/187] Install nuxt/content --- nuxt.config.ts | 2 +- package.json | 1 + pnpm-lock.yaml | 1404 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 1405 insertions(+), 2 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 299a64ab..1473f166 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -5,5 +5,5 @@ export default defineNuxtConfig({ future: { compatibilityVersion: 4, }, - modules: ["@nuxt/eslint"], + modules: ["@nuxt/eslint", "@nuxt/content"], }); diff --git a/package.json b/package.json index d211245a..6ca80872 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "vue-router": "latest" }, "devDependencies": { + "@nuxt/content": "2.13.4", "@nuxt/eslint": "0.7.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9dc350b3..2418383a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: specifier: latest version: 4.5.0(vue@3.5.13(typescript@5.7.2)) devDependencies: + '@nuxt/content': + specifier: 2.13.4 + version: 2.13.4(ioredis@5.4.1)(magicast@0.3.5)(nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)))(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2)) '@nuxt/eslint': specifier: 0.7.3 version: 0.7.3(@vue/compiler-sfc@3.5.13)(eslint@9.17.0(jiti@2.4.1))(magicast@0.3.5)(rollup@4.28.1)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) @@ -625,6 +628,9 @@ packages: resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} engines: {node: '>=16.14.0'} + '@nuxt/content@2.13.4': + resolution: {integrity: sha512-NBaHL/SNYUK7+RLgOngSFmKqEPYc0dYdnwVFsxIdrOZUoUbD8ERJJDaoRwwtyYCMOgUeFA/zxAkuADytp+DKiQ==} + '@nuxt/devalue@2.0.2': resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} @@ -687,6 +693,9 @@ packages: peerDependencies: vue: ^3.3.4 + '@nuxtjs/mdc@0.9.5': + resolution: {integrity: sha512-bTnlY+oiW8QsmrLoiYN+rkSYxl7asELlwYeU9QPSkun5BVx7Yd8RajH8I+0QJZiMZzIHaO3LEgf3lzp5Lg6E0A==} + '@parcel/watcher-android-arm64@2.5.0': resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} engines: {node: '>= 10.0.0'} @@ -963,10 +972,35 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@1.24.2': + resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} + + '@shikijs/engine-javascript@1.24.2': + resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} + + '@shikijs/engine-oniguruma@1.24.2': + resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} + + '@shikijs/transformers@1.24.2': + resolution: {integrity: sha512-cIwn8YSwO3bsWKJ+pezcXY1Vq0BVwvuLes1TZSC5+Awi6Tsfqhf3vBahOIqZK1rraMKOti2VEAEF/95oXMig1w==} + + '@shikijs/types@1.24.2': + resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} + + '@shikijs/vscode-textmate@9.3.1': + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@stylistic/eslint-plugin@2.12.1': resolution: {integrity: sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -977,15 +1011,27 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/http-proxy@1.17.15': resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} @@ -995,6 +1041,15 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@typescript-eslint/eslint-plugin@8.18.0': resolution: {integrity: sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1042,6 +1097,9 @@ packages: resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@unhead/dom@1.11.14': resolution: {integrity: sha512-FaHCWo9JR4h7PCpSRaXuMC6ifXOuBzlI0PD1MmUcxND2ayDl1d6DauIbN8TUf9TDRxNkrK1Ehb0OCXjC1ZJtrg==} @@ -1152,6 +1210,25 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vueuse/core@11.3.0': + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + + '@vueuse/head@2.0.0': + resolution: {integrity: sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@vueuse/metadata@11.3.0': + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + + '@vueuse/nuxt@11.3.0': + resolution: {integrity: sha512-FxtRTgFmsoASamR3lOftv/r11o1BojF9zir8obbTnKamVZdlQ5rgJ0hHgVbrgA6dlMuEx/PzwqAmiKNFdU4oCQ==} + peerDependencies: + nuxt: ^3.0.0 + + '@vueuse/shared@11.3.0': + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1249,6 +1326,9 @@ packages: b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1332,6 +1412,9 @@ packages: caniuse-lite@1.0.30001689: resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1339,6 +1422,22 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1394,6 +1493,9 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1559,6 +1661,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -1568,6 +1679,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1602,6 +1716,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} @@ -1609,6 +1727,9 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detab@3.0.2: + resolution: {integrity: sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==} + detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -1621,6 +1742,9 @@ packages: devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} @@ -1662,12 +1786,21 @@ packages: electron-to-chromium@1.5.73: resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + emoticon@4.1.0: + resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -1676,6 +1809,13 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + engine.io-client@6.6.2: + resolution: {integrity: sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -1856,6 +1996,9 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + externality@1.0.2: resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} @@ -1920,6 +2063,11 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flat@6.0.1: + resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==} + engines: {node: '>=18'} + hasBin: true + flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} @@ -1989,6 +2137,9 @@ packages: git-url-parse@15.0.0: resolution: {integrity: sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2053,6 +2204,36 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-from-parse5@8.0.2: + resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.0: + resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -2063,6 +2244,9 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -2140,6 +2324,16 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -2155,6 +2349,9 @@ packages: resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2177,6 +2374,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2197,6 +2397,10 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -2377,6 +2581,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2393,12 +2600,54 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2406,6 +2655,90 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2456,6 +2789,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minisearch@7.1.1: + resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -2523,6 +2859,10 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} @@ -2618,6 +2958,9 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-to-es@0.7.0: + resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -2674,6 +3017,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-git-config@3.0.0: resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} engines: {node: '>=8'} @@ -2696,6 +3042,9 @@ packages: parse-url@8.1.0: resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2947,6 +3296,9 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} @@ -3011,6 +3363,15 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regex-recursion@4.3.0: + resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -3023,6 +3384,40 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-sort-attribute-values@5.0.1: + resolution: {integrity: sha512-lU3ABJO5frbUgV132YS6SL7EISf//irIm9KFMaeu5ixHfgWf6jhe+09Uf/Ef8pOYUJWKOaQJDRJGCXs6cNsdsQ==} + + rehype-sort-attributes@5.0.1: + resolution: {integrity: sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg==} + + remark-emoji@5.0.1: + resolution: {integrity: sha512-QCqTSvcZ65Ym+P+VyBKd4JfJfh7icMl7cIOGVmPMzWkDtdD8pQ0nQG7yxGolVIiMzSx90EZ7SwNiVpYpfTxn7w==} + engines: {node: '>=18'} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdc@3.5.0: + resolution: {integrity: sha512-Amz+Km+E3IkIS23ZbzPM+JRmLUT0iNkNCBHBSTWB187vi3Uv0iIWxHiH8EtoOqCCTDWEYrIh+KAIEf5kvqxT1Q==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3134,6 +3529,9 @@ packages: resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} + shiki@1.24.2: + resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3151,6 +3549,10 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -3158,9 +3560,21 @@ packages: slashes@3.0.12: resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + slugify@1.6.6: + resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + engines: {node: '>=8.0.0'} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -3176,6 +3590,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3225,6 +3642,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3334,6 +3754,12 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -3393,13 +3819,38 @@ packages: unhead@1.11.14: resolution: {integrity: sha512-XmXW0aZyX9kGk9ejCKCSvv/J4T3Rt4hoAe2EofM+nhG+zwZ7AArUMK/0F/fj6FTkfgY0u0/JryE00qUDULgygA==} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unimport@3.14.5: resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==} + unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3503,6 +3954,15 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-hot-client@0.2.4: resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} peerDependencies: @@ -3620,6 +4080,17 @@ packages: vue-bundle-renderer@2.1.1: resolution: {integrity: sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} @@ -3642,6 +4113,9 @@ packages: typescript: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -3676,6 +4150,18 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -3692,6 +4178,10 @@ packages: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3737,6 +4227,9 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@ampproject/remapping@2.3.0': @@ -4287,6 +4780,58 @@ snapshots: '@nodelib/fs.scandir': 3.0.0 fastq: 1.17.1 + '@nuxt/content@2.13.4(ioredis@5.4.1)(magicast@0.3.5)(nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)))(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@nuxtjs/mdc': 0.9.5(magicast@0.3.5)(rollup@4.28.1) + '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/head': 2.0.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/nuxt': 11.3.0(magicast@0.3.5)(nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)))(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2)) + consola: 3.2.3 + defu: 6.1.4 + destr: 2.0.3 + json5: 2.2.3 + knitwork: 1.2.0 + listhen: 1.9.0 + mdast-util-to-string: 4.0.0 + mdurl: 2.0.0 + micromark: 4.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-types: 2.0.1 + minisearch: 7.1.1 + ohash: 1.1.4 + pathe: 1.1.2 + scule: 1.3.0 + shiki: 1.24.2 + slugify: 1.6.6 + socket.io-client: 4.8.1 + ufo: 1.5.4 + unist-util-stringify-position: 4.0.0 + unstorage: 1.13.1(ioredis@5.4.1) + ws: 8.18.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - '@vue/composition-api' + - bufferutil + - idb-keyval + - ioredis + - magicast + - nuxt + - rollup + - supports-color + - utf-8-validate + - vue + '@nuxt/devalue@2.0.2': {} '@nuxt/devtools-kit@1.6.4(magicast@0.3.5)(rollup@4.28.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': @@ -4555,6 +5100,49 @@ snapshots: - vti - vue-tsc + '@nuxtjs/mdc@0.9.5(magicast@0.3.5)(rollup@4.28.1)': + dependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@shikijs/transformers': 1.24.2 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@vue/compiler-core': 3.5.13 + consola: 3.2.3 + debug: 4.4.0(supports-color@9.4.0) + defu: 6.1.4 + destr: 2.0.3 + detab: 3.0.2 + github-slugger: 2.0.0 + hast-util-to-string: 3.0.1 + mdast-util-to-hast: 13.2.0 + micromark-util-sanitize-uri: 2.0.1 + ohash: 1.1.4 + parse5: 7.2.1 + pathe: 1.1.2 + property-information: 6.5.0 + rehype-external-links: 3.0.0 + rehype-raw: 7.0.0 + rehype-slug: 6.0.0 + rehype-sort-attribute-values: 5.0.1 + rehype-sort-attributes: 5.0.1 + remark-emoji: 5.0.1 + remark-gfm: 4.0.0 + remark-mdc: 3.5.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + scule: 1.3.0 + shiki: 1.24.2 + ufo: 1.5.4 + unified: 11.0.5 + unist-builder: 4.0.0 + unist-util-visit: 5.0.0 + unwasm: 0.3.9 + vfile: 6.0.3 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + '@parcel/watcher-android-arm64@2.5.0': optional: true @@ -4773,8 +5361,43 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.28.1': optional: true + '@shikijs/core@1.24.2': + dependencies: + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/engine-javascript@1.24.2': + dependencies: + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.7.0 + + '@shikijs/engine-oniguruma@1.24.2': + dependencies: + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + + '@shikijs/transformers@1.24.2': + dependencies: + shiki: 1.24.2 + + '@shikijs/types@1.24.2': + dependencies: + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.1': {} + + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/merge-streams@2.3.0': {} + '@socket.io/component-emitter@3.1.2': {} + '@stylistic/eslint-plugin@2.12.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': dependencies: '@typescript-eslint/utils': 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) @@ -4789,14 +5412,28 @@ snapshots: '@trysound/sax@0.2.0': {} + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + '@types/estree@1.0.6': {} - '@types/http-proxy@1.17.15': + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-proxy@1.17.15': dependencies: '@types/node': 22.10.2 '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@0.7.34': {} + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 @@ -4805,6 +5442,12 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -4882,6 +5525,8 @@ snapshots: '@typescript-eslint/types': 8.18.0 eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.1': {} + '@unhead/dom@1.11.14': dependencies: '@unhead/schema': 1.11.14 @@ -5074,6 +5719,48 @@ snapshots: '@vue/shared@3.5.13': {} + '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.3.0 + '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.7.2)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/head@2.0.0(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@unhead/dom': 1.11.14 + '@unhead/schema': 1.11.14 + '@unhead/ssr': 1.11.14 + '@unhead/vue': 1.11.14(vue@3.5.13(typescript@5.7.2)) + vue: 3.5.13(typescript@5.7.2) + + '@vueuse/metadata@11.3.0': {} + + '@vueuse/nuxt@11.3.0(magicast@0.3.5)(nuxt@3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)))(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.28.1) + '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/metadata': 11.3.0 + local-pkg: 0.5.1 + nuxt: 3.14.1592(@parcel/watcher@2.5.0)(@types/node@22.10.2)(eslint@9.17.0(jiti@2.4.1))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.28.1)(terser@5.37.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - magicast + - rollup + - supports-color + - vue + + '@vueuse/shared@11.3.0(vue@3.5.13(typescript@5.7.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + abbrev@2.0.0: {} abort-controller@3.0.0: @@ -5170,6 +5857,8 @@ snapshots: b4a@1.6.7: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} bare-events@2.5.0: @@ -5257,6 +5946,8 @@ snapshots: caniuse-lite@1.0.30001689: {} + ccount@2.0.1: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -5264,6 +5955,16 @@ snapshots: change-case@5.4.4: {} + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -5320,6 +6021,8 @@ snapshots: colorette@1.4.0: {} + comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} commander@7.2.0: {} @@ -5469,12 +6172,20 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@9.4.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 9.4.0 + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -5496,16 +6207,24 @@ snapshots: depd@2.0.0: {} + dequal@2.0.3: {} + destr@2.0.3: {} destroy@1.2.0: {} + detab@3.0.2: {} + detect-libc@1.0.3: {} detect-libc@2.0.3: {} devalue@5.1.1: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff@7.0.0: {} doctrine@3.0.0: @@ -5544,14 +6263,34 @@ snapshots: electron-to-chromium@1.5.73: {} + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + emojilib@2.4.0: {} + + emoticon@4.1.0: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} + engine.io-client@6.6.2: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -5861,6 +6600,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + extend@3.0.2: {} + externality@1.0.2: dependencies: enhanced-resolve: 5.17.1 @@ -5927,6 +6668,8 @@ snapshots: flatted: 3.3.2 keyv: 4.5.4 + flat@6.0.1: {} + flatted@3.3.2: {} foreground-child@3.3.0: @@ -5991,6 +6734,8 @@ snapshots: dependencies: git-up: 7.0.0 + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6069,12 +6814,93 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-parse5@8.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.2.1 + hast-util-from-parse5: 8.0.2 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + hookable@5.5.3: {} hosted-git-info@2.8.9: {} html-tags@3.3.1: {} + html-void-elements@3.0.0: {} + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -6154,6 +6980,15 @@ snapshots: iron-webcrypto@1.2.1: {} + is-absolute-url@4.0.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arrayish@0.2.1: {} is-binary-path@2.1.0: @@ -6168,6 +7003,8 @@ snapshots: dependencies: hasown: 2.0.2 + is-decimal@2.0.1: {} + is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -6180,6 +7017,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -6195,6 +7034,8 @@ snapshots: is-path-inside@4.0.0: {} + is-plain-obj@4.1.0: {} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.6 @@ -6358,6 +7199,8 @@ snapshots: lodash@4.17.21: {} + longest-streak@3.1.0: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -6378,14 +7221,323 @@ snapshots: '@babel/types': 7.26.3 source-map-js: 1.2.1 + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdn-data@2.0.28: {} mdn-data@2.0.30: {} + mdurl@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.3: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0(supports-color@9.4.0) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -6421,6 +7573,8 @@ snapshots: minipass@7.1.2: {} + minisearch@7.1.1: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -6554,6 +7708,13 @@ snapshots: node-addon-api@7.1.1: {} + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + node-fetch-native@1.6.4: {} node-fetch@2.7.0: @@ -6746,6 +7907,12 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-to-es@0.7.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.0.2 + regex-recursion: 4.3.0 + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -6814,6 +7981,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-git-config@3.0.0: dependencies: git-config-path: 2.0.0 @@ -6845,6 +8022,10 @@ snapshots: dependencies: parse-path: 7.0.0 + parse5@7.2.1: + dependencies: + entities: 4.5.0 + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -7059,6 +8240,8 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + property-information@6.5.0: {} + protocols@2.0.1: {} punycode@2.3.1: {} @@ -7131,6 +8314,16 @@ snapshots: dependencies: '@eslint-community/regexpp': 4.12.1 + regex-recursion@4.3.0: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.0.2: + dependencies: + regex-utilities: 2.3.0 + regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.1 @@ -7142,6 +8335,105 @@ snapshots: dependencies: jsesc: 0.5.0 + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.1 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-sort-attribute-values@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + unist-util-visit: 5.0.0 + + rehype-sort-attributes@5.0.1: + dependencies: + '@types/hast': 3.0.4 + unist-util-visit: 5.0.0 + + remark-emoji@5.0.1: + dependencies: + '@types/mdast': 4.0.4 + emoticon: 4.1.0 + mdast-util-find-and-replace: 3.0.1 + node-emoji: 2.2.0 + unified: 11.0.5 + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdc@3.5.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + flat: 6.0.1 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark: 4.0.1 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.2 + scule: 1.3.0 + stringify-entities: 4.0.4 + unified: 11.0.5 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + yaml: 2.6.1 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -7269,6 +8561,15 @@ snapshots: shell-quote@1.8.2: {} + shiki@1.24.2: + dependencies: + '@shikijs/core': 1.24.2 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -7289,12 +8590,36 @@ snapshots: sisteransi@1.0.5: {} + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + slash@5.1.0: {} slashes@3.0.12: {} + slugify@1.6.6: {} + smob@1.5.0: {} + socket.io-client@4.8.1: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -7306,6 +8631,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -7363,6 +8690,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -7476,6 +8808,10 @@ snapshots: tr46@0.0.3: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-api-utils@1.4.3(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -7528,8 +8864,20 @@ snapshots: '@unhead/shared': 1.11.14 hookable: 5.5.3 + unicode-emoji-modifier-base@1.0.0: {} + unicorn-magic@0.1.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + unimport@3.14.5(rollup@4.28.1): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.28.1) @@ -7549,6 +8897,33 @@ snapshots: transitivePeerDependencies: - rollup + unist-builder@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universalify@2.0.1: {} unplugin-vue-router@0.10.9(rollup@4.28.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2)): @@ -7654,6 +9029,21 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + vite-hot-client@0.2.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): dependencies: vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) @@ -7768,6 +9158,10 @@ snapshots: dependencies: ufo: 1.5.4 + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): + dependencies: + vue: 3.5.13(typescript@5.7.2) + vue-devtools-stub@0.1.0: {} vue-eslint-parser@9.4.3(eslint@9.17.0(jiti@2.4.1)): @@ -7798,6 +9192,8 @@ snapshots: optionalDependencies: typescript: 5.7.2 + web-namespaces@2.0.1: {} + webidl-conversions@3.0.1: {} webpack-virtual-modules@0.6.2: {} @@ -7831,10 +9227,14 @@ snapshots: wrappy@1.0.2: {} + ws@8.17.1: {} + ws@8.18.0: {} xml-name-validator@4.0.0: {} + xmlhttprequest-ssl@2.1.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -7870,3 +9270,5 @@ snapshots: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.5.2 + + zwitch@2.0.4: {} From d7a4ca41b95b8e7d481237902b2dc61224f68ba8 Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Mon, 16 Dec 2024 10:25:01 -0500 Subject: [PATCH 005/187] Copy in new content --- content/1.getting-started/0.home.md | 61 ++ .../1.getting-started/0.platform-overview.md | 47 ++ .../1.getting-started/1.create-a-project.md | 116 ++++ content/1.getting-started/2.resources.md | 90 +++ content/1.getting-started/_dir.yml | 1 + content/10.extensions/0.overview.md | 70 ++ content/10.extensions/1.quickstart.md | 54 ++ .../10.extensions/2.api-extensions/0.index.md | 14 + .../10.extensions/2.api-extensions/1.hooks.md | 274 ++++++++ .../2.api-extensions/2.endpoints.md | 90 +++ .../2.api-extensions/3.operations.md | 124 ++++ .../2.api-extensions/4.services.md | 317 +++++++++ .../2.api-extensions/5.sandbox.md | 114 ++++ .../10.extensions/3.app-extensions/0.index.md | 14 + .../3.app-extensions/1.interfaces.md | 115 ++++ .../3.app-extensions/2.displays.md | 110 ++++ .../3.app-extensions/3.layouts.md | 120 ++++ .../3.app-extensions/4.panels.md | 108 ++++ .../3.app-extensions/5.modules.md | 100 +++ .../3.app-extensions/6.themes.md | 93 +++ .../3.app-extensions/7.ui-library.md | 62 ++ .../3.app-extensions/8.composables.md | 207 ++++++ content/10.extensions/4.bundles.md | 46 ++ .../10.extensions/5.marketplace/0.index.md | 29 + .../5.marketplace/1.publishing.md | 113 ++++ content/10.extensions/_dir.yml | 1 + content/11.configuration/1.general.md | 53 ++ content/11.configuration/10.extensions.md | 36 ++ content/11.configuration/11.logging.md | 66 ++ content/11.configuration/12.email.md | 76 +++ content/11.configuration/13.migrations.md | 55 ++ content/11.configuration/14.theming.md | 60 ++ content/11.configuration/15.translations.md | 36 ++ content/11.configuration/2.database.md | 30 + content/11.configuration/3.files.md | 125 ++++ content/11.configuration/4.synchronization.md | 27 + content/11.configuration/5.realtime.md | 51 ++ content/11.configuration/6.flows.md | 21 + content/11.configuration/7.security-limits.md | 131 ++++ content/11.configuration/8.auth-sso.md | 167 +++++ content/11.configuration/9.pm2.md | 27 + content/11.configuration/_dir.yml | 1 + content/12.self-hosting/1.overview.md | 46 ++ content/12.self-hosting/2.requirements.md | 34 + content/12.self-hosting/3.deploying.md | 109 ++++ content/12.self-hosting/4.upgrading.md | 26 + .../12.self-hosting/5.including-extensions.md | 76 +++ content/12.self-hosting/_dir.yml | 1 + content/13.releases/1.overview.md | 22 + .../13.releases/2.breaking-changes/0.index.md | 10 + .../2.breaking-changes/1.version-10.md | 477 ++++++++++++++ .../2.breaking-changes/2.version-11.md | 114 ++++ content/13.releases/3.changelog.md | 4 + content/13.releases/_dir.yml | 1 + content/2.data-modeling/1.quickstart.md | 47 ++ content/2.data-modeling/2.collections.md | 172 +++++ content/2.data-modeling/3.fields.md | 109 ++++ content/2.data-modeling/4.interfaces.md | 604 ++++++++++++++++++ content/2.data-modeling/5.relationships.md | 72 +++ content/2.data-modeling/_dir.yml | 1 + content/3.content/1.explore.md | 73 +++ content/3.content/2.editor.md | 86 +++ content/3.content/3.layouts.md | 238 +++++++ content/3.content/4.import-export.md | 56 ++ content/3.content/5.live-preview.md | 41 ++ content/3.content/6.content-versioning.md | 73 +++ content/3.content/7.translations.md | 67 ++ content/3.content/_dir.yml | 1 + content/4.auth/1.quickstart.md | 125 ++++ content/4.auth/2.tokens-cookies.md | 69 ++ content/4.auth/3.access-control.md | 101 +++ content/4.auth/4.creating-users.md | 102 +++ content/4.auth/5.email-login.md | 292 +++++++++ content/4.auth/6.2fa.md | 47 ++ content/4.auth/7.sso/1.index.md | 97 +++ content/4.auth/7.sso/2.seamless.md | 97 +++ content/4.auth/8.accountability.md | 47 ++ content/4.auth/_dir.yml | 1 + content/5.connect/1.quickstart.md | 82 +++ content/5.connect/2.authentication.md | 11 + content/5.connect/3.filter-rules.md | 239 +++++++ content/5.connect/4.query-parameters.md | 569 +++++++++++++++++ content/5.connect/5.errors.md | 26 + content/5.connect/6.sdk.md | 372 +++++++++++ content/5.connect/_dir.yml | 1 + content/6.files/1.quickstart.md | 63 ++ content/6.files/2.upload.md | 60 ++ content/6.files/3.manage.md | 84 +++ content/6.files/4.access.md | 51 ++ content/6.files/5.transform.md | 170 +++++ content/6.files/_dir.yml | 1 + content/7.automate/1.quickstart.md | 53 ++ content/7.automate/2.flows.md | 54 ++ content/7.automate/3.data-chain.md | 76 +++ content/7.automate/4.triggers.md | 176 +++++ content/7.automate/5.operations.md | 372 +++++++++++ content/7.automate/_dir.yml | 1 + content/8.realtime/1.quickstart.md | 120 ++++ content/8.realtime/2.authentication.md | 136 ++++ content/8.realtime/3.subscriptions.md | 209 ++++++ content/8.realtime/4.actions.md | 167 +++++ content/8.realtime/_dir.yml | 1 + content/9.insights/1.overview.md | 25 + content/9.insights/2.panels.md | 268 ++++++++ content/9.insights/_dir.yml | 1 + content/_partials/authentication.md | 24 + content/_partials/config-env-vars.md | 3 + .../_partials/extension-hook-exceptions.md | 5 + content/_partials/extension-hook-footguns.md | 1 + content/_partials/extensions-api-internals.md | 23 + content/_partials/extensions-api.md | 1 + content/_partials/extensions-app-internals.md | 25 + content/_partials/extensions-app.md | 1 + content/_partials/extensions-theme.md | 3 + content/_partials/extensions-uid.md | 3 + content/_partials/home-hero/auth.md | 13 + content/_partials/home-hero/data.md | 13 + content/_partials/home-hero/file.md | 13 + content/_partials/home-hero/realtime.md | 13 + content/_partials/license.md | 5 + content/_partials/query-functions.md | 15 + content/_partials/quickstart-making-calls.md | 1 + content/_partials/snippet-auth-token.md | 7 + 123 files changed, 10547 insertions(+) create mode 100644 content/1.getting-started/0.home.md create mode 100644 content/1.getting-started/0.platform-overview.md create mode 100644 content/1.getting-started/1.create-a-project.md create mode 100644 content/1.getting-started/2.resources.md create mode 100644 content/1.getting-started/_dir.yml create mode 100644 content/10.extensions/0.overview.md create mode 100644 content/10.extensions/1.quickstart.md create mode 100644 content/10.extensions/2.api-extensions/0.index.md create mode 100644 content/10.extensions/2.api-extensions/1.hooks.md create mode 100644 content/10.extensions/2.api-extensions/2.endpoints.md create mode 100644 content/10.extensions/2.api-extensions/3.operations.md create mode 100644 content/10.extensions/2.api-extensions/4.services.md create mode 100644 content/10.extensions/2.api-extensions/5.sandbox.md create mode 100644 content/10.extensions/3.app-extensions/0.index.md create mode 100644 content/10.extensions/3.app-extensions/1.interfaces.md create mode 100644 content/10.extensions/3.app-extensions/2.displays.md create mode 100644 content/10.extensions/3.app-extensions/3.layouts.md create mode 100644 content/10.extensions/3.app-extensions/4.panels.md create mode 100644 content/10.extensions/3.app-extensions/5.modules.md create mode 100644 content/10.extensions/3.app-extensions/6.themes.md create mode 100644 content/10.extensions/3.app-extensions/7.ui-library.md create mode 100644 content/10.extensions/3.app-extensions/8.composables.md create mode 100644 content/10.extensions/4.bundles.md create mode 100644 content/10.extensions/5.marketplace/0.index.md create mode 100644 content/10.extensions/5.marketplace/1.publishing.md create mode 100644 content/10.extensions/_dir.yml create mode 100644 content/11.configuration/1.general.md create mode 100644 content/11.configuration/10.extensions.md create mode 100644 content/11.configuration/11.logging.md create mode 100644 content/11.configuration/12.email.md create mode 100644 content/11.configuration/13.migrations.md create mode 100644 content/11.configuration/14.theming.md create mode 100644 content/11.configuration/15.translations.md create mode 100644 content/11.configuration/2.database.md create mode 100644 content/11.configuration/3.files.md create mode 100644 content/11.configuration/4.synchronization.md create mode 100644 content/11.configuration/5.realtime.md create mode 100644 content/11.configuration/6.flows.md create mode 100644 content/11.configuration/7.security-limits.md create mode 100644 content/11.configuration/8.auth-sso.md create mode 100644 content/11.configuration/9.pm2.md create mode 100644 content/11.configuration/_dir.yml create mode 100644 content/12.self-hosting/1.overview.md create mode 100644 content/12.self-hosting/2.requirements.md create mode 100644 content/12.self-hosting/3.deploying.md create mode 100644 content/12.self-hosting/4.upgrading.md create mode 100644 content/12.self-hosting/5.including-extensions.md create mode 100644 content/12.self-hosting/_dir.yml create mode 100644 content/13.releases/1.overview.md create mode 100644 content/13.releases/2.breaking-changes/0.index.md create mode 100644 content/13.releases/2.breaking-changes/1.version-10.md create mode 100644 content/13.releases/2.breaking-changes/2.version-11.md create mode 100644 content/13.releases/3.changelog.md create mode 100644 content/13.releases/_dir.yml create mode 100644 content/2.data-modeling/1.quickstart.md create mode 100644 content/2.data-modeling/2.collections.md create mode 100644 content/2.data-modeling/3.fields.md create mode 100644 content/2.data-modeling/4.interfaces.md create mode 100644 content/2.data-modeling/5.relationships.md create mode 100644 content/2.data-modeling/_dir.yml create mode 100644 content/3.content/1.explore.md create mode 100644 content/3.content/2.editor.md create mode 100644 content/3.content/3.layouts.md create mode 100644 content/3.content/4.import-export.md create mode 100644 content/3.content/5.live-preview.md create mode 100644 content/3.content/6.content-versioning.md create mode 100644 content/3.content/7.translations.md create mode 100644 content/3.content/_dir.yml create mode 100644 content/4.auth/1.quickstart.md create mode 100644 content/4.auth/2.tokens-cookies.md create mode 100644 content/4.auth/3.access-control.md create mode 100644 content/4.auth/4.creating-users.md create mode 100644 content/4.auth/5.email-login.md create mode 100644 content/4.auth/6.2fa.md create mode 100644 content/4.auth/7.sso/1.index.md create mode 100644 content/4.auth/7.sso/2.seamless.md create mode 100644 content/4.auth/8.accountability.md create mode 100644 content/4.auth/_dir.yml create mode 100644 content/5.connect/1.quickstart.md create mode 100644 content/5.connect/2.authentication.md create mode 100644 content/5.connect/3.filter-rules.md create mode 100644 content/5.connect/4.query-parameters.md create mode 100644 content/5.connect/5.errors.md create mode 100644 content/5.connect/6.sdk.md create mode 100644 content/5.connect/_dir.yml create mode 100644 content/6.files/1.quickstart.md create mode 100644 content/6.files/2.upload.md create mode 100644 content/6.files/3.manage.md create mode 100644 content/6.files/4.access.md create mode 100644 content/6.files/5.transform.md create mode 100644 content/6.files/_dir.yml create mode 100644 content/7.automate/1.quickstart.md create mode 100644 content/7.automate/2.flows.md create mode 100644 content/7.automate/3.data-chain.md create mode 100644 content/7.automate/4.triggers.md create mode 100644 content/7.automate/5.operations.md create mode 100644 content/7.automate/_dir.yml create mode 100644 content/8.realtime/1.quickstart.md create mode 100644 content/8.realtime/2.authentication.md create mode 100644 content/8.realtime/3.subscriptions.md create mode 100644 content/8.realtime/4.actions.md create mode 100644 content/8.realtime/_dir.yml create mode 100644 content/9.insights/1.overview.md create mode 100644 content/9.insights/2.panels.md create mode 100644 content/9.insights/_dir.yml create mode 100644 content/_partials/authentication.md create mode 100644 content/_partials/config-env-vars.md create mode 100644 content/_partials/extension-hook-exceptions.md create mode 100644 content/_partials/extension-hook-footguns.md create mode 100644 content/_partials/extensions-api-internals.md create mode 100644 content/_partials/extensions-api.md create mode 100644 content/_partials/extensions-app-internals.md create mode 100644 content/_partials/extensions-app.md create mode 100644 content/_partials/extensions-theme.md create mode 100644 content/_partials/extensions-uid.md create mode 100644 content/_partials/home-hero/auth.md create mode 100644 content/_partials/home-hero/data.md create mode 100644 content/_partials/home-hero/file.md create mode 100644 content/_partials/home-hero/realtime.md create mode 100644 content/_partials/license.md create mode 100644 content/_partials/query-functions.md create mode 100644 content/_partials/quickstart-making-calls.md create mode 100644 content/_partials/snippet-auth-token.md diff --git a/content/1.getting-started/0.home.md b/content/1.getting-started/0.home.md new file mode 100644 index 00000000..110586e1 --- /dev/null +++ b/content/1.getting-started/0.home.md @@ -0,0 +1,61 @@ +--- +title: Home +description: Learn how to get started and implement Directus through our developer resources. +additional_paths: + - / +--- + +# Directus Documentation + +## Try a Demo + +::tabs + ::tab{label="Local Demo"} + Run Docker locally and use the following command to start the project. + + ``` + docker run -p 8055:8055 directus/directus + ``` + + This project has no persistence. All data will be lost when the container is stopped. Read our [Create a Project guide](/getting-started/create-a-project) to learn how to create a project with persistence. + :: + ::tab{label="Hosted Demo"} + Try our [hosted demo project](https://directus.pizza/?utm_source=directus-docs&utm_campaign=docs-home). This is a public demo project that is occassionally reset but please don't input sensitive data. + :: +:: + +
+ +:video-embed{type="directus-tv" id="96b44cbc-1b14-4bea-87cd-0c4cb34d261d"} + +## Getting Started + +:article-cards{:show-description=false :paths='[{"title": "Platform Overview", "_path": "/getting-started/platform-overview"}, "/getting-started/create-a-project", { "title": "Directus Academy", "_path": "https://directus.io/tv/directus-academy"}]'} + +## Features + +:engine-studio-box + +## Directus APIs + +:article-cards{:show-description=false :paths='["/connect/quickstart", { "title": "API Reference", "_path": "/api"}, "/connect/sdk"]'} + +## Tutorials + +:article-cards{:show-description=false :paths='[{ "title": "Directus with Next.js", "_path": "/tutorials?tags=nextjs"}, { "title": "Build Projects with Directus", "_path": "/tutorials/projects"}, { "title": "Using Directus Auth", "_path": "/tutorials?tags=directus-auth"}, { "title": "Automate & Integrate", "_path": "/tutorials?tags=directus-automate"}, { "title": "Self-Hosting Guides", "_path": "/tutorials/self-hosting"}, { "title": "SEO Best Practices", "_path": "/tutorials/tips-and-tricks/search-engine-optimization-best-practices"}]'} + +See All Tutorials + +## Releases + +:article-cards{:show-description=false :paths='[{"title":"GitHub Releases", "_path": "https://github.com/directus/directus/releases"},"/releases/breaking-changes", { "title": "The Changelog", "_path": "/releases/changelog"}]'} + +## Community-Maintained Tooling + +These are built and maintained by our awesome community. If you are building tooling and want to include it here, please open a [pull request on GitHub](https://github.com/directus/docs). + +:article-cards{:show-description=false :paths='[{"title":"Python SDK", "_path": "https://pypi.org/project/directus-sdk-py/"}, { "title": "Go SDK", "_path": "https://pkg.go.dev/github.com/altipla-consulting/directus-go#section-readme"}, { "title": "Dart SDK", "_path": "https://github.com/apstanisic/directus-dart"}, { "title": "Nuxt Module", "_path": "https://nuxt.com/modules/directus"}, { "title": "Helm Charts", "_path": "https://github.com/directus-labs/helm-chart"}]'} + +## Advanced Concepts + +:article-cards{:show-description=false :paths='[{"title":"Environment Variables", "_path": "/configuration/general"}, { "title": "Building Extensions", "_path": "/extensions/overview"},{ "title": "Self-Hosting", "_path": "/self-hosting/overview"}]'} diff --git a/content/1.getting-started/0.platform-overview.md b/content/1.getting-started/0.platform-overview.md new file mode 100644 index 00000000..f0b64fef --- /dev/null +++ b/content/1.getting-started/0.platform-overview.md @@ -0,0 +1,47 @@ +--- +description: Learn about the Directus Data Engine and Studio, when to use it, and a how it works. +--- + +# Platform Overview + +Directus is a backend for building your projects. Connect it to your database, asset storage, and external services, and immediately receive rich developer tooling (Data Engine) and a comprehensive web application (Data Studio) to work with your data. Granular and powerful access control means users can only see, interact, and create data allowed by their role used by both the Engine and Studio. + +:engine-studio-box + +## How It Works + +:video-embed{type="directus-tv" id="96b44cbc-1b14-4bea-87cd-0c4cb34d261d"} + +## Use Cases + +### Backend as a Service + +Tools that developers need to build success applications - autogenerated APIs, event or schedule-based automations, user management and authentication, realtime, and webhooks. + +### Headless CMS + +Remember, *content* is just data from a database. Manage your files and data, delivering it across websites, apps, kiosks, digital signage, or any other data-driven application. + +### Internal Tool Builder + +Using Directus Insights, your whole team can build custom applications. Ditch the spreadsheet and quickly build back-office apps and admin panels for customers, inventory, projects, or reporting. + +### Data Management and Analytics + +Establish a single source of truth for all data. Build no-code analytics dashboards to gain insights into company KPIs and other metrics. Coalesce previously siloed data and use Directus Automate to keep everything in sync. + +::callout{type="tutorials" url="/tutorials"} +See all project and use-case tutorials. +:: + +## Directus Cloud + +Cloud architecture can be complicated and resource-intensive. Directus Cloud provides scalable, optimized storage and infrastructure, and automatic updates so you can focus on what makes your project special. + +With your Directus Cloud account, you can set up teams to organize projects and billing. You'll be able to get a project running in about 90 seconds. Directus Cloud projects scale automatically to improve reliability, even with unexpected peaks in traffic. + +:directus-cloud + +Need advanced configuration, unlimited scalability, and dedicated support? **[Contact us to check out Directus Enterprise Cloud](https://directus.io/contact).** + +:partial{content="license"} diff --git a/content/1.getting-started/1.create-a-project.md b/content/1.getting-started/1.create-a-project.md new file mode 100644 index 00000000..9221d409 --- /dev/null +++ b/content/1.getting-started/1.create-a-project.md @@ -0,0 +1,116 @@ +--- +description: Learn about how to create a managed Directus project or self-host with Docker. +--- + +# Create a Project + +There are several ways to start a new Directus project. This guide walks through the most common scenarios. + +:partial{content="license"} + +## Directus Cloud + +Directus Cloud provides infrastructure from the team who builds Directus. Projects can be created in over 15 global deployment regions and feature autoscaling for improved availability. + +Create and login to your [Directus Cloud account](https://directus.cloud/). The very first time you log in to your Directus Cloud account, you will be prompted to create a team. Each Directus Cloud project exists within the scope of one team. + +![Create a new project page on Directus Cloud. Fields include name, region, url, and project template. An area to the side shows Directus Cloud Starter tier is selected at $15 a month.](https://product-team.directus.app/assets/ed3ace98-6ee8-4b34-b2df-b109eb9bca17.png) + +:directus-cloud + +Once started, it should take around 90 seconds for the Cloud project to be created. During this time, a link will be sent to the email associated with your Cloud account. + +The email will contain your project URL as well as an email and password to login. If you used GitHub to create your account, this will be the email address associated with your GitHub account. + +Login to your new project using the URL in your email inbox or on your Directus Cloud Dashboard. + +## Docker Installation + +You will need Docker installed and running on your machine. You can [download it here](https://docs.docker.com/get-docker/). + +::callout{type="info" title="What is Docker?"} +Docker is a developer tool that allows software-creators to distribute their work along with all dependencies and required environment settings. This means that applications can run reliably and consistently, making it the perfect way to use Directus both locally and in-production. + +As soon as there are new releases of Directus, we publish them on [Docker Hub](https://hub.docker.com/r/directus/directus). +:: + +### Quickstart + +Run the following command in your terminal: + +```bash +docker run -p 8055:8055 directus/directus +``` + +The initial admin email address and password will be shown in the terminal. Directus should now be available at [http://localhost:8055](http://localhost:8055/) or [http://127.0.0.1:8055](http://127.0.0.1:8055/). + +This quickstart allows you to explore Directus at a glance, but lacks many features including persistence. Once you stop the Docker container from running, any changes you’ve made will be lost. + +### Docker Compose + +This is the recommended way to get started with Directus. Create a new empty directory on your machine called `directus`. Within this new directory, create the three empty sub-directories `database`, `uploads`, and `extensions`. + +Create a `docker-compose.yml` file in the `directus` directory: + + + +```yaml [docker-compose.yml] +services: + directus: + image: directus/directus:11.3.2 + ports: + - 8055:8055 + volumes: + - ./database:/directus/database + - ./uploads:/directus/uploads + - ./extensions:/directus/extensions + environment: + SECRET: "replace-with-random-value" + ADMIN_EMAIL: "admin@example.com" + ADMIN_PASSWORD: "d1r3ctu5" + DB_CLIENT: "sqlite3" + DB_FILENAME: "/directus/database/data.db" + WEBSOCKETS_ENABLED: "true" +``` + +::callout{type="info" :toggleable="true" title="Breakdown of Docker Compose File"} + +- This file defines a single Docker container that will use the specified version of the `directus/directus` image. +- The `ports` list maps internal port `8055` is made available to our machine using the same port number, meaning we can access it from our computer's browser. +- The `volumes` section maps internal `directus/database` and `directus/uploads` to our local file system alongside the `docker-compose.yml` + - meaning data is backed up outside of Docker containers. +- The `environment` section contains any [configuration environment variables](/configuration/overview) we wish to set. + - `SECRET` is required and should be a long random value. `SECRET` is used to sign access tokens. + - `ADMIN_EMAIL` and `ADMIN_PASSWORD` is the initial admin user credentials on first launch. + - `DB_CLIENT` and `DB_FILENAME` are defining the connection to your database. + - `WEBSOCKETS_ENABLED` is not required, but enables [Directus Realtime](/realtime/quickstart). + +:: + +Open the Terminal, navigate to your `directus` directory, and run the following command: + +``` +docker compose up +``` + +Directus should now be available at http://localhost:8055 or http://127.0.0.1:8055. + +The project that runs from this `docker-compose.yml` file is not production-ready but enough to use many features. + +::callout{type="dev-docs" url="/self-hosting/checklist"} +Read our self-hosting product checklist. +:: + +## Deploy Directus + +We also have a number of guides on self-hosting Directus on various cloud providers, like Amazon Web Services, Microsoft Azure, and Google Cloud Platform. + +::callout{type="tutorials" url="/tutorials/self-hosting"} + +See how to deploy Directus on multiple hosting providers. + +:: + +## Next Steps + +Now you have a project running, [learn how to create a data model](/data-modeling/quickstart), and then use the auto-generated APIs created by :product-link{product="connect"}. diff --git a/content/1.getting-started/2.resources.md b/content/1.getting-started/2.resources.md new file mode 100644 index 00000000..5cb0ef50 --- /dev/null +++ b/content/1.getting-started/2.resources.md @@ -0,0 +1,90 @@ +--- +description: Key links across the Directus ecosystem. +--- + +# Resources & Links + +## Documentation Areas + +::callout{type="dev-docs" url="/" title="Developer Docs"} +Detailed documentation about the Directus platform. +:: + +::callout{type="api-reference" url="/api" title="API Reference"} +Comprehensive list of endpoints available in your projects. +:: + +::callout{type="tutorials" url="/tutorials" title="Tutorials"} +Framework, project, and other implementation guides. +:: + +::callout{type="community" url="/community" title="Community"} +Get involved through feature requests, code contribution, education, and more. +:: + +## Directus Cloud + +::callout{type="link" title="Directus Cloud" url="https://directus.cloud"} +The best way to get your Directus project up and running. +:: + +::callout{type="link" title="Enterprise Cloud" url="https://directus.io/contact"} +Custom-tailored solutions for industrial-scale projects. +:: + +::callout{type="link" title="System Status" url="https://status.directus.cloud"} +Up-to-date information on our various cloud systems. +:: + + +## Directus Websites + +::callout{type="link" title="Website" url="https://directus.io"} +General information, resources, and team info. +:: + +::callout{type="link" title="Directus TV" url="https://directus.io/tv"} +Hours of video series across dozens of shows. +:: + +::callout{type="link" title="Directus+" url="https://directus.io/plus"} +Starter kits to help you build projects quicker. +:: + + +## Developer Resources + +::callout{type="link" title="GitHub" url="https://github.com/directus/directus"} +The open-source repository and version control. +:: + +::callout{type="link" title="NPM Package" url="https://www.npmjs.com/package/directus"} +The official Directus node package. +:: + +::callout{type="link" title="Docker Image" url="https://hub.docker.com/r/directus/directus"} +The official Directus docker image. +:: + +::callout{type="link" title="Crowdin" url="https://locales.directus.io"} +Service for managing the App's many language translations. +:: + + +## Directus Around The Web + +::callout{type="link" title="YouTube" url="https://www.youtube.com/c/DirectusVideos"} +Checkout our channel with video tutorials and feature overviews. +:: + +::callout{type="link" title="Discord" url="https://directus.chat"} +Our main community chat with thousands of Directus developers. +:: + +::callout{type="link" title="X" url="https://x.com/directus"} +The latest product info and sneak-peeks. +:: + +::callout{type="link" title="Bluesky" url="https://bsky.app/profile/directus.io"} +Be part of the conversation with our team. +:: diff --git a/content/1.getting-started/_dir.yml b/content/1.getting-started/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/1.getting-started/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/10.extensions/0.overview.md b/content/10.extensions/0.overview.md new file mode 100644 index 00000000..b882a2e1 --- /dev/null +++ b/content/10.extensions/0.overview.md @@ -0,0 +1,70 @@ +--- +title: Overview +description: Extensions are used to extend the functionality of Directus. +--- + +# Extensions Overview + +:video-embed{type="directus-tv" id="c7ab64da-f34d-42c9-8a1a-03e6026cc7e5"} +
+ +Directus has been built to be extensible - both allowing for powerful enhancements to be built for single projects, and for publishing in the [Directus Marketplace](/extensions/marketplace). + +Extensions in Directus run within the same environment as the main application, allowing them to leverage existing access to underlying [services](/extensions/api-extensions/services) and [UI components](/extensions/app-extensions/ui-library). + +## App Extensions + +[App Extensions](/extensions/app-extensions) extend the functionality of the Data Studio. + +### Interfaces + +![An "input" in the content module](https://product-team.directus.app/assets/e0712e22-1cda-403b-9903-7e20aa473701.webp) + +[Interfaces](/extensions/app-extensions/interfaces) are form inputs used primarily inside of the :product-link{product="editor"}. Interfaces are the primary way users interact with data inside of Directus. Custom interfaces can be used for use cases with unique interaction needs, complex data entry, and any time you need to add elements to the editor. + +### Displays + +![A Datetime display in the content module](https://product-team.directus.app/assets/99a21abb-a866-4766-bbce-0ed13295112b.webp) + +[Displays](/extensions/app-extensions/displays) are small components that are used to display a single value throughout the Data Studio. Displays receive a single value and any custom display options that are defined in the display entrypoint. They are then expected to render the value in a user-friendly way. + +### Layouts + +![A table display in the content module](https://product-team.directus.app/assets/ca3ceb27-7cbd-493d-acb1-d15cb707fb31.webp) + +[Layouts](/extensions/app-extensions/layouts) allow for listing of items in :product-link{product="explore"} pages. Layouts receive a collection, filters, searches, and any custom layout options that are defined in the layout entrypoint. They are then expected to fetch and render the items from a collection. + + +### Panels + +![A panel in the insights module](https://product-team.directus.app/assets/cd83e252-c23b-4e03-b2f4-dc35cee2d6a7.webp) + +[Panels](/extensions/app-extensions/panels) are customizable components within :product-link{product="insights"} dashboards. Panels are the building blocks of analytics dashboards, enabling rapid, no-code creation of data visualizations with data from a Directus project. Panels can also contain interactive elements, making them suitable for building custom internal applications within dashboards. + +### Modules + +![A module in Directus](https://product-team.directus.app/assets/7db9b50a-d25b-40b1-86dc-3e09dad388bf.webp) + +[Modules](/extensions/app-extensions/modules) are top-level areas of the Data Studio, navigated to from the left-hand module bar. They will load at the specified routes. The Data Studio splits up functionality into modules - the content module, the files module, the user module, the insights module, and the settings module. Extensions can add new modules to the Data Studio. + +### Themes + +![Directus' default theme](https://product-team.directus.app/assets/91797ca8-68fa-4231-b143-8d5e134e9981.webp) + +[Themes](/extensions/app-extensions/themes) are used to style the Data Studio. They can be used to change the colors, fonts, and other visual elements of the Data Studio. + +## API Extensions + +[API Extensions](/extensions/api-extensions) extend the functionality of the API. + +### Hooks + +[Hooks](/extensions/api-extensions/hooks) allow running code when events occur within Directus. Events are triggered on schedules, database events, or during the Directus application lifecycle. + +### Endpoints + +[Endpoints](/extensions/api-extensions/endpoints) allow you to register new API routes in your Directus project. + +### Operations + +[Operations](/extensions/api-extensions/operations) are single steps in a Flow - the no-code automation tool part of :product-link{product="automate"}. diff --git a/content/10.extensions/1.quickstart.md b/content/10.extensions/1.quickstart.md new file mode 100644 index 00000000..d560b726 --- /dev/null +++ b/content/10.extensions/1.quickstart.md @@ -0,0 +1,54 @@ +--- +title: Quickstart +description: This guide will cover how to get started with developing an extension for Directus. +--- + +# Extensions Quickstart + +This guide will cover how to get started with developing an extension for Directus. You will set up a development environment, build an extension, and load it into your project. + +## Loading an Extension Volume + +Follow the steps in the [Create a Project](/getting-started/create-a-project) guide to set up your project locally. This `docker-compose.yml` file will set up a local volume for extensions to be loaded from. This directory exists on your local filesystem and is also mounted into the Docker container. + +Add the following to the `environment` section of your `docker-compose.yml` file to automatically reload your extensions when they are rebuilt: + +```yaml +EXTENSIONS_AUTO_RELOAD: true +``` + +::callout{type="info" title="Restarting Directus"} +When changing the `docker-compose.yml` file, you will need to restart Directus by restarting the Docker container. +:: + +## Initializing an Extension + +In your terminal, navigate to the `extensions` directory and run the following command and follow the prompts to initialize an extension: + +```bash +npx create-directus-extension@latest +? Choose the extension type: endpoint +? Choose a name for the extension: my-first-endpoint +? Choose the language to use: javascript +? Auto install dependencies?: Yes +``` + +This will create a new subdirectory in `extensions` with a boilerplate extension. + +## Building Your Extension + +Run `npm run build` to build your extension. This will create a `dist` directory in your extension directory with your built extension. This is the code that will be loaded into your Directus project. + +You can alternatively run `npm run dev` to automatically rebuild your extension when you make changes. + +With the `EXTENSIONS_AUTO_RELOAD` environment variable set, your extension will be automatically reloaded in Directuswhen you make changes. + +## Using Your Extension + +Navigate to the extensions page in your project settings. You should now see your new extension in the list. + +Endpoints are only available via API, so navigate to `http://localhost:8055/my-first-endpoint` in your browser to access your new endpoint. Other extension types are available in their respective selection panes within the Data Studio. + +## Next Steps + +Now that you've built your first extension, you can start building out your own. Check out the [API Extensions](/extensions/api-extensions) overview or [App Extensions](/extensions/app-extensions) overview for more information on building each extension type. diff --git a/content/10.extensions/2.api-extensions/0.index.md b/content/10.extensions/2.api-extensions/0.index.md new file mode 100644 index 00000000..ec1945bf --- /dev/null +++ b/content/10.extensions/2.api-extensions/0.index.md @@ -0,0 +1,14 @@ +--- +title: API Extensions +description: API Extensions extend the functionality of the API. +--- + +# API Extensions Overview + +API Extensions extend the functionality of the API. + +## Extension Types +:article-cards{:paths='["/extensions/api-extensions/hooks","/extensions/api-extensions/endpoints","/extensions/api-extensions/operations"]'} + +## Resources +:article-cards{:paths='["/extensions/api-extensions/services","/extensions/api-extensions/sandbox"]'} diff --git a/content/10.extensions/2.api-extensions/1.hooks.md b/content/10.extensions/2.api-extensions/1.hooks.md new file mode 100644 index 00000000..de7c73c2 --- /dev/null +++ b/content/10.extensions/2.api-extensions/1.hooks.md @@ -0,0 +1,274 @@ +--- +description: Hooks allow running code when during the Directus lifecycle or database events. +--- + +# Event Hooks + +Hooks allow running code when events occur within Directus. Events are triggered on schedules, database events, schedules, or during the Directus application lifecycle. + +:partial{content="extensions-api"} + +## Hook Entrypoint + +The `index.js` or `index.ts` file exports a function that is read by Directus. It contains one or more event listeners. + +### Entrypoint Example + +```js +export default ({ filter, action }) => { + filter('items.create', () => { + console.log('Creating Item!'); + }); + + action('items.create', () => { + console.log('Item created!'); + }); +}; +``` + +## Register Function + +The register function receives an object containing the type-specific register functions as the first parameter: + +| Type | Description | +| ---------- | --------------------------------------------------------------------------------------------------- | +| `filter` | Happens before the event is emitted. Use to check, modify, or prevent the event from being emitted. | +| `action` | Happens after the event is emitted. Use to execute further logic, enrichment, or automations. | +| `init` | Happens at a defined point within the lifecycle of Directus. | +| `schedule` | Happens on a defined time interval. | +| `embed` | Inject custom JavaScript or CSS in the Data Studio. | + +The second parameter is a context object with the following properties: + +| Property | Description | +| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `services` | All internal Directus services. | +| `database` | Knex instance that is connected to the current database | +| `getSchema` | Async function that reads the full available schema for use in services | +| `env` | Parsed environment variables. | +| `logger` | [Pino](https://github.com/pinojs/pino) instance | +| `emitter` | [Event emitter](https://github.com/directus/directus/blob/main/api/src/emitter.ts) instance that can be used to emit custom events for other extensions | + +## Filter + +Filter events are called before an event is emitted. + +```js +export default ({ filter }) => { + filter('items.create', (payload, meta, context) => { + console.log('About to create item.'); + return payload; + }); +} +``` + +The `filter` register function takes an event name and a callback function that receives the modifiable `payload`, an event-specific `meta` object, and a `context` object when the event is emitted. + +The `meta` object contains the following properties: + +| Property | Description | +| ------------ | ------------------------------------------- | +| `event` | The type of event that is being emitted. | +| `collection` | The collection where the event is occuring. | + +The context object has the following properties: + +| Property | Description | +| ---------------- | ----------------------------------- | +| `database` | The current database transaction. | +| `schema` | The current API schema in use. | +| `accountability` | Information about the current user. | + +### Filter Events + +| Name | Payload | Meta | +| ------------------------------ | ------------------------------------- | ------------------------------------------- | +| `websocket.message` | The message sent over the WebSocket. | | +| `request.not_found` | `false` | `request`, `response` | +| `request.error` | The request errors. | | +| `database.error` | The database error. | `client` | +| `auth.login` | The login payload. | `status`, `user`, `provider` | +| `auth.jwt` | The auth token. | `status`, `user`, `provider`, `type` | +| `auth.create`[1] | The created user. | `identifier`, `provider`, `providerPayload` | +| `auth.update`[2] | The updated auth token[3]. | `identifier`, `provider`, `providerPayload` | +| `authenticate` | The empty accountability object. | `req` | +| `email.send` | The email payload. | | +| `(.)items.query` | The items query. | `collection` | +| `(.)items.read` | The read item. | `query`, `collection` | +| `(.)items.create` | The new item. | `collection` | +| `(.)items.update` | The updated item. | `keys`, `collection` | +| `(.)items.promote` | The promoted item. | `collection`, `item`, `version` | +| `(.)items.delete` | The keys of the item. | `collection` | +| `.query` | The items query. | `collection` | +| `.read` | The read item. | `query`, `collection` | +| `.create` | The new item. | `collection` | +| `.update` | The updated item. | `keys`, `collection` | +| `.delete` | The keys of the item. | `collection` | + +[1] Available for the `ldap`, `oauth2`, `openid` and `saml` driver. + +[2] Available for the `ldap`, `oauth2`, and `openid` driver. + +[3] Available for the `oauth2`, and `openid` driver if set by provider. + +:partial{content="extension-hook-exceptions"} + +:partial{content="extension-hook-footguns"} + +::callout{type="warning" title="Filters are Blocking"} + +Filters can impact performance if not implemented carefully, especially on `read` events, which can lead to many database reads. + +:: + +## Action + +Actions events are called after an event is emitted. + +```js +export default ({ action }) => { + action('items.create', (meta, context) => { + console.log('Item was just created.'); + }); +} +``` + +The `action` register function takes an event name and a callback function that receives a `meta` object (containing information about the action and the payload) and a `context` object. + +The `meta` object contains the following properties: + +| Property | Description | +| ------------ | ---------------------------------------- | +| `event` | The type of event that was emitted. | +| `payload` | The data associated with the event. | +| `key` | The primary key of the item. | +| `collection` | The collection where the event occurred. | + +The context object has the following properties: + +| Property | Description | +| ---------------- | ----------------------------------- | +| `database` | The current database transaction. | +| `schema` | The current API schema in use. | +| `accountability` | Information about the current user. | + +### Action Events + +| Name | Meta | +| ------------------------------ | --------------------------------------------------- | +| `websocket.message` | `message`, `client` | +| `websocket.error` | `client`, `event` | +| `websocket.close` | `client`, `event` | +| `websocket.connect` | `client` | +| `websocket.auth.success` | `client` | +| `websocket.auth.failure` | `client` | +| `server.start` | `server` | +| `server.stop` | `server` | +| `response` | `request`, `response`, `ip`, `duration`, `finished` | +| `auth.login` | `payload`, `status`, `user`, `provider` | +| `files.upload` | `payload`, `key`, `collection` | +| `(.)items.read` | `payload`, `query`, `collection` | +| `(.)items.create` | `payload`, `key`, `collection` | +| `(.)items.update` | `payload`, `keys`, `collection` | +| `(.)items.promote` | `payload`, `collection`, `item`, `version` | +| `(.)items.delete` | `keys`, `collection` | +| `(.)items.sort` | `collection`, `item`, `to` | +| `.read` | `payload`, `query`, `collection` | +| `.create` | `payload`, `key`, `collection` | +| `.update` | `payload`, `keys`, `collection` | +| `.delete` | `keys`, `collection` | + +:partial{content="extension-hook-exceptions"} + +:partial{content="extension-hook-footguns"} + +## Init + +Init events are called during the Directus application lifecycle. + +```js +export default ({ init }) => { + init('routes.before', (meta) => { + console.log(meta); + }); +}; +``` + + + +The `init` register function takes an event name and a callback function that receives `meta`. `meta` contains either `program` or `app` (the full underlying Express application) depending on the lifecycle event. + +### Init Events + +| Name | Meta | +| ---------------------- | --------- | +| `cli.before` | `program` | +| `cli.after` | `program` | +| `app.before` | `app` | +| `app.after` | `app` | +| `routes.before` | `app` | +| `routes.after` | `app` | +| `routes.custom.before` | `app` | +| `routes.custom.after` | `app` | +| `middlewares.before` | `app` | +| `middlewares.after` | `app` | + +## Schedule + +Schedule events are called on a defined time interval. + +```js +export default ({ schedule }) => { + schedule('*/15 * * * *', () => { + console.log('15 minutes have passed.'); + }); +}; +``` + +The `schedule` event takes a cron string as the first argument and a callback function as the second argument. The cron string follows the following format: + +``` +* * * * * * +┬ ┬ ┬ ┬ ┬ ┬ +│ │ │ │ │ │ +│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) +│ │ │ │ └───── month (1 - 12) +│ │ │ └────────── day of month (1 - 31) +│ │ └─────────────── hour (0 - 23) +│ └──────────────────── minute (0 - 59) +└───────────────────────── second (0 - 59, OPTIONAL) +``` + +## Embed + +The embed hook injects custom JavaScript or CSS into the `` and `` tags within the Data Studio. + +```js +export default ({ embed }) => { + embed('body', ''); +}; +``` + +The embed register function requires two parameters - the position of the embed (either `head` or `body`), and a value to embed (either a string or a function that returns a string). + +## Sandboxed Hooks + +When using the sandbox, you have access to `filter` and `action` events only. Callback functions recieve the `payload` object as the only parameter. + +### TypeScript + +You can import the `SandboxHookRegisterContext` type from `directus:api` to type the register function's `context` object: + +```ts +/// +import type { SandboxHookRegisterContext } from 'directus:api'; + +export default ({ filter, action }: SandboxHookRegisterContext) => { +}; +``` + +::callout{type="dev-docs" url="/extensions/api-extensions/sandbox"} +Learn more about the Directus sandbox for API extensions. +:: + +:partial{content="extensions-api-internals"} \ No newline at end of file diff --git a/content/10.extensions/2.api-extensions/2.endpoints.md b/content/10.extensions/2.api-extensions/2.endpoints.md new file mode 100644 index 00000000..c7a9d1f9 --- /dev/null +++ b/content/10.extensions/2.api-extensions/2.endpoints.md @@ -0,0 +1,90 @@ +--- +description: Endpoints allow you to register new API routes in your Directus project. +--- + +# API Endpoints + +Endpoints allow you to register new API routes in your Directus project. + +:partial{content="extensions-api"} + +## Endpoint Entrypoint + +The `index.js` or `index.ts` file exports a register function that is read by Directus. It contains one or more route handlers, each being a sub-route of `/`. + +### Entrypoint Example + +```js +export default (router, context) => { + router.get('/', (req, res) => res.send('Hello, World!')); +}; +``` + +Alternatively, you can export a configuration object to be able to customize the root route: + +```js +export default { + id: 'greet', + handler: (router, countext) => { + router.get('/', (req, res) => res.send('Hello, World!')); + router.get('/intro', (req, res) => res.send('Nice to meet you.')); + router.get('/goodbye', (req, res) => res.send('Goodbye!')); + }, +}; +``` + +The routes of this endpoint are accessible at `/greet`, `/greet/intro` and `/greet/goodbye`. + +## Register Function + +The register function receives the two parameters `router` and `context`. `router` is an Express router instance. `context` is an object with the following properties: + +| Property | Description | +| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `services` | All API internal services. | +| `database` | Knex instance that is connected to the current database. | +| `getSchema` | Async function that reads the full available schema for use in services. | +| `env` | Parsed environment variables. | +| `logger` | [Pino](https://github.com/pinojs/pino) instance. | +| `emitter` | [Event emitter](https://github.com/directus/directus/blob/main/api/src/emitter.ts) instance that can be used to emit custom events for other extensions. | + +## Sandboxed Endpoints + +When using the sandbox, the register function receives the `router` object only. Each handler function receives only a `request` object and must return a `response` object. + +```ts +interface SandboxEndpointRequest { + url: string; + headers: Record; + body: any; +} + +interface SandboxEndpointResponse { + status: number; + body: string | Record; +} +``` + +### TypeScript + +You can import the `SandboxEndpointRouter` type from `directus:api` to type the `router` object: + +```ts +/// +import type { SandboxEndpointRouter } from 'directus:api'; + +export default (router: SandboxEndpointRouter) => { + router.get('/', () => { + return { + status: 200, + body: 'Hello World' + } + }); +}; +``` + +::callout{type="dev-docs" url="/extensions/api-extensions/sandbox"} +Learn more about the Directus sandbox for API extensions. +:: + +:partial{content="extensions-api-internals"} \ No newline at end of file diff --git a/content/10.extensions/2.api-extensions/3.operations.md b/content/10.extensions/2.api-extensions/3.operations.md new file mode 100644 index 00000000..29e21c0f --- /dev/null +++ b/content/10.extensions/2.api-extensions/3.operations.md @@ -0,0 +1,124 @@ +--- +description: Operations are single steps in a Flow - the no-code automation tool part of Directus Automate. +--- + +# Flow Operations + +Operations are single steps in a Flow - the no-code automation tool part of :product-link{product="automate"}. + +![An operation being created in a "New Subscription" flow](https://product-team.directus.app/assets/d8598efa-ed8f-4d5b-924d-8e756b34b190.webp) + +:partial{content="extensions-api"} + +Operations have two entrypoints - one for the Data Studio, and one for the server process when the flow is run. + +## App Entrypoint + +The `app.js` or `app.ts` file contains the configuration for the appearance and user-provided options of the operation. + +### Entrypoint Example + +```js +export default { + id: 'custom', + name: 'Custom', + icon: 'box', + description: 'This is my custom operation!', + overview: ({ text }) => [ + { + label: 'Text', + text: text, + }, + ], + options: [ + { + field: 'text', + name: 'Text', + type: 'string', + meta: { + width: 'full', + interface: 'input', + }, + }, + ], +}; +``` + +### Options + +| Option | Description | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | A unique identifier for this extension. | +| `name` | The displayed name for this panel in the Data Studio. | +| `icon` | An icon name from the [Google Material Icons set](https://fonts.google.com/icons). Supports filled and outlined variants. | +| `description` | A description of this panel shown in the Data Studio. Maximum 80 characters. | +| `overview` | An overview that will be shown on the operation's tile. Can be either a function that receives the options of the operation and returns an array of objects containing `label` and `text` or a dedicated Vue component. | +| `options` | The options of your operation. Can be either an options object or a dedicated Vue component. | + +:partial{content="extensions-uid"} + +## API Entrypoint + +The `api.js` or `api.ts` file contains the logic for the operation. It runs a handler function with the data passed from the App Entrypoint options. + +### Entrypoint Example + +This example assumes there is an object with a name of `text` in the App Entrypoint options. + +```js +export default { + id: 'custom', + handler: (options) => { + console.log(options.text); + }, +}; +``` + +::callout{type="info"} + +The `id` in both the app and the api entrypoint must be the same. + +:: + +### Handler Function + +The handler function is called when the operation is executed. It must return a value to trigger the `resolve` anchor or throw with a value to trigger the `reject` anchor. The returned value will be added to the [data chain](/automate/data-chain). + +The handler function receives `options` and `context`. `options` contains the operation's option values, while `context` has the following properties: + +| Property | Description | +| ---------------- | ------------------------------------------------------------------------ | +| `services` | All API internal services. | +| `database` | Knex instance that is connected to the current database. | +| `getSchema` | Async function that reads the full available schema for use in services. | +| `env` | Parsed environment variables. | +| `logger` | [Pino](https://github.com/pinojs/pino) instance. | +| `data` | Object containing the raw data returned by the previous operations. | +| `accountability` | Information about the current user received by the trigger. | + +## Sandboxed Operations + +### TypeScript + +You can import the `SandboxOperationConfig` type from `directus:api` to type the register function's `context` object: + +```ts +/// +import type { SandboxOperationConfig } from "directus:api"; + +const operation: SandboxOperationConfig = { + id: 'custom', + handler: (options) => { + }, +}; + +export default operation; +``` + +The `handler` function receives the `options` object of the current flow. + +::callout{type="dev-docs" url="/extensions/api-extensions/sandbox"} +Learn more about the Directus sandbox for API extensions. +:: + +:partial{content="extensions-api-internals"} diff --git a/content/10.extensions/2.api-extensions/4.services.md b/content/10.extensions/2.api-extensions/4.services.md new file mode 100644 index 00000000..f8b99b3a --- /dev/null +++ b/content/10.extensions/2.api-extensions/4.services.md @@ -0,0 +1,317 @@ +--- +description: When building extensions, you may use internal Directus services directly. +--- + +# Services + +API extensions can directly use internal Directus services like the `ItemsService`, `CollectionsService`, `FilesService`, and more, accessible through the `context` parameter. + +When initializing services, you will need the following: + +| Parameter | Description | +| --- | --- | +| `schema` | [Knex](https://knexjs.org/) database schema, provided by the `getSchema` function. | +| `accountability` | Accountability object, used for access control. Omission will use administrator permissions. `null` will use public permissions. | + +::callout{type="link" url="https://github.com/directus/directus/tree/main/api/src/services"} +See a complete list of all services available by looking at the Directus source code. +:: + +This page uses endpoints to demonstrate how to use services, but they can also be used in other API extension types + +## `ItemsService` + +```js +export default (router, context) => { + const { services, getSchema } = context; + const { ItemsService } = services; + + router.get('/', async (req, res) => { + const itemsService = new ItemsService('collection_name', { + schema: await getSchema(), + accountability: req.accountability + }); + + // Your route handler logic + }); +}; +``` + +### Create an Item + +```js +const data = await itemsService.createOne({ + title: 'Hello world!', + body: 'This is our first article', +}); +``` + +### Read an Item + +```js +const data = await itemsService.readOne('item_id'); +``` + +### Update an Item + +```js +const data = await itemsService.updateOne('item_id', { + title: "An updated title" +}); +``` + +### Delete an Item + +```js +const data = await itemsService.deleteOne('item_id'); +``` + +::callout{type="link" url="https://github.com/directus/directus/blob/main/api/src/services/items.ts"} +See a complete list of all methods in the `ItemsService` by looking at the Directus source code. +:: + +## `CollectionsService` + +```js +export default (router, context) => { + const { services, getSchema } = context; + const { CollectionsService } = services; + + router.get('/', async (req, res) => { + const collectionsService = new CollectionsService({ + schema: await getSchema(), + accountability: req.accountability + }); + + // Your route handler logic + }); +}; +``` + +### Create a Collection + +```js +const data = await collectionsService.createOne({ + name: 'articles', + meta: { + note: 'Blog posts.', + }, +}); +``` + +### Read a Collection + +```js +const data = await collectionsService.readOne('collection_name'); +``` + +### Update a Collection + +```js +const data = await collectionsService.updateOne('collection_name', { + meta: { + note: 'Updated blog posts.', + }, +}); +``` + +### Delete a Collection + +```js +const data = await collectionsService.deleteOne('collection_name'); +``` + +::callout{type="link" url="https://github.com/directus/directus/blob/main/api/src/services/collections.ts"} +See a complete list of all methods in the `CollectionsService` by looking at the Directus source code. +:: + +## `FieldsService` + +```js +export default (router, context) => { + const { services, getSchema } = context; + const { FieldsService } = services; + + router.get('/', async (req, res) => { + const fieldsService = new FieldsService({ + schema: await getSchema(), + accountability: req.accountability + }); + + // Your route handler logic + }); +} +``` + +### Create a Field + +```js +await fieldsService.createField('collection_name', { + field: 'title', + type: 'string', + meta: { + icon: 'title', + }, + schema: { + default_value: 'Hello World', + }, +}); +``` + +### Read a Field + +```js +const data = await fieldsService.readOne('collection_name', 'field_name'); +``` + +### Update a Field + +```js +const data = await fieldsService.updateField('collection_name', 'field_name', { + meta: { + icon: 'title', + }, +}); +``` + +::callout{type="info"} +You cannot update the field name via Directus after creating the field. +:: + +### Delete a Field + +```js +const data = await fieldsService.deleteField('collection_name', 'field_name'); +``` + +## `RelationsService` + +```js +export default (router, context) => { + const { services, getSchema } = context; + const { RelationsService } = services; + + router.get('/', async (req, res) => { + const relationsService = new RelationsService({ + schema: await getSchema(), + accountability: req.accountability + }); + + // Your route handler logic + }); +}; +``` + +### Create a Relation + +```js +const data = await relationsService.createOne({ + collection: 'articles', + field: 'featured_image', + related_collection: 'directus_files', +}); +``` + +### Read a Relation + +```js +const data = await relationsService.readOne('collection_name', 'field_name'); +``` + +### Update a Relation + +```js +const data = await relationsService.updateOne( + 'collection_name', + 'field_name', + { + meta: { + one_field: 'articles', + }, + }, +); +``` + +### Delete a Relation + +```js +const data = await relationsService.deleteOne('collection_name', 'field_name' ); +``` + +::callout{type="link" url="https://github.com/directus/directus/blob/main/api/src/services/relations.ts"} +See a complete list of all methods in the `RelationsService` by looking at the Directus source code. +:: + +## `FilesService` + +```js +export default (router, context) => { + const { services, getSchema } = context; + const { FilesService } = services; + + router.get('/', async (req, res) => { + const filesService = new FilesService({ + schema: await getSchema(), + accountability: req.accountability + }); + + // Your route handler logic + }); +}; +``` + +### Import a File + +```js +const assetKey = await filesService.importOne({ + url: file_url, + data: file_object, +}); +``` + +### Upload a File + +Uploading a file requires the use of an external dependency called _Busboy_, a streaming parser for Node.js. Import it at the top of your extension: + +```js +import Busboy from 'busboy' +``` + +Then, inside of the route handler, pipe the request into Busboy: + +```js +const busboy = Busboy({ headers: req.headers }); + +busboy.on('file', async (_, fileStream, { filename, mimeType }) => { + const primaryKey = await filesService.uploadOne(fileStream, { + filename_download: filename, + type: mimeType, + storage: 'local', + }); +}); + +req.pipe(busboy); +``` + +### Read a File + +```js +const data = await filesService.readOne('file_id'); +``` + +### Update a File + +```js +const data = await filesService.updateOne('file_id', { title: 'Random' }); +``` + +### Delete a File + +```js +const data = await filesService.deleteOne('file_id'); +``` + +::callout{type="link" url="https://github.com/directus/directus/blob/main/api/src/services/files.ts"} +See a complete list of all methods in the `FilesService` by looking at the Directus source code. +:: + diff --git a/content/10.extensions/2.api-extensions/5.sandbox.md b/content/10.extensions/2.api-extensions/5.sandbox.md new file mode 100644 index 00000000..0886103c --- /dev/null +++ b/content/10.extensions/2.api-extensions/5.sandbox.md @@ -0,0 +1,114 @@ +--- +description: Sandboxed Extensions run in an isolated environment and must request permission scopes. +--- + +# Sandbox + +Sandboxed API Extensions run in an isolated environment and must request permission scopes to interact with the host environment. + +The sandboxed environment only has access to [JavaScript standard built-in objects](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects) which means that common runtime functions such as `console` and `setTimeout` are not available. A sandboxed extension is given additional capabilites through scopes and functions provided by the `directus:api` module. + +## Enabling the Sandbox + +To enable the the sandbox, add the `sandbox` object to your extension's `package.json` file. + +```json +"directus:extension": { + "type": "endpoint", + "path": "dist/index.js", + "source": "src/index.js", + "host": "^10.7.0", + "sandbox": { + "enabled": true, + "requestedScopes": {} + } +} +``` + +## Using TypeScript + +To enable type checking for `directus:api` functions, use the `api.d.ts` file from `@directus/extensions`. Reference it directly or add it to `tsconfig.json` for global extension support. + +```ts +/// +import type { SandboxEndpointRouter } from 'directus:api'; + +export default (router: SandboxEndpointRouter) => { + router.get("/hello", () => { + return { status: 200, body: "Hello World" }; + }); +}; +``` + +## Log Scope + +The `log` function will print a message in the API's `logger` output. It can be used as a replacement for `console.log`. + +```js +import { log } from 'directus:api'; + +log('Hello World!'); +``` + +### Required Scopes + +The `log` function requires the `log` scope. There are no additional configuration options. + +```json +"requestedScopes": { + "log": {} +} +``` + +## Sleep Scope + +The `sleep` function will wait for a given number of milliseconds. It can be used as a replacement for `setTimeout`. + +```js +import { sleep } from 'directus:api'; + +await sleep(1000); +``` + +### Required Scopes + +The `sleep` function requires the `sleep` scope. There are no additional configuration options. + +```json +"requestedScopes": { + "sleep": {} +} +``` + +## Request Scope + +The `request` function will make a network request to specified URLs. + +```js +import { request } from 'directus:api'; + +const getRequest = await request('https://directus.io'); + +const postRequest = await request('https://directus.io', { + method: 'POST', + headers: { Authorization: 'Bearer 1234567890' }, + body: { key: 'value' } +}); +``` + +Responses contain a `status`, `statusText`, `headers`, and `data` property. + +### Required Scopes + +The `request` function requires the `request` scope. You must specify which methods and URLs are allowed. + +```json +"requestedScopes": { + "request": { + "methods": ["GET", "POST"], + "urls": ["https://directus.io/*"] + } +} +``` + +The `url` property supports wildcards. For development purposes, you can use `https://*` to allow all URLs. \ No newline at end of file diff --git a/content/10.extensions/3.app-extensions/0.index.md b/content/10.extensions/3.app-extensions/0.index.md new file mode 100644 index 00000000..a72db0d4 --- /dev/null +++ b/content/10.extensions/3.app-extensions/0.index.md @@ -0,0 +1,14 @@ +--- +title: App Extensions +description: App Extensions extend the functionality of the Data Studio. +--- + +# App Extensions Overview + +App Extensions extend the functionality of the Data Studio. + +## Extension Types +:article-cards{:paths='["/extensions/app-extensions/interfaces","/extensions/app-extensions/displays","/extensions/app-extensions/layouts","/extensions/app-extensions/panels","/extensions/app-extensions/modules","/extensions/app-extensions/themes"]'} + +## Resources +:article-cards{:paths='["/extensions/app-extensions/ui-library","/extensions/app-extensions/composables"]'} diff --git a/content/10.extensions/3.app-extensions/1.interfaces.md b/content/10.extensions/3.app-extensions/1.interfaces.md new file mode 100644 index 00000000..fb97cbed --- /dev/null +++ b/content/10.extensions/3.app-extensions/1.interfaces.md @@ -0,0 +1,115 @@ +--- +description: Interfaces are form inputs used primarily inside of the Directus Editor. +--- + +# Editor Interfaces + +Interfaces are form inputs used primarily inside of the :product-link{product="editor"}. + +Interfaces are the primary way users interact with data inside of Directus. Custom interfaces can be used for use cases with unique interaction needs, complex data entry, and any time you need to add elements to the editor. + +![An "input" in the content module](https://product-team.directus.app/assets/e0712e22-1cda-403b-9903-7e20aa473701.webp) + +:partial{content="extensions-app"} + +## Interface Entrypoint + +The `index.js` or `index.ts` file exports an object that is read by Directus. It contains properties that control how an interface is displayed within menus, it’s what types it supports, what configurable options will be available to users, and the actual Vue component that will be loaded. + +### Entrypoint Example + +```js +import { defineInterface } from '@directus/extensions-sdk' +import InterfaceComponent from './interface.vue'; + +export default defineInterface({ + id: 'custom', + name: 'Custom', + icon: 'box', + description: 'This is my custom interface!', + component: InterfaceComponent, + types: ['string'], + options: [ + { + field: 'text', + name: 'Text', + type: 'string', + meta: { + interface: 'input', + width: 'full', + } + }, + ], +}); +``` + +### Properties + +| Property | Type | Description | +| --------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | string | A unique identifier for this extension. | +| `name` | string | The displayed name for this panel in the Data Studio. | +| `icon` | string | An icon name from the [Google Material Icons set](https://fonts.google.com/icons). Supports filled and outlined variants. | +| `description` | string | A description of this interface shown in the Data Studio. Maximum 80 characters. | +| `component` | component | A reference to the Vue component rendered in the editor. | +| `types` | array | All [types](/data-modeling/fields) supported by the interface. | +| `localTypes` | array | All local types supported by this interface. Accepts `standard`, `file`, `files`, `m2o`, `o2m`, `m2m`, `m2a`, `presentation`, `translations`, and `group`. Defaults to `standard`. | +| `group` | string | The group this interface is shown at when creating a field. Accepts `standard`, `selection`, `relational`, `presentation`, `group`, or `other`. Defaults to `other`. | +| `relational` | boolean | Indicates if this a relational interface. | +| `recommendedDisplays` | array | A list of display names which are recommended to be used with this interface. | +| `options` | array \| component | | When an array, options contains user-configurable fields that are set when creating or editing the interface. +| `preview` | string | Inline SVG to display in interface selection drawer. | + +:partial{content="extensions-uid"} + +:partial{content="extensions-theme"} + +## Interface Component + +The interface component is a Vue component that will be rendered in the Data Studio within the Editor. Data from the entrypoint are passed in as props. + +### Component Example + +This example assumes there is an item in the entrypoint’s `options` array with a `field` value of `url`. + +```vue + + + +``` + +The current value of the field is provided to the component via the `value` prop. If the value was changed inside your component, it should be emitted to the Directus Editor by using the `input` emit. + +### Props + +The interface component will be passed all user configuration options from the entrypoint file. It will also receive the following props: + +| Prop | Type | Description | +| ------------ | ------ | ------------------------------------------------------------------------------ | +| `value` | string | The current value of the field. | +| `width` | string | The layout width of the field. One of `half`, `half-right`, `full`, or `fill`. | +| `type` | string | The type of the field. | +| `collection` | string | The current collection name. | +| `field` | uuid | The key of the field. | +| `primaryKey` | string | The current item's primary key. | + +### Emits + +The interface component can emit the following events that will be recognized by Directus. + +| Event | Description | +| --------------- | -------------------------------------- | +| `input` | Update the value of the field. | +| `setFieldValue` | Used to set the value of other fields. | + +:partial{content="extensions-app-internals"} diff --git a/content/10.extensions/3.app-extensions/2.displays.md b/content/10.extensions/3.app-extensions/2.displays.md new file mode 100644 index 00000000..4f8459fe --- /dev/null +++ b/content/10.extensions/3.app-extensions/2.displays.md @@ -0,0 +1,110 @@ +--- +description: Displays are used to display a single value throughout the Data Studio. +--- + +# Inline Displays + +Displays are small components that are used to display a single value throughout the Data Studio. + +Displays receive a single value and any custom display options that are defined in the display entrypoint. They are then expected to render the value in a user-friendly way. + +![A Datetime display in the content module](https://product-team.directus.app/assets/99a21abb-a866-4766-bbce-0ed13295112b.webp) + +:partial{content="extensions-app"} + +## Display Entrypoint + +The `index.js` or `index.ts` file exports an object that is read by Directus. It contains properties that control how a display is displayed throughout the Data Studio, which options are available, and the actual Vue component that will be loaded. + +### Entrypoint Example + +```js +import { defineInterface } from '@directus/extensions-sdk' +import DisplayComponent from './display.vue'; + +export default defineInterface({ + id: 'custom', + name: 'Custom', + icon: 'box', + description: 'This is my custom display!', + component: DisplayComponent, + options: null, + types: ['string'], +}); +``` + +### Properties + +| Property | Type | Description | +| ------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | string | A unique identifier for this extension. | +| `name` | string | The displayed name for this layout in the Data Studio. | +| `icon` | string | An icon name from the [Google Material Icons set](https://fonts.google.com/icons). Supports filled and outlined variants. | +| `description` | string | A description of this display shown in the Data Studio. Maximum 80 characters. | +| `component` | component | A reference to your display component. | +| `options` | object \| component | The options of your display. Can be either an options object or a dedicated Vue component. | +| `types` | array | All [types](/data-modeling/fields) supported by the display. | +| `localTypes` | array | All local types supported by this display. Accepts `standard`, `file`, `files`, `m2o`, `o2m`, `m2m`, `m2a`, `presentation`, `translations` and `group`. Defaults to `standard`. | +| `fields` | array \| function | If this option is set, the display will fetch relational fields. Can either be an array of fields or a function that returns an array of fields. | + +:partial{content="extensions-uid"} + +## Display Component + +The display component is a Vue component that will be rendered in the Data Studio whenever your display is used to show the value of a field. Data from the entrypoint are passed in as props. + +### Component Example + +This example assumes there is an item in the entrypoint’s `options` array with a `field` value of `url`. + +```vue + + + +``` + +The current value of the field is provided to the component via the `value` prop. If you use the `fields` option to fetch relational fields, the `value` prop will be an object with the requested fields as keys and their respective values. + +### Props + +| Prop | Type | Description | +| ------------------ | ------ | -------------------------------------- | +| `value` | any | The value of the field. | +| `interface` | string | The interface of the field. | +| `interfaceOptions` | object | The options for the field's interface. | +| `type` | string | The type of the field. | +| `collection` | string | The collection name of the field. | +| `field` | string | The key of the field. | + +### Functional Component + +Instead of defining the component inside a separate Vue file, you can use a functional component. This allows you to make small displays that don't need a full component. + +```js +import { defineInterface } from '@directus/extensions-sdk' + +export default defineInterface({ + id: 'custom', + name: 'Custom', + icon: 'box', + description: 'This is my custom display!', + component: function ({ value }) { + return value.toLowerCase(); + }, + options: null, + types: ['string'], +}); +``` + +:partial{content="extensions-app-internals"} diff --git a/content/10.extensions/3.app-extensions/3.layouts.md b/content/10.extensions/3.app-extensions/3.layouts.md new file mode 100644 index 00000000..01be9c21 --- /dev/null +++ b/content/10.extensions/3.app-extensions/3.layouts.md @@ -0,0 +1,120 @@ +--- +description: Layouts are used to display a list of items in Explore pages in different ways. +--- + +# Explore Layouts + +Layouts allow for listing of items in :product-link{product="explore"} pages. + +Layouts receive a collection, filters, searches, and any custom layout options that are defined in the layout entrypoint. They are then expected to fetch and render the items from a collection. + +![A table display in the content module](https://product-team.directus.app/assets/ca3ceb27-7cbd-493d-acb1-d15cb707fb31.webp) + +:partial{content="extensions-app"} + +## Layout Entrypoint + +The `index.js` or `index.ts` file exports an object that is read by Directus. It contains properties that control how a layout is displayed within menus, which options are available, optional slots, and the actual Vue component that will be loaded. + +### Entrypoint Example + +```js +import { ref } from 'vue'; +import { defineInterface } from '@directus/extensions-sdk' +import LayoutComponent from './layout.vue'; + +export default defineInterface({ + id: 'custom', + name: 'Custom', + icon: 'box', + component: LayoutComponent, + slots: { + options: () => null, + sidebar: () => null, + actions: () => null, + }, + setup() { + const name = ref('Custom Layout'); + return { name }; + }, +}); +``` + +### Properties + +| Property | Type | Description | +| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | string | A unique identifier for this extension. | +| `name` | string | The displayed name for this layout in the Data Studio. | +| `icon` | string | An icon name from the [Google Material Icons set](https://fonts.google.com/icons). Supports filled and outlined variants. | +| `component` | component | A reference to the Vue component rendered in the Explore page. | +| `slots` | object | Additional components to be added by your layout. | +| `slots.options` | component | A reference to an options component. | +| `slots.sidebar` | component | A reference to a sidebar component. | +| `slots.actions` | component | A reference to an actions component. | +| `setup` | function | A function to setup reactive state to be shared by the layout component and the other components. It receives a `props` object as the first parameter and a `context` object containing an `emit()` function as the second parameter. | + +The `actions` slot is used to render additional buttons at the top of the layout by the search bar. It is commonly used to add additional buttons or display metadata about the layout. + +:partial{content="extensions-uid"} + +## Layout Component + +The layout component is a Vue component that will be rendered in the Data Studio within Explore pages. + +### Component Example + +```vue + + + +``` + +### Props + +The layout component will be passed all user configuration options from the entrypoint file. It will also receive the following props: + +| Prop | Type | Description | +| --------------- | -------- | ------------------------------------------------------------ | +| `collection` | string | The current collection's name. | +| `selection` | array | Any currently selected items. | +| `layoutOptions` | object | The user's currently saved layout options. | +| `layoutQuery` | object | The user's layout query parameters. (e.g., sort, limit, etc). | +| `filter` | object | The combined active filter. | +| `filterUser` | object | The user's currently active filter. | +| `filterSystem` | object | The system's currently active filter. | +| `search` | string | The user's current search query. | +| `selectMode` | boolean | Indicates if the layout should be in select mode. | +| `readonly` | boolean | Indicates if the layout should be in readonly mode. | +| `resetPreset` | function | A function to reset the preset. | + +### Emits + +The layout component can emit the following events that will be recognized by Directus. + +| Event | Description | +|------------------------|-------------------------------------------------------| +| `update:selection` | Update the currently selected items. | +| `update:layoutOptions` | Update the user's currently saved layout options. | +| `update:layoutQuery` | Update the user's layout query parameters. | + +:partial{content="extensions-app-internals"} diff --git a/content/10.extensions/3.app-extensions/4.panels.md b/content/10.extensions/3.app-extensions/4.panels.md new file mode 100644 index 00000000..07cbcc94 --- /dev/null +++ b/content/10.extensions/3.app-extensions/4.panels.md @@ -0,0 +1,108 @@ +--- +description: Panels are customizable components within Directus Insights dashboards. +--- + +# Dashboard Panels + +Panels are customizable components within :product-link{product="insights"} dashboards. + +Panels are the building blocks of analytics dashboards, enabling rapid, no-code creation of data visualizations with data from a Directus project. Panels can also contain interactive elements, making them suitable for building custom internal applications within dashboards. + +![A panel in the insights module](https://product-team.directus.app/assets/cd83e252-c23b-4e03-b2f4-dc35cee2d6a7.webp) + +:partial{content="extensions-app"} + +## Panel Entrypoint + +The `index.js` or `index.ts` file exports an object that is read by Directus. It contains properties that control how a panel is displayed within menus, it’s minimum width and height on the dashboard grid, what configurable options will be available to users, and the actual Vue component that will be loaded. + +### Entrypoint Example + +```js +import { defineInterface } from '@directus/extensions-sdk' +import PanelComponent from './panel.vue'; + +export default defineInterface({ + id: 'custom', + name: 'Custom', + icon: 'box', + description: 'This is my custom panel!', + component: PanelComponent, + minWidth: 12, + minHeight: 8, + options: [ + { + field: 'text', + name: 'Text', + type: 'string', + meta: { + interface: 'input', + width: 'full', + }, + }, + ], +}); +``` + +### Properties + +| Property | Type | Description | +| ------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------- | +| `id` | string | A unique identifier for this extension. | +| `name` | string | The displayed name for this panel in the Data Studio. | +| `icon` | string | An icon name from the [Google Material Icons set](https://fonts.google.com/icons). Supports filled and outlined variants. | +| `description` | string | A description of this panel shown in the Data Studio. Maximum 80 characters. | +| `component` | component | A reference to the Vue component rendered in the dashboard. | +| `minWidth` | number | Smallest number of grid units in the dashboard. | +| `minHeight` | number | Smallest number of grid units in the dashboard. | +| `options` | array \| component | | When an array, options contains user-configurable fields that are set when creating or editing the panel. +| `preview` | string | Inline SVG to display in panel selection drawer. | + +:partial{content="extensions-uid"} + +:partial{content="extensions-theme"} + +## Panel Component + +The panel component is a Vue component that will be rendered in the Data Studio within a dashboard. Data from the entrypoint are passed in as props. + +### Component Example + +This example assumes there is an item in the entrypoint’s `options` array with a `field` value of `text`. + +```vue + + + + + +``` + +### Props + +The panel component will be passed all user configuration options from the entrypoint file. It will also receive the following props: + +| Prop | Type | Description | +| ------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `id` | uuid | The UUID for this panel. This is for a specific instance of the panel and will not be the defined `id` in the entrypoint file. | +| `dashboard` | uuid | The UUID for the dashboard containing the panel. | +| `showHeader` | boolean | Whether the panel header visibility is enabled in the options. | +| `width` | number | The current number of grid units wide the panel is. | +| `height` | number | The current number of grid units high the panel is. | +| `now` | date | The date object at the time of loading the dashboard. | + +:partial{content="extensions-app-internals"} diff --git a/content/10.extensions/3.app-extensions/5.modules.md b/content/10.extensions/3.app-extensions/5.modules.md new file mode 100644 index 00000000..46c88a5e --- /dev/null +++ b/content/10.extensions/3.app-extensions/5.modules.md @@ -0,0 +1,100 @@ +--- +description: Modules are top-level areas of the Data Studio, navigated to from the left-hand module bar. +--- + +# Custom Modules + +Modules are top-level areas of the Data Studio, navigated to from the left-hand module bar. They will load at the specified routes. + +![A module in Directus](https://product-team.directus.app/assets/7db9b50a-d25b-40b1-86dc-3e09dad388bf.webp) + +The Data Studio splits up functionality into modules - the content module, the files module, the user module, the insights module, and the settings module. Extensions can add new modules to the Data Studio. + +::callout{type="info" title="Enable the Module"} + +For the module to appear in the module bar, the extension has to be enabled in your main project settings. + +:: + +:partial{content="extensions-app"} + +## Module Entrypoint + +The `index.js` or `index.ts` file exports an object that is read by Directus. It contains properties that control how a module is displayed in the module bar, the routes that exist within the module, and the actual Vue component that will be loaded. + +## Entrypoint Example + +```js +import { defineInterface } from '@directus/extensions-sdk' +import ModuleComponent from './module.vue'; + +export default defineInterface({ + id: 'custom', + name: 'Custom', + icon: 'box', + routes: [ + { + path: '', + component: ModuleComponent, + }, + ], +}); +``` + +### Properties + +| Property | Type | Description | +| ------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | string | A unique identifier for this extension. | +| `name` | string | The displayed name for this panel in the Data Studio. | +| `icon` | string | An icon name from the [Google Material Icons set](https://fonts.google.com/icons). Supports filled and outlined variants. | +| `color` | string | A color associated with the module. | +| `routes` | array | List of routes in the module. The routes are registered as nested routes with the module's `id` serving as the base path. | +| `hidden` | boolean | A boolean that indicates if the module should be hidden from the module bar. | +| `preRegisterCheck` | function | A function that receives the current user as the first parameter and the permissions of this user as the second parameter. It should return a boolean indicating success. | + +:partial{content="extensions-uid"} + +### Route Object + +The route object uses the same syntax as Vue Router, defining each route as an object. + +| Property | Description | +| ----------- | ---------------------------------------------- | +| `path` | The route path without the leading slash. | +| `component` | A Vue component to be rendered for this route. | + + +The `routes` array should contain a root route with an empty path, which will load at the module's base route (the value of the module's `id`). Dynamic portions of the path can be defined using the `:param` syntax. + +### Route Component + +The module route component will be rendered in the Data Studio when the route is accessed. + +```vue + + + +``` + +You can use the globally-registered `private-view` component to get access to Directus' page structure consisting of the module bar, navigation, +sidebar, header, and the main content area. Named slots can be used to add additional content to these areas. + +| Slot | Description | +| --------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `navigation` | Adds content to the navigation area of the Directus interface. | +| `title-outer:prepend` | Inserts content before the outer title container in the Directus header. | +| `headline` | Displays a headline above the main title in the Directus header. | +| `title` | Sets the main title in the Directus header. If not used, `title:prepend` and `title:append` can be used instead. | +| `title-outer:append` | Inserts content after the outer title container in the Directus header. | +| `actions:prepend` | Adds content before the action buttons in the Directus header. | +| `actions` | Defines the main action buttons in the Directus header. | +| `actions:append` | Adds content after the action buttons in the Directus header. | +| `splitView` | Renders content in the split view area (only if the private layout has the split-view prop set to true). | +| `sidebar` | Populates the sidebar area in the Directus interface. | + +:partial{content="extensions-app-internals"} diff --git a/content/10.extensions/3.app-extensions/6.themes.md b/content/10.extensions/3.app-extensions/6.themes.md new file mode 100644 index 00000000..5a82e6dc --- /dev/null +++ b/content/10.extensions/3.app-extensions/6.themes.md @@ -0,0 +1,93 @@ +--- +description: Themes are used to style elements of the Data Studio including colors and fonts. +--- + +# Custom Themes + +Themes are used to style the Data Studio. They can be used to change the colors, fonts, and other visual elements of the Data Studio. + +![Directus' default theme](https://product-team.directus.app/assets/91797ca8-68fa-4231-b143-8d5e134e9981.webp) + +## Theme Entrypoint + +The `index.js` or `index.ts` file exports an object that is read by Directus. It contains properties that control how a theme is displayed and what rules are applied when it is enabled. + +### Entrypoint Example + +```js +import { defineTheme } from '@directus/extensions-sdk'; + +export default defineTheme({ + id: 'custom', + name: 'My Custom Theme', + appearance: 'dark', + rules: { + background: 'tomato', + } +}); +``` + +### Properties + +| Property | Type | Description | +|-------------|--------|--------------------------------------------------------------------------------------------------------------------| +| `id` | string | A unique identifier for this extension. | +| `name` | string | The displayed name for this panel in the Data Studio. | +| `appearance`| string | To which appearance mode the theme belongs to - `light` or `dark`. | +| `rules` | object | A set of theming rules from the theme schema. | +### Available Rules + +Rules that are configured in the `rules` property adhere to the rules section of the [theme schema](https://github.com/directus/directus/blob/main/packages/themes/src/schemas/theme.ts). + +```js{3-5} +rules: { + borderRadius: '24px', + navigation: { + background: 'rebeccapurple' + } +} +``` + +Any rules that are not defined will fallback to the default theme for it's appearance. See the +([`default dark theme`](https://github.com/directus/directus/blob/main/packages/themes/src/themes/dark/default.ts) and +[`default light theme`](https://github.com/directus/directus/blob/main/packages/themes/src/themes/dark/default.ts)). + +We recommend using TypeScript for this extension type. The `defineTheme` function is typed to properly check and auto-complete all available rules. + +Custom Themes include only the allowed rules, and do not include custom CSS. + +### Theme Usage in the Directus Data Studio + +Every rule is automatically inserted in the app's root element as a CSS variable which are used across the app's +components. For example, the JSON path `navigation.modules.button.foregroundActive` will be available as +`var(--theme--navigation--modules--button--foreground-active)`. + +::callout{type="info" title="Property Names"} + +Nested objects are separated by `--`, and camelCase values are transformed to hyphen-case (`foregroundActive` becomes `foreground-active`). + +:: + +Because each rule is used as a CSS variable, each rule value should be valid CSS. This also means you can use any CSS +functions in the rules. + +## Using User Theming Options as a Development Tool + +The Theming Options customization interface found in the global appearance settings and user detail page uses theming +rules. For easier extension development, you can use this interface to configure your theme, and then save the output to your theme extension by using the "Copy Raw Value" option above the interface. + +## Google Fonts + +The `fontFamily` rules take any valid CSS `font-family` value. To load a Google Font, wrap the font name in a set of +quotes `""`. This is still valid CSS, but if the font-name is wrapped in quotes, Directus will automatically try +downloading it through Google Fonts. For example: + +```js +// Use the locally installed font called "Comic Sans MS" +fontFamily: 'Comic Sans MS, sans-serif' + +// Use the Google font "Yesteryear" +fontFamily: '"Yesteryear", sans-serif' +``` + +When using a Google Font, ensure the configured weight is available for the selected font. diff --git a/content/10.extensions/3.app-extensions/7.ui-library.md b/content/10.extensions/3.app-extensions/7.ui-library.md new file mode 100644 index 00000000..4de7370b --- /dev/null +++ b/content/10.extensions/3.app-extensions/7.ui-library.md @@ -0,0 +1,62 @@ +--- +description: Directus offers globally-registered UI components for building extensions. +--- + +# UI Library + +Directus offers reusable UI components for building extensions, providing a consistent user experience across the Directus Data Studio. These components are used by Directus itself and can be utilized in any extension without explicit imports. + +Explore the available components in our [Directus Components Playground](https://components.directus.io/). Here, you can +see all available components and experiment with variations before implementing them in your extensions. + +![Exploring the Button Component and its variations on the Directus UI Components Playground](https://product-team.directus.app/assets/f113fff5-aeda-4ee6-a390-88649c5a26a6.gif) + +## Extension Usage + +Directus UI components are globally registered, making them accessible throughout your extension project without the +need for explicit imports. Here’s an example: + +```html +My Button +``` + +## Customizing Styles + +Each component exports CSS custom properties (variables) that can be targeted for style overrides. + +For example, to adjust the text color of a button on hover: + +```vue + + + +``` + +::callout{type="info" title="Explore Component CSS Variables"} + +Refer to the full list of component based CSS variables [in our source code](https://github.com/directus/directus/tree/main/app/src/components). + +:: + +## Creating a Custom UI Component + +The Directus UI components are designed with flexibility and customization in mind. However, you may need to create your +own components using shared styling. Directus exposes several CSS variables for both light and dark themes. + +Examples of CSS variables include `--theme--border-normal`, `--theme--foreground-normal` `--theme--purple`, `--theme--module-background`, and +`--theme--overlay-color`. + +::callout{type="info" title="Explore Light and Dark Theme CSS Variables"} + +Refer to our [source code](https://github.com/directus/directus/tree/main/app/src/styles/themes) for a full list of CSS +variables. + +:: diff --git a/content/10.extensions/3.app-extensions/8.composables.md b/content/10.extensions/3.app-extensions/8.composables.md new file mode 100644 index 00000000..682aa19e --- /dev/null +++ b/content/10.extensions/3.app-extensions/8.composables.md @@ -0,0 +1,207 @@ +--- +description: Vue composables for working with Directus services when building extensions. +--- + +# Composables + +There are several Vue composables available as part of the Directus Extensions SDK that make working with Directus easier when building app extensions. + +Rather than needing to rewrite logic from scratch, extension developers can leverage primitives like `useApi()` or `useStores()`, to handle common complexities when building extensions. + +## `useApi()` + +The `useApi` composable is a wrapper around the `axios` library that uses the Data Studio's session cookie and provides concurrency +control when making multiple requests. Use the `useApi` composable when you need to make authorized API requests from your app extension. + +```html + +``` + +## `useStores()` + +The `useStores` composable serves as the primary way for app extensions to interact with data and features within a Directus project. `useStores` contains all stores, including `usePermissionsStore`, `useCollectionsStore`, and `useFieldsStore`. + +```html + +``` + +### `useFieldsStore()` + +The `useFieldsStore` is used to access and modify collections and fields. Use this store to retrieve field information, perform field mutations, or get field translations. + +```html + +``` + +### `usePermissionsStore()` + +The `usePermissionsStore` is used to check the current user's access control before performing operations within your app extension. + +```html + +``` + +### `useCollectionsStore()` + +The `useCollectionsStore` provides access to collections directly from your App extension. Use this store for CRUD operations on collections, retrieving translations, and accessing all or visible collections in Directus. + +```html + +``` + +## `useCollection()` + +The `useCollection` composable provides access to metadata about collections. Use this store to retrieve collection metadata, fields, default values, primary key, and accountability scope. You can't use it to manipulate collection configuration. + +```html + +``` + +## `useItems()` + +The `useItems` composable is used to retrieve items in a collection and provides pagination features. + +### Fetching Items in a Collection + +```html + +``` + +### Fetching the Item and Page Count + +```html + +``` + +### Fetching the Total Count + +```html + +``` + +## Next Steps + +While these core composables cover many common use cases, for a complete reference of all available Extension SDK +composables within Directus, check out our [source code](https://github.com/directus/directus/blob/main/app/src/composables/use-system.ts). Our source code also contains the [full list in of stores](https://github.com/directus/directus/blob/main/app/src/composables/use-system.ts). \ No newline at end of file diff --git a/content/10.extensions/4.bundles.md b/content/10.extensions/4.bundles.md new file mode 100644 index 00000000..a2fb2477 --- /dev/null +++ b/content/10.extensions/4.bundles.md @@ -0,0 +1,46 @@ +--- +description: Bundles are a way to group extensions together as a single distributable package. +--- + +# Bundling Extensions + +Bundles are a way to group extensions together as a single distributable package. They can be used when extensions should be installed together or to combine and share dependencies. + +## Creating a Bundle + +When creating an extension, select a `bundle` type. This will create a new empty bundle. + +## Entries + +In your bundle's `package.json` file, the `directus:extension` object has an `entries` array that describes all of the items contained within the bundle. Entries in a bundle are located within a `src` directory in the bundle. + +```json +{ + "type": "interface", + "name": "my-interface", + "source": "src/my-interface/index.ts" +} +``` + +## Partial + +For bundle type extensions `package.json` file, the `directus:extension` object supports an additional optional `partial` property. This boolean property controls whether the bundles entries can be individually disabled. This is enabled by default. + +## Add an Extension + +### Create New + +1. Navigate to your bundle extension directory in your terminal. +2. Use the `npm run add` command and select an extension type. + +This will create a boilerplate extension. + +### Add Existing + +1. Move your extension directory within your bundle's `src` directory. +2. Add an entry to the bundle's `package.json`. + +## Remove an Extension + +1. Delete the extension directory from your `src` directory. +2. Remove the entry from your `package.json`. diff --git a/content/10.extensions/5.marketplace/0.index.md b/content/10.extensions/5.marketplace/0.index.md new file mode 100644 index 00000000..1960b4e9 --- /dev/null +++ b/content/10.extensions/5.marketplace/0.index.md @@ -0,0 +1,29 @@ +--- +description: The Directus Marketplace provides a way for users to install extensions in their projects directly the Data Studio. +--- + +# Marketplace Beta + +The Directus Marketplace provides a way for users to install extensions in their projects directly the Data Studio. It's available in all projects, whether run on Directus Cloud or self-hosted. + +## Discover Extensions + +![An extension page showing the key metadata from the home, as well as a readme with a screenshot, install button, and a popularity graph.](https://product-team.directus.app/assets/98118508-cea1-487c-a57b-ea7a44fb44ff.png) + +The Marketplace is accessible from your project settings. Here, you can search, filter, and sort the available extensions to navigate to the extension detail page where you can install extensions. + +::callout{type="info" title="Compatibility Warnings"} +Extension authors must specify which versions the extensions have been tested to work with. If authors don't update this value, we may show an incompatibility warning. This does not mean that an extension does not work, but that the author has not explicitly stated that it does. +:: + +## Manage Extensions + +The currently-installed extensions list is accessible from your project settings. Here, you can disable or uninstall them. Extensions in [bundles](/extensions/bundles) can be disabled, but only the whole bundle can be uninstalled. + +## Publishing Extensions + +The Directus Marketplace uses the Directus Extensions Registry to publish and install extensions. While in beta, all extensions published to npm are available via the registry. + +::callout{type="dev-docs" url="/extensions/marketplace/publishing"} +Learn more about publishing extensions to the Directus Marketplace. +:: diff --git a/content/10.extensions/5.marketplace/1.publishing.md b/content/10.extensions/5.marketplace/1.publishing.md new file mode 100644 index 00000000..682d4b25 --- /dev/null +++ b/content/10.extensions/5.marketplace/1.publishing.md @@ -0,0 +1,113 @@ +--- +description: +--- + +# Publishing Extensions + +Directus hosts a registry mirroring npm, with enhanced search/filtering and security features like blocking/delisting. The Directus Extensions Registry is updated every few hours, and only the latest version of an extension is available in the Marketplace. + +## Required Metadata + +To be discovered by the Directus Extensions Registry, your extension must be published on npm with the `directus-extension` keyword in the `package.json` file. To be listed in the Marketplace, the `package.json` file must also contain the following properties: + +| Property | Description | +| ------------------------- | ------------------------------------------------------------------------------ | +| `name` | Required by npm to publish a package. | +| `version` | Required by npm to publish a package. | +| `directus:extension.type` | The extension type - used to categorize extensions in the Marketplace listing. | +| `directus:extension.host` | The minimum Directus version required for the extension to run. | + +If you create an extension with the `create-directus-extension` CLI, then these fields will be automatically populated. + +The directory that is published must also contain a `dist` directory with the built files for your extension. + +## Additional Metadata + +| Property | Description | +| ------------- | ---------------------------------------------------------------------- | +| `icon` | Name of an icon from [Material Icons](https://fonts.google.com/icons). | +| `license` | Your extension's license. | +| `description` | Shown in the Marketplace extension listing. | +| `author` | Automatically populated with your npm username. | + +## Extension Detail Page + +![An extension page showing the key metadata from the home, as well as a readme with a screenshot, install button, and a popularity graph.](https://product-team.directus.app/assets/98118508-cea1-487c-a57b-ea7a44fb44ff.png) + +### Extension Title + +The extension title displayed in the extension detail page is based on your npm package name and the following +processing: + +- The `directus-extension-` prefix is removed, if present. +- The package's scope is removed, if present. +- The title is parsed by the [Title Formatter](https://github.com/directus/format-title) used throughout the Data Studio. + +### README + +Your npm package's `README.md` file is shown on the extension detail page. This can be updated by releasing a new version of your package to npm. + +#### Installation Instructions + +Many extension authors provide installation instructions in their README. It is recommended that you update this to include the Directus Marketplace as an installation method. + +As extension detail pages are within projects, there is no global direct link to the page which allows installation. We recommend a prompt to search for the extension in the Marketplace for installation. + +#### Images & Screenshots + +We encourage screenshots of App and Hybrid extensions to help users understand and evaluate an extension before installation. We allow external images to be loaded from the `raw.githubusercontent.com` domain inside of the extension detail page. + +To include images, ensure your extension repository is in a public GitHub repository. Add images to your GitHub repository, visit the direct URL of the image, and use this reference inside your README. + +## Author Profile Page + +![A page shows an individual author's extensions, along with their name, location, workplace, bio, and links to their NPM, GitHub, and website.](https://product-team.directus.app/assets/401b4e88-5343-4f41-bc9c-9714c912e040.png) + +If your email address is public on GitHub and matches your npm account, the Directus Extensions Registry will also include information from your GitHub profile, including profile image, name, location, bio, and links. + +## Sandboxed Extensions + +The Directus Marketplace will allow installation of all [App extension types](/extensions/app-extensions) and sandboxed [API extension types](/extensions/api-extensions). + +::callout{type="dev-docs" url="/extensions/api-extensions-sandbox"} +Learn more about sandboxed API extensions. +:: + +## Best Practices + +### Third-Party Services + +- Ensure the terms of service for any third-party services allow use in an extension. +- Do not include sensitive data in your extension code, including authentication keys or access tokens. + +### Extension Description + +You can use the description to show potential users what your extension does in the Marketplace listing. To make the most of this placement, here are some guidelines: + +- Explain what your extension does concisely and descriptively. +- Start with a verb, followed by a noun. +- Avoid adjectives like 'quickly' or 'simply'. +- Do not start your description with 'An extension to'. +- Do not specify extension type, as this is shown in the listing. + +Some examples of good descriptions: + +- 'Show items with two dates in a Gantt chart.' +- 'Use OpenAI to generate content in a text field.' +- 'Display dynamic API reference for your project.' + +### Screenshots + +- Ensure screenshots are legible and high-quality, ideally with high-contrast. +- As Directus supports custom theming, ensure screenshots are created to look good on multiple background colors. +- If you include multiple screenshots, try and use the same theme throughout. +- Ensure there is no sensitive data in screenshots. + +### Icons + +Select a custom icon from Google's [Material Icons](https://fonts.google.com/icons) library to display next to your extension title in the listing and extension detail page. + +## Removing and Reporting Extensions + +Having our own registry means we can remove items, which we will do if we are made aware that extensions are malicious +or at the request of extension authors. If you wish to have an extension removed for either of these reasons, please get in touch with marketplace@directus.io diff --git a/content/10.extensions/_dir.yml b/content/10.extensions/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/10.extensions/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/11.configuration/1.general.md b/content/11.configuration/1.general.md new file mode 100644 index 00000000..b9e409c7 --- /dev/null +++ b/content/11.configuration/1.general.md @@ -0,0 +1,53 @@ +--- +description: Configuration for the general system, server, first admin user, and telemetry. +--- + +# General + +:partial{content="config-env-vars"} + +| Variable | Description | Default Value | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------- | +| `CONFIG_PATH` | Where your config file is located. See [Deploying Directus](/self-hosted/deploying-directus). | `.env` | +| `HOST` | IP or host the API listens on. | `0.0.0.0` | +| `PORT` | What port to run the API under. | `8055` | +| `UNIX_SOCKET_PATH` | The Unix socket the API listens on, `PORT` and `HOST` will be ignored if this is provided. | | +| `PUBLIC_URL` | URL where your API can be reached on the web. used for things like OAuth redirects, forgot-password emails, and publicly-accessible logos. | `/` | +| `ROOT_REDIRECT` | Redirect the root of the application `/` to a specific route. Accepts a relative path, absolute URL, or `false` to disable. | `./admin` | +| `SERVE_APP` | Whether or not to serve the Data Studio web application. | `true` | +| `GRAPHQL_INTROSPECTION` | Whether or not to enable GraphQL Introspection. | `true` | +| `GRAPHQL_SCHEMA_CACHE_CAPACITY` | How many user GraphQL schemas to store in memory. | `100` | +| `ROBOTS_TXT` | What the `/robots.txt` endpoint should return. | `User-agent: *\nDisallow: /` | +| `TEMP_PATH` | Where Directus' temporary files should be managed. | `./node_modules/.directus` | + + +## Server + +| Variable | Description | Default Value | +| --------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | +| `SERVER_KEEP_ALIVE_TIMEOUT` | Timeout in milliseconds for socket to be destroyed. | [server.keepAliveTimeout](https://github.com/nodejs/node/blob/master/doc/api/http.md#serverkeepalivetimeout) | +| `SERVER_HEADERS_TIMEOUT` | Timeout in milliseconds to parse HTTP headers. | [server.headersTimeout](https://github.com/nodejs/node/blob/master/doc/api/http.md#serverheaderstimeout) | +| `SERVER_SHUTDOWN_TIMEOUT` | Timeout in milliseconds before the server is forcefully shut down. | 1000 | + +### Additional Server Variables +All `SERVER_*` environment variables are merged with `server` instance properties created from [http.Server](https://github.com/nodejs/node/blob/master/doc/api/http.md#class-httpserver). This allows to configure server behind a proxy, a load balancer, etc. Be careful to not override methods of this instance otherwise you may incur into unexpected behaviors. + +## First Admin User + +The following commands set details for the first admin user created when the project is bootstrapped. + +| Variable | Description | Default Value | +| ---------------- | -------------------------------------------------------------------------------------- | ------------- | +| `ADMIN_EMAIL` | The email address of the first user that's automatically created during bootstrapping. | | +| `ADMIN_PASSWORD` | The password of the first user that's automatically created during bootstrapping. | | +| `ADMIN_TOKEN` | The API token of the first user that's automatically created during bootstrapping. | | + +## Telemetry + +To more accurately gauge the frequency of installation, version fragmentation, and general size of the user base, Directus collects little and anonymized data about your environment. + +| Variable | Description | Default Value | +| ------------------------- | ----------------------------------------------------------------- | -------------------------------- | +| `TELEMETRY` | Allow Directus to collect anonymized data about your environment. | `true` | +| `TELEMETRY_URL` | URL that the usage report is submitted to. | `https://telemetry.directus.io/` | +| `TELEMETRY_AUTHORIZATION` | Optional authorization header value. | | \ No newline at end of file diff --git a/content/11.configuration/10.extensions.md b/content/11.configuration/10.extensions.md new file mode 100644 index 00000000..043aca2a --- /dev/null +++ b/content/11.configuration/10.extensions.md @@ -0,0 +1,36 @@ +--- +description: Configuration for extensions and the Directus Marketplace. +--- + +# Extensions + +:partial{content="config-env-vars"} + +| Variable | Description | Default Value | +| -------------------------------------- | ------------------------------------------------------------------------------- | -------------- | +| `EXTENSIONS_PATH`[1] | Path to your local extensions directory. | `./extensions` | +| `EXTENSIONS_MUST_LOAD` | Exit the server when any API extension fails to load. | `false` | +| `EXTENSIONS_AUTO_RELOAD`[2] | Automatically reload extensions when they have changed. | `false` | +| `EXTENSIONS_CACHE_TTL`[3] | How long custom app Extensions get cached by browsers. | | +| `EXTENSIONS_LOCATION`[4] | What configured storage location to use for extensions. | | +| `EXTENSIONS_LIMIT` | Maximum number of extensions you allow to be installed through the Marketplace. | | + +[1] If `EXTENSIONS_LOCATION` is configured, this is the path to the extensions directory within the selected +storage location. + +[2] `EXTENSIONS_AUTO_RELOAD` will not work when the `EXTENSION_LOCATION` environment variable is set. + +[3] The `EXTENSIONS_CACHE_TTL` environment variable controls for how long [app extensions](/extensions/app-extensions) are cached by browsers. By default, extensions are not cached. + +[4] By default extensions are loaded from the local file system. `EXTENSIONS_LOCATION` can be used to load extensions from a storage location instead. + +## Marketplace + +| Variable | Description | Default Value | +| ---------------------- | ------------------------------------------------- | ------------------------------ | +| `MARKETPLACE_TRUST` | One of `sandbox`, `all` | `sandbox` | +| `MARKETPLACE_REGISTRY` | The registry to use for the Directus Marketplace. | `https://registry.directus.io` | + +::callout{type="info" title="Sandbox"} +By default, the Directus Marketplace will allow installation of all [App extension types](/extensions/app-extensions) and only [API extension types](/extensions/api-extensions) that use our secure sandbox. +:: diff --git a/content/11.configuration/11.logging.md b/content/11.configuration/11.logging.md new file mode 100644 index 00000000..30b94b20 --- /dev/null +++ b/content/11.configuration/11.logging.md @@ -0,0 +1,66 @@ +--- +description: Configuration for general and Realtime logging. +--- + +# Logging + +:partial{content="config-env-vars"} + +| Variable | Description | Default Value | +| ----------------------- | --------------------------------------------------------------------------------------------------- | ------------- | +| `LOG_LEVEL` | What level of detail to log. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace` or `silent`. | `info` | +| `LOG_HTTP_IGNORE_PATHS` | List of HTTP request paths which should not appear in the log. | | + +All `LOGGER_*` environment variables are passed to the `options` configuration of a [`Pino` instance](https://github.com/pinojs/pino/blob/master/docs/api.md#options) and all `LOGGER_HTTP*` environment variables are passed to the `options` configuration of a [`Pino-http` instance](https://github.com/pinojs/pino-http#api). + +Based on your project's needs, you can extend the `LOGGER_*` environment variables with any config you need to pass to the logger instance. If a `LOGGER_LEVELS` key is added, these values will be passed to the logger frontmatter, as described [here](https://github.com/pinojs/pino/blob/master/docs/help.md#mapping-pino-log-levels-to-google-cloud-logging-stackdriver-severity-levels). The format for adding `LEVELS` values is: `LOGGER_LEVELS="trace:DEBUG,debug:DEBUG,info:INFO,warn:WARNING,error:ERROR,fatal:CRITICAL"` + +## Log Retention + +| Variable | Description | Default Value | +| --------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------- | +| `RETENTION_ENABLED` | Whether or not to enable custom data retention settings. `false` will not delete data. | `false` | +| `RETENTION_SCHEDULE` | The cron schedule at which to check for removable records, the default is once a day at 00:00. | `0 0 * * *` | +| `RETENTION_BATCH` | The maximum number of records to delete in a single query. | `500` | +| `ACTIVITY_RETENTION` | The maximum amount of time to retain `directus_activity` records or `false` to disable. This excludes flow logs. | `90d` | +| `REVISIONS_RETENTION` | The maximum amount of time to retain `directus_revisions` records or `false` to disable. | `90d` | +| `FLOW_LOGS_RETENTION` | The maximum amount of time to retain flow logs or `false` to disable. | `90d` | + +## Realtime Logs + +![System Logs page with two panes - on the left a set of API calls, on the right the detailed logs for a single selected request.](https://product-team.directus.app/assets/7abf4ad2-7d08-407d-bfca-67f3bff183d0.png) + +The WebSocket Logs endpoint is accessible at `/websocket/logs`. The method of authentication is limited to `strict` and the connection will be disconnected when the authentication expires. + +| Variable | Description | Default Value | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | ------------- | +| `WEBSOCKETS_LOGS_ENABLED` | Whether or not to enable the Logs subscriptions. | `true` | +| `WEBSOCKETS_LOGS_LEVEL` | What level of detail to stream. One of `fatal`, `error`, `warn`, `info`, `debug`, `trace` or `silent`. | `info` | +| `WEBSOCKETS_LOGS_STYLE` | Stream just the message (pretty) or the full JSON log. One of `pretty`, `raw`. | `pretty` | +| `WEBSOCKETS_LOGS_CONN_LIMIT` | How many simultaneous connections are allowed. | `Infinity` | + +::callout{type="info" title="Ephemeral Logs"} +Realtime system logs are ephemeral and not stored in the database. They are only available while the realtime connection is +active. Refreshing the page will clear the logs. +:: + +### Log Levels + +Under the hood, Directus uses [pino](https://github.com/pinojs/pino) for logging and uses the log levels provided by the +library: + +| Log Level | Numeric Value | +| --------- | ------------- | +| `trace` | 10 | +| `debug` | 20 | +| `info` | 30 | +| `warn` | 40 | +| `error` | 50 | +| `fatal` | 60 | + +### Searching & Filtering + +If running multiple instances of Directus in a horizontally-scaled setup, you can also filter the logs by instance in +the System Logs pane. + +You can also filter the logs by level, or filter by search terms in the `msg` field. diff --git a/content/11.configuration/12.email.md b/content/11.configuration/12.email.md new file mode 100644 index 00000000..7466c6e9 --- /dev/null +++ b/content/11.configuration/12.email.md @@ -0,0 +1,76 @@ +--- +description: Configuration for email settings and templates. +--- + +# Email + +:partial{content="config-env-vars"} + +## Email Transport + +| Variable | Description | Default Value | +| -------------------- | ------------------------------------------------------------------------ | ------------- | +| `EMAIL_VERIFY_SETUP` | Check if email setup is properly configured. | `true` | +| `EMAIL_TRANSPORT` | What to use to send emails. One of `sendmail`, `smtp`, `mailgun`, `ses`. | `sendmail` | + +Based on the `EMAIL_TRANSPORT` used, you must also provide additional variables. + +### Sendmail + +| Variable | Description | Default Value | +| ------------------------- | --------------------------------------- | -------------------- | +| `EMAIL_SENDMAIL_NEW_LINE` | What new line style to use in sendmail. | `unix` | +| `EMAIL_SENDMAIL_PATH` | Path to your sendmail executable. | `/usr/sbin/sendmail` | + +### SMTP + +| Variable | Description | Default Value | +| ----------------------- | --------------------- | ------------- | +| `EMAIL_SMTP_HOST` | SMTP server host. | | +| `EMAIL_SMTP_PORT` | SMTP server port. | | +| `EMAIL_SMTP_USER` | SMTP user. | | +| `EMAIL_SMTP_PASSWORD` | SMTP password. | | +| `EMAIL_SMTP_POOL` | Use SMTP pooling. | | +| `EMAIL_SMTP_SECURE` | Enable TLS. | | +| `EMAIL_SMTP_IGNORE_TLS` | Ignore TLS. | | +| `EMAIL_SMTP_NAME` | SMTP client hostname. | | + +### Mailgun + +| Variable | Description | Default Value | +| ----------------------- | ---------------------------------------------------------------------------------- | ----------------- | +| `EMAIL_MAILGUN_API_KEY` | Your Mailgun API key. | | +| `EMAIL_MAILGUN_DOMAIN` | A domain from [your Mailgun account](https://app.mailgun.com/app/sending/domains). | | +| `EMAIL_MAILGUN_HOST` | Specify a custom host. | `api.mailgun.net` | + +### AWS SES + +| Variable | Description | Default Value | +| ------------------------------------------ | --------------------------- | ------------- | +| `EMAIL_SES_CREDENTIALS__ACCESS_KEY_ID` | Your AWS SES access key ID. | | +| `EMAIL_SES_CREDENTIALS__SECRET_ACCESS_KEY` | Your AWS SES secret key. | | +| `EMAIL_SES_REGION` | Your AWS SES region. | | + +## Email Templates + +Templates can be used to add custom templates for your emails, or to override the system emails used for things like resetting a password or inviting a user. + +| Variable | Description | Default Value | +| ---------------------- | ----------------------------------------- | ---------------------- | +| `EMAIL_FROM` | Email address from which emails are sent. | `no-reply@example.com` | +| `EMAIL_TEMPLATES_PATH` | Where custom templates are located | `./templates` | + +In the `EMAIL_TEMPLATES_PATH`, you can create templates for your emails by adding [`.liquid`](https://liquidjs.com) files. + +### Overriding System Emails + +There are a number of templates provided by Directus that can be overridden with a custom template: + +| Template | File | +| ------------------ | ----------------------- | +| Password Reset | `password-reset.liquid` | +| User Invitation | `user-invitation.liquid` | +| User Registration | `user-registration.liquid` | + +When overriding the default email templates, make sure to include the provided `url` somewhere to ensure the email is functional. + diff --git a/content/11.configuration/13.migrations.md b/content/11.configuration/13.migrations.md new file mode 100644 index 00000000..87d72f5a --- /dev/null +++ b/content/11.configuration/13.migrations.md @@ -0,0 +1,55 @@ +--- +description: Creation of custom migration files to automate database changes. +--- + +# Migrations + +Directus allows adding custom migration files that run whenever the migration commands are run. + +| Variable | Description | Default Value | +| ----------------- | ------------------------------------ | -------------- | +| `MIGRATIONS_PATH` | Where custom migrations are located. | `./migrations` | + +The file name follows the following structure `[identifier]-[name].js`, for example `20201202A-my-custom-migration.js`. + +Every file in the root of the `migrations` directory is treated as a migration. Files that don't include a `-` character are ignored. If you want to rely on shared helper functions between migrations, put them in a subdirectory so they aren't loaded in by the migrations helper. + +## Structure + +Migrations have to export an `up` and a `down` function. These functions get a [Knex](http://knexjs.org) instance that can be used to do virtually whatever. + +```js +export async function up(knex) { + await knex.schema.createTable('test', (table) => { + table.increments(); + table.string('rijk'); + }); +} + +export async function down(knex) { + await knex.schema.dropTable('test'); +} +``` + +::callout{type="warning" title="Backup Your Database"} +Proceed at your own risk and backup your database before adding custom migrations. +:: + +## Migrations and Directus Schema + +Migrations can be used to manage the contents of Directus collections (e.g. initial hydration). In order to do it, you must ensure that the schema is up to date before running your migrations. + +`directus database migrate:latest` runs the required Directus internal migrations and the migrations from the `migrations` directory. In general, you need the following flow: + +```sh +# Option 1 +npx directus bootstrap +npx directus schema apply ./path/to/snapshot.yaml + +# Option 2 - without bootstrap, you must ensure that you run all required `bootstrap` tasks +npx directus database install +npx directus database migrate:latest +npx directus schema apply ./path/to/snapshot.yaml +``` + +To correctly follow this process, the `migrations` directory must not contain tasks that modify the contents of Directus system collections, because schema may not yet be created when you run `migrate:latest`. diff --git a/content/11.configuration/14.theming.md b/content/11.configuration/14.theming.md new file mode 100644 index 00000000..5320e7f9 --- /dev/null +++ b/content/11.configuration/14.theming.md @@ -0,0 +1,60 @@ +--- +description: Configuration of the Data Studio's theming engine and appearance settings. +--- + +# Theming + +:video-embed{type="directus-tv" id="8ad4795b-963c-4ebd-8921-38ea2dda9f44"} +
+ +The Directus Data Studio has been developed with customization and extensibility in mind. Colors and styles referenced within the codebase are based around theme rules which enables making comprehensive styling changes to the Data Studio. + +Theming options can be found in dedicated section in the Settings Module. + +## Branding + +The branding section contains global settings that are applied as defaults throughout the Data Studio and favicon. + +- **Project Color** — Sets color on the project logo, favicon and login/public pages. +- **Project Logo** — Adds a 40x40px logo at the top of the Module Bar and on the login/public pages. The image is inset within a 64x64px square filled with the project color. +- **Public Foreground** — Adds image on the public page's right-pane _(max-width 400px)_. +- **Public Background** — Adds image displayed behind the public foreground image, shown full-bleed within the public page's right-pane. When a public background image is not set, the project color is used instead. +- **Public Favicon** — Adds favicon for the Data Studio. +- **Public Note** — A helpful note displayed at the bottom of the public page's right-pane, supports markdown for rich-text formatting. +- **Default Appearance** — Light or Dark theme (or based on system preference). + +## Theming Defaults + +The Directus Theming Engine contains a few customizable themes including a Light Theme and Dark Theme. If default values are changed, they will be automatically mapped to the correct elements in the Data Studio, even between upgrades. + +Both themes can be updated for all users (in the Settings Module), or for specific users (in the Users Module). + +![Theming options showing a yellow color theme and serif font throughout.](https://product-team.directus.app/assets/005783db-6a54-4aa9-b425-bc6e6092ff20.png) + +Any valid CSS values will be accepted by the Directus Theming Engine. The raw JSON values containing your changes can be seen by clicking the dropdown next to the theme customization labels. These can be saved and quickly applied between projects or users. + +### Custom CSS + +The Custom CSS input allows you to override the Data Studio's default styling. Be aware that the Data Studio's core code, and therefore its DOM selectors, may change in any release. These updates are not considered a breaking change. + +Since Data Studio styles are inserted/removed whenever a component is rendered, you'll need to be aware of CSS priority. Using +`:root` or `body` likely isn't scoped enough, you'll need to define a more specific scope, such as `#app`, or use `!important`. + +```css +body { + --family-sans-serif: 'Comic Sans MS'; + --primary: MediumSlateBlue !important; +} +``` + +This example is better served using the Theming Engine, but is a good example of Directus' flexibility of approach. + +#### Action Styling + +The `--primary` variable (and its shades) control call-to-actions and all other elements within the App using the +"Directus Purple". While it may be tempting to override this variable with your brand's color, please first review the +following warnings: + +- Avoid using yellow, orange, or red hues that give a sense of "danger". +- Avoid low-contrast colors like yellows, grays, etc, that might not be easily visible. +- Avoid low-saturation colors like black, which might not properly highlight call-to-actions. diff --git a/content/11.configuration/15.translations.md b/content/11.configuration/15.translations.md new file mode 100644 index 00000000..f216e28a --- /dev/null +++ b/content/11.configuration/15.translations.md @@ -0,0 +1,36 @@ +--- +description: Directus supports translations for both the Data Studio UI and authored content. +--- + +# Translations + +There are two types of translations in Directus: Data Studio translations and content translations. + +## Data Studio Translations + +Data Studio translations are used to translate the user interface of the Data Studio. The application supports internationalization across the entire App. Many languages are currently supported, with more being added all the time. Anyone can add or refine any languages through our [locales project](https://locales.directus.io). + +### Releasing New Translations + +As soon as a translation is edited on our translation platform, a pull request is created in our repository, which contains the corresponding changes. This pull request is usually included in the subsequent release of Directus. + +### Translation Strings + +![Translation Strings show in a standard Directus Explore page.](https://product-team.directus.app/assets/f991854a-5abb-49a6-b6b4-2163b2ed27fe.png) + +Any strings can be translated in the Data Studio through the decicated translation strings section of the settings module. Each entry in the translation strings has a `key` that is used in the data studio, and any number of translations. + +![Translation strings can be used anywhere the translation icon is shown..](https://product-team.directus.app/assets/1696e3b0-2ed0-4318-b209-cd7959326bef.png) + +Throughout the Data Studio, click the :icon{name="material-symbols:translate"} icon to assign a translation string to the field's value. The correct translation will now be shown based on the user language preference. If a language is chosen for which there is no translation string, the translation `key` will be displayed instead. + +## Content Translations + +![Translations interface showing text in American English and German.](https://product-team.directus.app/assets/3e9a8108-169f-4df8-988b-e966b3809d1b.png) + +Content translations are used to translate the content of the database, which can be served via API to your external applications. The built-in translations interface handles much of the complexity in managing your data model for multilingual content. + +The `languages` collection will be automatically created when you add your first translations field. It contains each language you support, with a `code` and `direction` field (some languages are written right-to-left). + +The field will also create a new collection-specific collection for translated content, for example `articles_translations`. Add fields you wish to translate to this collection, and they will be displayed in the translations interface. + diff --git a/content/11.configuration/2.database.md b/content/11.configuration/2.database.md new file mode 100644 index 00000000..872712a0 --- /dev/null +++ b/content/11.configuration/2.database.md @@ -0,0 +1,30 @@ +--- +description: Configuration for database connections. +--- + +# Database + +:partial{content="config-env-vars"} + +| Variable | Description | Default Value | +| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | +| `DB_CLIENT` | **Required**. What database client to use. One of `pg` or `postgres`, `mysql`, `oracledb`, `mssql`, `sqlite3`, `cockroachdb`. | | +| `DB_HOST` | Database host. Required when using `pg`, `mysql`, `oracledb`, or `mssql`. | | +| `DB_PORT` | Database port. Required when using `pg`, `mysql`, `oracledb`, or `mssql`. | | +| `DB_DATABASE` | Database name. Required when using `pg`, `mysql`, `oracledb`, or `mssql`. | | +| `DB_USER` | Database user. Required when using `pg`, `mysql`, `oracledb`, or `mssql`. | | +| `DB_PASSWORD` | Database user's password. Required when using `pg`, `mysql`, `oracledb`, or `mssql`. | | +| `DB_FILENAME` | Where to read/write the SQLite database. Required when using `sqlite3`. | | +| `DB_CONNECTION_STRING` | When using `pg`, you can submit a connection string instead of individual properties. Using this will ignore any of the other connection settings. | | +| `DB_EXCLUDE_TABLES` | CSV of tables you want Directus to ignore completely | `spatial_ref_sys,sysdiagrams` | +| `DB_CHARSET` / `DB_CHARSET_NUMBER` | Charset/collation to use in the connection to MySQL/MariaDB | `UTF8_GENERAL_CI` | +| `DB_VERSION` | Database version, in case you use the PostgreSQL adapter to connect a non-standard database. Not usually required. | | +| `DB_HEALTHCHECK_THRESHOLD` | Healthcheck timeout threshold in milliseconds. | `150` | + +## Additional Database Variables + +All `DB_*` environment variables are passed to the `connection` configuration of a [`Knex` instance](https://knexjs.org/guide/#configuration-options). This means you can extend the `DB_*` environment variables with any values you need to pass to the database instance. + +This includes: +- `DB_POOL__` prefixed options which are passed to [`tarn.js`](https://github.com/vincit/tarn.js#usage). +- `DB_SSL__` prefixed options which are passed to the respective database driver. For example, `DB_SSL__CA` which can be used to specify a custom Certificate Authority (CA) certificate for SSL connections. This is required if the database server CA is not part of [Node.js' trust store](https://nodejs.org/api/tls.html). \ No newline at end of file diff --git a/content/11.configuration/3.files.md b/content/11.configuration/3.files.md new file mode 100644 index 00000000..f4de9b99 --- /dev/null +++ b/content/11.configuration/3.files.md @@ -0,0 +1,125 @@ +--- +description: Configuration for storage locations, metadata, upload limits, and transformations. +--- + +# Files + +:partial{content="config-env-vars"} + +By default, Directus stores all uploaded files locally on the file system or can also configure Directus to use external storage services. You can also configure _multiple_ storage adapters at the same time whih allows you to choose where files are being uploaded on a file-by-file basis. + +In the Data Studio, files will automatically be uploaded to the first configured storage location (in this case `local`). The used storage location is saved under `storage` in the `directus_files` collection. + +## Storage Locations + +| Variable | Description | Default Value | +| ------------------- | --------------------------------------------------------------------------------------------- | ------------- | +| `STORAGE_LOCATIONS` | A comma separated list of storage locations. You can use any names you'd like for these keys. | `local` | + +For each of the storage locations listed, you must provide the following configuration (variable name must be uppercase in these options): + +| Variable | Description | Default Value | +| ------------------------------------------ | ------------------------------------------------------------------------------------ | ------------- | +| `STORAGE__DRIVER` | Which driver to use, either `local`, `s3`, `gcs`, `azure`, `cloudinary`, `supabase`. | | +| `STORAGE__ROOT` | Where to store the files on disk. | `''` | +| `STORAGE__HEALTHCHECK_THRESHOLD` | Healthcheck timeout threshold in ms. | `750` | + +Based on your configured drivers, you must also provide additional variables, where `` is the capitalized name of the item in the `STORAGE_LOCATIONS` value. + +### Local (`local`) + +| Variable | Description | Default Value | +| ------------------------- | --------------------------------- | ------------- | +| `STORAGE__ROOT` | Where to store the files on disk. | | + +### S3 (`s3`) + +| Variable | Description | Default Value | +| ------------------------------------------- | -------------------------- | ------------------ | +| `STORAGE__KEY` | User key. | | +| `STORAGE__SECRET` | User secret. | | +| `STORAGE__BUCKET` | S3 bucket. | | +| `STORAGE__REGION` | S3 region. | | +| `STORAGE__ENDPOINT`[1] | S3 endpoint. | `s3.amazonaws.com` | +| `STORAGE__ACL` | S3 ACL. | | +| `STORAGE__SERVER_SIDE_ENCRYPTION` | S3 server side encryption. | | +| `STORAGE__FORCE_PATH_STYLE` | S3 force path style. | false | + +[1] When overriding this variable for S3, make sure to add your bucket's region in the endpoint: `s3.{region}.amazonaws.com`. + +### Google Cloud Storage (`gcs`) + +| Variable | Description | Default Value | +| --------------------------------- | ---------------------------- | ------------- | +| `STORAGE__KEY_FILENAME` | Path to key file on disk. | | +| `STORAGE__BUCKET` | Google Cloud Storage bucket. | | + +### Azure (`azure`) + +| Variable | Description | Default Value | +| ----------------------------------- | --------------------------- | ---------------------------------------------- | +| `STORAGE__CONTAINER_NAME` | Azure Storage container. | | +| `STORAGE__ACCOUNT_NAME` | Azure Storage account name. | | +| `STORAGE__ACCOUNT_KEY` | Azure Storage key. | | +| `STORAGE__ENDPOINT` | Azure URL. | `https://{ACCOUNT_NAME}.blob.core.windows.net` | + +### Cloudinary (`cloudinary`) + +| Variable | Description | Default Value | +| -------------------------------- | ------------------------------------------------------------------- | ------------- | +| `STORAGE__CLOUD_NAME` | Cloudinary cloud name. | | +| `STORAGE__API_KEY` | Cloudinary API key. | | +| `STORAGE__API_SECRET` | Cloudinary API secret. | | +| `STORAGE__ACCESS_MODE` | Default access mode for the file. One of `public`, `authenticated`. | | + +Cloudinary is supported only as a storage driver. Changes made on Cloudinary are not synced back to Directus, and Directus wo't_ rely on Cloudinary's asset transformations in the `/assets` endpoint. + +### Supabase (`supabase`) + +| Variable | Description | Default Value | +| --------------------------------- | --------------------------- | ------------- | +| `STORAGE__SERVICE_ROLE` | The admin service role JWT. | | +| `STORAGE__BUCKET` | Storage bucket. | | +| `STORAGE__PROJECT_ID` | Project ID. | | +| `STORAGE__ENDPOINT` | Optional custom endpoint. | | + +## Metadata + +When uploading an image, Directus persists the `description`, `title`, and `tags` from available Exif metadata. For security purposes, collection of additional metadata must be configured: + +| Variable | Description | Default Value | +| -------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `FILE_METADATA_ALLOW_LIST` | A comma-separated list of metadata keys to collect during file upload. Use `*` for all[1]. | ifd0.Make,ifd0.Model,exif.FNumber,exif.ExposureTime,exif.FocalLength,exif.ISOSpeedRatings | + +[1]: Extracting all metadata might cause memory issues when the file has an unusually large set of metadata + +## Upload Limits + +| Variable | Description | Default Value | +| ---------------------------- | --------------------------------------------------------------------------------- | ------------- | +| `FILES_MAX_UPLOAD_SIZE` | Maximum file upload size allowed. For example `10mb`, `1gb`, `10kb`. | | +| `FILES_MIME_TYPE_ALLOW_LIST` | Allow list of mime types that are allowed to be uploaded. Supports `glob` syntax. | `*/*` | + +## Chunked Uploads + +Large files can be uploaded in chunks to improve reliability and efficiency, especially in scenarios with network instability or limited bandwidth. This is implemented using the [TUS protocol](https://tus.io/). + +| Variable | Description | Default Value | +| ----------------------- | ------------------------------------------------------------------ | ------------- | +| `TUS_ENABLED` | Whether or not to enable the chunked uploads. | `false` | +| `TUS_CHUNK_SIZE` | The size of each file chunks. For example `10mb`, `1gb`, `10kb`. | `10mb` | +| `TUS_UPLOAD_EXPIRATION` | The expiry duration for uncompleted files with no upload activity. | `10m` | +| `TUS_CLEANUP_SCHEDULE` | Cron schedule to clean up the expired uncompleted uploads. | `0 * * * *` | + +## Assets + +| Variable | Description | Default Value | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ------------- | +| `ASSETS_CACHE_TTL` | How long assets will be cached for in the browser. Sets the `max-age` value of the `Cache-Control` header. | `30d` | +| `ASSETS_TRANSFORM_MAX_CONCURRENT` | How many file transformations can be done simultaneously. | `25` | +| `ASSETS_TRANSFORM_IMAGE_MAX_DIMENSION` | The max pixel dimensions size (width/height) that is allowed to be transformed. | `6000` | +| `ASSETS_TRANSFORM_TIMEOUT` | Max time spent trying to transform an asset. | `7500ms` | +| `ASSETS_TRANSFORM_MAX_OPERATIONS` | The max number of transform operations that is allowed to be processed (excludes saved presets). | `5` | +| `ASSETS_INVALID_IMAGE_SENSITIVITY_LEVEL` | Level of sensitivity to invalid images. See the [`sharp.failOn`](https://sharp.pixelplumbing.com/api-constructor#parameters) option. | `warning` | + +Image transformations can be heavy on memory usage. If you're using a system with 1GB or less available memory, we recommend lowering the allowed concurrent transformations to prevent you from overflowing your server. diff --git a/content/11.configuration/4.synchronization.md b/content/11.configuration/4.synchronization.md new file mode 100644 index 00000000..6134bb1b --- /dev/null +++ b/content/11.configuration/4.synchronization.md @@ -0,0 +1,27 @@ +--- +description: Configuration around synchronization and Redis. +--- + +# Synchronization + +:partial{content="config-env-vars"} + +Synchronization in Directus refers to the process of coordinating actions across multiple instances or containers. This is crucial for ensuring consistency and reliability in distributed environments. Directus supports two synchronization stores: `memory` and `redis`. The `memory` store is the default and suitable for single-container deployments, while `redis` is recommended for multi-container deployments to ensure synchronization across all instances. + +| Variable | Description | Default Value | +| --------------------------- | ----------------------------------- | --------------- | +| `SYNCHRONIZATION_STORE` | One of `memory`, `redis`. | `memory` | +| `SYNCHRONIZATION_NAMESPACE` | How to scope the channels in Redis. | `directus-sync` | + +## Redis + +Redis is a critical component for Directus in multi-container deployments. It enables features like caching, rate-limiting, and WebSockets to function reliably across all instances of Directus. To use Redis, you can configure the following variables: + +| Variable | Description | Default Value | +| ---------------- | ----------------------------------------------------------------------------------------------------------- | ------------- | +| `REDIS_ENABLED` | Whether or not Redis should be used. Defaults to whether or not you have any of the vars below configured. | | +| `REDIS` | Redis connection string. Using this will ignore the other Redis connection parameter environment variables. | | +| `REDIS_HOST` | Hostname of the Redis instance. | | +| `REDIS_PORT` | Port of the Redis instance. | | +| `REDIS_USERNAME` | Username for the Redis instance. | | +| `REDIS_PASSWORD` | Password for the Redis instance. | | diff --git a/content/11.configuration/5.realtime.md b/content/11.configuration/5.realtime.md new file mode 100644 index 00000000..b8490acc --- /dev/null +++ b/content/11.configuration/5.realtime.md @@ -0,0 +1,51 @@ +--- +description: Configuration for WebSockets and GraphQL Subscriptions. +--- + +# Realtime + +:partial{content="config-env-vars"} + +Directus Realtime provides WebSockets and GraphQL Subscriptions. + +| Variable | Description | Default Value | +| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `WEBSOCKETS_ENABLED` | Whether or not to enable all WebSocket functionality. | `false` | +| `WEBSOCKETS_HEARTBEAT_ENABLED` | Whether or not to enable the heartbeat ping signal. | `true` | +| `WEBSOCKETS_HEARTBEAT_PERIOD` | The period in seconds at which to send the ping. This period doubles as the timeout used for closing an unresponsive connection. | 30 | + +It's recommended to keep the `WEBSOCKETS_HEARTBEAT_PERIOD` between 30 and 120 seconds, otherwise the connections could be considered idle by other parties and therefore terminated. + +## WebSockets + +| Variable | Description | Default Value | +| ------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------- | +| `WEBSOCKETS_REST_ENABLED` | Whether or not to enable the WebSocket message handlers. | `true` | +| `WEBSOCKETS_REST_PATH` | The URL path at which the WebSocket endpoint will be available. | `/websocket` | +| `WEBSOCKETS_REST_CONN_LIMIT` | How many simultaneous connections are allowed. | `Infinity` | +| `WEBSOCKETS_REST_AUTH` | The method of authentication to require for this connection. One of `public`, `handshake` or `strict`. | `handshake` | +| `WEBSOCKETS_REST_AUTH_TIMEOUT` | The amount of time in seconds to wait before closing an unauthenticated connection. | 30 | + +::callout{type="dev-docs" url="/realtime/authentication"} +Read more about different authentication methods with Directus Realtime. +:: + +## GraphQL + +| Variable | Description | Default Value | +| --------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------- | +| `WEBSOCKETS_GRAPHQL_ENABLED` | Whether or not to enable GraphQL Subscriptions. | `true` | +| `WEBSOCKETS_GRAPHQL_PATH` | The URL path at which the GraphQL Subscriptions endpoint will be available. | `/graphql` | +| `WEBSOCKETS_GRAPHQL_CONN_LIMIT` | How many simultaneous connections are allowed. | `Infinity` | +| `WEBSOCKETS_GRAPHQL_AUTH` | The method of authentication to require for this connection. One of `public`, `handshake` or `strict`. | `handshake` | +| `WEBSOCKETS_GRAPHQL_AUTH_TIMEOUT` | The amount of time in seconds to wait before closing an unauthenticated connection. | 30 | + + +::callout{type="dev-docs" url="/realtime/authentication"} +Read more about different authentication methods with Directus Realtime. +:: + +## Logging + +Read more about logging with Directus Realtime in the [logging configuration](/configuration/logging). + diff --git a/content/11.configuration/6.flows.md b/content/11.configuration/6.flows.md new file mode 100644 index 00000000..cccaa5f6 --- /dev/null +++ b/content/11.configuration/6.flows.md @@ -0,0 +1,21 @@ +--- +description: Configure environment variables, memory, and timeout for Flows. +--- + +# Flows + +:partial{content="config-env-vars"} + +| Variable | Description | Default Value | +| ----------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------- | +| `FLOWS_ENV_ALLOW_LIST` | A comma-separated list of environment variables. | `false` | +| `FLOWS_RUN_SCRIPT_MAX_MEMORY` | The maximum amount of memory the 'Run Script' operation can allocate in megabytes. Minimum `8`. | `32` | +| `FLOWS_RUN_SCRIPT_TIMEOUT` | The maximum duration the 'Run Script' operation can run for in milliseconds. | `10000` | + +## Using Environment Variables + +Once enabled via the `FLOWS_ENV_ALLOW_LIST` variable, environment variables can be accessed through the `$env` object within the passed `data` or through `process.env`. For example: + +```js +const publicUrl = data.$env.PUBLIC_URL; +``` diff --git a/content/11.configuration/7.security-limits.md b/content/11.configuration/7.security-limits.md new file mode 100644 index 00000000..3617c2e6 --- /dev/null +++ b/content/11.configuration/7.security-limits.md @@ -0,0 +1,131 @@ +--- +description: Configuration for access tokens, cookies, CSP, hashing, CORS, rate limiting, and request limits. +--- + +# Security & Limits + +:partial{content="config-env-vars"} + +| Variable | Description | Default Value | +| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | +| `SECRET`[1] | Secret string for the project. Used for secret signing. | Random value | +| `ACCESS_TOKEN_TTL` | The duration that an access token is valid. | `15m` | +| `EMAIL_VERIFICATION_TOKEN_TTL` | The duration that an email verification token is valid. | `7d` | +| `REFRESH_TOKEN_TTL` | The duration that a refresh token is valid. This value should be higher than `ACCESS_TOKEN_TTL` and `SESSION_COOKIE_TTL`. | `7d` | +| `REFRESH_TOKEN_COOKIE_DOMAIN` | Which domain to use for the refresh token cookie. Useful for development mode. | | +| `REFRESH_TOKEN_COOKIE_SECURE` | Whether or not to set the `secure` attribute for the refresh token cookie. | `false` | +| `REFRESH_TOKEN_COOKIE_SAME_SITE` | Value for `sameSite` in the refresh token cookie. | `lax` | +| `REFRESH_TOKEN_COOKIE_NAME` | Name of the refresh token cookie. | `directus_refresh_token` | +| `SESSION_COOKIE_TTL` | The duration that the session cookie/token is valid, and also how long users stay logged-in to the App. | `1d` | +| `SESSION_COOKIE_DOMAIN` | Which domain to use for the session cookie. Useful for development mode. | | +| `SESSION_COOKIE_SECURE` | Whether or not to set the `secure` attribute for the session cookie. | `false` | +| `SESSION_COOKIE_SAME_SITE` | Value for `sameSite` in the session cookie. | `lax` | +| `SESSION_COOKIE_NAME` | Name of the session cookie. | `directus_session_token` | +| `SESSION_REFRESH_GRACE_PERIOD` | The duration during which a refresh request will permit recently refreshed sessions to be used, thereby preventing race conditions in refresh calls. | `10s` | +| `LOGIN_STALL_TIME` | The duration in milliseconds that a login request will be stalled for, and it should be greater than the time taken for a login request with an invalid password. | `500` | +| `REGISTER_STALL_TIME` | The duration in milliseconds that a registration request will be stalled for, and it should be greater than the time taken for a registration request with an already registered email. | `750` | +| `PASSWORD_RESET_URL_ALLOW_LIST` | List of URLs that can be used as `reset_url` in the `/password/request` endpoint. | | +| `USER_INVITE_TOKEN_TTL` | The duration that the invite token is valid. | `7d` | +| `USER_INVITE_URL_ALLOW_LIST` | List of URLs that can be used as `invite_url` in the `/users/invite` endpoint. | | +| `USER_REGISTER_URL_ALLOW_LIST` | List of URLs that can be used as `verification_url` in the `/users/register` endpoint. | | +| `IP_TRUST_PROXY` | Settings for the Express.js trust proxy setting. | true | +| `IP_CUSTOM_HEADER` | What custom request header to use for the IP address. | false | +| `ASSETS_CONTENT_SECURITY_POLICY` | Custom overrides for the Content-Security-Policy header for the /assets endpoint. See [helmet's documentation on `helmet.contentSecurityPolicy()`](https://helmetjs.github.io). | | +| `IMPORT_IP_DENY_LIST`[2] | Deny importing files from these IP addresses / IP ranges / CIDR blocks. Use `0.0.0.0` to match any local IP address. | `0.0.0.0,169.254.169.254` | +| `CONTENT_SECURITY_POLICY_*` | Custom overrides for the Content-Security-Policy header. See [helmet's documentation on `helmet.contentSecurityPolicy()`](https://helmetjs.github.io). | | +| `HSTS_ENABLED` | Enable the Strict-Transport-Security policy header. | `false` | +| `HSTS_*` | Custom overrides for the Strict-Transport-Security header. See [helmet's documentation](https://helmetjs.github.io). | | + +[1] When `SECRET` is not set, a random value will be used. This means sessions won't persist across system +restarts or horizontally scaled deployments. Must be explicitly set to a secure random value in production. + +[2] localhost can get resolved to `::1` as well as `127.0.0.1` depending on the system - ensure to include +both if you want to specifically block localhost. + +Browser are pretty strict when it comes to third-party cookies. If you're running into unexpected problems when running your project and API on different domains, make sure to verify your configuration for `REFRESH_TOKEN_COOKIE_NAME`, `REFRESH_TOKEN_COOKIE_SECURE`, and `REFRESH_TOKEN_COOKIE_SAME_SITE`. + +## Hashing + +| Variable | Description | Default Value | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------- | +| `HASH_MEMORY_COST` | How much memory to use when generating hashes, in KiB. | `4096` (4 MiB) | +| `HASH_LENGTH` | The length of the hash function output in bytes. | `32` | +| `HASH_TIME_COST` | The amount of passes (iterations) used by the hash function. It increases hash strength at the cost of time required to compute. | `3` | +| `HASH_PARALLELISM` | The amount of threads to compute the hash on. Each thread has a memory pool with `HASH_MEMORY_COST` size. | `1` (single thread) | +| `HASH_TYPE` | The variant of the hash function (`0`: argon2d, `1`: argon2i, or `2`: argon2id). | `2` (argon2id) | +| `HASH_ASSOCIATED_DATA` | An extra and optional non-secret value. The value will be included Base64 encoded in the parameters portion of the digest. | | + +Argon2's hashing function is used by Directus to hash user passwords, generate hashes for the `Hash` field type in collections, and for use in the `/utils/hash/generate` endpoint. + +All `HASH_*` environment variable parameters are passed to the `argon2.hash` function. See the [node-argon2 library options page](https://github.com/ranisalt/node-argon2/wiki/Options) for reference. + + +::callout{type="info" title="Memory Usage"} +Modifying `HASH_MEMORY_COST` and/or `HASH_PARALLELISM` will affect the amount of memory directus uses when computing hashes; each thread gets `HASH_MEMORY_COST` amount of memory, so the total additional memory will be these two values multiplied. This may cause out of memory errors, especially when running in containerized environments. +:: + +## CORS + +| Variable | Description | Default Value | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| `CORS_ENABLED` | Whether or not to enable the CORS headers. | `false` | +| `CORS_ORIGIN` | Value for the `Access-Control-Allow-Origin` header. Use `true` to match the Origin header, or provide a domain or a CSV of domains for specific access. | `false` | +| `CORS_METHODS` | Value for the `Access-Control-Allow-Methods` header. | `GET,POST,PATCH,DELETE` | +| `CORS_ALLOWED_HEADERS` | Value for the `Access-Control-Allow-Headers` header. | `Content-Type,Authorization` | +| `CORS_EXPOSED_HEADERS` | Value for the `Access-Control-Expose-Headers` header. | `Content-Range` | +| `CORS_CREDENTIALS` | Whether or not to send the `Access-Control-Allow-Credentials` header. | `true` | +| `CORS_MAX_AGE` | Value for the `Access-Control-Max-Age` header. | `18000` | + +For more details about each configuration variable, please see the [CORS package documentation](https://www.npmjs.com/package/cors#configuration-options). + +## Rate Limiting + +You can use the built-in rate-limiter to prevent users from hitting the API too much. + +Enabling the rate-limiter with no other options will set a default maximum of 50 requests per second, tracked in memory. + +| Variable | Description | Default Value | +| ------------------------------------------- | ----------------------------------------------------------------------- | ------------- | +| `RATE_LIMITER_ENABLED` | Whether or not to enable rate limiting per IP on the API. | `false` | +| `RATE_LIMITER_POINTS` | The amount of allowed hits per duration. | `50` | +| `RATE_LIMITER_DURATION` | The time window in seconds in which the points are counted. | `1` | +| `RATE_LIMITER_STORE` | Where to store the rate limiter counts. One of `memory`, `redis`. | `memory` | +| `RATE_LIMITER_HEALTHCHECK_THRESHOLD` | Healthcheck timeout threshold in milliseconds. | `150` | +| `RATE_LIMITER_GLOBAL_ENABLED` | Whether or not to enable global rate limiting on the API. | `false` | +| `RATE_LIMITER_GLOBAL_POINTS` | The total amount of allowed hits per duration. | `1000` | +| `RATE_LIMITER_GLOBAL_DURATION` | The time window in seconds in which the points are counted. | `1` | +| `RATE_LIMITER_GLOBAL_HEALTHCHECK_THRESHOLD` | Healthcheck timeout threshold in milliseconds. | `150` | +| `RATE_LIMITER_REGISTRATION_ENABLED` | Whether or not to enable rate limiting per IP on the user registration. | `true` | +| `RATE_LIMITER_REGISTRATION_POINTS` | The amount of allowed hits per duration. | `5` | +| `RATE_LIMITER_REGISTRATION_DURATION` | The time window in seconds in which the points are counted. | `60` | + +### Pressure-Based Rate Limiter + +This rate-limiter prevents the API from accepting new requests while the server is experiencing high load. This continuously monitors the current event loop and memory usage, and error with a 503 early when the system is overloaded. + +| Variable | Description | Default Value | +| --------------------------------------------- | --------------------------------------------------------------------------- | ------------- | +| `PRESSURE_LIMITER_ENABLED` | Whether or not to enable pressure-based rate limiting on the API. | `true` | +| `PRESSURE_LIMITER_SAMPLE_INTERVAL` | The time window for measuring pressure in milliseconds. | `250` | +| `PRESSURE_LIMITER_MAX_EVENT_LOOP_UTILIZATION` | The maximum allowed utilization where `1` is 100% loop utilization. | `0.99` | +| `PRESSURE_LIMITER_MAX_EVENT_LOOP_DELAY` | The maximum amount of time the current loop can be delayed in milliseconds. | `500` | +| `PRESSURE_LIMITER_MAX_MEMORY_RSS` | The maximum allowed memory Resident Set Size (RSS) in bytes. | `false` | +| `PRESSURE_LIMITER_MAX_MEMORY_HEAP_USED` | The maximum allowed heap usage in bytes. | `false` | +| `PRESSURE_LIMITER_RETRY_AFTER` | Sets the `Retry-After` header when the rate limiter is triggered. | `false` | + +## Limits & Optimizations + +Allows you to configure hard technical limits, to prevent abuse and optimize for your particular server environment. + +| Variable | Description | Default Value | +| --------------------------- | ------------------------------------------------------------------------------------------- | ------------- | +| `RELATIONAL_BATCH_SIZE` | How many rows are read into memory at a time when constructing nested relational datasets. | 25000 | +| `EXPORT_BATCH_SIZE` | How many rows are read into memory at a time when constructing exports. | 5000 | +| `USERS_ADMIN_ACCESS_LIMIT` | How many active users with admin privilege are allowed. | `Infinity` | +| `USERS_APP_ACCESS_LIMIT` | How many active users with access to the Data Studio are allowed. | `Infinity` | +| `USERS_API_ACCESS_LIMIT` | How many active API access users are allowed. | `Infinity` | +| `GRAPHQL_QUERY_TOKEN_LIMIT` | How many GraphQL query tokens will be parsed. | 5000 | +| `MAX_PAYLOAD_SIZE` | Controls the maximum request body size. Accepts number of bytes, or human readable string. | `1mb` | +| `MAX_RELATIONAL_DEPTH` | The maximum depth when filtering / querying relational fields, with a minimum value of `2`. | `10` | +| `QUERY_LIMIT_DEFAULT` | The default query limit used when not defined in the API request. | `100` | +| `QUERY_LIMIT_MAX` | The maximum query limit accepted on API requests. | `-1` | diff --git a/content/11.configuration/8.auth-sso.md b/content/11.configuration/8.auth-sso.md new file mode 100644 index 00000000..bb472e7a --- /dev/null +++ b/content/11.configuration/8.auth-sso.md @@ -0,0 +1,167 @@ +--- +description: Configuration for authentication methods, including local email/password, OAuth 2.0, OpenID, LDAP, and SAML. +title: Auth & SSO +--- + +# Authentication & SSO + +:partial{content="config-env-vars"} + +Directus offers a variety of authentication methods, including local email/password, OAuth 2.0, OpenID, LDAP, and SAML. + +| Variable | Description | Default Value | +| ---------------------- | ---------------------------------------------------------------------------------------- | ------------- | +| `AUTH_PROVIDERS` | A comma-separated list of auth providers. You can use any names you like for these keys. | | +| `AUTH_DISABLE_DEFAULT` | Disable the default auth provider. | `false` | + +For each of the storage locations listed, you must provide the following configuration (variable name must be uppercase in these options): + +| Variable | Description | Default Value | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `AUTH__DRIVER` | Which driver to use, either `local`, `oauth2`, `openid`, `ldap`, `saml`. | | +| `AUTH__MODE` | Whether to use `'cookie'` or `'session'` authentication mode when redirecting. Applies to the following drivers `oauth2`, `openid`, `saml`. | `session` | + + +Based on your configured drivers, you must also provide additional variables, where `` is the capitalized name of the item in the `AUTH_PROVIDERS` value. + +::callout{type="warning" title="PUBLIC_URL"} +`oauth2`, `openid`, `ldap`, and `saml` drivers rely on the `PUBLIC_URL` variable for redirecting. Ensure the variable is correctly configured. +:: + +## Local (`local`) + +The default Directus email/password authentication flow. No additional configuration required. + +## OAuth 2.0 + +| Variable | Description | Default Value | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------- | +| `AUTH__CLIENT_ID` | Client identifier for the OAuth provider. | | +| `AUTH__CLIENT_SECRET` | Client secret for the OAuth provider. | | +| `AUTH__SCOPE` | A white-space separated list of permissions to request. | `email` | +| `AUTH__AUTHORIZE_URL` | Authorization page URL of the OAuth provider. | | +| `AUTH__ACCESS_URL` | Access token URL of the OAuth provider. | | +| `AUTH__PROFILE_URL` | User profile URL of the OAuth provider. | | +| `AUTH__IDENTIFIER_KEY` | User profile identifier key [1]. Will default to `EMAIL_KEY`. | | +| `AUTH__EMAIL_KEY` | User profile email key. | `email` | +| `AUTH__FIRST_NAME_KEY` | User profile first name key. | | +| `AUTH__LAST_NAME_KEY` | User profile last name key. | | +| `AUTH__ALLOW_PUBLIC_REGISTRATION` | Automatically create accounts for authenticating users. | `false` | +| `AUTH__DEFAULT_ROLE_ID` | A Directus role ID to assign created users. | | +| `AUTH__SYNC_USER_INFO` | Set user's first name, last name and email from provider's user info on each login. | `false` | +| `AUTH__ICON` | SVG icon to display with the login link. Can be a Material Icon or Font Awesome Social Icon. | `account_circle` | +| `AUTH__LABEL` | Text to be presented on SSO button within the Data Studio. | `` | +| `AUTH__PARAMS` | Custom query parameters applied to the authorization URL. | | +| `AUTH__REDIRECT_ALLOW_LIST` | A comma-separated list of external URLs (including paths) allowed for redirecting after successful login. | | + +[1] When authenticating, Directus will match the identifier value from the external user profile to a Directus users "External Identifier". + +## OpenID + +OpenID is an authentication protocol built on OAuth 2.0, and should be preferred over standard OAuth 2.0 where possible. + +| Variable | Description | Default Value | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------- | +| `AUTH__CLIENT_ID` | Client identifier for the external service. | | +| `AUTH__CLIENT_SECRET` | Client secret for the external service. | | +| `AUTH__SCOPE` | A white-space separated list of permissions to request. | `openid profile email` | +| `AUTH__ISSUER_URL` | OpenID `.well-known` discovery document URL of the external service. | | +| `AUTH__IDENTIFIER_KEY` | User profile identifier key [1]. | `sub`[2] | +| `AUTH__ALLOW_PUBLIC_REGISTRATION` | Automatically create accounts for authenticating users. | `false` | +| `AUTH__REQUIRE_VERIFIED_EMAIL` | Require created users to have a verified email address. | `false` | +| `AUTH__DEFAULT_ROLE_ID` | A Directus role ID to assign created users. | | +| `AUTH__SYNC_USER_INFO` | Set user's first name, last name and email from provider's user info on each login. | `false` | +| `AUTH__ICON` | SVG icon to display with the login link. Can be a Material Icon or Font Awesome Social Icon. | `account_circle` | +| `AUTH__LABEL` | Text to be presented on SSO button within the Data Studio. | `` | +| `AUTH__PARAMS` | Custom query parameters applied to the authorization URL. | | +| `AUTH__REDIRECT_ALLOW_LIST` | A comma-separated list of external URLs (including paths) allowed for redirecting after successful login. | | + +[1] When authenticating, Directus will match the identifier value from the external user profile to a Directus users "External Identifier". + +[2] `sub` represents a unique user identifier defined by the OpenID provider. For users not relying on `PUBLIC_REGISTRATION` it is recommended to use a human-readable identifier, such as `email`. + +## LDAP (`ldap`) + +LDAP allows Active Directory users to authenticate and use Directus without having to be manually configured. User information and roles will be assigned from Active Directory. + +| Variable | Description | Default Value | +| ---------------------------------------- | ----------------------------------------------------------------------------------- | ------------- | +| `AUTH__CLIENT_URL` | LDAP connection URL. | | +| `AUTH__BIND_DN` | Bind user [1] distinguished name. | | +| `AUTH__BIND_PASSWORD` | Bind user password. | | +| `AUTH__USER_DN` | Directory path containing users. | | +| `AUTH__USER_ATTRIBUTE` | Attribute to identify the user. | `cn` | +| `AUTH__USER_SCOPE` | Scope of the user search, either `base`, `one`, `sub` [2]. | `one` | +| `AUTH__MAIL_ATTRIBUTE` | User email attribute. | `mail` | +| `AUTH__FIRST_NAME_ATTRIBUTE` | User first name attribute. | `givenName` | +| `AUTH__LAST_NAME_ATTRIBUTE` | User last name attribute. | `sn` | +| `AUTH__GROUP_DN`[3] | Directory path containing groups. | | +| `AUTH__GROUP_ATTRIBUTE` | Attribute to identify user as a member of a group. | `member` | +| `AUTH__GROUP_SCOPE` | Scope of the group search, either `base`, `one`, `sub` [2]. | `one` | +| `AUTH__DEFAULT_ROLE_ID` | A fallback Directus role ID to assign created users. | | +| `AUTH__SYNC_USER_INFO` | Set user's first name, last name and email from provider's user info on each login. | `false` | + +[1] The bind user must have permission to query users and groups to perform authentication. Anonymous binding +can by achieved by setting an empty value for `BIND_DN` and `BIND_PASSWORD`. + +[2] The scope defines the following behaviors: + +- `base`: Limits the scope to a single object defined by the associated DN. +- `one`: Searches all objects within the associated DN. +- `sub`: Searches all objects and sub-objects within the associated DN. + +[3] If `GROUP_DN` is specified, the user's role will always be updated on authentication to a matching group +configured in AD, or fallback to the `DEFAULT_ROLE_ID`. + +## SAML + +SAML is an open-standard, XML-based authentication framework for authentication and authorization between two entities without a password. + +- Service provider (SP) agrees to trust the identity provider to authenticate users. +- Identity provider (IdP) authenticates users and provides to service providers an authentication assertion that indicates a user has been authenticated. + +| Variable | Description | Default Value | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `AUTH__SP_metadata` | String containing XML metadata for service provider | | +| `AUTH__IDP_metadata` | String containing XML metadata for identity provider | | +| `AUTH__ALLOW_PUBLIC_REGISTRATION` | Automatically create accounts for authenticating users. | `false` | +| `AUTH__DEFAULT_ROLE_ID` | A Directus role ID to assign created users. | | +| `AUTH__IDENTIFIER_KEY` | User profile identifier key [1]. | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier` | +| `AUTH__EMAIL_KEY` | User profile email key. | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress` | +| `AUTH__GIVEN_NAME_KEY` | User first name attribute. | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname` | +| `AUTH__FAMILY_NAME_KEY` | User last name attribute. | `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname` | +| `AUTH__REDIRECT_ALLOW_LIST` | A comma-separated list of external URLs (including paths) allowed for redirecting after successful login. | | + +[1] When authenticating, Directus will match the identifier value from the external user profile to a Directus users "External Identifier". + +The `SP_metadata` and `IDP_metadata` variables should be set to the XML metadata provided by the service provider and identity provider respectively. + +## Multiple Auth Providers + +You can configure multiple providers for handling authentication in Directus. This allows for different options when logging in. To do this, provide a comma-separated list of provider names, and a config block for each provider. For example; + +```bash +AUTH_PROVIDERS="google,facebook" + +AUTH_GOOGLE_DRIVER="openid" +AUTH_GOOGLE_CLIENT_ID="830d...29sd" +AUTH_GOOGLE_CLIENT_SECRET="la23...4k2l" +AUTH_GOOGLE_ISSUER_URL="https://accounts.google.com/.well-known/openid-configuration" +AUTH_GOOGLE_IDENTIFIER_KEY="email" +AUTH_GOOGLE_ICON="google" +AUTH_GOOGLE_LABEL="Google" + +AUTH_FACEBOOK_DRIVER="oauth2" +AUTH_FACEBOOK_CLIENT_ID="830d...29sd" +AUTH_FACEBOOK_CLIENT_SECRET="jd8x...685z" +AUTH_FACEBOOK_AUTHORIZE_URL="https://www.facebook.com/dialog/oauth" +AUTH_FACEBOOK_ACCESS_URL="https://graph.facebook.com/oauth/access_token" +AUTH_FACEBOOK_PROFILE_URL="https://graph.facebook.com/me?fields=email" +AUTH_FACEBOOK_ICON="facebook" +AUTH_FACEBOOK_LABEL="Facebook" +``` + +::callout{type="info" title="Multiple Providers"} +Directus users can only authenticate using the auth provider they are created with. It is not possible to authenticate +with multiple providers for the same user. +:: \ No newline at end of file diff --git a/content/11.configuration/9.pm2.md b/content/11.configuration/9.pm2.md new file mode 100644 index 00000000..3b290c2b --- /dev/null +++ b/content/11.configuration/9.pm2.md @@ -0,0 +1,27 @@ +--- +description: Configuration for PM2, the process manager for Directus. +--- + +# PM2 + +:partial{content="config-env-vars"} + +For more information on what these options do, refer directly to the [`pm2` documentation](https://pm2.keymetrics.io/docs/usage/application-declaration/). + +| Variable | Description | Default | +| ----------------------------- | ------------------------------------------------------------------- | -------------------------------------------- | +| `PM2_INSTANCES`[1] | Number of app instance to be launched. | `1` | +| `PM2_EXEC_MODE` | One of `fork`, `cluster`. | `'cluster'` | +| `PM2_MAX_MEMORY_RESTART` | App will be restarted if it exceeds the amount of memory specified. | | +| `PM2_MIN_UPTIME` | Min uptime of the app to be considered started. | | +| `PM2_LISTEN_TIMEOUT` | Time in ms before forcing a reload if app not listening. | | +| `PM2_KILL_TIMEOUT` | Time in milliseconds before sending a final SIGKILL. | | +| `PM2_MAX_RESTARTS` | Number of failed restarts before the process is killed. | | +| `PM2_RESTART_DELAY` | Time to wait before restarting a crashed app. | `0` | +| `PM2_AUTO_RESTART` | Automatically restart Directus if it crashes unexpectedly. | `false` | +| `PM2_LOG_ERROR_FILE` | Error file path. | `$HOME/.pm2/logs/-error-.log` | +| `PM2_LOG_OUT_FILE` | Output file path. | `$HOME/.pm2/logs/-out-.log` | + +[1] Redis is required in case of multiple instances. + +These environment variables only exist when you're using the official Docker Container, or are using the provided [`ecosystem.config.cjs`](https://github.com/directus/directus/blob/main/ecosystem.config.cjs) file with `pm2` directly. diff --git a/content/11.configuration/_dir.yml b/content/11.configuration/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/11.configuration/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/12.self-hosting/1.overview.md b/content/12.self-hosting/1.overview.md new file mode 100644 index 00000000..da7b3d18 --- /dev/null +++ b/content/12.self-hosting/1.overview.md @@ -0,0 +1,46 @@ +--- +title: Overview +description: Self-hosting Directus means running the Directus software on your own infrastructure. +--- + +# Self-Hosting Overview + +Self-hosting Directus means running the Directus software on your own infrastructure, giving you full control over your data, hardware, and deployment configuration. While Directus offers both cloud-hosted and self-hosted options, this section of the documentation focuses on self-hosting. + +## Considerations + +There are many benefits to self-hosting, but there are also some considerations to keep in mind. + +### Control + +Some users prefer to have full control over their infrastructure and deployment configuration. This means you have the freedom to choose the hardware that best fits your needs. As Directus is provided as a Docker image, you can deploy it on many different platforms. + +You can also control all of the required parts for a production system, including the database, caching, and backups. All environment variables are configurable, giving you the ability to customize the behavior of Directus to your needs, even if the desired options are not recommended for security or stability. + +### Skills + +While we try to make it as easy as possible to self-host Directus, there is still a lot to consider when self-hosting and maintaining Directus for production use that requires additional skills. + +If you have experience running and scaling Docker containers, are able to monitor and maintain a server, and have knowledge of how to configure a database and set up backups, then self-hosting Directus may be a good fit for you. + +### Cost + +:partial{content="license"} + +On top of the Directus license, you will need to consider the cost of your infrastructure, including the server, database, and other dependencies. The non-exhaustive list of considerations includes: + +- Compute (running the Directus instance) +- Database +- Redis Cache +- Content Delivery Network (CDN) +- Load Balancers +- Backup System +- Monitoring + +And, of course, the cost of time to manage and maintain all of these moving parts. In some contexts, this is a non-issue, but in others, it can be a significant factor. + +### Directus Cloud + +Directus Cloud is a hosted version of Directus that is maintained by the Directus team. It is a fully managed service that provides a secure and scalable environment for your Directus project. + +:directus-cloud \ No newline at end of file diff --git a/content/12.self-hosting/2.requirements.md b/content/12.self-hosting/2.requirements.md new file mode 100644 index 00000000..ecb8bc8c --- /dev/null +++ b/content/12.self-hosting/2.requirements.md @@ -0,0 +1,34 @@ +--- +title: Requirements +description: This page outlines the requirements for self-hosting Directus. +--- + +# Self-Hosting Requirements + +We distribute Directus as a Docker image. To self-host Directus, you will need to be in an environment that supports Docker. + +## Variables + +Directus uses environment variables to configure many advanced features. In order to run Directus, your host will need to provide the ability to edit the required variables. You can learn more about the available variables in the [configuration section](/configuration/general). + +## Compute + +It can be easy to under-provision resources to run a self-hosted instance of Directus. For Directus' container resources, the required minimum system requirements are 1x 0.25 vCPU / 512 MB, although the recommended minimum is 2x 1 vCPU / 2GB. + +## Database + +The Directus Docker Image contains all optional dependencies supported in the API. This means the Docker image can be used with most of the supported databases and storage adapters without having to create a custom image. + +Directus supports the Long-Term Support (LTS) versions of PostgreSQL, MySQL, SQLite, MS SQL Server, MariaDB, CockroachDB, and OracleDB. + +## Storage + +To store files, Directus uses the storage adapter pattern. This allows Directus to use any compatible storage provider. You will need to configure the [storage adapter](/configuration/files) via configuration variables or mount a local file system directory as a volume. + +## Caching & Scaling + +Directus uses Redis for caching and scaling. It is not required, but it is recommended to use Redis for caching and is a requirement with horizontally scaling your Directus instance. + +## Recommendations + +While not required, you may also consider implementing a database and asset storage backup system to ensure the safety of your data, a CDN to improve performance, and a load balancer to distribute traffic across your Directus instances. To understand how your application is running, you may also consider implementing a monitoring system. \ No newline at end of file diff --git a/content/12.self-hosting/3.deploying.md b/content/12.self-hosting/3.deploying.md new file mode 100644 index 00000000..f9d382da --- /dev/null +++ b/content/12.self-hosting/3.deploying.md @@ -0,0 +1,109 @@ +--- +title: Deployment +description: This section covers the deployment process of Directus, including environment variables, versioning, persistence, and initial admin user setup. +--- + +# Deploying Directus + +Directus is provided as a Docker image. This means you can deploy it on many different platforms. While each is slightly different, the core concepts are the same. + +## Environment Variables + +Directus uses environment variables for database and asset storage connection details and some [key project configuration](/configuration/general). At the very least, you will need to [configure a database](/configuration/database) and set a `SECRET`. + +Dependent on your hosting provider, you will need to set these variables in a different place. In some, it is a dedicated key/value store provided in a Web UI. In others, it is a file that is loaded when the Docker container starts. As Directus is provided as a Docker image, you shouldn't need to do more than set environment variables to get started. + +## Version Pinning + +The Docker image is published on Docker Hub as `directus/directus`. The version is specified in the tag. For example, `directus/directus:11.1.1`. You can always use the `latest` tag instead of an explicit version, but we recommend pinning to a specific version for production environments. + +This also means your project will not be automatically updated to the latest version when restarting the container, which is recommended in case of required changes or breaking changes. + +## Persistence + +Docker containers are ephemeral by design. This means that any changes you make while the container is running will be lost when the container is stopped or restarted. + +To persist data, you will need to mount a volume to the container. When using Docker Compose, this is done by adding a `volumes` section to the `docker-compose.yml` file, which you can see in our [create a project page](/getting-started/create-a-project/). + +Files can be persisted by mounting a volume to the container, or by setting up an [external storage location](/configuration/files). + +## Initial Admin User + +You do not need to create the initial admin user in the database manually. When the container starts, you will see a message in the terminal that includes the email address and password for the initial user. + +You can manually set an email address, password, and static access token for the initial admin user using the [`ADMIN_*` environment variables](/configuration/general). + +## Docker Compose Examples + +::callout{type="info" :toggleable="true" title="Postgres, Redis, Directus, Local Files"} + +Be sure to replace placeholder values with your own. + +```yaml +services: + database: + image: postgis/postgis:13-master + volumes: + - ./data/database:/var/lib/postgresql/data + environment: + POSTGRES_USER: "directus" + POSTGRES_PASSWORD: "directus" + POSTGRES_DB: "directus" + healthcheck: + test: ["CMD", "pg_isready", "--host=localhost", "--username=directus"] + interval: 10s + timeout: 5s + retries: 5 + start_interval: 5s + start_period: 30s + + cache: + image: redis:6 + healthcheck: + test: ["CMD-SHELL", "[ $$(redis-cli ping) = 'PONG' ]"] + interval: 10s + timeout: 5s + retries: 5 + start_interval: 5s + start_period: 30s + + directus: + image: directus/directus:REPLACE_WITH_VERSION + ports: + - 8055:8055 + volumes: + - ./uploads:/directus/uploads + - ./extensions:/directus/extensions + depends_on: + database: + condition: service_healthy + cache: + condition: service_healthy + environment: + SECRET: "REPLACE_WITH_YOUR_SECRET" + + DB_CLIENT: "pg" + DB_HOST: "database" + DB_PORT: "5432" + DB_DATABASE: "directus" + DB_USER: "directus" + DB_PASSWORD: "directus" + + CACHE_ENABLED: "true" + CACHE_AUTO_PURGE: "true" + CACHE_STORE: "redis" + REDIS: "redis://cache:6379" + + ADMIN_EMAIL: "REPLACE_WITH_YOUR_EMAIL" + ADMIN_PASSWORD: "REPLACE_WITH_YOUR_PASSWORD" + + PUBLIC_URL: "REPLACE_WITH_YOUR_URL" +``` + +:: + +::callout{type="info" title="Request Other Examples"} + +We're keeping this section light for now, but if you need examples for other database providers, let us know! + +:: \ No newline at end of file diff --git a/content/12.self-hosting/4.upgrading.md b/content/12.self-hosting/4.upgrading.md new file mode 100644 index 00000000..74a5c3a9 --- /dev/null +++ b/content/12.self-hosting/4.upgrading.md @@ -0,0 +1,26 @@ +--- +title: Upgrading +description: Learn how to upgrade Directus to the latest version. +--- + +# Upgrading Directus + +We release a new version of Directus approximately once a month, with more rapid releases for critical fixes. + +## Breaking Changes + +Each release, we update the [list of breaking changes](/releases/breaking-changes) with any changes that could affect you if upgrading. It is critically important that you review this list before upgrading, mitigating any potential issues. + +Certain features may be removed, or the behavior of existing features may change. We do our best to ensure these changes are not disruptive, but they can happen. + +Changes could include: +- Changes to environment variables. +- Changes to the REST and GraphQL APIs. +- Changes to the JavaScript SDK. +- Changes to internal services used by extension authors. + +## Upgrading + +If using Docker, you can upgrade by updating the tag in `docker-compose.yml` or `Dockerfile`. If using `latest`, restart your container. + +All database migrations are handled automatically. \ No newline at end of file diff --git a/content/12.self-hosting/5.including-extensions.md b/content/12.self-hosting/5.including-extensions.md new file mode 100644 index 00000000..1ccfb156 --- /dev/null +++ b/content/12.self-hosting/5.including-extensions.md @@ -0,0 +1,76 @@ +--- +description: Learn how to include extensions in your self-hosted Directus project. +--- + +# Including Extensions + +All Directus projects can include extensions via the [Directus Marketplace](/extensions/marketplace). Self-hosted projects can also install extensions directly from npm or by dropping extensions directly into the extensions directory mounted in your project. + +## Directus Marketplace + +By default, App extensions and API using our [Sandbox SDK](/extensions/api-extensions/sandbox) are available from the Marketplace in all Directus projects. If you want to install API extensions that are not sandboxed, you can change the value of the [`MARKETPLACE_TRUST`](/configuration/extensions) variable. + +## npm Packages + +To install extensions, you will need to build a custom image of Directus. + +### 1. Modify Docker Compose File + +If you are using a `docker-compose.yml` file, delete the `image` property and add a `build` section: + +```yaml +build: + context: ./ +``` + +### 2. Create a Dockerfile + +At the root of your project, create a file called `Dockerfile`, if one doesn't already exist, and add the following: + +```dockerfile +FROM directus/directus:latest + +USER root +RUN corepack enable +USER node + +RUN pnpm install @directus-labs/spreadsheet-layout +``` + +This is an example `Dockerfile` that installs the Spreadsheet Layout via npm. You can change the `RUN pnpm install` line to install any extension published on npm, and add multiple lines for each extension you want to install. + +### 3. Build Docker Image + +Build your Docker image by running `docker compose build` and then run `docker compose up` as normal to start the container. + +## Directly Including Extensions + +To locally install extensions, copy the files generated by building an extension into the `extensions` directory. By default, this is located at the root of your Directus project, but this can be changed using the [`EXTENSIONS_PATH`](/configuration/extensions) environment variable. + +### 1. Mount Extensions Directory + +At the root of your project, next to your `docker-compose.yml` file, create a new directory called `extensions`. Then, in your `docker-compose.yml` file, add the directory as a volume to the `directus` service section: + +```yaml +services: + directus: + volumes: + - ./extensions:/directus/extensions +``` + +### 2. Add Extensions + +Inside of the `extensions` directory, create a new directory for each extension you want to install. Then, copy the files generated by building an extension into the directory. + +``` +extensions/ + / + dist/ + index.js + package.json + ... +``` + +At the very least you should have a `package.json` file and a `dist` directory with one or more files inside of it. + +When you restart your Docker container, Directus will automatically load any extensions you have included in the directory. \ No newline at end of file diff --git a/content/12.self-hosting/_dir.yml b/content/12.self-hosting/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/12.self-hosting/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/13.releases/1.overview.md b/content/13.releases/1.overview.md new file mode 100644 index 00000000..65e5f886 --- /dev/null +++ b/content/13.releases/1.overview.md @@ -0,0 +1,22 @@ +--- +title: Overview +description: Releases are how we roll out new features, updates, and fixes to Directus. +--- + +# Releases Overview + +We release new versions of Directus approximately once a month. While we provide a single version number for each release, Directus has several packages and each package may have different version numbers. + +While we use a three number versioning scheme, we don't adhere to semantic versioning stadards, which means that any release may include breaking changes. Instead, we use the importance or impact of changes to determine the version number. + +::callout{type="link" url="/releases/changelog" title="The Changelog"} +A monthly summary of what's new from the Directus team. +:: + +::callout{type="link" url="/releases/breaking-changes" title="Breaking Changes"} +Breaking changes may require action on your part before upgrading. +:: + +::callout{type="link" url="https://github.com/directus/directus/releases" title="Releases"} +See the full release history on GitHub. +:: \ No newline at end of file diff --git a/content/13.releases/2.breaking-changes/0.index.md b/content/13.releases/2.breaking-changes/0.index.md new file mode 100644 index 00000000..dc8cc060 --- /dev/null +++ b/content/13.releases/2.breaking-changes/0.index.md @@ -0,0 +1,10 @@ +--- +description: Breaking changes may require action on your part before upgrading. +--- + +# Breaking Changes + +As we continue to build Directus, we occasionally make changes that change how certain features works. We try and keep +these to a minimum, but rest assured we only make them with good reason. + + \ No newline at end of file diff --git a/content/13.releases/2.breaking-changes/1.version-10.md b/content/13.releases/2.breaking-changes/1.version-10.md new file mode 100644 index 00000000..20606454 --- /dev/null +++ b/content/13.releases/2.breaking-changes/1.version-10.md @@ -0,0 +1,477 @@ +--- +description: Breaking changes may require action on your part before upgrading. +--- + +# Version 10 + +## Version 10.13.2 + +### Updated Date Fields for Files + +In order to make it possible to recognize when a file was last replaced, the following changes have been made to the +date fields: + +- A new `created_on` field has been introduced, which contains the initial date of creation +- The `uploaded_on` field is now updated with every file upload/replacement + +## Version 10.12.2 + +### Disallowed Mutation of Special System Collections via Relations + +For security reasons, mutations of the following system collections via relations are no longer permitted: + +- `directus_collections` +- `directus_fields` +- `directus_relations` +- `directus_sessions` +- `directus_extensions` + +## Version 10.10.0 + +### Deprecated Typed Extension Folders + +Legacy extension type directory-based structure (`/interfaces/my-interface/`, `/endpoints/my-endpoint`, etc) are being +removed in favor of relying on the `package.json` file for metadata including extension type. + +If your extensions are already relying on the up-to-date extensions directory paradigm (extensions in the root of your +extensions directory prefixed with `directus-extension-`) no action is required at this point. If you're currently relying +on the legacy format for extensions, recognizable by each extension type having it's own directory, like `endpoints`, +`hooks`, etc, you will have to update your extensions before upgrading to this version. + +Directus will ignore extensions that use the legacy format starting in this version. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + +Move all extension directories from their extension type subdirectory one level up. For example: + +- `./extensions/modules/module-a/` becomes `./extensions/module-a/`. +- `./extensions/panels/panel-b/` becomes `./extensions/panel-b/`. + +If your extension does not already have one, add a `directus:extension` object to your `package.json` file: + +```json +{ + "name": "directus-extension-hello-world", + "version": "1.0.0", + "type": "module", + "directus:extension": { + "type": "endpoint", + "path": "dist/index.js", + "source": "src/index.js", + "host": "^10.0.0" + } +} +``` + +Notes: + +- Make sure `type` matches the JS type of your `dist` file (cjs or esm). +- Make sure `directus:extension.type` matches the type of extension. This should match the legacy type directory name. +- Make sure `directus:extension.path`points to your extensions’ `dist` file. +- Make sure `directus:extension.source` points to your extensions’ source code entry point or set to an empty string + `""` when the source code is not stored alongside the `package.json` file. +- Make sure `directus:extension.host` is set to a Directus version range your extension is compatible with (for example: + `^10.0.0`) + +:: + +### Moved Migrations Out of Extensions + +Migrations are no longer considered an extension type as of this release. The `migrations` extensions directory must be +migrated. + +Place migrations in the `./migrations` directory, or set the new location in the `MIGRATIONS_PATH` environment variable. + +### Moved Email Templates Out of Extensions + +Email Templates are no longer considered an extension type as of this release. The `templates` extensions directory must +be migrated. + +Place email templates in the `./templates` directory, or set the new location in the `EMAIL_TEMPLATES_PATH` environment +variable. + +### Content Versioning Output + +Starting with 10.10.0, when requesting Item Content Versions via the API, nested relational changes to one-to-many are +resolved rather than returned as a raw changes object (see [#20890](https://github.com/directus/directus/issues/20890) +for more information). + +The change makes the output for a versioned record match the format of the `Main` record more closely, which then +natively supports other features like Live Preview. To retrieve the raw staged version (pre-10.10.0 behavior), just add +the new `?versionRaw=true` query parameter to the request. + +### Session Cookie Based Authentication + +For improved security and ease of use we have implemented session based authentication and have updated the App to use +this method over the previous token based authentication. This impacts `oauth2`, `open-id` and `saml` SSO installations +as they too will now default to the new session based authentication in order to work with the App out-of-the-box. The +new session cookie can be configured using the `SESSION_COOKIE_*` environment variables. + +To keep using the previous SSO behavior setting the refresh token instead of session token for use in external +applications, you can set `AUTH__MODE=cookie`. This will however not work with the Directus app. + +#### Extensions Extracting the Current Token from `axios` + +This affects App extensions that are currently extracting the token from `axios`. This will no longer be either possible +or necessary, as the App now uses a session cookie, which will be sent with each request from the browser. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + + ::tabs + + ::tab{label="Before"} + + ```js + function addQueryToPath(path, query) { + const queryParams = []; + + for (const [key, value] of Object.entries(query)) { + queryParams.push(`${key}=${value}`); + } + + return path.includes('?') ? `${path}&${queryParams.join('&')}` : `${path}?${queryParams.join('&')}`; + } + + function getToken() { + return ( + directusApi.defaults?.headers?.['Authorization']?.split(' ')[1] || + directusApi.defaults?.headers?.common?.['Authorization']?.split(' ')[1] || + null + ); + } + + function addTokenToURL(url) { + const accessToken = getToken(); + if (!accessToken) return url; + return addQueryToPath(url, { + access_token: accessToken, + }); + } + + const authenticatedURL = addTokenToURL('/assets/') + ``` + :: + + ::tab{label="After"} + ```js + // no extra logic needed to be authenticated + const authenticatedURL = '/assets/'; + ``` + :: + +:: + +#### Extensions using `AuthenticationService` + +In the `AuthenticationService` the `login` function signature has been changed to have an `options` object as the third +argument for any extra options. + +::callout{type="info" :toggleable="true" title="Show examples"} + ::tabs + ::tab{label="Before"} + ```js + AuthenticationService.login('email', 'password', 'otp-code'); + ``` + :: + + ::tab{label="After"} + ```js + AuthenticationService.login('email', 'password', { otp: 'otp-code', session: true }); + ``` + :: + :: +:: + +### Introduced Allow List for OAuth2/OpenID/SAML Redirects + +Due to an Open Redirect vulnerability with the OAuth2, OpenID and SAML SSO providers, we have introduced an allow list +for these redirects. + +If your current workflow depends on redirecting to an external domain after successful SSO login using the +`?redirect=http://example.com/login` query parameter, then you'll need to add this URL to the +`AUTH__REDIRECT_ALLOW_LIST` config option. + +`AUTH__REDIRECT_ALLOW_LIST` accepts a comma-separated list of URLs (path is included in comparison). + +### Email Flow Operation No Longer Waits for Emails to Be Sent + +Previously, the [Send Email](https://docs.directus.io/app/flows/operations.html#send-email) Flow Operation has waited +until emails have been sent out before proceeding to the next step. + +This is no longer the case, which also means that the operation can no longer be used to receive information about +dispatched emails. + +If this is a requirement, it can still be achieved by building a custom operation which directly uses the `MailService`. + +## Version 10.9.0 + +### Updated Exif Tags + +The library `exif-reader`, which is used for Exif metadata extraction of images, has been updated to v2. In this +release, tag names have been updated to align with the Exif standard. See +https://github.com/devongovett/exif-reader/pull/30 for a complete list of updated tags. + +This might be a breaking change if a custom `FILE_METADATA_ALLOW_LIST` config is in place, or you rely on the generated +Exif tags stored in Directus Files to not change name. + +The updated Exif tags only apply to images which are uploaded after upgrading to this release. + +### Dropped Support for SDK Scoped Entrypoints + +You can no longer import parts of the SDK through scoped entrypoints to prevent issues with TypeScript based libraries +consuming the SDK. + +Any scoped imports of `@directus/sdk` will need updating to import functions from the root. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + ::tabs + ::tab{label="Before"} + ```js + import { createDirectus } from '@directus/sdk'; + import { rest } from '@directus/sdk/rest'; + ``` + :: + ::tab{label="After"} + ```js + import { createDirectus, rest } from '@directus/sdk'; + ``` + :: + :: +:: + +### Dropped Support for Asynchronous Logic In JS Config Files + +Environment handling has been moved to a new `@directus/env` package. With this new package, ESM config files are still +supported, but will no longer support running asynchronous code within them. + +### Updated Sorting in Schema Snapshots + +The sort order of fields and relations inside schema snapshots has been changed to their original creation order. This +is to increase consistency of resulting snapshots artifacts. + +While this is not a breaking change, you are advised to regenerate the snapshot after the version update of Directus, +provided you are tracking the snapshot in a version control system. + +## Version 10.8.3 + +### Updated GraphQL Content Version Usage + +Previously when accessing content versions via GraphQL, a `version` parameter was used on existing fields. This has now +been changed and is accessed via dedicated query types (`_by_version` and `versions`). + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + ::tabs + ::tab{label="Before"} + ```graphql + # Get an item's version by id + query { + _by_id(id: 15, version: "draft") { + id + title + body + } + } + + # Get a version singleton or list versions in a collection + query { + (version: "draft") { + id + title + body + } + } + ``` + :: + ::tab{label="After"} + ```graphql + # Get an item's version by id + query { + _by_version(id: 15, version: "draft") { + id + title + body + } + } + + # Get a version singleton + query { + _by_version(version: "draft") { + id + title + body + } + } + + # List versions in a collection (`/graphql/system`) + query { + versions(filter: { collection: { _eq: "posts" } }) { + item + key + } + } + ``` + :: +:: + +### Renamed `ExtensionItem` Type in the SDK + +The `ExtensionItem` type has been renamed to `DirectusExtension` to be inline with other system collections. + +## Version 10.7.0 + +### Replaced Extensions List Endpoints + +In previous releases, it was possible to `GET /extensions/:type` to retrieve a list of enabled extensions for a given +type. + +This has been replaced with a `GET /extensions` endpoint that returns all extensions along with their type and status. + +## Version 10.6.2 + +### Swapped Parameters and Auth Mode for Refresh Method in the SDK + +The parameter order for the `refresh` method and thus also the default auth mode have been swapped in order to work well +with both auth modes, `cookie` and `json`. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + + ::tabs + + ::tab{label="Before"} + ```js + // refresh http request using a cookie + const result = await client.request(refresh('', 'cookie')); + + // refresh http request using json + const result = await client.request(refresh(refresh_token)); + const result = await client.request(refresh(refresh_token, 'json')); + ``` + :: + + ::tab{label="After"} + ```js + // refresh http request using a cookie + const result = await client.request(refresh()); + const result = await client.request(refresh('cookie')); + + // refresh http request using json + const result = await client.request(refresh('json', refresh_token)); + ``` + :: + :: +:: + +### Renamed Helper Function in the SDK + +The SDK helper function `asSearch` has been renamed to `withSearch` for naming consistency in helpers. + +## Version 10.6.0 + +### Dropped Support for Custom NPM Modules in the Run Script operation in Flows + +Prior to this release, Directus relied on `vm2` to run code from **Run Script** operations in Flows - our automation +feature. `vm2` is now unmaintained with critical security issues that could potentially allow code to escape the sandbox +and potentially access the machine which hosts your Directus project. We have migrated to `isolated-vm` to allow Flows +to continue to run safely. + +If you used to rely on axios, node-fetch, or other libraries to make web requests, we strongly recommend migrating to +using the **Webhook / Request URL** operation instead. This operation includes additional security measures, like the IP +allow-list that prevents traffic. For other npm packages in Flows, your will need to +[create a custom operation extension](/guides/extensions/operations-npm-package). + +## Version 10.4.0 + +### Consolidated Environment Variables for Redis Use + +Directus had various different functionalities that required you to use Redis when running Directus in a horizontally +scaled environment such as caching, rate-limiting, realtime, and flows. The configuration for these different parts have +been combined into a single set of `REDIS` environment variables that are reused across the system. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} +Combine all the `*_REDIS` environment variables into a single shared one as followed: + ::tabs + ::tab{label="Before"} + ```ini + CACHE_STORE="redis" + CACHE_REDIS_HOST="127.0.0.1" + CACHE_REDIS_PORT="6379" + ... + RATE_LIMITER_STORE="redis" + RATE_LIMITER_REDIS_HOST="127.0.0.1" + RATE_LIMITER_REDIS_PORT="6379" + ... + SYNCHRONIZATION_STORE="redis" + SYNCHRONIZATION_REDIS_HOST="127.0.0.1" + SYNCHRONIZATION_REDIS_PORT="6379" + ... + MESSENGER_STORE="redis" + MESSENGER_REDIS_HOST="127.0.0.1" + MESSENGER_REDIS_PORT="6379" + ``` + :: + ::tab{label="After"} + ```ini + REDIS_HOST="127.0.0.1" + REDIS_PORT="6379" + + CACHE_STORE="redis" + RATE_LIMITER_STORE="redis" + SYNCHRONIZATION_STORE="redis" + MESSENGER_STORE="redis" + ``` + :: + :: +:: + +### Dropped Support for Memcached + +Directus used to support either memory, Redis, or Memcached for caching and rate-limiting storage. Given a deeper +integration with Redis, and the low overall usage/adoption of Memcached across Directus installations, we've decided to +sunset Memcached in favor of focusing on Redis as the primary solution for pub/sub and hot-storage across load-balanced +Directus installations. + +### Updated Errors Structure for Extensions + +As part of standardizing how extensions are built and shipped, you must replace any system exceptions you extracted from +`exceptions` with new errors created within the extension itself. We recommend prefixing the error code with your +extension name for improved debugging, but you can keep using the system codes if you relied on that in the past. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + + ::tabs + ::tab{label="Before"} + ```js + export default (router, { exceptions }) => { + const { ForbiddenException } = exceptions; + + router.get('/', (req, res) => { + throw new ForbiddenException(); + }); + }; + ``` + :: + ::tab{label="After"} + ```js + import { createError } from '@directus/errors'; + + const ForbiddenError = createError('MY_EXTENSION_FORBIDDEN', 'No script kiddies please...'); + + export default (router) => { + router.get('/', (req, res) => { + throw new ForbiddenError(); + }); + }; + ``` + :: + :: +:: + +## Version 10.2.0 + +### Removed Fields from Server Info Endpoint + +As a security precaution, we have removed the following information from the `/server/info` endpoint: + +- Directus Version +- Node Version and Uptime +- OS Type, Version, Uptime, and Memory diff --git a/content/13.releases/2.breaking-changes/2.version-11.md b/content/13.releases/2.breaking-changes/2.version-11.md new file mode 100644 index 00000000..3f62bdb8 --- /dev/null +++ b/content/13.releases/2.breaking-changes/2.version-11.md @@ -0,0 +1,114 @@ +--- +description: Breaking changes may require action on your part before upgrading. +--- + +# Version 11 + +## Version 11.1.2 + +### New Comment Endpoints + +We've introduced a dedicated `directus_comments` collection, replacing the previous system that used `directus_activity` +for comments. While new comment endpoints have been added, existing endpoints remain functional. + +Comment primary keys are now UUIDs instead of numeric values, which may impact custom type checking implementations. + +### SDK Comment Function Uses New Endpoints + +The internal comment endpoints in the Directus SDK have been updated to reflect this change. To avoid errors, ensure +your Directus version is compatible with the latest SDK when using comment functions. + +### Migrate to `CommentsService` in Extensions + +Extensions using the `ActivityService` to manage comments should migrate to the new `CommentsService`. + +## Version 11.1.1 + +### Dropped support for the SendGrid email transport option + +The SendGrid abstraction for `nodemailer` is no longer supported, so we have dropped it's usage from Directus. Users of +SendGrid should update their configuration to use their SendGrid account's SMTP Relay configuration instead. + +## Version 11.0.0 + +Directus 11 introduces policies, a new concept within access control configuration. Permissions are no longer held in +roles, but instead in policies. Policies can be attached to roles and also directly to users. + +While users can still only have one direct role, roles can now also be nested within roles. A user's permissions are now +an aggregate of all policies attached directly to them, to their role, and any nested roles. + +### Changes to Object Properties + +Object properties have changed and moved. This should only impact users who use and rely on the users, roles, and +permissions endpoints. + +#### Users + +Users now have one additional property - `policies`, which is a many-to-many relationship to `policies`. + +#### Roles + +Roles no longer hold `admin_access`, `app_access`, `enforce_tfa`, or `ip_access`. These have been moved to `policies`. + +Roles now have one additional property - `children`, which is a one-to-many relationship to `roles`. + +#### Permissions + +Permissions are no longer attached to a `role`. This has been changed to a `policy`. + +### Requests for Missing Fields Now Fail + +If you are requesting fields that do not exist anymore, your requests will throw an error. To fix this, either put +fields back into your data model or remove them from the request. + +### M2A Fields Now Require Collection Name + +If you are requesting Many-to-Any (M2A) fields without collection name, they will throw an error. To fix this, you need +to put the collection name you are targeting. This is true regardless of level or if using REST/GraphQL. + +::callout{type="info" :toggleable="true" title="Migration/Mitigation"} + +You could previously request fields in a M2A builder without specifying the collection they came from, for example: + +``` +GET https://example.directus.app/items/example?fields=items.item.m2a_field +``` + +This no longer works and you must specify which collection the field is located in: + +``` +GET https://example.directus.app/items/example?fields=items.item:m2a_collection.m2a_field +``` + +[Understand the M2A field syntax in our global query parameter page](https://docs.directus.io/reference/query). + +:: + +### Changes for Extension Developers + +#### Properties Returned from `usersStore` + +The `usersStore` has a `role` object that previously contained the `admin_access`, `app_access`, and `enforce_tfa` +properties. These are now returned directly in the `user` object. + +#### `preRegisterCheck` Data Structure + +If you use the `preRegisterCheck` guard function in your module extension to determine whether it is shown, it now +receives a different data structure. It previously received a list of permission objects. Now, it receives the same data +returned from the new [Get Current User Permissions](/reference/system/permissions.html#get-current-user-permissions) +endpoint. + +### Replaced `mysql` with `mysql2` + +The database client library [`mysql`](https://www.npmjs.com/package/mysql) has been replaced with +[`mysql2`](https://www.npmjs.com/package/mysql2), which is a continuation of the former. The client is used to connect +to MySQL/MariaDB databases. + +If you're using MySQL/MariaDB, please note that: + +- `mysql2` leads to cross-collection queries (filtering on relations) with stricter charset comparison. Therefore, + ensure again that the value of the config option + [`DB_CHARSET`/`DB_CHARSET_NUMBER`](/self-hosted/config-options#database) matches the charset of your tables. +- Values of type "Decimal" are now returned as a `string` instead of a `number`, which ensures that the precision is + preserved. + diff --git a/content/13.releases/3.changelog.md b/content/13.releases/3.changelog.md new file mode 100644 index 00000000..eb6f3be8 --- /dev/null +++ b/content/13.releases/3.changelog.md @@ -0,0 +1,4 @@ +--- +description: A monthly summary of what's new from the Directus team. +# Authored from Directus Backend +--- \ No newline at end of file diff --git a/content/13.releases/_dir.yml b/content/13.releases/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/13.releases/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/2.data-modeling/1.quickstart.md b/content/2.data-modeling/1.quickstart.md new file mode 100644 index 00000000..bd422007 --- /dev/null +++ b/content/2.data-modeling/1.quickstart.md @@ -0,0 +1,47 @@ +--- +title: Quickstart +description: This guide will cover creating a collection in Directus via the Data Studio, creating fields, and configurng relationships. +--- + +# Data Modeling Quickstart + +:video-embed{type="directus-tv" id="637aafa2-b323-4ad0-adf0-ba52328bb798"} +
+ +This guide will cover creating a collection in Directus via the Data Studio, creating fields, and configuring relationships. + +:directus-cloud + +## Creating a Collection + +Log into the Directus Data Studio as an administrator. If this is a brand-new project, you will be presented with the option to create your first collection. Otherwise, go to the settings module and create a new collection from the Data Model page. + +Set the name of this collection to be `posts`, leaving all other options in both the collection setup and optional field pages as their defaults. You now have a new collection with only a primary key. + +![A brand new collection](https://product-team.directus.app/assets/2e088221-6bc5-4c00-b348-e23f77a9a748.webp) + +## Creating Fields + +Your collection only has a primary key. From your new `posts` collection configuration page, click the **Create Field** button and select the Input interface. Set the key to `title` and leave all other options as their defaults. + +Create another new field with a What You See Is What You Get (WYSIWYG) interface. Set the key to `content`. + +## Configuring a Relationship + +Create a new collection called `authors`. In the new collection, create a new field with an Input interface and set the key to `name`. + +Go to the `posts` collection configuration and create a new field with the Many to One interface and set the key to `author`. Set the related collection to `authors` and configure the Display Template to show just the author's name by clicking :icon{name="material-symbols:add-circle-outline-rounded"} and selecting the `name` field. + +Now that you have successfully configured a relationship between the two tables, you can start creating data. + +In the module bar, click :icon{name="content-module"} to go to the content module. Enter your `authors` collection and create 2 authors with the names `Ben Haynes` and `Rijk van Zanten`. + +Enter the `posts` collection and create two posts, selecting an author from the Many to One interface. + +![Selecting an item from a relation](https://product-team.directus.app/assets/73e236ac-322f-4565-ba98-172a5596bcad.webp) + +![Both collections' settings](https://product-team.directus.app/assets/8a641c77-e13b-4bec-ae54-085a5484cd32.webp) + +## Next Steps + +Read more about configuring [collections](/data-modeling/collections), [fields](/data-modeling/fields), and [relationships](/data-modeling/relationships). See all available [interfaces](/data-modeling/interfaces) in Directus. Access your new collections via API or SDK using :product-link{product="connect"}. diff --git a/content/2.data-modeling/2.collections.md b/content/2.data-modeling/2.collections.md new file mode 100644 index 00000000..36ceb7cb --- /dev/null +++ b/content/2.data-modeling/2.collections.md @@ -0,0 +1,172 @@ +--- +description: Directus collections help you manage your data. Create custom collections, define fields, configure relationships, and leverage features like content versioning and access control. Learn how to create, configure, and manage collections in Directus. +--- + +# Collections + +Collections are database tables with additional metadata and configuration used by Directus. + +All Directus-specific settings and data is held only in system collections prefixed with `directus_`. Should you wish to remove Directus, you can remove these collections with no proprietary data left behind. + +There are two types of collections: **user collections** and **system collections**. + +## Creating Collections + +**User collections** are created directly in your database or via Directus. They describe your specific data models and configurations and can be queried via APIs created by :product-link{product="connect"} or via :product-link{product="explore"}. + +You can create collections from the Data Model settings in the Directus Data Studio, or using the [Collections API](/api#tag/collections). + +![Creating a collection](https://product-team.directus.app/assets/2e088221-6bc5-4c00-b348-e23f77a9a748.webp) + +### Name + +The unique name for your collection must be set on creation, is case sensitive, and will be used throughout the Data Studio and Directus APIs. + +::callout{type="warning" title="Collection names are immutable"} +The collection name cannot be modified after collection creation, which includes casing. However, you can override how it is displayed in the Data Studio with collection naming translations. +:: + +### Primary Key + +The primary key field contains a unique value for each item in the collection. This unique identifier is used in a number of places: + +- When creating [relationships](/data-modeling/relationships) between items across different collections. +- When fetching or performing actions on data using the [Items API](/api#tag/items). + +The primary key type defines the strategy for creating unique primary keys. Once selected, this cannot be modified. + +Additionally, Directus can create some common fields, including a status field, sort, as well as fields related to who and when items are created or edited. Directus supports the following types of IDs: + +- **Auto-Incremented Integer**: IDs increment from `1` to `2^31-1` (`2,147,483,647`). +- **Auto-Incremented Big Integer**: IDs increment from `1` to `2^63-1` (`9,223,372,036,854,775,807`). This is only available if using MySQL and PostgreSQL as your database. +- **Generated UUID**: Universally Unique Identifier. Creates a completely unique ID. IDs generated with this system (not just in your database, but anywhere this system is used) are so statistically unlikely to be repeated that for all practical purposes they are unique. +- **Manually Entered String**: you manually type out a unique string as the ID for each item. Directus will ensure they are unique by forbidding new item creation with a duplicate ID. + +::callout{type="api-reference" url="/api#tag/collections"} +Explore the Collections API to create and manage collections. +:: + +## Configuring Collections + +Once a collection is created, there are a number of configuration options available. + +### Collection Setup + +![Configuration settings for the posts collection](https://product-team.directus.app/assets/5b85f21c-b96f-4453-887b-c043f167b523.webp) + +- **Note**: set a helpful note that explains the collection's purpose. Seen in Data Model settings page. +- **Icon**: icon used throughout the Data Studio when referencing this collection. +- **Color**: color for the icon, shown in the navigation bar and page headers. +- **Display Template**: display templates are used to represent an item in relationship fields - for example to show the value of the `Name` field when displaying a post's author. +- **Hidden**: toggle whether the collection should be globally hidden in the Data Studio. +- **Singleton**: toggle to bypass the collection page and take users to the single item details page. +- **Collection Naming Translations**: translate the collection name across multiple languages. When the default language is changed, the relevant translation will be used throughout the Data Studio. + +### Content Versioning + +Content versioning is used by :product-link{product="editor"} and allows teams to create and manage different versions of their content. There are several reasons to use content versioning, including drafting content without publishing it, and more ways to collaborate with others. + +This feature can be enabled for specific collections, and will be available for all items. Once enabled, item versions can be created, and later have some or all fields promoted to the main version, typically used for publishing. + +::callout{type="dev-docs" url="/content/content-versioning"} +Read the content versioning user guide. +:: + +### Live Preview + +Live preview is used by :product-link{product="editor"} and allows for your application to be shown in a pane next to your content, which can be used for previewing content before publishing. + +You can use item field values to construct the URL used by the live preview, including unique identifiers and content version, allowing for previewing content versions before promoting them to the main version. + +::callout{type="tutorials" url="/tutorials/getting-started"} +Read tutorials on implementing live preview. +:: + +### Accountability + +**Revisions** are created whenever an item is updated. This history of versions is tracked so that previous states can be recovered. Every change made to items in Directus is stored as a complete versioned snapshot and a set of specific changes made. + +**Activity** is a log of all events that take place within the platform. Each activity record tracks the event type, user, timestamp, IP address, user-agent, and any associated revision data. + +By default, your Directus project tracks all activity and revisions for collections. However, you can override this and choose to only track activity, or nothing. + +::callout{type="info" title="Accountability vs Telemetry"} +Accountability is a log of who does what in your project. It is for your team's own use. This is different from telemetry, which is configured in environment variables. +:: + +### Sorting + +The sort feature enables users to manually sort items in the Data Studio and via the API. If not selected as an optional field when creating a collection, you will need to create a new field with an integer type. It can then be selected as the sort field. + +::callout{type="info" title="Sorting Relational Fields"} +To configure manual sorting within a [relational field](/data-modeling/relationships) (e.g., M2M, O2M, or M2A), also set the sort field within the relationship section of the field's configuration drawer. +:: + +Once configured, click :icon{name="material-symbols:sort" title="Sort Button"} in the configured sort column, and then drag items by their :icon{name="material-symbols:drag-handle" title="Drag Button"} handle. You can also sort by the sort field with querying data via the [Items API](/api#tag/items). + +### Duplication + +The **Save as Copy** option in :product-link{product="editor"} offers a way to effectively duplicate the current item. Duplication settings define which field values will be copied. + +### Archive Settings + +Archived items still exist in your collections, but are filtered within the Data Studio. If not selected as an optional field when creating a collection, you will need to create a new field. + +To configure an archive field, set the following four input fields as desired. + +- **Archive Field**: selects the archive field. +- **Archive App Filter**: can users filter for archived items. +- **Archive Value**: assigned value to archive field when an item is archived. +- **Unarchive Value**: assigned value to archive field when an item is unarchived. + +::callout{type="info" title="Archived Items via API"} +Archived items are hidden in the app by default, but they are still returned normally via the API unless explicitly filtered out. This gives you the flexibility to manage archived items however you want when working with the API. +:: + +## System Collections + +**System collections** are the automatically-created collections required for Directus to operate. These collections are surfaced throughout Directus to power different parts of the system - like notifications, users, roles, and even collection configuration itself. + +While fields that come system collection fields cannot be altered, you can extend system collections. + +| Collection | Purpose | +| ------------------------ | ------------------------------------------------- | +| `directus_activity` | Accountability logs for all events. | +| `directus_collections` | Additional collection configuration and metadata. | +| `directus_dashboards` | Dashboards within the Insights module. | +| `directus_extensions` | Configuration of extensions. | +| `directus_fields` | Additional field configuration and metadata. | +| `directus_files` | Metadata for all managed file assets. | +| `directus_flows` | Automation flows. | +| `directus_folders` | Provides virtual directories for files. | +| `directus_migrations` | What version of the database you're using. | +| `directus_notifications` | Notifications sent to users. | +| `directus_operations` | Operations that run in Flows. | +| `directus_panels` | Individual panels within Insights dashboards. | +| `directus_permissions` | Access permissions for each role. | +| `directus_presets` | Presets for collection defaults and bookmarks. | +| `directus_relations` | Relationship configuration and metadata. | +| `directus_revisions` | Data snapshots for all activity. | +| `directus_roles` | Permission groups for system users. | +| `directus_sessions` | User session information. | +| `directus_settings` | Project configuration options. | +| `directus_shares` | Tracks externally shared items. | +| `directus_translations` | Custom translations. | +| `directus_users` | System users for the platform. | +| `directus_versions` | Content Versions for items. | + +## Existing Database Tables + +![System database tables](https://product-team.directus.app/assets/426fb648-1e88-46e4-92f1-af76f3254d25.webp) + +When Directus is connected to an existing database, it will introspect existing tables and relationships and collections will be made available to admins via the [Items API](/api#tag/items). + +To access the collection via the Data Studio, you must configure the collection with additional Directus-specific metadata, such as interfaces, displays, and icons. + +To access the collection without an admin role, you must also configure [access control](/auth/access-control) as with any other collection. + +Finally, any relationships not configured in the database must also be set up inside of Directus. + +::callout{type="info" title="Composite Keys & SQL Views"} +Directus does not currently support composite keys, or the creation of virtual tables via SQL views. +:: diff --git a/content/2.data-modeling/3.fields.md b/content/2.data-modeling/3.fields.md new file mode 100644 index 00000000..cd97b8fd --- /dev/null +++ b/content/2.data-modeling/3.fields.md @@ -0,0 +1,109 @@ +--- +description: Directus fields let you define how your data is stored and displayed. Learn about creating fields, data types, interfaces, validations, relationships, and more. Discover how to configure fields to perfectly suit your data modeling needs in Directus. +--- + +# Fields + +Fields are database columns with additional metadata and configuration used by Directus, such as how data is displayed, validations, and interfaces. + +## Types + +Directus supports various databases, though each vendor has their own simple data types. To standardize these differences, Directus has a single set of types that are mapped to the vendor-specific ones. + +| Group | Types | +| ------------- | --------------------------------------------------------------------------------- | +| Text | `String`, `Text`, `UUID`, `Hash`, `Alias` | +| Numeric | `Integer`, `Big Integer`, `Float`, `Decimal` | +| Boolean | `Boolean` | +| Date and Time | `Timestamp`, `DateTime`, `Date`, `Time` | +| Binary | `Binary` | +| Structured | `JSON`, `CSV` | +| Geospatial | `Point`, `LineString`, `Polygon`, `MultiPoint`, `MultiLineString`, `MultiPolygon` | + +Fields that do not map directly to an actual database column are called "alias" fields, and include presentational fields and certain relational fields. + +Geospatial fields are used to store data in [GeoJSON](https://geojson.org/) format. These types are only supported if your database supports spatial extensions. + +## Creating Fields + +When creating a new field, you must first select an [interface](/data-modeling/interfaces) and provide some basic configuration. Basic configuration will depend on the interface selected, but all fields have some common characteristics. + +![Field creation form showing datetime field](https://product-team.directus.app/assets/426fb648-1e88-46e4-92f1-af76f3254d25.webp) + +The **interface** describes how users will create and edit data, as well as how it is displayed in :product-link{product="editor"}. There are many kinds of built-in interface, such as a text input, date selector, map, and a set of relationship interfaces. More interfaces can be built as [extensions](/extensions/overview). + +The **key** is the unique name for a field within a collection. This value is used in both the Data Studio and via API. Within the Data Studio, the key is parsed through our title formatter to improve readability. + +The **type** defines the underlying data type configured in the database. When creating fields, the available types will correspond to the interface selected. + +::callout{type="warning" title="Field names and types are immutable"} +The field key and type cannot be modified after collection creation, which includes casing. However, you can override how the key is displayed in the Data Studio with field name translations. +:: + +![Field configuration form showing datetime field](https://product-team.directus.app/assets/1234cdf2-778e-4e3a-836c-bb698398848b.webp) + +## Configuring Fields + +There are a number of advanced configuration options available for fields. Some must be configured at the time of creation, while others can be edited after creation. + +### Schema + +This section defines the database column settings for the field. This includes the key, type, length (if applicable), default value, whether the field is nullable, and whether values must be unique in the collection. + +### Field + +This section sets details for the interface, which is displayed in the editor. This includes whether the field is read-only or requires a value to be provided when an item is created. + +This section also allows for a note - which is displayed in the editor and provides additional context or help to the user, and field name translations, which changes the label of this field in the editor based on the selected language in the Data Studio. + +### Interface + +This section describes how the user will create, edit, and view data in the editor, and are effectively different form inputs. Each interface will have its own configuration options. + +::callout{type="dev-docs" url="/data-modeling/interfaces"} +See all available interfaces in Directus. +:: + +### Display + +This section describes how individual field values will be displayed throughout the Data Studio. You can always choose to display the raw value, but you can display a formatted value instead. Each interface will have its own display options. + +Conditional styles allow for different colors, icons, and text values to be used when the field data meets configured criteria. + +### Validation + +This section allows for the configuration of rules to determine valid user input. If validation fails, you can also use this configuration section to write custom messages. + +These validations apply to data added via Directus and are not database-level validations. + +### Conditions + +This section alters the current field's configuration based on the values of other fields in the item. Conditional configuration include whether a field is read-only, hidden, or required, along with any editable interface-specific configuration. + +::callout{type="info" title="Conditionally Show Fields"} +To show a field conditionally, set hidden to `true` in the field settings. Then, create a condition with a rule checking the value of another field. The condition should set hidden to `false`. +:: + +### Relationships & Translations + +This section will only appear when the field is relational, and describes the relationship between this field and other collections. Each relationship type will be shown differently, and where there is a junction collection you will be given the option to add a sort field on the collection. + +Relational triggers configure what will happen to the relational field data when related values are deselected or deleted. This includes setting values to `null`, their default, or cascading/preventing the deletion. + +::callout{type="dev-docs" url="/data-modeling/relationships"} +See all available relationship types in Directus. +:: + +### Field Width + +Each field can be configured to be half or full width in the editor. Two half-width fields can be placed next to each other. Additionally, a field can be configured to use up the full-width of the editor, expanding beyond the usual full-width container. + +Field width is not in the field configuration, but can be set by clicking on :icon{name="material-symbols:more-vert" title="Field Width Button"} in the collection data model page. + +## System Collection Fields + +System collections have a number of default fields that cannot be configured as they are required for Directus to operate. However, additional fields can be added to any system collection. + +## Existing Database Fields + +When Directus is connected to an existing database, fields will be automatically made available in Directus. You can then fully configure it as desired within the Data Studio. diff --git a/content/2.data-modeling/4.interfaces.md b/content/2.data-modeling/4.interfaces.md new file mode 100644 index 00000000..8eca5509 --- /dev/null +++ b/content/2.data-modeling/4.interfaces.md @@ -0,0 +1,604 @@ +--- +description: Manage your data effectively with Directus fields. Discover various field types, interfaces, validations, and relationships to perfectly suit your data modeling needs. +--- + +# Interfaces + +Interfaces are how users interact with fields in :product-link{product="editor"}. Each interface supports specific data types and configurations. + +## Text & Numbers + +### Input + +![A standard form text input](https://product-team.directus.app/assets/02d2521b-8e5a-4a2f-8663-729c77f00493.webp) + +A standard form input. + +| Configuration | Options | +| ------------- | ---------------------------------------------------------------------- | +| Types | `String`, `Text`, `UUID`, `Integer`, `Big Integer`, `Float`, `Decimal` | +| Length | Used to limit number of characters in the database. | +| Soft Limit | Used to limit the number of characters within the Data Studio. | +| Trim | Toggle to trim whitespace at start and end of the value. | +| Masked | Toggle to hide the typed value with • values. | +| Cleared Value | Toggle to save cleared value as an empty string. | +| Slugify | Toggle to make the entered value URL safe. | + +### Autocomplete Input (API) + +![An autocomplete form text input that shows a dropdown list of options based on a search query](https://product-team.directus.app/assets/02d2521b-8e5a-4a2f-8663-729c77f00493.webp) + +A search input that will populate dropdown choices by making a request to a given URL. + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------------ | +| Types | `String`, `Text` | +| URL | The request URL with dynamic `{{ value }}`. | +| Results Path | The returned object path using dot notation containing an array with search results. | +| Text Path | The value within each object that displays for each search result. | +| Value Path | The value within each object that is stored for each search result. | +| Trigger | Select between `throttle` and `debounce`. | +| Rate | The delay in `milliseconds` used for the trigger. | + +::callout{type="info" title="Throttle vs Debounce"} +Throttle and debounce are very similar. Debounce will wait until a period of 'silence' has happened before making the request, while throttle will keep making requests at most 1 call every period. Period is set in the 'rate' configuration for this interface. +:: + +### Block Editor + +![Showcase of the block editor with example blocks](https://product-team.directus.app/assets/0344b52f-aa52-4a57-9f8c-2a9c4fa0b10e.webp) + +Allows users to create and edit content using blocks. These blocks represent individual pieces of content, such as text, +images, videos, buttons, and more, that can be assembled and re-arranged within a flexible layout. + +| Configuration | Options | +| ------------- | ----------------------------------------------------------------------- | +| Types | `JSON` | +| Toolbar | Allows for customization of visible formatting options. | +| Root Folder | Default folder to store uploaded files. Does not affect existing files. | + +### Code + +![A code editor input](https://product-team.directus.app/assets/a07b7361-671f-48ca-944f-acefa2bbe1e1.webp) + +Code editor for pre-formatted text. + +| Configuration | Options | +| ------------- | --------------------------------------------------------------------------------------------- | +| Types | `String`, `Text`, `JSON`, `Geometry (All)` | +| Language | Language for syntax highlighting. Can be set when type is not `JSON`. | +| Line Number | Toggle to show line numbers. | +| Line Wrapping | Toggle to wrap text to prevent horizontal scrolling. | +| Template | Preset value that the user can add to the field value by clicking "Fill with Template Value". | + +### Textarea + +![A standard form textarea input](https://product-team.directus.app/assets/1b66cfc0-785d-40ed-adf3-9ce90441142b.webp) + +Textarea input for longer plain text. + +| Configuration | Options | +| ------------- | -------------------------------------------------------------- | +| Types | `Text` | +| Soft Limit | Used to limit the number of characters within the Data Studio. | + +### WYSIWYG + +![A What You See Is What You Get (WYSIWYG) form input that has a toolbar for formatting](https://product-team.directus.app/assets/262f71a7-8cc8-4402-85b9-b80dbc2a60ba.webp) + +The What You See Is What You Get (WYSIWYG) editor provides a text area with rich formatting options in the toolbar. + +| Configuration | Options | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Types | `Text` | +| Toolbar | Allows for customization of visible formatting options | +| Folder | Default folder to store uploaded files. Does not affect existing files. | +| Soft Limit | Used to limit the number of characters within the Data Studio. | +| Static Access Token | Token appended to asset URLs when displaying in the editor. | +| Custom Formats | JSON array of formatting that is passed to the `style_formats` config option of the WYSIWYG editor instance. [TinyMCE Documentation](https://www.tiny.cloud/docs/demo/format-custom/) | +| Options Override | JSON object to override the default config option of the WYSIWYG editor instance. [TinyMCE Documentation](https://www.tiny.cloud/docs/configure/) | + +### Markdown + +![A markdown text editor with a toolbar with formatting options. Edit and preview tabs.](https://product-team.directus.app/assets/b41d6822-35ab-48db-ada9-dd3a723a5c52.webp) + +Markdown text editor with formatting options in the toolbar. You can switch between Edit and Preview modes. + +| Configuration | Options | +| ------------------- | ------------------------------------------------------------------------------------ | +| Types | `Text` | +| Toolbar | Allows for customization of visible formatting options. | +| Root Folder | Default folder to store uploaded files. Does not affect existing files. | +| Static Access Token | Token appended to asset URLs when displaying in the editor. | +| Soft Limit | Used to limit the number of characters within the Data Studio. | +| Custom Blocks | Each block adds an icon to the toolbar, and wraps the cursor in specific characters. | + +### Tags + +![A standard form text input where user can select, add, and remove tags.](https://product-team.directus.app/assets/510231f2-4336-4071-bf41-7c9d4193cca3.webp) + +A text input that allows users to apply any number of tags. When adding new tag, press Enter to save the tag. + +| Configuration | Options | +| -------------- | ----------------------------------------------------------------------- | +| Types | `JSON`, `CSV` | +| Presets | Preset tags that the user can select. | +| Alphabetize | Toggle to force tags to display in alphabetical order. | +| Allow Other | Toggle to allow users to add new tags. | +| Whitespace | Force whitespace to be removed or replaced with hyphens or underscores. | +| Capitalization | Force tags to be stored as lowercase, uppercase, or title case. | + +## Selection + +### Toggle + +![A toggle form input with label named "Enabled"](https://product-team.directus.app/assets/532c82dd-c851-4874-b596-597421dfc3cd.webp) + +A checkbox input that allows user to toggle boolean values. + +| Configuration | Options | +| ------------- | -------------------------------------------------- | +| Types | `Boolean` | +| Default Value | `true`, `false`, `null` | +| Icon On | Icon that shows whenever the toggle is enabled. | +| Icon Off | Icon that shows whenever the toggle is disabled. | +| Color On | Color of the icon whenever the toggle is enabled. | +| Color Off | Color of the icon whenever the toggle is disabled. | +| Label | The text displayed to the user beside the toggle. | + +### Datetime + +![A date picker input. User can select a calendar date and input a time. ](https://product-team.directus.app/assets/b5ba6fb2-0e24-408a-b4c5-78c898558293.webp) + +Date picker input that allows user to select a date and time. + +| Configuration | Options | +| ------------------ | --------------------------------------- | +| Types | `DateTime`, `Date`, `Time`, `Timestamp` | +| Include Seconds | Show seconds in the interface. | +| Use 24-Hour Format | Use 24 hour time system. | + +::callout{type="info" title="Handling Timezones"} +The `DateTime` type does not have timezone information, and will always store values as UTC. The `Timestamp` type contains timezone information. +:: + +### Repeater + +![A repeater field](https://product-team.directus.app/assets/7bc91592-707a-4e61-8eca-667a1ecf8e8f.webp) + +![A repeater field, open](https://product-team.directus.app/assets/f2675394-689a-485f-9627-39992a97c30d.webp) + +A repeating group of fields. You can use any field in a repeater, except for relational, presentation, or group fields. The value is stored as a JSON array of objects. + +| Configuration | Options | +| ------------------ | -------------------------------------------------------------------------------------------------- | +| Types | `JSON` | +| Template | Label shown in the repeater items using display templates. Defaults to `{{ title }}`. | +| "Create New" Label | Label for the button to create a new item below the field in the editor. Defaults to "Create New". | +| Sort | Method of sorting the items groups within the repeater. | +| Edit Fields | The configuration for fields within the repeater. | + +Each field in a repeater has further configuration options. + +| Configuration | Options | +| ----------------- | --------------------------------------------------------------------------------------------- | +| Field | Unique name for the field - used as the property key and in the repeater's `template` option. | +| Type | Data type of property values. | +| Interface | The interface to use for the field. | +| Interface Options | Option configuration for the selected interface. | +| Display | The display to use for the preview on each item. | + +### Map + +![An interactive map interface that shows a single point on the east coast of the United States. Map has buttons for zoom, search, and full screen.](https://product-team.directus.app/assets/e8d96531-7a23-4516-af4d-4180b778ef84.webp) + +Show and set geospatial data on an interactive map. Mapping data is stored as [GeoJSON](https://geojson.org/). + +::callout{type="info" title="Maps Provider"} +By default, Directus will use [OpenStreetMap](https://www.openstreetmap.org) to display your mapping data. + +[By entering a Mapbox API key](/configuration/general#mapbox), you can enhance the platform's mapping experience. +:: + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Types |
  • **`Point`**: A single location on a map.
  • **`LineString`**: A series of points on a map connected in a line.
  • **`Polygon`**: An area of a map drawn by selecting vertices.
  • **`Multipoint`**: A series of disconnected points on a map.
  • **`MultiLineString`**: A series of `LineString` objects.
  • **`MultiPolygon`**: A series of `Polygon` objects.
  • **`Geometry (All)`**: An series of `Point`, `LineString` and `Polygon` objects.
  • **`JSON`**: A `Geometry (All)` object stored as JSON.
  • **`String`**: A `Geometry (All)` object stored a string of characters.
  • **`Text`**: A `Geometry (All)` object stored as Text.
  • **`CSV`**: A `Geometry (All)` object stored as comma-separated values.
  • | +| Default View | The default location and zoom settings on the map to show by default | + +::callout{type="info" title="Database Support"} +Your database must support geospatial data or have a geospatial plugin installed, such as PostGIS or SpatiaLite, to fully utilize mapping functionality with Directus. +:: + +### Color + +![A text input for color hex codes that allows user to select color modes ](https://product-team.directus.app/assets/6429c983-5a72-4e77-aa8e-df816a0348d0.webp) + +A color picker interface that allows users to input color codes and convert between different color modes. + +| Configuration | Options | +| ------------- | ------------------------------------------------- | +| Types | `String` | +| Opacity | Enable opacity values to be adjusted by the user. | +| Preset Colors | Preset colors that users can select. | + +### Dropdown + +![A select input with a dropdown of options.](https://product-team.directus.app/assets/370efb9d-83de-4830-a33c-7de3a2e6e246.webp) + +Input that allows the user to select a value from a dropdown list of options. + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------------------------------------- | +| Types | `String`, `Integer`, `Big Integer`, `Float`, `Decimal` | +| Choices | Options for the dropdown. Each option contains text that is displayed to the user and a value that is stored. | +| Allow Other | Allow user to enter custom values other than preset values. | +| Allow None | Allow user to deselect an option. | + +### Dropdown (Multiple) + +![A select input where user can select multiple options from a dropdown.](https://product-team.directus.app/assets/888f1cb3-b88c-4fd4-b7cf-c8c7b4ddbf9a.webp) + +Input that allows user to select multiple values from a list of options. + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------------------------------------- | +| Types | `JSON`, `CSV` | +| Choices | Options for the dropdown. Each option contains text that is displayed to the user and a value that is stored. | +| Allow Other | Allow user to enter custom values other than preset values. | +| Allow None | Allow user to deselect an option. | + +### Icon + +![A select input with a dropdown grid of icon choices.](https://product-team.directus.app/assets/e33d72e2-2f3c-4c18-8446-b40d07ecc1b8.webp) + +Allow the user to select from a list of icons. Icons are from the [Google Material Symbols](https://fonts.google.com/icons) library and cannot be swapped for another library. + +| Configuration | Options | +| ------------- | -------- | +| Types | `String` | + +### Checkboxes + +![A form input with multiple checkboxes.](https://product-team.directus.app/assets/7a7d6ff7-8931-4a44-8ccf-1f3a7d0f04d1.webp) + +Input that allows user to select multiple checkboxes. + +| Configuration | Options | +| ------------- | --------------------------------------------------------------------------------------------------------------- | +| Types | `JSON`, `CSV` | +| Choices | Options for the checkboxes. Each option contains text that is displayed to the user and a value that is stored. | +| Allow Other | Allow user to enter custom values other than preset values. | +| Color | Color of the checkboxes. | +| Icon On/Off | Icons shown whenever a checkbox is checked/unchecked. | +| Items Shown | Number of checkboxes before a 'Show More' toggle is shown. | + +### Checkboxes (Tree) + +![A form input with a nested tree of multiple parent and child checkboxes.](https://product-team.directus.app/assets/3a4950bb-da45-4814-95a6-eff7ae14fab8.webp) + +Nested tree of checkboxes that can be expanded or collapsed. + +| Configuration | Options | +| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| Types | `JSON`, `CSV` | +| Choices | Options for the checkboxes. Each option contains text that is displayed to the user and a value that is stored, along with any child options. | +| Choice Children | Child checkboxes nested below the current choice. | +| Value Combining | Controls what value is stored when nested selections are made. `All`, `Branch`, `Leaf`, `Indeterminate`, `Exclusive`. | + +::callout{type="info" title="Understanding Value Combining Options"} + +In a Checkboxes (Tree) interface, checkboxes can exist within a parent checkbox. Value combining determines the final value when selecting items in a tree. + +`All` returns all checked values. + + ::callout{type="info" :toggleable="true" title="Show examples"} + + | Selection | Final Value | + | ------------------------------------------------------------------------------------------------------------------------ | -------------------------- | + | :icon{name="not-checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="not-checked"} `child2` | `[child1]` | + | :icon{name="checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="checked"} `child2` | `[child1, child2, parent]` | + + :: + +`Branch` returns the top-most values that are selected. + + ::callout{type="info" :toggleable="true" title="Show examples"} + + | Selection | Final Value | + | ------------------------------------------------------------------------------------------------------------------------ | ----------- | + | :icon{name="not-checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="not-checked"} `child2` | `[child1]` | + | :icon{name="checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="checked"} `child2` | `[parent]` | + + :: + +`Leaf` returns the deepest values that are selected + + ::callout{type="info" :toggleable="true" title="Show examples"} + + | Selection | Final Value | + | ------------------------------------------------------------------------------------------------------------------------ | ------------------ | + | :icon{name="not-checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="not-checked"} `child2` | `[child1]` | + | :icon{name="checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="checked"} `child2` | `[child1, child2]` | + + :: + +`Indeterminate` returns checked items, and always returns a parent when one or more children are selected. + + ::callout{type="info" :toggleable="true" title="Show examples"} + + | Selection | Final Value | + | ------------------------------------------------------------------------------------------------------------------------ | -------------------------- | + | :icon{name="not-checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="not-checked"} `child2` | `[child1, parent]` | + | :icon{name="checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="checked"} `child2` | `[child1, child2, parent]` | + + :: + +`Exclusive` returns either the parent or child elements, but not both. + + ::callout{type="info" :toggleable="true" title="Show examples"} + + | Selection | Final Value | + | ------------------------------------------------------------------------------------------------------------------------ | ------------------ | + | :icon{name="checked"} `parent`
      :icon{name="not-checked"} `child1`
      :icon{name="not-checked"} `child2` | `[parent]` | + | :icon{name="not-checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="not-checked"} `child2` | `[child1]` | + | :icon{name="not-checked"} `parent`
      :icon{name="checked"} `child1`
      :icon{name="checked"} `child2` | `[child1, child2]` | + :: + +:: + +### Radio Buttons + +![A radio button form input with different options to select](https://product-team.directus.app/assets/d9cb554c-d24b-44b5-a0a1-f28187542f34.webp) + +Radio button input that allows users to select a single value from multiple choices. + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------------------------------------------ | +| Types | `String`, `Integer`, `Big Integer`, `Float` | +| Choices | Options for the radio buttons. Each option contains text that is displayed to the user and a value that is stored. | +| Allow Other | Allow user to enter custom values other than preset values. | + +## Relational + +### File + +![A file type form input where user can pick from three options: "Upload File From Device", "Choose Files from Library", "Import File from URL"](https://product-team.directus.app/assets/b7582b34-f741-48e4-9095-64b2d0995cdf.webp) + +Upload a single file of any mime-type, choose an existing file from the [file library](/files/manage), or import a file from a URL. + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------ | +| Types | `UUID` | +| Root Folder | Folder for the uploaded files. Does not affect the location of existing files. | + +### Image + +![An image form input where user can pick from three options: "Upload File From Device", "Choose Files from Library", "Import File from URL"](https://product-team.directus.app/assets/b673b63d-75e0-4763-96fb-47263da2193a.webp) + +Upload a single image file, choose an existing image from the [file library](/files/manage), or import an image from a URL. + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------ | +| Types | `UUID` | +| Root Folder | Folder for the uploaded files. Does not affect the location of existing files. | +| Crop to Fit | Crop the image as needed when displaying the image. | + +### Files + +![A file type form input where user can select and upload multiple files.](https://product-team.directus.app/assets/aaca7ac1-ae3d-458b-8b5b-e4747a236cf0.webp) + +Upload multiple files, choose existing files from the [file library](/files/manage), or import files from URL. + +When this field is added to a collection, Directus will create a Many to Many (M2M) junction collection on your behalf. + +| Configuration | Options | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| Types | `Alias` | +| Folder | Folder for the uploaded files. Does not affect the location of existing files. | +| Display Template | Display templates are used to represent an item in relationship fields - for example to show the value of the `Title` field. | + +### Builder (M2A) + +![A form interface that allows users to create a relationship from the current item by selecting different items from multiple, distinct Collections.](https://product-team.directus.app/assets/df84bd0b-cdba-4920-bc3c-493928b763a7.webp) + +Create relationships between the current item and multiple items from any number of other collections in a many-to-any (M2A) interface. + +When this field is added to a collection, Directus will create a Many to Many (M2M) junction collection on your behalf. + +| Configuration | Options | +| ------------------- | ------------------------------------------------ | +| Types | `Alias` | +| Related Collections | Which collections should items be selected from. | +| Allow Duplicates | Allow users to add the same Item multiple times. | + +::callout{type="tutorials" url="/tutorials/getting-started/create-reusable-blocks-with-many-to-any-relationships"} +Read our tutorial on using a Builder (M2A) to create reusable page components. +:: + +### Many To Many + +![A form interface that allows users to select multiple different items from a single collection. Buttons for "Create New" and "Add Existing".](https://product-team.directus.app/assets/010f9c29-a4b1-4463-bc72-7106f41ef4a8.webp) + +Create relationships between the current item and many different items from a single collection. + +When this field is added to a collection, Directus will create a Many to Many (M2M) junction collection on your behalf. + +| Configuration | Options | +| ------------------------ | ------------------------------------------------------------------------- | +| Types | `Alias` | +| Related Collection | Which collection should items be selected from. | +| Layout | How to present items in the editor. `List`, `Table` | +| Junction Fields Location | Where in the editor the relational field should be added. `Top`, `Bottom` | +| Allow Duplicates | Allow users to add the same Item multiple times. | +| Filter | Filter the list of items a user can select. | +| Item link | Toggle visible link to the item. | + +### One to Many + +![A form interface that allows users to select multiple items from a single collection. Buttons for "Create New" and "Add Existing".](https://product-team.directus.app/assets/63dcee0a-9ee7-4328-bd6b-bd85cc4660c9.webp) + +Create a relationship between the current item and many items from a single collection. + +When this field is added to a collection, Directus will create a corresponding Many to One field on the related collection on your behalf. + +| Configuration | Options | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| Types | `Alias` | +| Related Collection | Which collection should items be selected from. | +| Foreign Key | Name of field in related collection to be created. | +| Layout | How to present items in the editor. `List`, `Table` | +| Display Template | Display templates are used to represent an item in relationship fields - for example to show the value of the `Title` field. | +| Filter | Filter the list of items a user can select. | +| Item link | Toggle visible link to the item. | + +### Tree View + +![A form interface that shows multiple parent and child items from the same collection. Buttons for "Create New" and "Add Existing".](https://product-team.directus.app/assets/aa6b991e-7c5b-459d-ae9a-7e3f7ffc4fb1.webp) + +A special One to Many interface that allows users to create and manage recursive relationships between items from the same collection. + +The Tree View interface is only available on self-referencing (recursive) relationships. + +| Configuration | Options | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| Types | `Alias` | +| Related Collection | Which collection should items be selected from. | +| Foreign Key | Name of field in related collection to be created. | +| Display Template | Display templates are used to represent an item in relationship fields - for example to show the value of the `Title` field. | +| Filter | Filter the list of items a user can select. | + +### Many to One + +![A form interface that allows a user to select a single item from a collection."](https://product-team.directus.app/assets/202ad6d5-b5cd-4592-a9b7-f26c79702fae.webp) + +Create a relationship between the current item and a single item from single collection. + +| Configuration | Options | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| Types | `Alias` | +| Related Collection | Which collection should items be selected from. | +| Display Template | Display templates are used to represent an item in relationship fields - for example to show the value of the `Title` field. | +| Filter | Filter the list of items a user can select. | + +### Translations + +![A form interface with two columns and two fields per column - "Title" and "Content". One column contains the English translation for each field. Second column contains the French translation for each field.](https://product-team.directus.app/assets/6641341c-c9ba-483e-bd6f-17d8275abb21.webp) + +Special relational interface designed specifically to handle translations. When this field is added to a collection a Languages Collection will be created by Directus on your behalf if it does not already exist. + +| Configuration | Options | +| ------------------------- | ------------------------------------------------------------------------------------------------------ | +| Types | `Alias` | +| Languages Collection | Which collection to use for language selection. | +| Language Indicator Field | The field from your `languages` collection that identifies the language to the user. | +| Language Direction Field | The field from your `languages` collection that identifies the text direction for a selected language. | +| Default Language | Default language to use. | +| Use Current User Language | Default to the current users language. | + +## Presentation + +### Divider + +![A horizontal divider between two form fields](https://product-team.directus.app/assets/7eb81773-59d7-46cb-95cd-6b50d8ef4bdf.webp) + +A horizontal divider to separate fields into different sections. + + + +### Button Links + +![A group of two buttons. One primary button. One default button.](https://product-team.directus.app/assets/c88411d7-c4a9-44e8-8a55-78e84de7dbd2.webp) + +Group of one or more buttons that link to a preset or dynamic URL. Each link has the following configuration: + +| Configuration | Options | +| ------------- | ------------------------------------------------------------------------------------------------------------------------- | +| Label | Label for the button. | +| Icon | Icon displayed beside the button label. | +| Type | The colors used by the button. `Primary`, `Normal`, `Info`, `Success`, `Warning`, `Danger` | +| URL | URL to send the user to when the button is clicked. You can use field values from the item to create the URL dynamically. | + +### Notice + +![A standard warning notice in yellow with a hazard icon.](https://product-team.directus.app/assets/eff79b29-a12a-46b3-b01a-a0a329064f76.webp) + +An alert or notice interface to notify users of important information. + + + +## Groups + +### Accordion + +![An accordion interface that allows use to expand and collapse different fields.](https://product-team.directus.app/assets/774bc56b-adb5-44a2-8e65-69e770321977.webp) + +User-controlled showing and hiding of fields within the group by clicking on each field. + +| Configuration | Options | +| -------------- | ------------------------------------------------------ | +| Accordion Mode | Toggle whether only one section can be open at a time. | +| Start | `All Closed`, `First Opened` | + +### Detail Group + +![A group of form fields that are currently hidden behind a toggle.](https://product-team.directus.app/assets/f1d62298-5cce-41b5-9655-1014b97a6aac.webp) + +![A group of form fields that are currently visible but can be hidden behind a toggle.](https://product-team.directus.app/assets/9eec605f-af7b-4c39-a65a-73ad7440ed0b.webp) + +User-controlled showing and hiding of sub-groups by clicking on the group header. + +| Configuration | Options | +| ------------- | ------- | +| Types | `Alias` | + +### Raw Group + +![A group of form fields](https://product-team.directus.app/assets/d03eef30-f983-4efb-aac3-ebf120294516.webp) + +Interface that groups multiple fields together in the data model, with no visual distinction. + +| Configuration | Options | +| ------------- | ------- | +| Types | `Alias` | + +## Other + +### Collection Item Dropdown + +![A collection item field](https://product-team.directus.app/assets/89863252-f709-4ddb-97b6-d298b01b05e5.webp) + +Dropdown to select an item from an existing collection. + +| Configuration | Options | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| Types | `JSON` | +| Collection | Which collection should items be selected from. | +| Display Template | Display templates are used to represent an item in relationship fields - for example to show the value of the `Title` field. | +| Filter | Filter the list of items a user can select. | + +### Hash + +![Form text input that shows the value is securely hashed.](https://product-team.directus.app/assets/6b62272a-8a1e-4bed-be6d-3cf614bb2f48.webp) + +Text input that allows users to hash the value on save. The Directus APIs can be used to [verify the hash](/api#tag/utilities/POST/utils/hash/verify). + +| Configuration | Options | +| ------------- | ---------------------------------------- | +| Types | `Hash` | +| Masked | Toggle raw value visibility before save. | + + + +### Slider + +![A slider input](https://product-team.directus.app/assets/4fd92002-5f86-4e61-91f9-1169df4d6268.webp) + +Range input that allows users to select a number with an interactive slider. + +| Configuration | Options | +| ----------------- | ------------------------------------------------------------------- | +| Types | `Integer`, `Decimal`, `Big Integer`, `Float` | +| Minimum Value | Minimum value that can be set by the user. | +| Maximum Value | Maximum value that can be set by the user. | +| Step Interval | Specify the size of each increment (or step) of the slider control. | +| Always show value | Toggle visibility of the numeric value below the slider. | diff --git a/content/2.data-modeling/5.relationships.md b/content/2.data-modeling/5.relationships.md new file mode 100644 index 00000000..5947da87 --- /dev/null +++ b/content/2.data-modeling/5.relationships.md @@ -0,0 +1,72 @@ +--- +description: Leverage Directus relationships to create powerful data connections. Explore Many to One, One to Many, Many to Many, and Many to Any relationships, along with Translations for multilingual content management. +--- + +# Relationships + +Directus supports all standard relationship types, as well as a few more of its own compound types, meant to streamline certain common configurations. + +## Many to One (M2O) + +![2 tables: One for cities each of which has a reference to a country ID, and a country table](https://product-team.directus.app/assets/57e9702f-c8fa-48d4-90bc-a8443248d406.webp) + +In a M2O relationship, multiple items from the one collection are linked to one item in a different collection. One field is added to the 'many' collection referencing the primary key of the 'one' collection. + +![A cities collection item with the country many-to-one relation set to the country "Chile"](https://product-team.directus.app/assets/3003d17c-2aa1-4664-ad58-34a755f24876.webp) + +In :product-link{product="editor"}, having a M2O field does not automatically provide navigation to the related collection's items. To achieve this, the related collection requires a One to Many field to be set up. + +::callout{type="info" title="M2O Examples"} + +- Given `cities` and `countries` collections, many cities would be assigned to one country. +- Given `orders` and `customers`, many orders would be assigned to one customer. +- Given `books` and `pubilshers`, many books would be assigned to one publisher. + +:: + +## One to Many (O2M) + +![A one-to-many relation showing 2 tables: cities and countries](https://product-team.directus.app/assets/574de2a6-1aa8-4594-942a-e98d79ec183e.webp) + +In a O2M relationship, one item from a collection is linked to multiple items in a different collection. + +![A one-to-many relation field being open](https://product-team.directus.app/assets/63dcee0a-9ee7-4328-bd6b-bd85cc4660c9.webp) + +Creating a O2M interface on the 'many' side of a M2O relationship creates an `Alias` field, which lets us access related items. This does not create a new database column as the O2M field is purely virtual. It creates an interface within the :product-link{product="editor"} to access items from an O2M perspective. + +## Many to Many (M2M) + +![A many-to-many relation showing 3 tables: recipes, ingredients and recipes-ingredients](https://product-team.directus.app/assets/cb29838f-12fd-4b1a-8044-d7c7938670df.webp) + + +In a M2M relationship, an additional collection is created known as the junction collection. The junction collection stores the primary keys from two related collections, allowing for any number of items to be related between two collections. + +You can also have a self-referencing M2M relationship that connects items in the same collection. + +::callout{type="info" title="Self-Referencing M2M Examples"} + +- Given an `articles` collection, you could configure related articles. +- Given a `users` collection, you could configure a friends list. +- Given `papers`, you could configure citations. + +:: + +One example is "Related Articles", where each article relates to many other articles. + +## Many to Any (M2A) + +![A series of tables, showing blog, content_builder, headings, images and text_bodies](https://product-team.directus.app/assets/d4cc93fb-3c0b-41fe-ae1c-5cc4f1d23979.webp) + +In a M2A relationship, one collection can be related to any item in any collection. This is sometimes known as a matrix field or replicator. + +When you configure a M2A in Directus, a M2A `Alias` field is created as well as a junction collection. The junction collection in a M2A relationship also stores the collection name for related collections. + +::callout{type="tutorials" url="/tutorials/getting-started/create-reusable-blocks-with-many-to-any-relationships"} +Read our tutorial on using a Builder (M2A) to create reusable page components. +:: + +## Translations + +![An articles, languages and articles_translations table, linked by language_id](https://product-team.directus.app/assets/f1fe2c0b-4baa-47e3-a7c1-a49c27a9852b.webp) + +When you create a Translations interface in Directus, a translations O2M `Alias` field is created, as well as a `languages` collection and a junction collection between your main collection and `languages`. All translated text is stored in the junction collection. diff --git a/content/2.data-modeling/_dir.yml b/content/2.data-modeling/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/2.data-modeling/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/3.content/1.explore.md b/content/3.content/1.explore.md new file mode 100644 index 00000000..b981a8b9 --- /dev/null +++ b/content/3.content/1.explore.md @@ -0,0 +1,73 @@ +--- +description: Learn to filter, layout, batch edit and more with collections in the collection explorer. +--- + +# Collection Explorer + +The content module allows users to browse, filter, and search for items held in collections. When users navigate into viewing single items, they use :product-link{product="editor"}. Each page contains data from a single collection, but can display related fields for each item. + +To open the collection explorer, click on the content module on the left hand side of the page. + +![The content module showing a list of posts](https://product-team.directus.app/assets/f28e21ef-07bd-4b3f-8eeb-e37aa3b388be.webp) + +## Filtering Items + +![The content module showing a list of posts, with the filter popup open](https://product-team.directus.app/assets/a18b7f4a-1ea3-4d47-afa3-7671ff7be56d.webp) + +You can create custom filters to display items that fulfill certain criteria. + +Click on :icon{name="material-symbols:filter-list"} at the top of the page to create a filter. You can then select a field to filter by and click on the criterion to tweak what should pass for that item to be filtered. + +### And / Or Groups + +`AND` groups give the option to filter for items that meet all of several criteria. On the other hand, `OR` groups filter for items that meet any one of several criteria. + +In order for filters to be included in `AND` or `OR` groups, filters must be indented below them in the filter UI. + +### Dynamic Variables + +![The content module showing a list of posts, with the filters using the `$NOW` dynamic variables](https://product-team.directus.app/assets/56b3463f-c593-4581-8dcb-a8996f9d4ad6.webp) + +The following dynamic variables are built into Directus to add extra functionality to filters: + +- **`$CURRENT_USER`** — The primary key of the currently authenticated user. +- **`$CURRENT_ROLE`** — The primary key of the role for the currently authenticated user. +- **`$CURRENT_ROLES`** - An array of roles containing the `$CURRENT_ROLE` and any roles included within it. +- **`$CURRENT_POLICIES`** - An array of policies assigned to the user directly, or through their roles. +- **`$NOW`** — The current timestamp. +- **`$NOW()`** - The current timestamp plus/minus a given distance, for example `$NOW(-1 year)`, `$NOW(+2 hours)`. + +## Layouts + +Layouts are customized mechanisms for viewing and interacting with the items in a collection. You can [select a layout](/content/layouts) for displaying your collection. Note that restrictions will apply depending on your collection's [data model](/data-modeling/collections). + +## Batch Editing + +![Batch editing a set of posts](https://product-team.directus.app/assets/96ae3c9e-b3b0-4c08-bdf7-d6ff8bd05c2e.webp) + +By selecting more than one item in the explorer will allow you to click on :icon{name="material-symbols:filter-list"} and edit several items' fields at once to have the same value. + +## Bookmarks + + +![The list of bookmarks](https://product-team.directus.app/assets/5279bcef-f497-413e-a568-e788c9aa5309.webp) + +Bookmarks are custom views for your collections that include specified configurations, layouts, visible fields, sorting, filtering and more. + +To create a bookmark, navigate to the Settings -> Bookmarks module. Here, you can create a new one by clicking on :icon{name="material-symbols:add-circle-outline-rounded"}. + +You'll see the "Editing Preset" form, where you can set the name and collection, amongst layout and other values for this bookmark. Note that leaving the name field empty will make it so this bookmark is what is viewed for this collection by default. + + + +:: + +## Kanban Layout + +![Kanban layout](https://product-team.directus.app/assets/0a02d810-079d-4257-83ec-d4bdd9f28d58.webp) + +This layout is ideal for collections that serve as project management tools or to-do lists, where each item represents a +task, because it groups items onto columns according to their status (e.g. "Not Started", "In Progress", "Under +Review", "Complete", or any other status defined). + +### Layout Options + +| Control | Description | +|---|---| +| **Group By** | Select the field used to define item status. See below for details. | +| **Card Title** | Choose the field use to serve as the title for each kanban board. | +| **Card Text** | Choose a field to display additional text on each item. | + +### Layout Options > Advanced + +| Control | Description | +|---|---| +| **Card Tags** | Choose a tag field to be displayed on the item. | +| **Card Date** | Choose a datetime field to be displayed on each item. | +| **Card Image** | Choose an image field to be displayed on each item. | +| **Card Image Fit** | Toggle whether the image fit is cropped. | +| **Card User** | Choose the user created field to display their avatar in the bottom right corner. | +| **Show Ungrouped** | Toggle display of a column containing Items with no assigned status. | + +### Subheader + +There is no Subheader for the Kanban Layout. + +### Page Area + +| Control | Description | +|---|---| +| **Create Task and Assign Status** | Click :icon{name="material-symbols:add"} in a status column and the item page will open. | +| **Sort Panels** | Drag and drop items to reposition or change task status. | +| **Add Status Panel** | Click :icon{name="material-symbols:add-box"} and add a group name (i.e. new status column). | +| **Edit or Delete Status Column** | Click :icon{name="material-symbols:more-horiz"} and then click :icon{name="material-symbols:edit"} to edit or :icon{name="material-symbols:delete"} to delete. | + +::callout{type="info" title="Configuration Requirements"} + +To make this layout work, you will need to configure an appropriate status [field](/data-modeling/fields) on the +collection, then identify this field under "Group By" in the Layout Options menu. + +:: diff --git a/content/3.content/4.import-export.md b/content/3.content/4.import-export.md new file mode 100644 index 00000000..70654987 --- /dev/null +++ b/content/3.content/4.import-export.md @@ -0,0 +1,56 @@ +--- +description: Learn to import and export multiple items stored as files using Directus. +--- + +# Import & Export + +The content module allows importing and exporting of multiple items from and to files respectively. + +## Import Items + +![Import items](https://product-team.directus.app/assets/5c0b44e2-8fdd-4050-b1f1-602e40555af8.webp) + +You can import JSON or CSV files into your collection as items. + +To import Items from a file, navigate to the collection and click "Import / Export" in the sidebar. Click into the import search box. A file browser will open. Once a file has been selected, click on "Start Import" to import the items. + +The items will now be in the collection, and the file itself will not be stored in the Directus project. + +::callout{type="warning"} + +The field headers in the imported file must match the field keys of the collection you're importing into. Otherwise, the column will be skipped. + +:: + +::callout{type="info" title="Importing Relational Files"} + +It is possible to import relational field values as well. For this task, the user performing the import will need access +permissions for the related collection. + +:: + +## Export Items + +![Export items](https://product-team.directus.app/assets/6253cd72-005d-4551-b3fd-72acd33e47f6.webp) + +When exporting items, the export items menu provides granular control over exactly which items and +fields are exported, how they are exported, and where they are exported. + +To export items, follow the steps below, navigate to the desired collection and select "Import / Export" from the sidebar. Click on "Export Items" and the export items menu will appear. Select the desired format from CSV, JSON, XML, or YAML and click :icon{name="material-symbols:download-for-offline"} to download the file. + +## Export Items Menu + +This menu provides granular control over exactly which items and fields are exported, how they are exported, and where +they are exported. + +| Item | Description | +|---|---| +| **Format** | Choose to export items as CSV, JSON, XML, or YAML. | +| **Limit** | Set the maximum number of items to be exported. | +| **Export Location** | Download the export file directly to your machine or to the file library. | +| **Folder** | Choose the Folder to download to (if export location is the folder library). | +| **Sort Field** | Choose field to sort items by. | +| **Sort Direction** | Choose to sort items in ascending or descending order. | +| **Full-Text Search** | Limit exported Items to ones which matched as search results. | +| **Filter** | Limit exported items with a filter. | +| **Fields** | Add, remove, and re-order the item fields that will be exported. | diff --git a/content/3.content/5.live-preview.md b/content/3.content/5.live-preview.md new file mode 100644 index 00000000..5e3e3fb5 --- /dev/null +++ b/content/3.content/5.live-preview.md @@ -0,0 +1,41 @@ +--- +description: Learn to set up your project for live previewing items from your application. +--- + +# Live Preview + +Live preview allows you to show changes in your website collection before publishing and without the need to refresh the browser. + +## Configure a Live Preview URL + +![Data Studio configuration for Posts collection. The Preview URL is filled in with the dynamic ID.](https://product-team.directus.app/assets/e3619c91-8917-4014-9ad1-5d7cd2b59ff4.webp) --> + +Navigate to Settings -> Data Model and select the collection you wish to configure. In the "Preview URL" section, specify the Preview URL for your project by selecting the field you wish to use to identify your object in your application from the dropdown and entering a URL in this format: +`http://your-website-url/` + +### Using Live Preview with Your Application + +Once configured, Directus will send a request to your application for a page with the specified URL format. For example, if you've configured the URL to be `https://mysite.com/posts/{id}`, and load the preview for the item with the an `id` of `42`, then your application will receive a request to `https://mysite.com/posts/42`. You may choose to add `preview=true` to indicate to your client that it needs to treat this as a live preview. You may also choose to add an access token with the ability to view items as an additional URL query parameter. + +You can then develop your application to handle that request and return a page that shows a preview of the item requested. + +::callout{type="warning" title="Using Live Preview with Static Site Generators"} + +If you're using a static site generator to preview your item data, be sure to develop it to render the item page on load as opposed to on build. Otherwise, it will only show the state of the item when the site itself was last built. + +:: + +::callout{type="info" title="Using Live Preview with Content Versioning"} + +If you've enabled [content versioning](/content/content-versioning), you can pass the version identifier to your live preview URL. + +:: + +## Previewing Item Contents in the Editor + +In an item page, toggle "Enable Preview" at the top of the page. Whenever you create or edit an item in your collection +and “click” save, you should see a live preview of the item on the right-hand side of the screen. + +![Live preview of a post](https://product-team.directus.app/assets/ae834006-2b0b-40df-87aa-66e5c2da1987.webp) --> + +Clicking on :icon{name="material-symbols:devices"} also lets you preview your content on desktop and mobile screens, while :icon{name="material-symbols:open-in-new"} allows you to pop the live preview out into a separate window. diff --git a/content/3.content/6.content-versioning.md b/content/3.content/6.content-versioning.md new file mode 100644 index 00000000..485de365 --- /dev/null +++ b/content/3.content/6.content-versioning.md @@ -0,0 +1,73 @@ +--- +description: This guide covers the process of enabling and utilizing Content Versioning in Directus. +--- + +# Content Versioning + +Content versioning allows teams to create and manage different versions of their content. There are several reasons to +use content versioning, including drafting content without publishing it, and more ways to collaborate effectively. + +## Concepts + +- **Version**: A version of an item is a snapshot that gets copied from the current or `main` version, allowing you to safely make changes and later promote to be the main version. Any changes to the main version made in the meantime are updated automatically. +- **Main**: the main version is the original version of a piece of content that has been created. It is the default version that is displayed to users. The main version is the "source of truth" for all other versions. This is often used for published content. +- **Promote**: promoting a version means to make it the new main version. When a new version is promoted, it becomes the main version that is displayed to users, and it replaces the previous main version. + + +::callout{type="info" title="Using Versions in Live Preview" url="/content/live-preview"} + +The version field is a dynamic variable can be added to the live preview URL so you can preview a specific version of an item. Check out more about live previews. + +:: + +## Setting Up Content Versioning + +![Content versioning checkbox](https://product-team.directus.app/assets/26a59b99-55e9-4185-83f3-f8945ace589e.webp) + +Navigate to **Settings** > **Data Model**, select the collection that you want to enable content versioning for, and scroll down to the content versioning section. Toggle "Enable Versions" and save your data model. + +## Creating a New Version + +![Creating a new version in the content module](https://product-team.directus.app/assets/bb353039-325c-4e4e-afaa-98a9ce2032d7.webp) --> + +Open an item within your versioned collection. At the top of the item view, you will notice a dropdown with the main Content Version displayed as "main". Select "Create Version" and provide a key and a name for the new version. You can then save your new version. + +::callout{type="info" title="Version Source"} + +All new versions originate from the main version. This implies that the main version acts as the single source of truth +for other versions. + +:: + +## Making Changes to a Version + +![Editing a version](https://product-team.directus.app/assets/03d58f08-491a-4d5a-9fd8-4c007d800b5b.webp) + +Open the item in the newly created version, and make the desired edits to the item's content. + +Upon saving the changes, you'll notice that the main version remains unaffected, while the changes are reflected only in the modified version. + +## Reviewing and Promoting a Version + +![Promoting a version, comparing its changes](https://product-team.directus.app/assets/2eef0c84-877c-43c3-9a15-72366f637f9e.webp) + +Promoting a version will turn it into the main version. + +Open the version you want to promote and select the "Promote Version" option from the dropdown. In the "Changes" tab, you can review the changes made for each field in the version and decide which field's changes to accept or reject. Switch to the "Preview" tab to see a preview of the changes you are about to promote. + +After promoting a version, you can choose to keep or delete the version. + +::callout{type="info" title="Programmatically Implement Content Versioning"} + +You have the option to integrate Content Versioning through the API. To learn how to accomplish this, please refer to +our [API reference documentation](/api#tag/versions). + +:: + +## Revisions and Content Versioning + +Under the hood, content versions are stored in the `directus_revisions` collection. In bigger projects this collection +can get large. + +This can be mitigated by periodically removing some or all data in this collection. Note that this could +unintentionally remove some content versions. diff --git a/content/3.content/7.translations.md b/content/3.content/7.translations.md new file mode 100644 index 00000000..513fde4b --- /dev/null +++ b/content/3.content/7.translations.md @@ -0,0 +1,67 @@ +--- +description: Both content and the data studio can be translated into multiple languages. +--- + +# Translations + +Localising content in Directus involves using translation strings, which are multilingual key-value pairs that you can use throughout the app. They enable you to translate things like dropdown options, placeholder text, field notes, and more. + +![Translation strings](https://product-team.directus.app/assets/d2348575-9fbb-4c38-9d9f-22e32799ded7.webp) + +::callout{type="info" title="Data Studio Translations"} + +This article refers to translating your content in Directus. Many parts of the Data Studio are already translated into multiple languages via community contribution on Crowdin. + +:: + + +## Create a Translation String + +![Form to create a translation string](https://product-team.directus.app/assets/1ca1ec31-2263-4b69-b87b-95449ec98bbd.webp) + +To create a translation string, navigate to Settings > Translation Strings and click on :icon{name="material-symbols:add-circle-rounded"} in the page header and a drawer will open. + +Add a key and click on "Create New" to open another drawer. Select the language and type in the corresponding translation. Click on :icon{name="material-symbols:check-circle"} to confirm and add the translation. + +## Use a Translation String + +![Using a translation string on a field](https://product-team.directus.app/assets/c26df052-5b97-401d-97f8-5c7c7bc29952.webp) + +Throughout the settings module, you will notice certain input fields have a :icon{name="material-symbols:translate"} icon on them, meaning you have the option assign a translation string. + +To assign a translation string, navigate to the input that you'd like to add a translation string to. There are two ways to assign a translation string: + +- Click :icon{name="material-symbols:translate"} and a dropdown menu with all translation strings will appear. +- Type `$t:translation-string-key` and hit enter. + +Choose a translation string key as desired. + +::callout{type="info" title="Switching Language"} + +There are two ways to change the app language. Administrators can set the project's +[default language](/configuration/translations), while users can choose their own personal +language preference. + +:: + +::callout{type="info" title="Adding New Translation Strings"} + +You can also click ":icon{name="material-symbols:add-circle-rounded"} New Translation String" in the :icon{name="material-symbols:translate"} dropdown menu to create a new translation string on the fly. + +:: + +## Content Translations + +With Directus, you can localize your content into several languages using a [translations field](/data-modeling/relationships) on a given collection. + +![Creating a translations field](https://product-team.directus.app/assets/3097a653-da4f-449a-a5d5-4dcf62da73bd.webp) + +Once this field is added to a collection, a few new collections will be created. One being a pre-populated `languages` collection, as well as a hidden `_translations` collection. + +In the "Data Model" section of the settings module, navigate into the `_translations` collection and add the fields which you'd like to translate. + +![Post translations collection showing it has a title and content field added](https://product-team.directus.app/assets/ec059ce9-ece1-4353-8844-7e557a4556c4.webp) + +Now, when [editing an item](/content/editor) of that collection, you'll be able to add translations for those fields. + +![Creating a post with a title in both Spanish and English](https://product-team.directus.app/assets/774ac37b-1c9e-433b-80ba-deededd8e406.webp) diff --git a/content/3.content/_dir.yml b/content/3.content/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/3.content/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/4.auth/1.quickstart.md b/content/4.auth/1.quickstart.md new file mode 100644 index 00000000..28fe786e --- /dev/null +++ b/content/4.auth/1.quickstart.md @@ -0,0 +1,125 @@ +--- +title: Quickstart +description: Get started with Directus Auth. Learn how to register, login, create users, and make authenticated requests. +--- + +# Auth Quickstart + +:video-embed{type="directus-tv" id="04ffd615-6d1d-45de-9c1b-2ff9206fe343"} +
    + +This guide will cover registering users, logging in, and making an authenticated request. + +:partial{content="quickstart-making-calls"} + +## Before You Start + +You will need a Directus project. + +:directus-cloud + +Create a `posts` collection with at least a `title` and `content` field. [Follow the data modeling quickstart to learn more](/data-modeling/quickstart). Create a single item in the collection. + +## Creating a Role and a Policy + +From your settings, navigate to User Roles and create a new role named "User". This role will later be applied to new users who register. + +Within the role page, create a new policy named "Read Posts". Add a permission to the policy to allow **Read** action on `posts` collection. + +## Allow User Registration + +From your settings, enable User Registration. Select the User role that was just created and disable the Verify Email setting. + +## Registering via the Data Studio + +Log out of the Data Studio. From the Sign In screen, you will see a new option to Sign Up. Once a user is signed up, they will immediately be able to log in. + +## Registering via API + +Open your terminal and run the following command to register a new user. + +::snippets +#rest +```bash [Terminal] +curl \ +--request POST \ +--header 'Content-Type: application/json' \ +--data '{ "email": "hello@example.com", "password": "d1r3ctu5" }' \ +--url 'https://directus.example.com/register' +``` + +#graphql +```graphql +mutation { + users_register(email: "hello@example.com", password: "d1r3ctu5") +} +``` + +#sdk +```js +import { createDirectus, rest, registerUser } from '@directus/sdk'; + +const client = createDirectus('https://directus.example.com').with(rest()); + +const result = await client.request(registerUser('hello@example.com', 'd1r3ctu5')); +``` +:: + +Go to the user directory by clicking :icon{name="user-directory"} in the module bar and you should see a new user has been created. + +## Logging In + +::snippets +#rest +```bash [Terminal] +curl \ +--request POST \ +--header 'Content-Type: application/json' \ +--data '{ "email": "hello@example.com", "password": "d1r3ctu5" }' \ +--url 'https://directus.example.com/auth/login' +``` + +#graphql +```graphql +mutation { + auth_login(email: "hello@example.com", password: "d1r3ctu5") { + access_token + refresh_token + } +} +``` + +#sdk +```js +import { createDirectus, authentication } from '@directus/sdk'; + +const email = "hello@example.com"; +const password = "d1r3ctu5"; + +const client = createDirectus('http://directus.example.com').with(authentication()); + +const token = await client.login(email, password); +``` +:: + +## Authenticating Requests + +You can use the access token while making requests. If your token has expired, you must refresh it. + +```bash [Terminal] +curl \ +--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ +--url 'https://directus.example.com/items/posts' +``` + +::callout{type="dev-docs" url="/auth/email-login"} +Read more about refreshing tokens. +:: + +## Next Steps + +Read more about [access tokens](/auth/tokens-cookies), [access control](/auth/access-control), and then refer to the Users API reference to manage user accounts. + +::callout{type="api-reference" url="/api#tag/users"} +Explore the Users API Reference. +:: diff --git a/content/4.auth/2.tokens-cookies.md b/content/4.auth/2.tokens-cookies.md new file mode 100644 index 00000000..ea5d326e --- /dev/null +++ b/content/4.auth/2.tokens-cookies.md @@ -0,0 +1,69 @@ +--- +description: Learn how to authenticate requests & explore standard, session, and static token types. +--- + +# Access Tokens + +Access tokens are used to authenticate requests to Directus. They are scoped to users, and have the same permissions that the associated user does. + +## Token Types + +### Standard Tokens + +Standard tokens are returned when a user logs in and expire after a short period, and are provided with an expiry time as well as a refresh token. + +Refresh tokens have a much longer expiry time, and can be used to generate a new standard token. + +The token should be stored and reused by your application, checking if it has expired before each use and refreshing if required. Logging out will invalidate the refresh token, stopping a user from authenticating without first logging in again. + +::callout{type="dev-docs" url="/auth/email-login"} +Read more about logging in, refreshing tokens, and logging out. +:: + +### Session Tokens + +Session tokens are returned when a user logs in, and combine both an access and refresh token in a single token. They can only be refreshed before they expire, and must be stored as a cookie. + +### Static Tokens + +![A user profile in the data studio with a newly-generated static token before saving. A notice reads "Make sure to backup and copy the token above. For security reasons, you will not be able to view the token again after saving and navigate off this page."](https://product-team.directus.app/assets/0df2a7cc-53c8-4f89-acee-476caf877270.png) + +Each user can have one static token that does not expire. This can be generated in the Data Studio within the user page. It is stored in plain text in the `directus_users` collection, and can be manually set via the Data Studio or the [Users API](/api#tag/users). + +## Storing Tokens + +### JSON + +The default response to any Directus API request is via a JSON payload. It is your responsibility to handle storage and usage of the token. + +:partial{content="snippet-auth-token"} + +### Cookies + +A cookie is a method of storing data in the browser. When using the login endpoint, you may set the `mode` to `session` and the Directus response will contain specific headers and the browser will automatically create a `directus_session_token` cookie on your behalf. + +When a request is made to the same Directus domain, the cookie will be automatically included in the request until it expires or is overwritten. As a `httpOnly` cookie, client-side JavaScript is unable to access it. + +## Making Requests + +To perform actions that are not available to the public role, a valid token must be included in the request. + +::tabs + ::tab{label="Authorization Header"} + Add the following header: `Authorization: Bearer ` + :: + + ::tab{label="Session Cookies"} + You do not need to set anything. The `directus_session_token` is used automatically. + :: + + ::tab{label="Query Parameter"} + Append the following query parameter: `?access_token=` + + ::callout{type="info" title="Exercise caution when using query parameters for authentication"} + Using a query parameter for authentication can lead to it being revealed or logged. If possible, use another method. + :: + + :: + +:: diff --git a/content/4.auth/3.access-control.md b/content/4.auth/3.access-control.md new file mode 100644 index 00000000..166ae371 --- /dev/null +++ b/content/4.auth/3.access-control.md @@ -0,0 +1,101 @@ +--- +description: Manage user and role permissions and policies for interacting with data in Directus. +--- + +# Access Control + +:video-embed{type="directus-tv" id="04ffd615-6d1d-45de-9c1b-2ff9206fe343"} +
    + +Access control is a critical part of managing data - what different users in their various roles should be able to create, read, update, delete, and share. + +You can find Access Control in the Settings module. + + +![A diagram showing the relationship between permissions, policies, roles, and users.](https://product-team.directus.app/assets/9c4b55ec-5402-4460-a091-f22406f524e1.jpg) + +## Users + +A user is an item in the `directus_users` collection and typically referring to a person, application, or service that needs access to a Directus project. + +## Permissions + +![A single permission set for a collection. The collection is posts, and the actions are create, read, update, delete, and share.](https://product-team.directus.app/assets/e19b7b11-bf9b-4588-bbcb-17671f6aafb0.png) + +A permission is set on a collection and an action. The available actions in Directus are create, read, update, delete, and share. Permissions can provide all access, no access, or use custom permissions. + +### Custom Permissions + +Custom permissions provide more granularity than 'all' or 'none'. They impact what items and fields a user can access, and have permission-level validation and presets. + +#### Item Permissions + +![Item permissions with a filter rule that limits access to update items where user_created equals the current user.](https://product-team.directus.app/assets/ca52a0bc-65a4-4b9a-92cc-86a71c3d4de6.png) + +Use [filter rules](/connect/filter-rules) to define which items in a collection a user can access. + +#### Field Permissions + +![Field permissions with limited update access to only the content field.](https://product-team.directus.app/assets/80ffe7d7-9a5e-4516-8768-a00c03d28613.png) + +Define which fields the role is included in this permission. As a permission is scoped to both a collection and an action, a different set of fiends can be provided to each action. + +#### Field Validation + +![Field validation with some fields not empty and are at least 3 characters long via a regular expression.](https://product-team.directus.app/assets/3bf61316-edf3-4e87-848d-7f5225dd3ada.png) + +Use [filter rules](/connect/filter-rules) to validate field values when an item is created or updated. + +#### Field Presets + +![Field presets with a default value for the visibility field.](https://product-team.directus.app/assets/44e001a8-e369-43a9-82e7-b75cb74d5bff.png) + +Define default field values when an item is created or updated. The value will appear in :product-link{product="editor"}, and can later be updated. + +::callout{type="info" title="Conflicting Permissions & the API"} +When using the Directus API, only fields you have permission to see will be returned. However, if multiple permissions allow for varying access to the same field, it will always be returned with the value `null` if not allowed in the given context. + +You must treat `null` as both a value and an indication of restricted permissions. +:: + +:header-with-badge{h="2" text="Policies" badge="New in Directus 11"} + +Policies are a group of permissions that can be applied to users or roles. + +As a user starts with no permissions, and multiple policies can set a permission on the same collection and actions. Applying policies is additive - each policy can add to existing permissions, but not take them away. + +## Roles + +Roles are an organizational tool that define a user's position within a project. A role can have any number of policies attributed to it, and be applied to any number of users. Roles can also have any number of policies and child roles. + +### Administrator Role + +An administrator role provides complete, unrestricted control over the project, including the data model and all data. This cannot be limited, as by definition it would no longer be an administrator role. You need at least one user in an administrator role. + +### Public Role + +A public role defines access permissions for unauthenticated requests to the database. That means that if you enable an access permission for this role, everybody has that permission enabled. All public permissions are off by default. It is up to the administrators to re-configure these and define exactly what the public role has access to. + +## Statuses + +A policy can toggle access to the App (Data Studio). If you only want a user to access the project via API, leave this disabled. + +An admin can set the user status. Only the active state is able to authenticate, with all others being descriptive inactive states. + +- **Draft**: an incomplete user item. +- **Invited**: has a pending invite to the Directus project. +- **Unverified**: registered but has not yet verified their email address. +- **Active**: access to the Directus project via API or the Data Studio. +- **Suspended**: a User that has been temporarily disabled. +- **Archived**: a soft-deleted user. + +## Limiting to Specific IP Addresses + +A policy can also have a specific allowlist of IP addresses, IP ranges, and CIDR blocks which allow access. Leave this empty to allow all IP addresses. + +## Seats + +Seats in Directus are used in the context of licensing and billing for Directus Cloud. A user that occupies a seat meets at least one of the following criteria: + +1. At least one policy with 'Admin Access' enabled. +2. At least one policy with 'App Access' enabled, allowing access to the Data Studio. diff --git a/content/4.auth/4.creating-users.md b/content/4.auth/4.creating-users.md new file mode 100644 index 00000000..95c8638b --- /dev/null +++ b/content/4.auth/4.creating-users.md @@ -0,0 +1,102 @@ +--- +description: Learn about creating users in directus, including API creation, inviting users, and seamless invites. +--- + +# Creating Users + +A user is an item in the `directus_users` collection. There are no required fields by default, although you may choose to require values for any system or user-created fields. + +![A user profile for Ben Haynes, showing an image, email, role, and various other pieces of metadata in an editable form.](https://product-team.directus.app/assets/c933f8ef-ed2d-43e0-a95a-700978611568.png) + +To log in with an `email` and `password` they must be set on the user item. A user can also have a [role](/auth/access-control) and any number of policies that can be assigned in the user detail page. + +There are three ways to create new users in Directus - registration, creation, and invitation. + +## Register a User + +The user registration feature is disabled by default. To make use of it, it must first be enabled via project settings. By enabling user registration, it is open to anyone via the Data Studio or via API. Once enabled, all users who register will receive the role configured in project settings. + +The Register a User endpoint also only supports `first_name` and `last_name` fields to be set. + +```json [POST /register] +{ + "email": "hello@example.com", + "password": "d1r3ctu5" +} +``` + +### Email Verification & Validation + +If enabled in project settings, newly-registered users will receive the `Unverified` status and will be unable to log in until they click the verification link sent via email. + +You may also create custom email filter rules to ensure the registering user's email matches certain patterns or has certain characteristics. All string filters are available. + +### Seamless Registration + +You can use the verification system within your own application ensuring users do not need to access the Data Studio. + +When using the register user endpoint, add a `verification_url` property. The invite email will use this URL instead of your Directus project, appending the invite token in the URL as a `token` parameter. + + + +Your application must extract this value and send it to the verify email endpoint. + +```json [POST /users/register/verify-email] +{ + "token": "eyJh...KmUk" +} +``` + +::callout{type="dev-docs" url="/configuration/security-limits"} +The `USER_REGISTER_URL_ALLOW_LIST` environment variable must be configured. +:: + +## Create a New User + +The Users API can also create a new user. Any field in the `directus_users` collection can be set when creating a user, but the correct public collection permissions will be required. + +```json [POST /users] +{ + "email": "hello@example.com", + "password": "d1r3ctu5", + "role": "c86c2761-65d3-43c3-897f-6f74ad6a5bd7" +} +``` + +::callout{type="api-reference" url="/api#tag/users/POST/users"} +See all parameters and payload options for the create user endpoint. +:: + +## Inviting Users + +Inviting a user will send an email with an invite URL. Once invited, the user will be created with the provided email address and a status of `invited`. When a user accepts their invite they must provide a password and will be able to log in. + +```json [POST /users/invite] +{ + "email": "hello@example.com", + "role": "c86c2761-65d3-43c3-897f-6f74ad6a5bd7" +} +``` + +::callout{type="dev-docs" url="/configuration/email"} +An email service must be configured to send invites. +:: + +### Seamless Invites + +You can use the invite system within your own application ensuring users do not need to access the Data Studio. + +When using the invite user endpoint, add an `invite_url` property. The invite email will use this URL instead of your Directus project, appending the invite token in the URL as a `token` parameter. + +Your application must extract this value, collect the new user's password, and send both to the accept invite endpoint. + +```json [POST /users/invite/accept] +{ + "token": "eyJh...KmUk", + "password": "d1r3ctu5" +} +``` + +::callout{type="dev-docs" url="/configuration/security-limits"} +The `USER_INVITE_URL_ALLOW_LIST` environment variable must be configured. +:: diff --git a/content/4.auth/5.email-login.md b/content/4.auth/5.email-login.md new file mode 100644 index 00000000..31baf436 --- /dev/null +++ b/content/4.auth/5.email-login.md @@ -0,0 +1,292 @@ +--- +description: Learn about user registration, login with standard/session tokens, refresh, logout, and resetting passwords. +--- + +# Email Login + +It is most common to authenticate users with an email and password either receiving and storing a standard token or using a session token cookie. + +::callout{type="dev-docs" url="/auth/tokens-cookies"} +Read more about tokens in Directus. +:: + +## Registration + +Before being able to log in, a user with an `email` and `password` must exist. This user can be created manually in the Data Studio, via an invite, or via the [Users API](/api#tag/users). + +::callout{type="dev-docs" url="/auth/creating-users"} +Read more about creating users. +:: + +## Login + +You can authenticate as a user to receive a standard token. + +## Logging In + +::snippets +#rest +```bash [Terminal] +curl \ +--request POST \ +--header 'Content-Type: application/json' \ +--data '{ "email": "hello@example.com", "password": "d1r3ctu5" }' \ +--url 'https://directus.example.com/auth/login' +``` + +#graphql +```graphql +mutation { + auth_login(email: "hello@example.com", password: "d1r3ctu5") { + access_token + refresh_token + } +} +``` + +#sdk +```js +import { createDirectus, authentication } from '@directus/sdk'; + +const email = "hello@example.com"; +const password = "d1r3ctu5"; + +const client = createDirectus('http://directus.example.com').with(authentication()); + +const token = await client.login(email, password); +``` +:: + +If the user has [two-factor authentication](/auth/2fa) enabled, an `otp` (one-time password) can be passed as an additional property. The response will contain a standard token. + +:partial{content="snippet-auth-token"} + +### Setting a Cookie + + + +If you wish to receive and store a session cookie, add a `mode` property when logging in. + +::snippets +#rest +```json [POST /auth/login] +{ + "email": "hello@example.com", + "password": "d1r3ctu5" +} +``` +The token won't be returned in JSON response. + +#graphql +```graphql +mutation { + auth_login(email: "hello@example.com", password: "d1r3ctu5", mode: "session") { + access_token + refresh_token + } +} +``` + +#sdk +```js +import { createDirectus, authentication } from '@directus/sdk'; + +const email = "hello@example.com"; +const password = "d1r3ctu5"; + +const client = createDirectus('http://directus.example.com').with(authentication()); + +const token = await client.login(email, password, {mode: "session"}); +``` +:: + +## Refresh + +Retrieve a new access token by refreshing it. + +::snippets +#rest +```json [POST /auth/refresh] +{ + "refresh_token": "Xp2tTNAdLYfnaAOOjt3oetyCWtobKKUIeEXj..." +} +``` + +#graphql + +```graphql +mutation { + auth_refresh(refresh_token: "refresh_token") { + access_token + refresh_token + } +} +``` + +# sdk + +```js +import { createDirectus, authentication, rest, refresh } from '@directus/sdk'; + +const client = createDirectus('directus_project_url').with(authentication()).with(rest()); + +// refresh http request using json +const result = await client.request(refresh('json', refresh_token)); +``` + +### Refreshing a Cookie + +You do not need to provide the `refresh_token`, but you must specify the `mode`. + +::snippets +#rest +```json [POST /auth/refresh] +{ + "mode": "session" +} +``` + +#graphql +```graphql +mutation { + auth_refresh(refresh_token: "refresh_token") { + access_token + refresh_token + } +} +``` + +#sdk +```js +import { createDirectus, authentication, rest, refresh } from '@directus/sdk'; + +const client = createDirectus('directus_project_url').with(authentication()).with(rest()); + +// refresh http request using a cookie +const result = await client.request(refresh('cookie')); +``` +:: + +## Logout + +Invalidate the refresh token and destroy the user's session. + +::snippets +#rest +```json [POST /auth/logout] +{ + "refresh_token": "Xp2tTNAdLYfnaAOOjt3oetyCWtobKKUIeEXj..." +} +``` + +#graphql +```graphql +mutation { + auth_logout(refresh_token: "Xp2tTNAdLYfnaAOOjt3oetyCWtobKKUIeEXj...") +} +``` + +#sdk +```js +import { createDirectus, authentication, rest, logout } from '@directus/sdk'; + +const client = createDirectus('directus_project_url').with(authentication()).with(rest()); + +const result = await client.logout(); +``` + +You can also log out using the http request mechanism: + +```js +import { createDirectus, authentication, rest, logout } from '@directus/sdk'; + +const client = createDirectus('directus_project_url').with(authentication()).with(rest()); + +const result = await client.request(logout(refresh_token)); +``` +:: + +### Invalidating a Cookie + +You do not need to provide the `refresh_token`, but you must specify the `mode`. This will immediately invalidate and delete the cookie. + +::snippets +#rest +```json [POST /auth/logout] +{ + "mode": "session" +} +``` + +#graphql +```graphql +mutation { + auth_logout(mode: "session") +} +``` + +#sdk +```js +import { createDirectus, authentication, rest, logout } from '@directus/sdk'; + +const client = createDirectus('directus_project_url').with(authentication()).with(rest()); + +const result = await client.logout({mode: "session"}); +``` +:: + +## Password Reset + +Requesting a password reset will send an email to the user with a URL to the Data Studio to reset their password. + +```json [POST /auth/password/request] +{ + "email": "hello@example.com" +} +``` + +::callout{type="dev-docs" url="/configuration/email"} +An email service must be configured to send password reset requests. +:: + +### Seamless Password Reset + +You can use the password reset system within your own application ensuring users do not need to access the Data Studio. + +When using the request reset password endpoint, add a `reset_url` property. The email will use this URL instead of your Directus project, appending the reset token in the URL as a `token` parameter. + +Your application must extract this value, collect the new user's password, and send both to the reset password endpoint. + +::snippets +#rest +```json [POST /auth/password/reset] +{ + "token": "Xp2tTNAdLYfnaAOOjt3oetyCWtobKKUIeEXj", + "password": "d1r3ctu5!" +} +``` + +#graphql + +```graphql +mutation { + auth_password_reset(token: "Xp2tTNAdLYfnaAOOjt3oetyCWtobKKUIeEXj", password: "d1r3ctu5!") +} +``` + +#sdk + +```js +import { createDirectus, rest, passwordReset } from '@directus/sdk'; + +const client = createDirectus('directus_project_url').with(rest()); + +const reset_token = "Xp2tTNAdLYfnaAOOjt3oetyCWtobKKUIeEXj"; +const new_password = "d1r3ctu5!"; + +const result = await client.request(passwordReset(reset_token, new_password)); +``` + +::callout{type="dev-docs" url="/configuration/security-limits"} +The `PASSWORD_RESET_URL_ALLOW_LIST` environment variable must be configured. +:: diff --git a/content/4.auth/6.2fa.md b/content/4.auth/6.2fa.md new file mode 100644 index 00000000..159290fb --- /dev/null +++ b/content/4.auth/6.2fa.md @@ -0,0 +1,47 @@ +--- +title: Two-Factor Auth +description: Secure your logins with one-time codes! Learn how to generate secrets, enable/disable 2FA. +--- + +# Two-Factor Authentication + +Two-factor authentication (2FA) in Directus is a security measure that requires a generated one-use code to be provided after log in to complete authentication. 2FA for the Data Studio can be enabled or enforced in the user page. A one-time password (OTP) is required when logging in via the Data Studio or API. + +To enable 2FA, you will need an external authenticator app or support for OTPs in your password manager. + +## Generate 2FA Secret + +A 2FA secret is required to set up OTPs in your authenticator app. + +```json [POST /users/me/tfa/generate] +{ + "password": "d1r3ctu5" +} +``` + +The response will contain the `secret` and an `otpauth_url` which can be optionally rendered as a QR code and to be used by authenticator apps. + +Save the `secret` in your authenticator app either manually or via the `otpauth_url` QR code. + +## Enable 2FA + +To complete 2FA setup, you will need both the `secret` and a generated `otp` from your authenticator app. + +```json [POST /users/me/tfa/enable] +{ + "otp": "123456", + "secret": "GV3UEVQVOM4D4O33" +} +``` + +You must now log in with a `otp` property whose value is generated by your authenticator app. + +## Disable 2FA + +To disable 2FA, you need to generate and use a OTP from your authenticator app. + +```json [POST /users/me/tfa/disable] +{ + "otp": "123456" +} +``` diff --git a/content/4.auth/7.sso/1.index.md b/content/4.auth/7.sso/1.index.md new file mode 100644 index 00000000..dfb0ffcc --- /dev/null +++ b/content/4.auth/7.sso/1.index.md @@ -0,0 +1,97 @@ +--- +description: Single Sign-On is a mechanism which allows to use external providers to login into systems. +--- + +# Single Sign-On + +Single Sign-On (SSO) is a mechanism which allows to use external providers to login into systems. For example, you can use +your Google or Facebook account to authenticate without the need to create a new registration. + +::callout{type="info" title="Session Based Authentication"} + +In [Directus version 10.10.0](/releases/breaking-changes) the `cookie` mode has +been replaced by the new `session` mode. The API still supports `cookie` mode logins for compatibility, however the Data +Studio no longer supports `cookie` mode for logging in. + +:: + +## Supported SSO Mechanisms + +Directus supports four SSO mechanisms: + +- [OpenID](https://openid.net/specs/openid-connect-core-1_0.html) +- [OAuth 2.0](https://www.ietf.org/rfc/rfc6750.txt) +- [LDAP](https://datatracker.ietf.org/doc/html/rfc4511) +- [SAML](https://datatracker.ietf.org/doc/html/rfc7522) + +::callout{type="info" url="/configuration/auth-sso"} + +Check out specific SSO configuration variables for different mechanisms. + +:: + +In order to use these mechanisms you need to create an application/configuration on your preferred external provider, set the environment variables to configure the external provider and, optionally, set the environment variables to configure cookies. + +## SSO with Directus Behind a Proxy + +If Directus is running behind an HTTP(S) proxy, the instance might not be able to reach the configured SSO provider. In +such a case, you may want to use the [`global-agent`](https://www.npmjs.com/package/global-agent) package, allowing you +to configure the corresponding proxy settings. + +In this guide, you'll learn how to set up the `global-agent` package by extending the Directus Docker Image. + +::callout{type="warning" title="Security Concerns"} + +Due to the fact that the `global-agent` package needs to intercept all external requests, it can be regarded as a +potential attack surface. Especially in critical environments, it's therefore recommended to thoroughly evaluate the +impact of such a setup beforehand. + +:: + +Create a patch file to adjust the `pm2` configuration file so that `global-agent` is registered at startup: + +```diff [ecosystem-global-agent.patch] +diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs +index 5218fda853..4c53cabc80 100644 +--- a/ecosystem.config.cjs ++++ b/ecosystem.config.cjs +@@ -10,6 +10,7 @@ module.exports = [ + name: 'directus', + script: 'cli.js', + args: ['start'], ++ node_args: ['-r', 'global-agent/bootstrap'], + + // General + instances: process.env.PM2_INSTANCES ?? 1, +``` + +In the same directory, create a `Dockerfile`. Extend the Directus Image, install the +`global-agent` package, and apply the previously created patch file: + +```dockerfile +FROM directus/directus:11.1.1 + +USER root +RUN corepack enable +USER node + +RUN pnpm install global-agent@3 + +COPY ecosystem-global-agent.patch . + +USER root +RUN < + +A new Docker Image can now be built from this customized `Dockerfile`, and can then be used with the following +environment variables to control the proxy configuration: + +- `GLOBAL_AGENT_HTTP_PROXY` +- `GLOBAL_AGENT_HTTPS_PROXY` diff --git a/content/4.auth/7.sso/2.seamless.md b/content/4.auth/7.sso/2.seamless.md new file mode 100644 index 00000000..19892288 --- /dev/null +++ b/content/4.auth/7.sso/2.seamless.md @@ -0,0 +1,97 @@ +--- +description: Seamless SSO is a setup to allow logging in without the user ever seeing Directus' login page. +--- + +# Seamless SSO + +While sometimes you want your users to directly have access to the Directus project, in other cases you may need to +fetch private data from Directus in your application using external providers. + +## Implementing Seamless SSO + +Set up an external provider. You'll find some examples further down below. Allow the cookie to be accessible across domains. There are two authentication mechanisms for this. + +**Authentication Mode: session** + +```sh +AUTH__MODE="session" +SESSION_COOKIE_DOMAIN="XXXX" +SESSION_COOKIE_SECURE="true" +SESSION_COOKIE_SAME_SITE="None" +``` + +Replace XXXX for either of these modes with the domain of your Directus instance. For example "directus.myserver.com" + +On your client, the login button should conform to the following format: + +```html +Login +``` + +Replace `https://directus.myserver.com` with the address of your Directus instance, while `https://client.myserver.com/login` should be the address of your client application. The `/login` path is not necessary, but helps to separate concerns. + +On your login page, following the example of `https://client.myserver.com/login`, you need to call the refresh +endpoint either via REST API or via SDK in order to have a session cookie or an `access_token`. Here are some +examples: + +::tabs + ::tab{label="Via REST API / Fetch"} + + ```js + await fetch("https://directus.myserver.com/auth/refresh", { + method: "POST", + credentials: "include", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ mode: "session" }), + }); + ``` + + In the above, `credentials` is required in order to send the refresh/session token cookie. This is using `'session'` mode, but it can also be 'cookie' or 'json'. + :: + + ::tab{label="Via SDK in `session` Authentication Mode"} + + ```js + import { createDirectus, authentication } from "@directus/sdk"; + + const client = createDirectus("https://directus.myserver.com").with( + authentication("session", { credentials: "include" }) + ); + + await client.refresh(); + ``` + :: +:: + +::callout{type="info" title="Redirect Allow List"} + +To allow Directus to redirect to external domains like `https://client.myserver.com/` used above, you'll need to include +it in the `AUTH__REDIRECT_ALLOW_LIST` security setting. + +:: + +## Testing Seamless SSO Locally + +Locally, Directus won't be served under +a valid SSL certificate, which is a requirement for "Secure" cookies. Instead, for local testing purposes (and local +testing purposes only), the following configuration can be used when using session authentication: + +```sh +SESSION_COOKIE_SECURE="false" +SESSION_COOKIE_SAME_SITE="lax" + +``` +Note that no `SESSION_COOKIE_DOMAIN` value is set. + +::callout{type="warning" title="Disabling Secured Cookies"} + +The configuration disables secured cookies and should only be used in local environment. Using it in production exposes +your instance to CSRF attacks. + +:: diff --git a/content/4.auth/8.accountability.md b/content/4.auth/8.accountability.md new file mode 100644 index 00000000..f2b878d4 --- /dev/null +++ b/content/4.auth/8.accountability.md @@ -0,0 +1,47 @@ +--- +description: Learn to audit user activity and enforce accountability using the activity feed. +--- + +# Accountability + +![The activity feed shows action, collection, timestamp, and user.](https://product-team.directus.app/assets/805d75be-45bd-4ba5-ac63-69ba2d928842.png) + +The activity feed provides a collective timeline of all data-changing actions taken within your project. It is accessed via the notifications tray of the sidebar, and has the same filtering and search features as the [Collection Page](/data-modeling/collections). + +You can access the activity feed from the bottom of the right-hand sidebar. + +::callout{type="warning" title="External Changes"} + +Directus can only track the events which actually pass through its platform. Therefore, any changes directly made to the database are not tracked in the activity feed. + +:: + +## View an Activity Log Item + +![The activity feed item details drawer showing user, action, timestamp, IP address, user agent, collection, and item.](https://product-team.directus.app/assets/d9f6749f-304e-4b8d-b086-6c17a447371c.png) + +Click on any item in the activity feed and a side drawer will open, displaying its logged details. The following information +is stored for each item: + +- **User** — The user that performed the action. +- **Action** — The specific action taken (e.g., Create, Update, Delete, Comment, or Login). +- **Timestamp** — The timestamp of when the action was performed. +- **IP Address** — The IP address of the device from which the action was performed. +- **User Agent** — The description of the browser that was used to perform the action. +- **Collection** — The Collection affected by the action. +- **Item** — The ID of the item affected. +- **Comment** — The comment left by the user (when applicable). + +## Filter by Activity + +![The filter UI is the same as the collection page - the action is being filtered to only show updates.](https://product-team.directus.app/assets/149adb98-7b9f-4ea9-ad24-c1d00c3c153b.png) + +In addition to the filter and display functionality inherited from the +[Collection Page](/data-modeling/collections), you can also filter items by activity from the +navigation bar. + +## Modify an Activity + +To ensure proper accountability, system collections are read only by design. However, users with an Admin role have +the ability to reopen, view, and modify an item's values in activities from non-system collections (where the name does +not begin with `directus_`). diff --git a/content/4.auth/_dir.yml b/content/4.auth/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/4.auth/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/5.connect/1.quickstart.md b/content/5.connect/1.quickstart.md new file mode 100644 index 00000000..008564e8 --- /dev/null +++ b/content/5.connect/1.quickstart.md @@ -0,0 +1,82 @@ +--- +title: Quickstart +description: Get started with Directus APIs. Learn to interact with collections, fetch, and create data. +--- + +# Connect Quickstart + +:video-embed{type="directus-tv" id="4cc18530-ba2a-44f3-bb2e-2bfe4ad024d5"} +
    + +This guide will cover interacting with collections in Directus via the REST APIs automatically created on your behalf. You will fetch and create data, and make your first request with the Directus SDK. + +:partial{content="quickstart-making-calls"} + +## Before You Start + +You will need a Directus project. + +:directus-cloud + +Create a `posts` collection with at least a `title` and `content` field. [Follow the Data Modeling quickstart to learn more](/data-modeling/quickstart). + +You also need an admin static token. In the Data Studio, go to your user detail page. Create a new token, take note of it, and then save. + +::callout{type="dev-docs" url="/auth/tokens-cookies"} +Read more about tokens and cookies in Directus Auth. +:: + +## Fetching Data + +Open your terminal and run the following command to read items from the `posts` collection. + +```bash [Terminal] +curl \ +--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ +--url 'https://directus.example.com/items/posts' +``` + +::callout{type="info" title="Replace values"} +- The Base URL (`https://directus.example.com`) must be replaced with your project URL. +- In the Authorization Header, replace `YOUR_ACCESS_TOKEN` with your admin static token. +- If you used a different collection, replace `posts` with the name of the collection. +:: + +Directus will respond with an array of items. The default limit is 100, so if there are more than 100 items, you must either provide a higher limit or request a second page. + +## Using Query Parameters + +You can use any of the global query parameters to change the data that is returned by Directus. + +```bash [Terminal] +curl \ + --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ + --url 'https://directus.example.com/items/posts?filter[status][_eq]=published&fields=id,title' +``` + +This request will only show items with a `status` value of `published`, and only return the `id` and `title` fields. + +::callout{type="dev-docs" url="/connect/query-parameters"} +See all available query parameters in Directus. +:: + +## Creating Data + +All collections are given consistent endpoints. By sending a POST request to `/items/posts` with an object containing properties in the collection, a new item will be created. + +```bash [Terminal] +curl \ + --request POST \ + --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ + --header 'Content-Type: application/json' \ + --data '{ "title": "Hello Universe!" }' \ + --url 'https://directus.example.com/items/posts' +``` + +## Next Steps + +All endpoints in Directus are documented in our API Reference, which also shows all expected parameters and properties in the payload. The API reference shows examples using the REST API, GraphQL API, and the Directus SDK. + +::callout{type="api-reference" url="/api"} +Explore the Directus API Reference. +:: diff --git a/content/5.connect/2.authentication.md b/content/5.connect/2.authentication.md new file mode 100644 index 00000000..e1881833 --- /dev/null +++ b/content/5.connect/2.authentication.md @@ -0,0 +1,11 @@ +--- +description: Discover how to authenticate Directus Connect requests using authorization headers, session cookies, or query parameters. +--- + +# Authentication + +:partial{content="authentication"} + +::callout{type="dev-docs" url="/auth/access-tokens"} +Learn more about using authentication tokens and cookies. +:: diff --git a/content/5.connect/3.filter-rules.md b/content/5.connect/3.filter-rules.md new file mode 100644 index 00000000..7faf301a --- /dev/null +++ b/content/5.connect/3.filter-rules.md @@ -0,0 +1,239 @@ +--- +description: Learn about filter rules in Directus - available operators, filter syntax, relational fields, dynamic variables, logical operators, and functions parameters. Understand how to build complex filters for permissions, validations, and automations. +--- + +# Filter Rules + +Filters are used in permissions, validations, and automations, as well as throughout the APIs and in extensions. All filters use standard syntax and operators which are described on this page. + +## Available Operators + +| Operator | Description | +| ---------------------------------- | --------------------------------------- | +| `_eq` | Equals | +| `_neq` | Doesn't equal | +| `_lt` | Less than | +| `_lte` | Less than or equal to | +| `_gt` | Greater than | +| `_gte` | Greater than or equal to | +| `_in` | Is one of | +| `_nin` | Is not one of | +| `_null` | Is `null` | +| `_nnull` | Isn't `null` | +| `_contains` | Contains | +| `_icontains` | Contains (case-insensitive) | +| `_ncontains` | Doesn't contain | +| `_starts_with` | Starts with | +| `_istarts_with` | Starts with (case-insensitive) | +| `_nstarts_with` | Doesn't start with | +| `_nistarts_with` | Doesn't start with (case-insensitive) | +| `_ends_with` | Ends with | +| `_iends_with` | Ends with (case-insensitive) | +| `_nends_with` | Doesn't end with | +| `_niends_with` | Doesn't end with (case-insensitive) | +| `_between` | Is between two values (inclusive) | +| `_nbetween` | Is not between two values (inclusive) | +| `_empty` | Is empty (`null` or falsy) | +| `_nempty` | Isn't empty (`null` or falsy) | +| `_intersects` [1] | Intersects a point | +| `_nintersects` [1] | Doesn't intersect a point | +| `_intersects_bbox` [1] | Intersects a bounding box | +| `_nintersects_bbox` [1] | Doesn't intersect a bounding box | +| `_regex` [2] | Regular expression (escape backslashes) | +| `_some` [3] | At least one related value is true | +| `_none` [3] | No related values are true | + +[1] Only available on geometry fields.
    +[2] Only available in validation permissions.
    +[3] Only available on One to Many relationship fields. + +## Filter Syntax + +```json +{ + "field": { + "operator": "value" + } +} +``` + +The `field` can exist on the current collection or a relational collection. + +The `operator` must be any valid filter operator such as 'equals' or 'contains'. + +The `value` can be any fixed static value or one of the provided dynamic variables. + +::callout{type="info" title="Example"} +This filter checks the `title` field contains the case-sensitive substring 'Directus': +```json +{ + "title": { + "_contains": "Directus" + } +} +``` +:: + +## Relational Fields + +You can specify related values by nesting field names. For example, if you have a relational Many to One `author` field, and want to specify a filter on the author's `name` field: + +```json +{ + "authors": { + "authors_id": { + "name": { + "_eq": "Rijk van Zanten" + } + } + } +} +``` + +When applying filters to a One to Many field, Directus will default to a 'some' search. + +::callout{type="info" title="Example"} +This filter checks all related category names and will check is at least one value is equal to 'Recipe': +```json +{ + "categories": { + "name": { + "_eq": "Recipe" + } + } +} +``` +:: +This behavior can be overridden by using the explicit `_some` and `_none` operators. + +::callout{type="info" title="Example"} +```json +{ + "categories": { + "_none": { + "name": { + "_eq": "Recipe" + } + } + } +} +``` +:: + +## Dynamic Variables + +| Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------ | +| `$CURRENT_USER` | The primary key of the currently authenticated user. | +| `$CURRENT_ROLE` | The primary key of the role for the currently authenticated user | +| `$NOW` | The current timestamp | +| `$NOW()` | The current timestamp plus/minus a given distance, for example `$NOW(-1 year)`, `$NOW(+2 hours)` | + +::callout{type="info" title="Examples"} + ::tabs + ::tab{label="$CURRENT_USER"} + ```json + { + "owner": { + "_eq": "$CURRENT_USER" + } + } + ``` + :: + + ::tab{label="$NOW"} + ```json + { + "datetime": { + "_lte": "$NOW" + } + } + ``` + :: + :: +:: + +::callout{type="info" title="Nested user and role variables in permissions"} +When configuring permissions, `$CURRENT_USER` and `$CURRENT_ROLE` allow you to specify any related field, such as `$CURRENT_ROLE.name` or `$CURRENT_USER.avatar.filesize`. +:: + +## Logical Operators + +You can group multiple rules using the `_and` or `_or` logical operators. Each logical operator holds an array of filter rules. Logical operators can be nested directly inside of each other, but not inside of other filter rules. + +```json +{ + "_and": [ + { + "field": { + "operator": "value" + } + }, + { + "field": { + "operator": "value" + } + } + ] +} +``` + +::callout{type="info" title="Example"} +```json +{ + "_or": [ + { + "_and": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + { + "status": { + "_in": ["published", "draft"] + } + } + ] + }, + { + "_and": [ + { + "user_created": { + "_neq": "$CURRENT_USER" + } + }, + { + "status": { + "_in": ["published"] + } + } + ] + } + ] +} +``` +:: + +## Functions Parameters + +:partial{content="query-functions"} + +::callout{type="info" title="Example"} +```js +{ + _and: [ + { + "year(published_date)": { + _eq: 1968, + }, + }, + { + "month(published_date)": { + _eq: 4, + }, + }, + ], +}, +``` +:: diff --git a/content/5.connect/4.query-parameters.md b/content/5.connect/4.query-parameters.md new file mode 100644 index 00000000..29eeae7b --- /dev/null +++ b/content/5.connect/4.query-parameters.md @@ -0,0 +1,569 @@ +--- +description: Learn about Directus query parameters - fields, filter, search, sort, limit, offset, page, aggregate, groupBy, deep, alias, and export. Understand how to customize your API requests and retrieve specific data from your collections. +--- + +# Query Parameters + +Most Directus API endpoints can use global query parameters to alter the data that is returned. + +## Fields + +Specify which fields are returned. This parameter also supports dot notation to request nested relational fields, and wildcards (*) to include all fields at a specific depth. + + + +::snippets +#rest +```http [GET /items/posts] +?fields=first_name,last_name,avatar.description +``` + +#graphql +Use native GraphQL queries. + +#sdk +```json +{ + "fields": ["first_name", "last_name", { "avatar": ["description"] }] +} +``` +:: + +::callout{type="info" title="Examples"} +| Value | Description | +| ---------------------- | ------------------------------------------------------------------ | +| `first_name,last_name` | Return only the `first_name` and `last_name` fields. | +| `title,author.name` | Return `title` and the related `author` item's `name` field. | +| `*` | Return all fields. | +| `*.*` | Return all fields and all immediately related fields. | +| `*,images.*` | Return all fields and all fields within the `images` relationship. | +:: + +::callout{type="info" title="Wildcards and performance"} +While wildcards are very useful, we recommend only requesting specific fields in production. By only requesting the fields you need, you can speed up the request, and reduce the overall output size. +:: + +### Many to Any Fields + +As Many to Any (M2A) fields have nested data from multiple collections, you are not always able to fetch the same field from every related collection. In M2A fields, you can use the following syntax to specify what fields to fetch from which related nested collection type: `?fields=m2a-field:collection-scope.field` + +::callout{type="info" title="Example"} +In an `posts` collection there is a Many to Any field called `sections` that points to `headings`, `paragraphs`, and `videos`. Different fields should be fetched from each related collection. + + ::snippets + #rest + ```http [GET /items/posts] + ?fields[]=title + &fields[]=sections.item:headings.title + &fields[]=sections.item:headings.level + &fields[]=sections.item:paragraphs.body + &fields[]=sections.item:videos.source + ``` + + #graphql + Use can use native GraphQL Union types. + ```graphql + query { + posts { + sections { + item { + ... on headings { + title + level + } + ... on paragraphs { + body + } + ... on videos { + source + } + } + } + } + } + ``` + + #sdk + ```js + import { createDirectus, rest, readItems } from '@directus/sdk'; + const directus = createDirectus('https://directus.example.com').with(rest()); + + const result = await directus.request( + readItems('posts', { + fields: [ + 'title', + { + sections: [ + { + item: { + headings: ['title', 'level'], + paragraphs: ['body'], + videos: ['source'], + } + } + ] + } + ], + }) + ); + ``` + :: + +:: + +## Filter + +Specify which items are returned based on the result of a [filter rule](/connect/filter-rules). + +::snippets +#rest +There are two available syntax: +```http [GET /items/posts] +?filter[title][_eq]=Hello +``` +```http [GET /items/posts] +?filter={ "title": { "_eq": "Hello" }} +``` + +#graphql +```graphql +query { + posts(filter: { title: { _eq: "Hello" } }) { + id + } +} +``` + +Attribute names in GraphQL cannot contain the `:` character. If you are filtering Many to Any fields, you will need to replace it with a double underscore. + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + filter: { + title: { + _eq: 'Hello', + }, + }, + }) +); +``` +:: + +## Search + +Search on all string and text type fields within a collection. It's an easy way to search for an item without creating complex field filters – though it is far less optimized. Related item fields are not included. + +::snippets +#rest +```http [GET /items/posts] +?search=Directus +``` + +#graphql +```graphql +query { + posts(search: "Directus") { + id + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + search: 'Directus', + }) +); +``` +:: + +## Sort + +What fields to sort results by. Sorting defaults to ascending, but appending a `-` will reverse this. Fields are prioritized by the order in the parameter. The dot notation is used to sort with values of related fields. + +::snippets +#rest +```http [GET /items/posts] +?sort=sort,-date_created,author.name +``` + +#graphql +```graphql +query { + posts(sort: ["sort", "-date_created", "author.name"]) { + id + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + sort: ['sort', '-date_created', 'author.name'], + }) +); +``` +:: + +## Limit + +Set the maximum number of items that will be returned. The default limit is set to `100`. `-1` will return all items. + +::snippets +#rest +```http [GET /items/posts] +?limit=50 +``` + +#graphql +```graphql +query { + posts(limit: 50) { + id + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + limit: 50, + }) +); +``` +:: + +::callout{type="info" title="Large limits and performance"} +Depending on the size of your collection, fetching the maximum amount of items may result in degraded performance or timeouts. + +The maximum number of items that can be requested on the API can be configured using the `QUERY_LIMIT_MAX` environment variable. This cannot be overridden by changing the value of `limit`. +:: + +## Offset + +Skip the specified number of items in the response. This parameter can be used for pagination. + +::snippets +#rest +```http [GET /items/posts] +?offset=100 +``` + +#graphql +```graphql +query { + posts(offset: 100) { + id + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + offset: 100, + }) +); +``` +:: + +## Page + +An alternative to `offset`. Returned values are the value of `limit` multiplied by `page`. The first page is `1`. + +::snippets +#rest +```http [GET /items/posts] +?page=2 +``` + +#graphql +```graphql +query { + posts(page: 2) { + id + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + page: 2, + }) +); +``` +:: + +## Aggregate + +Aggregate functions allow you to perform calculations on a set of values, returning a single result. + +| Function | Description | +| --------------- | ------------------------------------------------------------- | +| `count` | Counts how many items there are | +| `countDistinct` | Counts how many unique items there are | +| `sum` | Adds together the values in the given field | +| `sumDistinct` | Adds together the unique values in the given field | +| `avg` | Get the average value of the given field | +| `avgDistinct` | Get the average value of the unique values in the given field | +| `min` | Return the lowest value in the field | +| `max` | Return the highest value in the field | +| `countAll` | Equivalent to `?aggregate[count]=*` (GraphQL only) | + +::snippets +#rest +```http [GET /items/posts] +?aggregate[count]=* +``` + +#graphql +```graphql +query { + posts_aggregated { + countAll + } +} +``` + +#sdk +```js +import { createDirectus, rest, aggregate } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + aggregate('posts', { + aggregate: { count: '*' }, + }) +); +``` +:: + +## GroupBy + +Grouping allows for running aggregate functions based on a shared value, rather than the entire dataset. + +You can group by multiple fields simultaneously. Combined with the functions, this allows for aggregate reporting per year-month-date. + +::snippets +#rest +```http [GET /items/posts] +?aggregate[count]=views,comments +&groupBy[]=author +&groupBy[]=year(publish_date) +``` + +#graphql +```graphql +query { + posts_aggregated(groupBy: ["author", "year(publish_date)"]) { + group + count { + views + comments + } + } +} +``` + +#sdk +```js +import { createDirectus, rest, aggregate } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + aggregate('posts', { + aggregate: { + count: ['views', 'comments'] + }, + groupBy: ['authors', 'year(publish_date)'], + }) +); +``` +:: + +## Deep + +Set any query parameters on a nested relational dataset. + +::snippets +#rest +There are two available syntax: +```http [GET /items/posts] +?deep[translations][_filter][languages_code][_eq]=en-US +``` +```http [GET /items/posts] +?deep={ "translations": { "_filter": { "languages_code": { "_eq": "en-US" }}}} +``` + + +#graphql +Natively supported by GraphQL. +```graphql +query { + posts { + translations(filter: { languages_code: { _eq: "en-US" } }) { + id + } + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + deep: { + translations: { + _filter: { + languages_code: { + _eq: 'en-US', + }, + } + }, + }, + }) +); +``` +:: + +::callout{type="info" title="Example"} +Only get 3 related posts, with only the top rated comment nested: +```json +{ + "related_posts": { + "_limit": 3, + "comments": { + "_sort": "rating", + "_limit": 1 + } + } +} +``` +:: + +## Alias + +Rename fields for this request, and fetch the same nested data set multiple times using different filters. + +::snippets +#rest +```http [GET /items/posts] +?alias[all_translations]=translations +&alias[dutch_translations]=translations +&deep[dutch_translations][_filter][code][_eq]=nl-NL +``` + +#graphql +Natively supported by GraphQL. +```graphql +query { + posts { + dutch_translations: translations(filter: { code: { _eq: "nl-NL" } }) { + id + } + + all_translations: translations { + id + } + } +} +``` + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(staticToken()).with(rest()); + +const result = await directus.request( + readItems('posts', { + alias: { + all_translations: 'translations', + dutch_translations: 'translations', + }, + deep: { + dutch_translations: { + _filter: { + code: { + _eq: 'nl-NL', + }, + }, + }, + }, + }) +); +``` +:: + +## Export + +Saves the API response to a file. Valid values are `csv`, `json`, `xml`, `yaml`. + +```http [GET /items/posts] +?export=type +``` + +## Functions + +:partial{content="query-functions"} + +::snippets +#rest +```http [get /items/posts] +?filter[year(date_published)][_eq]=1968 +``` + +#graphql +```graphql +query { + posts(filter: { date_published_func: { year: { _eq: 1968 } } }) { + id + } +} +``` + +Due to GraphQL name limitations, append `_func` at the end of the field name and use the function name as the nested field. + +#sdk +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('https://directus.example.com').with(rest()); + +const result = await directus.request( + readItems('posts', { + filter: { + "year(date_published)": { + _eq: 1968 + } + }, + }) +); +``` +:: diff --git a/content/5.connect/5.errors.md b/content/5.connect/5.errors.md new file mode 100644 index 00000000..3a99bbd2 --- /dev/null +++ b/content/5.connect/5.errors.md @@ -0,0 +1,26 @@ +--- +description: Learn about Directus error codes - understand what each code means, from validation failures to rate limits exceeded. Troubleshoot issues with your API requests and resolve errors efficiently. +--- + +# Error Codes + +Below are the global error codes used within Directus, and what they mean. + +| Error Code | Status | Description | +| ------------------------ | ------ | ---------------------------------------------------------------- | +| `FAILED_VALIDATION` | 400 | Validation for this particular item failed. | +| `FORBIDDEN` | 403 | You are not allowed to do the current action. | +| `INVALID_TOKEN` | 403 | Provided token is invalid. | +| `TOKEN_EXPIRED` | 401 | Provided token is valid but has expired. | +| `INVALID_CREDENTIALS` | 401 | Username / password or access token is wrong. | +| `INVALID_IP` | 401 | Your IP address isn't allow-listed to be used with this user. | +| `INVALID_OTP` | 401 | Incorrect OTP was provided. | +| `INVALID_PAYLOAD` | 400 | Provided payload is invalid. | +| `INVALID_QUERY` | 400 | The requested query parameters can not be used. | +| `UNSUPPORTED_MEDIA_TYPE` | 415 | Provided payload format or `Content-Type` header is unsupported. | +| `REQUESTS_EXCEEDED` | 429 | You have exceeded the rate limit. | +| `ROUTE_NOT_FOUND` | 404 | Endpoint does not exist. | +| `SERVICE_UNAVAILABLE` | 503 | Could not use external service. | +| `UNPROCESSABLE_CONTENT` | 422 | You tried doing something illegal. | + +To prevent revealing which items exist, all actions for non-existing items will return a `FORBIDDEN` error. diff --git a/content/5.connect/6.sdk.md b/content/5.connect/6.sdk.md new file mode 100644 index 00000000..75ecc578 --- /dev/null +++ b/content/5.connect/6.sdk.md @@ -0,0 +1,372 @@ +--- +description: A JavaScript and TypeScript library that simplifies working with Directus. +--- + +# Directus SDK + +The Directus SDK allows to work with Directus directly in your JavaScript and TypeScript projects. The SDK is split into separate modules, giving granular control over which features to include and which can be pruned at build-time. It is lightweight and dependency-free. + +```bash +npm install @directus/sdk +``` + +## Create a Client + +The Directus SDK is a "Composable Client" that allows you to customize and build a client with the specific features you need. The client starts as an empty wrapper without any functionality. To add features, import and use the following composables: + +| Composable | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------- | +| `rest()` | Adds `.request()` method for making REST requests. | +| `graphql()` | Adds `.query()` method for making GraphQL requests. | +| `authentication()` | Adds `.login()`, `.logout()`, and `.refresh()` methods. Also adds token handling. | +| `realtime()` | Adds `.connect()`, `.subscribe()`, `.sendMessage()`, and `.onWebSocket()` methods. Also adds reconnect logic. | +| `staticToken()` | Adds `.setToken()` and `.getToken()` methods for manually managing tokens. | + +::tabs + ::tab{label="JavaScript"} + ```js + import { createDirectus, rest } from '@directus/sdk'; + const directus = createDirectus('http://directus.example.com').with(rest()); + ``` + :: + + ::tab{label="TypeScript"} + You must provide a `Schema` when creating a Directus client to make use of type hinting and completion. This schema contains definitions for each collection and provides you with type hints (on input) and completion (on output). + + ```ts + import { createDirectus, rest } from '@directus/sdk'; + + interface Post { + id: number; + title: string; + content: string; + } + + interface Schema { + posts: Post[]; + } + + const directus = createDirectus('http://directus.example.com').with(rest()); + ``` + + ::callout{type="tutorials" url="/tutorials/tips-and-tricks/advanced-types-with-the-directus-sdk"} + Learn how to create a Schema for SDK client creation. + :: + :: +:: + + +## Making Requests + +To make a request, you must create the client with the `rest()` or `graphql()` composable. If using `rest()`, you must also import and use one of the query functions. + +```js +import { createDirectus, rest, readItems } from '@directus/sdk'; +const directus = createDirectus('http://directus.example.com').with(rest()); + +const allPosts = await directus.request(readItems('posts')); + +const somePosts = await directus.request( + readItems('posts', { + filter: { status: { _eq: 'published' } }, + sort: ['-date_created'], + fields: ['id', 'title', 'date_created'], + limit: 3 + }) +); +``` + +::callout{type="info" title="Breakdown of snippet" :toggleable="true"} +- Imports + - `createDirectus` is required to create a client. + - `rest` is required to make REST requests, and adds the `.request()` method. + - `readItems` is a query function which fetches +- Creating the client + - A new client is created and held in the `directus` variable. + - `createDirectus` requires the valid URL of a Directus project. + - The client is created with the `rest()` composable. +- Requests + - `allPosts` makes a request to `readItems` in the `posts` collection. + - `somePosts` does the same, but only the specified fields from the latest 3 published items. +:: + +::callout{type="api-reference" url="/api#tag/items"} +The API Reference contains SDK examples for endpoints, showing the required function usage. +:: + +::callout{type="dev-docs" url="/connect/query-parameters"} +See all query parameters with SDK examples. +:: + +### Custom Endpoints + +To call custom endpoints using the SDK, you can manually provide a path and method. If using TypeScript, you can type the output. + +::tabs + ::tab{label="JavaScript"} + + ```js + import { createDirectus, rest } from '@directus/sdk'; + const directus = createDirectus('http://directus.example.com').with(rest()); + + const result = await directus.request(() => ({ + path: '/custom/endpoint', + method: 'GET', + })); + ``` + + :: + + ::tab{label="TypeScript"} + ```ts + import { createDirectus, rest, customEndpoint } from '@directus/sdk'; + const directus = createDirectus('http://directus.example.com').with(rest()); + + const result = await directus.request(customEndpoint({ + path: '/custom/endpoint', + method: 'GET', + })); + ``` + :: +:: + +### GraphQL Usage + +Add the `graphql()` composable to the client, and use the `.query()` method. + +```ts +import { createDirectus, graphql } from '@directus/sdk'; + +interface Post { + id: number; + title: string; + content: string; +} + +interface Schema { + posts: Post[]; +} + +const directus = createDirectus('http://directus.example.com').with(graphql()); + +const result = await directus.query(` + query { + posts { + id + title + content + } + } +`); +``` + +## Authentication + +The `authentication()` composable provides the Directus client with new `login()`, `logout()`, and `refresh()` methods. It also manages token storage and refreshing on your behalf. + +```js +import { createDirectus, authentication } from '@directus/sdk'; +const directus = createDirectus('http://directus.example.com').with(authentication()); + +await directus.login(email, password, login_options); +await directus.refresh(); +await directus.logout(); +``` + +This approach will handle refreshing of the token automatically. The current token is stored inside the initialized client. + +### Login Options + +The login options object contains three optional parameters to control the behavior of the request. + +```ts +type LoginOptions = { + otp?: string; + mode?: AuthenticationMode; + provider?: string; +}; +``` + +- `otp` contains the user's one-time-password if two-factor authentication is enabled. +- `mode` defines how the refresh token is returned. One of `json`, `cookie` or `session`. Defaults to `cookie`. +- `provider` allows a specific authentication provider to be used. This is unavailable for SSO that relies on browser redirects. + +### Token Management + +#### Set Token + +::tabs + ::tab{label="Create client with token"} + Import `staticToken` and use it when creating a client. + + ```js + import { createDirectus, staticToken, rest } from '@directus/sdk'; + const directus = createDirectus('http://directus.example.com') + .with(staticToken('TOKEN')) + .with(rest()); + ``` + :: + + ::tab{label="Token for single requests"} + Import `withToken` and use it as a request function with your token as the first parameter, and your original request as the second. + + ```js + import { createDirectus, rest, withToken, readItems } from '@directus/sdk'; + const directus = createDirectus('http://directus.example.com').with(rest()); + + const request = await directus.request( + withToken('TOKEN', readItems('posts')) + ); + ``` + :: + + ::tab{label="Set client token manually"} + Import `authentication` or `staticToken` and use it when creating a client. You now have access to the `setToken` method. + + ```js + import { createDirectus, authentication } from '@directus/sdk'; + const directus = createDirectus('http://directus.example.com').with(authentication()); + + await directus.setToken('TOKEN'); + ``` + :: +:: + +#### Get a Token + +Import `authentication` or `staticToken` and use it when creating a client. You now have access to the `getToken` method. + +```js +import { createDirectus, authentication } from '@directus/sdk'; +const directus = createDirectus('http://directus.example.com').with(authentication()); + +const token = await directus.getToken(); +``` + +### Configure Custom Storage + +Internally, `getToken()` and `setToken()` make use of the configurable storage, which can be customized for your environment's needs. There must be a `get()` and `set()` method exposed, and the `AuthData` type returned. + +::callout{type="info" title="Example"} +Instead of storing `AuthData` in an object in the browser, this custom storage implementation stores and retrieves data in `localStorage`: + +```js +import { createDirectus, authentication } from '@directus/sdk'; + +class LocalStorage { + get() { + return JSON.parse(localStorage.getItem("directus-data")); + } + set(data) { + localStorage.setItem("directus-data", JSON.stringify(data)); + } +} + +const storage = new LocalStorage(); +const directus = createDirectus('http://directus.example.com') + .with(authentication('json', { storage })); + +// Set a long term or static token without expiry information. +directus.setToken('TOKEN'); + +// Set custom credentials to the storage. +storage.set({ + access_token: 'token', + refresh_token: 'token', + expires_at: 123456789 +}); +``` +:: + +### Cross-Domain Cookies + +A common situation is for the Directus backend and frontend to be hosted on different domains, requiring extra configuration to make sure cookies are passed correctly. Usually this is only required for authentication with cookies but this can be set globally for each composable that does requests. This will then apply to all requests made using that composable: + +```js +const directus = createDirectus('http://directus.example.com') + .with(authentication('cookie', { credentials: 'include' })) + .with(graphql({ credentials: 'include' })) + .with(rest({ credentials: 'include' })); +``` + +Or you can enable this only for specific REST requests using the `withOptions`: + +```js +const result = await directus.request( + withOptions(refresh(), { credentials: 'include' }) +); +``` + +## Realtime + +The Directus SDK makes it easier to work with :product-link{product="realtime"} by adding `.connect()`, `.subscribe()`, `.sendMessage()`, and `.onWebSocket()` methods. It also handles reconnect logic. + +::callout{type="dev-docs" url="/realtime/quickstart"} +Read the Directus Realtime quickstart. +:: + +## Global APIs + +To keep the SDK dependency-free, it does rely on the APIs mentioned below, which originally came from the browser ecosystem and may not be available in all environments. + +### The `fetch` API + +This API is shipped with almost every modern runtime. Nevertheless, there might be reasons to overwrite or set the implementation, for example, if an alternative implementation is preferred or if you actually work with a special runtime where `fetch` is not available. + +- [`node-fetch`](https://www.npmjs.com/package/node-fetch) +- [`ofetch`](https://www.npmjs.com/package/ofetch) +- [`whatwg-fetch`](https://www.npmjs.com/package/whatwg-fetch) + +### The `URL` API + +This API is shipped with almost every modern runtime. However, there are exceptions, like `react-native`, that require a polyfill for the SDK to work. + +- [`url-polyfill`](https://www.npmjs.com/package/url-polyfill) +- [`react-native-url-polyfill`](https://www.npmjs.com/package/react-native-url-polyfill) + +### The `WebSocket` API + +This API is optional if you're not making use of the `realtime()` features in the SDK. Backend JavaScript environments often do not ship with an implementation of WebSockets. + +- [`ws`](https://www.npmjs.com/package/ws) +- [`isomorphic-ws`](https://www.npmjs.com/package/isomorphic-ws) + +### The `logger` API + +This API is optional and currently only used for debugging `realtime()` features. This will default to the `Console` however in environments where this isn't shipped you can overwrite this with any logger. + +### Polyfilling + +There are two polyfilling approaches, with the first taking precedence. + +#### Options Parameter of `createDirectus` + +```js +import { createDirectus } from '@directus/sdk'; +import { ofetch } from 'ofetch'; +import WebSocket from 'ws'; + +const directus = createDirectus('http://directus.example.com', { + globals: { + WebSocket: WebSocket, + fetch: ofetch, + } +}); +``` + +#### `globalThis` object + +```js +import { createDirectus } from '@directus/sdk'; +import { ofetch } from 'ofetch'; +import WebSocket from 'ws'; + +globalThis.WebSocket = WebSocket; +globalThis.fetch = ofetch; + +import 'react-native-url-polyfill/auto'; + +const directus = createDirectus('http://directus.example.com'); +``` + +Polyfill libraries will often register itself to the `globalThis` object. For example, the `react-native-url-polyfill` package. \ No newline at end of file diff --git a/content/5.connect/_dir.yml b/content/5.connect/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/5.connect/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/6.files/1.quickstart.md b/content/6.files/1.quickstart.md new file mode 100644 index 00000000..504118be --- /dev/null +++ b/content/6.files/1.quickstart.md @@ -0,0 +1,63 @@ +--- +title: Quickstart +description: This guide will cover importing a file via URL, requesting assets, and using transformation parameters. +--- + +# Files Quickstart + +:video-embed{type="directus-tv" id="43612e4c-1bd9-411e-bd73-9c835a9b51e0"} +
    + +This guide will cover importing a file via URL, requesting assets, and using transformation parameters. + +:directus-cloud + +## Import a File + +In the module bar, click :icon{name="material-symbols:folder-outline-rounded"} to go to the files module. Click the :icon{name="material-symbols:add"} button and :icon{name="material-symbols:link"} to import a file via URL. + +Use `https://directus.io/docs/img/examples/files-import.png` and the file will be uploaded to your asset storage. + +## Access a File + +The uploaded file is immediately available via the Data Studio for users with the correct access control. From here, you can download, edit, or replace files. + + + +You can access files via URL in your applications by using the following URL pattern: + +``` +https://example.directus.app/assets/?access_token=token +``` + +The token must belong to a user who has access to read files in the `directus_files` collection. If the public role has read access, you can omit the `access_token` parameter. + +::callout{type="dev-docs" title="Access Control" url="/auth/access-control"} +Learn how to limit access to data in your project through custom permissions. +:: + +## Transform an Image + +Directus can transform images via query parameters, commonly used to provide the most suitable size and file format. + +Add the following query parameter to the end of your file URL: + +``` +width=200 +``` + +Your new URL should look like this: + +``` +https://example.directus.app/assets/?access_token=token&width=200 +``` + +The asset will be transformed, saved to your asset storage, and returned to the user. On subsequent requests, the already transformed asset will be returned. + +## Next Steps + +Read more about [uploading files](/files/upload), [advanced transformations](/files/access), and then refer to the Files API reference to manage user accounts. + +::callout{type="api-reference" url="/api#tag/files"} +Explore the Files API Reference. +:: diff --git a/content/6.files/2.upload.md b/content/6.files/2.upload.md new file mode 100644 index 00000000..93cdaee5 --- /dev/null +++ b/content/6.files/2.upload.md @@ -0,0 +1,60 @@ +--- +description: Learn to upload files to Directus via both the data studio or API. +--- + +# Upload Files + +Multiple files can be uploaded simultaneously via both the data studio and via the API. File uploads are not limited to just images, they can be any kind of file. + +## Data Studio + +![The files module with a number of files visible in a gallery layout.](https://product-team.directus.app/assets/796eb265-bce2-4faa-93d0-118dac406457.png) + +By opening the files module on the left, you will see your file library, which acts as one big folder to store all uploaded files and sub-folders. + +Create a folder called `Images` and click on :icon{name="material-symbols:add-circle-outline-rounded"}. + +![The popup that appears when clicking on the upload button.](https://product-team.directus.app/assets/ec81bb5c-6dbf-4518-8684-0e5df99de013.png) + +You'll see a popup with options for uploading your file: + +- Dragging a file from your desktop. +- Clicking on the popup area to select a file from your machine. +- Clicking on the menu in the popup and selecting "**Import from URL**" + +Optionally, you can also click the file display to open the file details page and fill in information as desired. + +## API + +::snippets +#rest + +```http [POST /files] + +Body must be formatted as a `multipart/form-data` with a final property called `file`. +``` + +#graphql + +Not supported by GraphQL + +#sdk + +```js +import { createDirectus, rest, uploadFiles } from '@directus/sdk'; + +const directus = createDirectus('https://directus.example.com').with(rest()); + +const formData = new FormData(); +formData.append('file_1_property', 'Value'); +formData.append('file', raw_file); +formData.append('file_2_property', 'Value'); +formData.append('file', raw_file_2); + +const result = await directus.request(uploadFiles(formData)); +``` + +:: + +The file contents has to be provided in a property called `file`. All other properties of +the file object can be provided as well, except `filename_disk` and `filename_download`. diff --git a/content/6.files/3.manage.md b/content/6.files/3.manage.md new file mode 100644 index 00000000..ad1d7454 --- /dev/null +++ b/content/6.files/3.manage.md @@ -0,0 +1,84 @@ +--- +description: Learn to view, modify, edit and set files' focal points. +--- + +# Manage Files + +When a file is clicked in the file listing page, the file details page is shown. This is a custom form for viewing assets +and embeds, with core fields included out-of-the-box (see below), and the ability for administrators to add additional +custom fields. This page has the same features and functionality as the +item page. + +![A file details page showing an image with editable fields for title and description. File metadata is shown in the sidebar.](https://product-team.directus.app/assets/5cf9a82c-5a4b-4feb-ab61-ff6e9d10455d.png) + +## Action Buttons + +Notice the following buttons in the header: + +- :icon{name="material-symbols:check-circle"} – Saves any edits made to the file. +- :icon{name="material-symbols:tune"} – Opens the image editor. +- :icon{name="material-symbols:download"} – Downloads the file to your current device. +- :icon{name="material-symbols:drive-file-move-outline"} – Moves selected file(s) to another folder. +- :icon{name="material-symbols:delete-outline"} – Permanently removes the file and its metadata. This action is permanent and cannot be undone. + +::callout{type="info" title="Deleting Files Linked to Items"} + +By default, Directus will not allow you to delete a file until you remove it from any and all related items. However, +this behavior can be reconfigured so that files automatically update when the image is deleted by setting the relational +constraint of your file field to `SET NULL` or `CASCADE` when the file is deleted. + +:: + +## File Details + +The files collection comes pre-configured with the following fields out of the box. New fields can be created and +customized as needed in **Settings > Data Model** under the `directus_files` collection. However the pre-configured Fields cannot be changed or deleted. + +- **Preview**: a preview of the image or file. +- **Title**: a title for the File. +- **Description**: a description of the File. +- **Tags**: keywords used for search-ability. +- **Location**: an optional location _(e.g. where a photo was taken)_. +- **Storage**: which storage adapter is used to store the file asset. +- **Filename (Disk)**: This is the actual name of the file in storage. This cannot be modified. +- **Filename (Download)**: allows you to set the name of the file when it is downloaded. + +## File Sidebar + +The file sidebar also includes the following details, which are not editable and serve as metadata. + +- **Type**: the MIME type of the file, displayed in the App as a formatted media type. +- **Dimensions**: _images only_. The width and height of the image in pixels. +- **Size**: the file-size the asset takes up in the storage adapter. +- **Created**: the timestamp of when the file was uploaded to the Project. +- **Owner**: the User that uploaded the file to the Project. +- **Modified**: the timestamp of when the file was last modified. +- **Edited By**: the User that modified the File. +- **Folder**: the current parent folder that contains the File. +- **Metadata**: metadata JSON dump of the File's Exif, IPTC, and ICC information. + +## Edit an Image + +![The image editor with a number of options for editing an image, including cropping, focal points, and changing aspect ratios.](https://product-team.directus.app/assets/dc2929f8-7a5b-419f-8a31-c3ac7a45415e.png) + +Rotate, crop, flip, adjust aspect ratios, or set focal points of an image. + +1. From the **File Library**, click a file to open its detail page. +2. Click the tune button in the top right to open the image editor. +3. Make your changes and click check in the top right to save the updates. + +::callout{type="warning" title="Irreversible Change"} + +Edits overwrite the original file on disk. This can't be reversed. + +:: + +## Set a Focal Point + +By default, Directus will crop images around the center when specific sizes are requested. Focal points change the +center point to specific coordinates. + +1. From the **File Library**, click a file to open its detail page. +2. Click the tune button in the top right to open the image editor. +3. Click the location_searching button to select a focal point. +4. Make your changes and click check in the top right to save the updates. diff --git a/content/6.files/4.access.md b/content/6.files/4.access.md new file mode 100644 index 00000000..f5c840e9 --- /dev/null +++ b/content/6.files/4.access.md @@ -0,0 +1,51 @@ +--- +description: Learn how to access uploaded files, authenticate, provide optional filenames and directly download them. +--- + +# Access Files + +Folders and file information are stored in regular collections, which means [user and role access permissions](/auth/access-control) are fully configurable and granular on both folders and files. + +The location of your actual file originals is based on the project's configuration, but you can consistently access them +via the API using the following URL: + +``` +https://example.com/assets/ +https://example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4 +``` + +## Authentication + +Directus leverages stored cookies to authenticate when accessing files, when present. + +If no cookie is stored, you can use the `access_token` query parameter to authenticate, provided the token belongs to a user with the required access to read the file. + +## SEO + +You can provide an optional filename after the UUID to optimize for SEO, for example: + +``` +https://example.com/assets// +https://example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4/directus-logo.png +``` + +This optional filename is also used in the `Content-Disposition` header when the `?download` query parameter is used. + +::callout{type="warning" title="Direct File Access"} + +While you may _technically_ be able to expose your storage adapters root file system and access your raw files through +there, it is recommended that you always use the Directus API. This is the only way that you can take advantage of file +permissions and other built-in features. + +:: + +## Downloading a File + +To download an asset with the correct filename, you need to add the `?download` query parameter to the request and the +`download` attribute to your anchor tag. This will ensure the appropriate +[Content-Disposition](https://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html) headers are added. Without this, the +download will work on the _same_ domain, however it will have the file's "id" as the filename for cross-origin requests. + +Fetching transformed assets is done by adding a `key` query parameter to the original file's URL. In the Data Studio, you can +configure different asset presets that control the output of any given image. If a requested transformed asset doesn't yet +exist, it is dynamically generated and immediately returned. diff --git a/content/6.files/5.transform.md b/content/6.files/5.transform.md new file mode 100644 index 00000000..0bb26220 --- /dev/null +++ b/content/6.files/5.transform.md @@ -0,0 +1,170 @@ +--- +description: Learn how to transform files and set custom presets for these transformations. +--- + +# Transform Files + +Directus allows you to transform assets using URL query parameters. You can pass these as either query parameters to the `assets` endpoint. If a processed asset does not yet exist, it is dynamically generated, stored, and returned. + +## Custom Transformations + +| Parameter | Description | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `width` | How wide the image is in pixels. | +| `height` | How high the image is in pixels. | +| `quality` | The overall image quality (1 to 100), defaults to 100 if omitted. The higher the value, the larger the image size. The lower the value, the more compression artifacts are in the image. | +| `withoutEnlargement` | Disable automatically upscaling the image (true) | +| `format` | What file format to return the image in. One of auto, jpg, png, webp, tiff auto default if omitted, Will try to format it in webp or avif if the browser supports it, otherwise it will fallback to jpg. | +| `fit` | How the image should fit into the provided dimensions, values including:
    • **`cover` (default if omitted)**: try to fit the image into the dimensions while preserving the aspect ratio
    • **`contain`**: contain within the dimensions while using "letterboxing" to fill the rest
    • **`inside`**: Resize to be as large as possible within the dimensions
    • **`outside`**: sesize to be as small as possible within or beyond the dimensions
    | + +::callout{type="info" title="Focal Points"} + +When transforming an image with `width` and/or `height` parameters, the focal point is taken from the `focal_point_x` and `focal_point_y` coordinate values stored in the file object, cropping the image around these. This defaults to the image's centre. + +:: + +::snippets +#rest + +```http [GET /assets/c984b755-e201-497e-b0a7-24156ad9c7e0?width=300&height=300&quality=50&fit=contain] + +``` + +#graphql + +Not supported by GraphQL + +#sdk + +```js +import { createDirectus, rest, readAssetRaw } from '@directus/sdk'; + +const FILE_ID = 'c984b755-e201-497e-b0a7-24156ad9c7e0'; + +const directus = createDirectus('directus_project_url').with(rest()); + +const result = await directus.request( + readAssetRaw(FILE_ID, { + width: 300, + height: 300, + quality: 50, + fit: 'contain', + }), +); +``` + +:: + +## Advanced Transformations + +Directus allows full access to the [Sharp API](https://sharp.pixelplumbing.com/), giving you access to more complex image transformations. + +This is done using the `transforms` parameter, whose value consists of a two dimensional array. Each sub-array contains the name of the operation, followed by its arguments: `[["operation1", …arguments], ["operation2", …otherArguments]]`. + +::callout{type="info" title="REST Values"} + +When calling the REST API, datatypes like booleans need to be passed as strings. + +:: + +| sharp API Call | transforms Equivalent | +| ---------------------------------------- | -------------------------------------------------------------- | +| `.rotate(90)` | `[["rotate", 90]]` | +| `.rotate(90).blur(10).tint(255, 0, 255)` | `[["rotate", 90], ["blur", 10], ["tint", "rgb(255, 0, 255)"]]` | +| `negate({lower: 10, upper: 50})` | `[["negate", {"lower": 10, "upper": 50}]]` | + +::snippets +#rest + +```http [GET /assets/c984b755-e201-497e-b0a7-24156ad9c7e0?transforms=[["rotate", 90],["blur", 10],["tint", "rgb(255, 0, 255)"], ["negate", {"lower": 10, "upper": 50}]]] + +``` + +#graphql + +Not supported by GraphQL + +#sdk + +```js +import { createDirectus, rest, readAssetRaw } from '@directus/sdk'; + +const FILE_ID = 'c984b755-e201-497e-b0a7-24156ad9c7e0'; + +const directus = createDirectus('directus_project_url').with(rest()); + +const result = await directus.request( + readAssetRaw(FILE_ID, { + transforms: [ + ['rotate', 90], + ['blur', 10], + ['tint', 'rgb(255, 0, 255)'], + [ + 'negate', + { + lower: 10, + upper: 50, + }, + ], + ], + }), +); +``` + +:: + +Custom and advanced transformations can also be used in conjunction. + +::snippets +#rest + +```http [GET /assets/c984b755-e201-497e-b0a7-24156ad9c7e0?transforms=[["flip"]]&fit=cover&width=300&height=100] + +``` + +#graphql + +Not supported by GraphQL + +#sdk + +```js +import { createDirectus, rest, readAssetRaw } from '@directus/sdk'; + +const FILE_ID = 'c984b755-e201-497e-b0a7-24156ad9c7e0'; + +const directus = createDirectus('directus_project_url').with(rest()); + +const result = await directus.request( + readAssetRaw(FILE_ID, { + transforms: [['flip']], + fit: 'cover', + width: 300, + height: 100, + }), +); +``` + +:: + +## Preset Transformations + +In order to mitigate the creation a large number of files, you can restrict the transformations to a set of presets. You can create your own storage asset preset in the "Settings" section of your project's settings. + +The following options are available: + +- **Allowed Transformations**: for enabling, disabling, or limiting image transformations. +- **Default Folder**: sets the default folder where new assets are added. This does not affect existing files. Be aware + that fields may override this value. +- **Transformation Presets**: sets a specific image transformation configuration to simplify requests or limit usage. + - **Key**: sets unique identifier allowing faster and easier image transformation requests. + - **Fit**: contain _(keeps aspect ratio)_, Cover _(exact size)_, Fit Inside, or Fit Outside. + - **Width**: sets the width of the image. + - **Height**: sets the height of the image. + - **Quality**: adjusts the compression or quality of the image. + - **Upscaling**: when enabled, images won't be upscaled. + - **Format**: changes the output format. + - **Additional Transformations**: adds additional transformations using + [Sharp](https://sharp.pixelplumbing.com/api-constructor). + +You can then use this `key` as a parameter to when requesting a file to apply the preset. diff --git a/content/6.files/_dir.yml b/content/6.files/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/6.files/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/7.automate/1.quickstart.md b/content/7.automate/1.quickstart.md new file mode 100644 index 00000000..aa0a40b8 --- /dev/null +++ b/content/7.automate/1.quickstart.md @@ -0,0 +1,53 @@ +--- +title: Quickstart +description: Get started using flows, triggers, operations and the data chain in Directus Automate. +--- + +# Automate Quickstart + +:video-embed{type="directus-tv" id="6e6965e7-13cc-4f86-b512-f567d66cfbe9"} +
    + +This guide will cover custom event-driven data processing using Directus Automate. + +## Before You Start + +You will need a Directus project. + +:directus-cloud + +Create a `posts` collection with at least a `title` and `content` field. [Follow the Data Modeling quickstart to learn more](/data-modeling/quickstart). + +## Create a Flow + +![Create a new flow pane - including name, metadata, and option to track activity and logs.](https://product-team.directus.app/assets/3c337848-a40f-4e62-9370-c943e8d5e761.png) + +Navigate to the Flows section in the Settings module. Click on :icon{name="material-symbols:add-circle"} in the page header and name the new flow "Post Created". + +## Configure a Trigger + +![Create a new flow pane - trigger setup where the trigger is an event hook.](https://product-team.directus.app/assets/) + +Click on :icon{name="material-symbols:play-arrow"} to open trigger setup. Select "Event Hook" as the trigger type and select "Action (Non-Blocking)". This will allow you to set up this flow to respond to when an event takes place by running an action that doesn't interrupt. + +Select `items.create` as the scope, and then check the "Posts" collection. This combination means that the operation will be triggered when an post is created. + +## Configure an Operation + +![In the flow editor, the trigger connects to an operation. The operation configuration pane is open with a type of Send Notification.](https://product-team.directus.app/assets/4c072da6-b396-47ad-85ff-f300e3eb9661.png) + +Click on :icon{name="material-symbols:add-circle"} on the trigger panel. + +Here, you can create an operation. Give it the name "Notify Post Created" and the key "notify_post_created" will be written alongside. + +Select the "Send Notification" operation type. Fill in the "User" field with the UUID of your user, which can be found in the user directory. Under "Permissions", select "From Trigger", which will cause the operation to have the same permissions as those that came from the trigger itself. + +Fill in the "Subject" and "Message" fields as desired, leaving "Collection" and "Item" blank. + +When finished, click on :icon{name="material-symbols:check-circle-rounded"} in the flow's top right corner. + +Now, when you create a post, the user you entered will be notified. + +## Next Steps + +Read more about different [triggers](/automate/triggers) available in flows and how data is passed through a flow with [the data chain](/automate/data-chain), and . diff --git a/content/7.automate/2.flows.md b/content/7.automate/2.flows.md new file mode 100644 index 00000000..5d3fece7 --- /dev/null +++ b/content/7.automate/2.flows.md @@ -0,0 +1,54 @@ +--- +description: Flows enable custom, event-driven data processing and task automation within Directus. +--- + +# Flows + +Flows enable custom, event-driven data processing and task automation within Directus. Each flow is composed of one trigger, a series of operations, and a data chain that is passed between each step. + +## Fields + +- **Name (required)** — The displayed name of the Flow. +- **Status** — Sets the flow to active or inactive. +- **Icon** — Adds an icon to help quickly identify the flow. +- **Description** — Sets a brief verbal description of the flow. +- **Color** — Sets a color to help identify the flow. +- **Activity and Logs Tracking** — Selects whether the flow should be tracked in both the [activity log](auth/accountability) and the flow's logs, only in the activity log, or neither. + +## Logs + +![Logs from one flow execution. It shows the trigger payload and accountability, and the operation options and payload.](https://product-team.directus.app/assets/222e9acb-ae30-47be-b59f-0125c10fc58f.png) + +Accessible from the sidebar, logs store information for each flow execution. Each log will display information from +triggers as well as each operation in the flow. + +Logs are not a 1:1 mapping to the data chain. Each trigger and operation gets its own dropdown, which stores its +relevant data. Here's what you'll get from each of these: + +### Trigger + +- **Options** — The values you input when you configured the trigger. +- **Payload** — Displays the data appended under `$trigger`, which includes the data passed into the flow itself. +- **Accountability** — Displays data appended under `$accountability`, which is a breakdown of the permissions and request information of the user that triggered that event. + +Note that `$accountability` is not nested under the `$trigger` key. However, it is listed under the trigger in the log +because `$accountability` is generated by the trigger. + +### `` + +- **Options** — The values you input when you configured the operation.\ + _(These configuration options are not stored on the data chain)_. +- **Payload** — Displays the data appended under this ``. + +::callout{type="warning" title="Logs are stored in the database"} + +Flows configured to tracks will store this information in the database, which may require occasionally deleting. + +:: + +::callout{type="info" title="Where is `$last`?"} + +`$last` constantly updates to store the data of the most recently executed operation. Since the log shows the results of the entire flow, `$last` would only be the final +operation in the flow. + +:: diff --git a/content/7.automate/3.data-chain.md b/content/7.automate/3.data-chain.md new file mode 100644 index 00000000..35ff64e0 --- /dev/null +++ b/content/7.automate/3.data-chain.md @@ -0,0 +1,76 @@ +--- +description: Data chains are created by each flow and hold information that can be accessed within different operations. +--- + +# Data Chain + +In order for a flow's operations to track and access the same data, each flow creates its own +data chain. Every operation has access to this data chain and each operation appends some value onto +this object after it runs. This means you can dynamically access data from a previous operation or trigger in the current operation +with data chain variables. + +Each flow creates its own JSON object to store any data generated. When the flow begins, four keys are appended to the data chain: `$trigger`, `$accountability`, `$env`, and `$last`. +Then, as each operation runs, it has access to this data chain. Once an operation finishes, its data is appended under +its ``. When the operation doesn't generate data, `null` is appended under its key. + +The following is an example of a data chain. + +```json +{ + "$trigger": {}, + "$accountability": {}, + "$env": {}, + "$last": {}, + "operationKey1": "A value", + "operationKey2": { + "nestedKey": ["nested val", "nested val 2"] + }, + "operationKey3": null +} +``` + +The keys contain the following information. + +- **`$trigger`** — Contains data generated by the flow's trigger. This could include headers, access tokens, payloads, etc. Every data chain has a `$trigger key`. +- **`$accountability`** — Provides details on who/what started the flow. This could include user's id, role, ip address, etc. Every data chain has an $accountability key. +- **`$env`** — Environment variables allowed in `FLOWS_ENV_ALLOW_LIST`. This could include PUBLIC_URL, PORT, etc. Every data chain has an `$env` key. +- **`$last`** — The value appended under $last changes after each operation. It stores data of the last operation that executed in the Flow. Every data chain has a `$last` key. + +Operation keys will contain the data (if any) generated by the first operation. If none, `null` will be appeneded. It will also be common to have nested JSON data. + +Real-life examples of data chains and their data structures will vary, based on your Flow's unique configuration. + +## Data Chain Variables + +While [configuring your operations](/automate/operations), you can use keys from the data chain as variables to +access data. The syntax to do so is as follows: + +```json +"{{ $accountability }}" +``` + +This will get the data nested under the `$accountability` key, producing something like this, for example: + +```json +{ + "user": "4b11492d-631d-4b8a-bca7-2beasdfadf58b", + "role": "12c79228-5361-4905-929b-d69d3w46trs6b", + "admin": true, + "app": true, + "ip": "127.0.0.1", + "userAgent": "Amazon CloudFront" +} +``` + +You can mix your own hardcoded JSON alongside variables. You can also use dot notation and array indexing to retrieve nested values: + +```json +{ + "key0": "a hard-coded value", + "key1": "{{ $trigger.payload }}", + "key2": "{{ operationKey.payload.friend_list[0] }}" +} +``` + +Certain operations use dropdowns, toggles, checkboxes, and other input options. However, you can bypass this entirely to +input raw values directly with [Toggle to Raw Editor](/automate/operations). diff --git a/content/7.automate/4.triggers.md b/content/7.automate/4.triggers.md new file mode 100644 index 00000000..c60ece36 --- /dev/null +++ b/content/7.automate/4.triggers.md @@ -0,0 +1,176 @@ +--- +description: Triggers define the action or events that start flows. +--- + +# Triggers + +A trigger defines the event that starts a [flow](/automate/flows). This could be from an internal or external activity, such as +changes to data, logins, errors, incoming webhooks, schedules, operations from other flows, or even the click of a +button within the Data Studio. + +There are 5 types of triggers: event hook, webhook, schedule (CRON), "another flow", and manual. + +## Event Hook + +![Event hook trigger setup](https://product-team.directus.app/assets/724d4aae-7dd7-4d36-8c1c-88e8cb59a9ee.png) + +Event Hooks are triggered by events within the platform. The logic is based on [Custom API Hooks](/extensions/api-extensions/hooks). +Any data generated by the event will be nested in the `$trigger`. + +- **Type** — Choose the type of event hook: + - Filter (Blocking) — This pauses the transaction and passes the `payload` to your flow, allowing you to + validate or transform `payload` or even prevent the event transaction. + - Action (Non-Blocking) — Actions do not block the event. A non-blocking action is mostly useful for + completing tasks in response to an event, without modifying the event or slowing the API. +- **Scope** — Set the types of events that trip this trigger. +- **Collections** — Set the collections whose events trip this trigger. +- **Response Body** — This is optional and only for "Filter (Blocking)" events. It defines data to replace the + event's original `payload`. Choose to return: + - **Data of Last Operation** — Replaces event `payload` with value from `$last`. + - **All Data** — Replaces event `payload` with the entire data chain. + - **Other** — Replaces event `payload` with value from an ``. + +::callout{type="info" title="Events with Multiple Items"} + +If you create items in a single request, the flow will trigger once for each item. If you create three items, +the flow runs three separate times. On each run, just one item will be in the payload. + +:: + +### Filters + +A filter will halt the event transaction, copy the event `payload` into the flow, let the whole flow run, +optionally replace the original `payload` by configuring the response body, then resume the event's transaction to +the database. + +::callout{type="info"} + +If you're filtering on the `items.created` scope, the item itself will not have an ID, as it hasn't been created yet. + +:: + +::callout{type="info" title="Response Body"} + +If no **Response Body** is configured, the original payload will not be modified, but you'd still have the ability to +cancel the transaction. + +:: + +::callout{type="info" title="Cancelling Transactions"} + +To completely cancel a transaction, you'll need to throw an error within a +[script operation](/automate/operations) or end the Flow on a [failure path](/automate/flows). + +:: + +### Actions + +An action lets the event commit its transaction to the database without waiting for the Flow to finish. These are asynchronous, leading them to be more performant, but without the ability to validate or transform the payload before the transaction is committed to the database. However, a copy of the `payload` is still added into `$trigger` to use as needed. + +## Webhook + +![Webhook trigger setup](https://product-team.directus.app/assets/d32100e6-1238-4234-83be-93eb3427b8d2.png) + +Webhooks are triggered on an incoming HTTP request to: `/flows/trigger/:this-webhook-trigger-id` which you can copy from the webhook +trigger panel. + +- **Method** — Choose whether the Flow will be triggered by a `GET` or `POST` request from the dropdown. +- **Asynchronous** — Toggle whether or not the trigger responds asynchronously. +- **Response Body** — Optional. Defines data to return as a response. Choose to return: + - **Data of Last Operation** — Responds with value from `$last`. + - **All Data** — Responds with the entire data chain. + - **Other** — Responds with value from an ``. +- **Cache** — Choose whether responses to `GET` requests should be stored and served from cache or the cache should be + bypassed. + +::callout{type="info" title="Response Body"} + +If no data is defined in **Response Body**, the response is empty. + +:: + +::callout{type="info" title="Asynchronous"} + +If **Asynchronous** is enabled, the Flows system will immediately resolve/respond to the request without returning a +**Response Body**, which frees up the API immediately. If it is disabled, the Flows system will wait for the Flow to +finish and return whatever value is in **Response Body**. This slows the API, but lets you send data. + +:: + +## Schedule (CRON) + +![Schedule CRON trigger setup](https://product-team.directus.app/assets/f5f5d71c-462f-4a45-a6bc-6ad1ed3a8462.png) + +This trigger type enables creating data at scheduled intervals, via +[6-point cron job syntax](https://github.com/node-schedule/node-schedule#cron-style-scheduling). + +- **Interval** — Set the cron job interval to schedule when the Flow triggers. + +### Syntax Explanation + +``` + ┌────────────── second (0-59) + │ ┌──────────── minute (0-59) + │ │ ┌────────── hour (0-23) + │ │ │ ┌──────── day of month (1-31) + │ │ │ │ ┌────── month (1-12) + │ │ │ │ │ ┌──── day of week (0-7) + │ │ │ │ │ │ + │ │ │ │ │ │ + * * * * * * +``` + +## Another Flow + +![Another Flow trigger setup](https://product-team.directus.app/assets/2e6dec0e-2550-4c13-8cf0-0bca786b71cc.png) + +This trigger type executes by the trigger Flow operation, allowing chaining Flows. + +- **Response Body** — Optional. Defines data to return and append under the `` of + the trigger Flow operation that tripped the trigger. Choose to return: + - **Data of Last Operation** — Responds with value from `$last`. + - **All Data** — Responds with the entire data chain. + - **Other** — Responds with value from an ``. + +::callout{type="info" title="Flows for-loops"} + +If you pass an array to this trigger, it will run once for each item in the array. + +::: + +## Manual + +![Manual trigger setup](https://product-team.directus.app/assets/87a4a8ea-3a07-49d4-b1c4-e4a791e0b293.png) + +This trigger starts your Flow on a manual click of a button within the Data Studio. + +The manual trigger must take in item ID(s) before you can click it. On the collection page, the button will be +grayed out until you select some number of items. From the item page, the current item's ID is passed in +automatically. These item IDs are passed in to `$trigger` as an array. + +- **Collections** — Choose the Collection(s) to add the button to. +- **Location** — Choose to display the button on the [Item Page](/content/editor), + [Collection Page](/content/explore), or both. +- **Asynchronous** — Toggle whether the Flow executes asynchronously. If enabled, you can immediately trigger the Flow + again. If not, you must wait for the Flow to complete to use it again. +- **Collection Page (Requires Selection)** — Toggle whether a selection is required in the Collection Page to trigger. +- **Require Confirmation** - Toggle whether a confirmation dialog will be shown before the Flow is executed. + +After the operation runs, a toast notification will appear in your +sidebar indicating whether the Flow ran successfully. + +### Confirmation Dialog + +![A confirmation prompt dialog showing in Directus Editor](https://product-team.directus.app/assets/7ce51378-3f33-406e-9eeb-7d3ba2e22c31.png) + +If enabled, a confirmation dialog will be shown in a modal before the Flow is executed. There are further options to set +up a confirmation dialog. + +- **Confirmation Description** - Text shown at the top of the modal. +- **Confirmation Input Fields** - Set up one or more inputs to be filled by users before executing the Flow. + +Each input field can have its own data type, interface, and display options. Some convenience options are also provided +to immediately alter the user input (such as trimming whitespace and slugifying text). + +Data provided by users when triggering a manual Flow with a confirmation dialog will be accessible in `$trigger.body` in +the [data chain](/automate/data-chain). diff --git a/content/7.automate/5.operations.md b/content/7.automate/5.operations.md new file mode 100644 index 00000000..77242900 --- /dev/null +++ b/content/7.automate/5.operations.md @@ -0,0 +1,372 @@ +--- +description: Operations are individual customizable actions in a flow. +--- + +# Operations + +Operations are the individual actions in a flow. They enable you to do things like manage data within Directus, +transform the flow's data, send information off to outside services, set conditional logic, trigger other flows, and +more. + +## Condition + +![Condition operation configuration](https://product-team.directus.app/assets/be18c61d-1a80-4251-8d33-547943318f6a.png) + +A condition operation lets you choose a success path or failure path by validating data passed into it with +[Filter Rules](/connect/filter-rules). + +### Options + +- **Condition Rules** — Create conditions with [Filter Rules](/connect/filter-rules). + +### Payload + +This operation does not generate data. If the filter rule is configured properly, it will append a `null` value on its +`operationKey`, regardless of if the condition was met or not. However, if the filter rule is misconfigured, it will +append an array containing an object you can use to help debug the misconfiguration. + +::callout{type="warning"} + +When using an [Event Hook](/automate/triggers) configured to be "Filter (Blocking)", if your flow ends +with a condition that executes with a `reject` path, it will cancel your database transaction. + +:: + +## Run Script + +![Run Script operation configuration](https://product-team.directus.app/assets/85932180-168e-44d6-814d-bb29bf76a713.png) + +This operation lets you add a custom script using vanilla JavaScript or TypeScript. The script will be executed securely +in an isolated sandbox. No interactions take place between the sandbox and the host except for sharing input and output +values. This means, for example, no access to the file system and no ability to do network requests. + +### Options + +The operation provides a default function template. The optional `data` parameter lets you pass in the data chain as +an argument. + +### Payload + +The function's `return` value will be appended under its ``. + +### More Details + +As an example, let's say you have this function in a script operation, named `myScript`. + +```json +// A key from the data chain +{ + "previousOperation": { + "value": 5 + } +} +``` + +Then you add the following logic via Run Script. + +```typescript +// Your function in the myScript operation +module.exports = function (data) { + return { + timesTwo: data.previousOperation.value * 2, + }; +}; +``` + +The returned value will be appended under the `myScript` operation key. + +```json +{ + "previousOperation": { + "value": 5 + }, + "myScript": { + "timesTwo": 10 + } +} +``` + +::callout{type="info"} + +Make sure your `return` value is valid JSON. + +:: + +::callout{type="info" title="Throwing Errors"} + +If you throw an error in a Run Script operation, it will immediately break your flow chain and stop execution of +subsequent flows. If you used a ["Blocking" Event hook](/automate/triggers), throwing an error will cancel +the original event transaction to the database. + +:: + +::callout{type="info" title="Node Modules"} + +To prevent unauthorized access to the underlying server, node modules can't be used in the Run Script operation. If +you require a third party library for your custom script, you can create a custom +[operation extension](/extensions/api-extensions/operations) instead. + +:: + +## Create Data + +![Create Data operation configuration](https://product-team.directus.app/assets/6a5fbeab-fd3e-48c2-bf4b-8ba709b87878.png) + +This operation creates item(s) in a collection. + +### Options + +- **Collection** — Select the collection you'd like to create items in. +- **Permissions** — Select the scope of permissions used for this operation. +- **Emit Events** — Toggle whether the event is emitted. +- **Payload** — Defines the payload to create item(s) in a collection. + +### Payload + +An array with the ID(s) of all items created will be appended under its ``. + +::callout{type="info"} + +To learn about payload requirements when creating an item, see [API Reference > Items](/api#tag/items). + +:: + +## Read Data + +![Read Data operation configuration](https://product-team.directus.app/assets/2c56ca1f-e5ce-47c1-864d-1b7c25496870.png) + +This operation reads items from a collection and adds them onto the data chain. You may select Items by their ID or by running a query. + +### Options + +- **Permissions** — Set the scope of permissions used for this operation. +- **Collections** — Select the collection you'd like to read items from. +- **IDs** — Input the ID for items you wish to read and press enter. Click the ID to remove. +- **Query** — Select the items with a query. To learn more, see [Filter Rules](/connect/filter-rules). +- **Emit Events** — Toggle whether the event is emitted. + +### Payload + +An array containing all items read will be appended under its ``. + +## Update Data + +![Update Data operation configuration](https://product-team.directus.app/assets/62eb2117-c067-466b-a5b2-75e81dc3cad9.png) + +This operation updates item(s) in a collection. You may select item(s) to update by their ID or by running a query. + +### Options + +- **Collection** — Select the collection on which you'd like to update items in. +- **Permissions** — Set the role that this operation will inherit permissions from. +- **Emit Events** — Toggle whether the event is emitted. +- **IDs** — Input the ID for Item(s) you wish to update and press enter. Click the ID to remove. +- **Payload** — Update Items in a collection, using one of the following formats: + - Single object with data, to update items specified in IDs or Query to the same values. + - Single object with keys and data, to update multiple items to the same values. + - Array of objects with data including primary keys, to update multiple items to different values. + - To learn more, see [our Items API reference](/api#tag/items). +- **Query** — Select items to update with a query. To learn more, see [Filter Rules](/connect/filter-rules). + +### Payload + +An array containing all items updated will be appended under its ``. + +::callout{type="info"} + +To learn about `payload` requirements when updating an item, see [our Items API reference](/api#tag/items). + +:: + +## Delete Data + +![Delete Data operation configuration](https://product-team.directus.app/assets/986cbc29-01bb-4b4d-8207-b1ff1b8b4eab.png) + +This operation deletes item(s) from a collection. + +### Options + +- **Collection** — Select the collection you'd like to delete items from. +- **Permissions** — Set the scope of permissions used for this operation. +- **Emit Events** — Toggle whether the event is emitted. +- **IDs** — Set Item IDs and press enter to confirm. Click the ID to remove. +- **Query** — Select items to delete with a query. To learn more, see [Filter Rules](/api-reference/filter-rules). + +### Payload + +An array with the ID(s) of all items deleted will be appended under its ``. + + +## JSON Web Token (JWT) + +![JSON Web Token operation configuration](https://product-team.directus.app/assets/342dc05a-b963-4778-837c-94968ef86245.png) + +This operation lets you sign and verify a JSON Web Token (JWT) using the +[`jsonwebtoken`](https://www.npmjs.com/package/jsonwebtoken) package. + +### Options + +- **Operation** — Select the operation you'd like to perform. +- **Payload** — The string or JSON payload to sign. +- **Token** — The JSON Web Token to verify or decode. +- **Secret** — The secret key used to sign or verify a token. +- **Options** — The options object provided to the operation. For the list of available options, see the + [documentation of `jsonwebtoken`](https://www.npmjs.com/package/jsonwebtoken#usage). + +### Payload + +Based on the operation selected, a JSON Web Token (JWT) or `payload` will be appended under its ``. + +## Log to Console + +![Log to Console operation configuration](https://product-team.directus.app/assets/bdc87668-f651-41d5-af35-1b3b5b8cace0.png) + +This operation outputs information to the server-side console as well as the [Logs](/automate/quickstart) within the Data +Studio. This is a key tool for troubleshooting flow configuration. A log operation's key will have a null value on the +data chain. + +### Options + +- **Message** — Sets a [log message](/automate/quickstart). + +### Payload + +This operation does not generate data for the data chain as its messages are for debugging and troubleshooting. It will +append a `null` value on the `operationKey`. + +## Send Email + +![Send Email operation configuration](https://product-team.directus.app/assets/30b3f744-dc45-4f59-8c86-ca07f8e4e3be.png) + +This operation sends emails off to one or more addresses specified. + +::callout{type="warning" url="/configuration/email"} + +If you are self-hosting Directus, then you need to make sure that email capabilities are correctly configured. Read more on this. + +:: + +### Options + +- **To** — Sets the email addresses. Hit enter to save the email. Click on a pill to remove + it. +- **Subject** — Set the subject line. +- **Body** — Use a Markdown or WYSIWYG editor to create the email body. + +### Payload + +This operation does not generate data for the data chain. It will append a `null` value on the `operationKey`. + +### More Details + +::callout{type="info" title="Batch Emails"} + +You can input an array of emails in the `To` input option to send off multiple emails. + +:: + +::callout{type="info"} + +If you are testing out this operation from `localhost:8080`, be sure to check your spam box, because your email provider +may send it there automatically. + +:: + +## Send Notification + +![Send Notification operation configuration](https://product-team.directus.app/assets/fb4db8f8-41b4-4908-84f0-c06f064ced2f.png) + +This operation pushes notifications to Directus Users. If the operation executes successfully, a list containing the IDs +of all sent notifications generated is appended under this operation's key. + +### Options + +- **Users** — Define a user by their UUID. Hit enter to save it. Click on a pill to remove + it. +- **Permissions** — Define the role that this operation will inherit permissions from. +- **Title** — Set the title of the notification. +- **Message** — Set the main body of the notification. + +### Payload + +This operation does not generate data. It will append a `null` value on its `operationKey`. + +### More Details + +::callout{type="info" title="Batch Notifications"} + +You can input an array of UUIDs in the `To` input option to send off multiple notifications. + +:: + +## Webhook / Request URL + +![Webhook / Request URL operation configuration](https://product-team.directus.app/assets/103e850c-54ff-45d6-88f6-8aac7f00a617.png) + +This operation makes a request to another URL. + +### Options + +- **Method** — Choose to make a GET, POST, PATCH, DELETE, or other type of request. +- **URL** — Define the URL to send the request to. +- **Headers** — Create a new `header:value` to pass along with the request. +- **Request Body** — Set the request body's data. + +### Payload + +When an operation completes successfully, the `response` is appended under its ``. + +## Sleep + +![Sleep operation configuration](https://product-team.directus.app/assets/7942ab7e-dbf6-43dc-8a8b-77b1a229cddc.png) + +This operation creates a delay in the Flow for a given amount of milliseconds, then continues to the next operation. + +### Options + +- **Milliseconds** — Define the number of milliseconds to sleep. + +### Payload + +This operation does not generate data. It will append a `null` value on its `operationKey`. + +## Transform Payload + +![Transform Payload operation configuration](https://product-team.directus.app/assets/300dc3af-93b2-4782-b2eb-0d07aeb51c69.png) + +This operation lets you custom define your own JSON payload for use in subsequent operations. This enables you to take +multiple sources of data and consolidate them into a single payload. + +### Options + +- **JSON** — Define JSON to insert into the data chain. + +### Payload + +When an operation completes successfully, the value you defined under the JSON configuration operation is appended +onto its `operationKey`. + +## Trigger Flow + +![Trigger Flow operation configuration](https://product-team.directus.app/assets/4e26a660-0100-4f32-8e85-d5e618734c94.png) + +This operation starts another flow and (optionally) passes data into it. It should be used in combination with the +[Another Flow](/automate/triggers) trigger. + +### Options + +- **Flow** — Define a flow by its primary key UUID. +- **Payload** — Defines a JSON `payload` to pass into `$trigger` on the flow it triggered. + +### Payload + +If you've configured a response body in the trigger of the other flow, this will be appended under this +`operationKey`. If no response body is configured, `null` is appended under this `operationKey`. + +### More Details + +::callout{type="info" title="Flows for-loops"} + +If you pass an array to the other flow, the other flow will run once for each item in the array. + +:: diff --git a/content/7.automate/_dir.yml b/content/7.automate/_dir.yml new file mode 100644 index 00000000..6208269a --- /dev/null +++ b/content/7.automate/_dir.yml @@ -0,0 +1 @@ +navigation.root: true diff --git a/content/8.realtime/1.quickstart.md b/content/8.realtime/1.quickstart.md new file mode 100644 index 00000000..a071ef2f --- /dev/null +++ b/content/8.realtime/1.quickstart.md @@ -0,0 +1,120 @@ +--- +title: Quickstart +description: This guide will cover connecting to Directus via WebSockets on the web, subscribing to changes, and creating new items over the connection. +--- + +# Realtime Quickstart + +:video-embed{type="directus-tv" id="4d3c062f-0f30-41b7-83e9-3d2ed34a86f4"} +
    + +Instead of needing to make a request to see if data has changed, your application can receive updates in realtime over a persistent connection with Directus. All subscriptions and actions over a realtime connection use the permissions of the authenticated user, or public permissions if not authenticated. + +This guide will cover getting started with :product-link{product="realtime"} by connecting to Directus with the Directus SDK on the web, subscribing to changes, and creating new items. + +## Before You Start + +You will need a Directus project. + +:directus-cloud + +Create a `messages` collection with a `date_created` field enabled on collection creation. Add `text` and `user` text fields. Follow the [data modeling quickstart](/data-modeling/quickstart) to learn more. + +Add an [access policy](/auth/access-control) called **Public Posts** to your user in the Data Studio. Within it, create a new permission to allow the `read` and `create` actions on the `messages` collection. + +In the Data Studio, create a [static token](/auth/tokens-cookies) for your user, copy it, and save your user profile. + +## Enable Realtime + +Directus Realtime is disabled by default on self-hosted projects. Set the `WEBSOCKETS_ENABLED` environment variable to `true`. If you use Directus Cloud to host your project, you do not need to manually enable Realtime. + +## Connect via Directus Realtime + +Create an `index.html` file, import the Directus SDK from a CDN, create a client with the `realtime` composable, and connect. Be sure to replace your Directus project URL and access token. + +```html + + + + + + +``` + +## Subscribe to Changes + +After subscribing to collections over your connection, you will receive new messages whenever items in the collection are created, updated, or deleted. + +At the bottom of your ` + + \ No newline at end of file diff --git a/app/layouts/docs.vue b/app/layouts/docs.vue new file mode 100644 index 00000000..2516916f --- /dev/null +++ b/app/layouts/docs.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/pages/[...slug].vue b/app/pages/[...slug].vue new file mode 100644 index 00000000..2516916f --- /dev/null +++ b/app/pages/[...slug].vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file From b069039cdd7843f0923f1db5ccfb70e58de5eddc Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Mon, 16 Dec 2024 10:54:30 -0500 Subject: [PATCH 009/187] Move bak to different workspace --- .bak/.editorconfig | 16 - .bak/.env.example | 9 - .bak/.github/actions/prepare/action.yaml | 39 - .bak/.github/workflows/lint-app.yaml | 31 - .bak/.github/workflows/lint-oas.yaml | 31 - .bak/.github/workflows/typecheck.yaml | 32 - .bak/.gitignore | 29 - .bak/README.md | 1 - .bak/api-spec/components/parameters.yaml | 110 - .bak/api-spec/components/responses.yaml | 30 - .bak/api-spec/components/schemas/_index.yaml | 56 - .../api-spec/components/schemas/activity.yaml | 62 - .../components/schemas/collections.yaml | 76 - .../api-spec/components/schemas/comments.yaml | 42 - .../components/schemas/dashboards.yaml | 43 - .bak/api-spec/components/schemas/diff.yaml | 46 - .../components/schemas/extensions.yaml | 45 - .bak/api-spec/components/schemas/fields.yaml | 75 - .bak/api-spec/components/schemas/files.yaml | 114 - .bak/api-spec/components/schemas/flows.yaml | 73 - .bak/api-spec/components/schemas/folders.yaml | 26 - .bak/api-spec/components/schemas/items.yaml | 7 - .../components/schemas/notifications.yaml | 44 - .../components/schemas/operations.yaml | 63 - .bak/api-spec/components/schemas/panels.yaml | 70 - .../components/schemas/permissions.yaml | 45 - .../api-spec/components/schemas/policies.yaml | 58 - .bak/api-spec/components/schemas/presets.yaml | 59 - .bak/api-spec/components/schemas/query.yaml | 40 - .../components/schemas/relations.yaml | 43 - .../components/schemas/revisions.yaml | 49 - .bak/api-spec/components/schemas/roles.yaml | 52 - .bak/api-spec/components/schemas/schema.yaml | 21 - .../api-spec/components/schemas/settings.yaml | 230 - .bak/api-spec/components/schemas/shares.yaml | 64 - .../components/schemas/translations.yaml | 20 - .bak/api-spec/components/schemas/users.yaml | 140 - .../api-spec/components/schemas/versions.yaml | 57 - .../components/schemas/x-metadata.yaml | 8 - .bak/api-spec/components/security.yaml | 8 - .bak/api-spec/index.yaml | 295 - .../paths/activity/_id/getActivity.yaml | 41 - .bak/api-spec/paths/activity/_id/index.yaml | 2 - .../paths/activity/getActivities.yaml | 49 - .bak/api-spec/paths/activity/index.yaml | 2 - .bak/api-spec/paths/assets/_id/getAsset.yaml | 50 - .bak/api-spec/paths/assets/_id/index.yaml | 2 - .bak/api-spec/paths/auth/login/index.yaml | 2 - .bak/api-spec/paths/auth/login/login.yaml | 85 - .bak/api-spec/paths/auth/logout/index.yaml | 2 - .bak/api-spec/paths/auth/logout/logout.yaml | 59 - .../paths/auth/oauth/_provider/index.yaml | 2 - .../auth/oauth/_provider/oauthProvider.yaml | 37 - .bak/api-spec/paths/auth/oauth/index.yaml | 2 - .bak/api-spec/paths/auth/oauth/oauth.yaml | 37 - .../paths/auth/password/request/index.yaml | 2 - .../password/request/passwordRequest.yaml | 51 - .../paths/auth/password/reset/index.yaml | 2 - .../auth/password/reset/passwordReset.yaml | 55 - .bak/api-spec/paths/auth/refresh/index.yaml | 2 - .bak/api-spec/paths/auth/refresh/refresh.yaml | 75 - .../collections/_id/deleteCollection.yaml | 38 - .../paths/collections/_id/getCollection.yaml | 45 - .../api-spec/paths/collections/_id/index.yaml | 6 - .../collections/_id/updateCollection.yaml | 126 - .../paths/collections/createCollection.yaml | 127 - .../paths/collections/getCollections.yaml | 42 - .bak/api-spec/paths/collections/index.yaml | 4 - .../paths/comments/_id/deleteComment.yaml | 32 - .../paths/comments/_id/getComment.yaml | 39 - .bak/api-spec/paths/comments/_id/index.yaml | 6 - .../paths/comments/_id/updateComment.yaml | 46 - .../paths/comments/createComments.yaml | 59 - .../paths/comments/deleteComments.yaml | 39 - .bak/api-spec/paths/comments/getComments.yaml | 48 - .bak/api-spec/paths/comments/index.yaml | 8 - .../paths/comments/updateComments.yaml | 62 - .../paths/dashboards/_id/deleteDashboard.yaml | 36 - .../paths/dashboards/_id/getDashboard.yaml | 44 - .bak/api-spec/paths/dashboards/_id/index.yaml | 6 - .../paths/dashboards/_id/updateDashboard.yaml | 50 - .../paths/dashboards/createDashboards.yaml | 57 - .../paths/dashboards/deleteDashboards.yaml | 37 - .../paths/dashboards/getDashboards.yaml | 49 - .bak/api-spec/paths/dashboards/index.yaml | 8 - .../paths/dashboards/updateDashboards.yaml | 63 - .../paths/extensions/_bundle/_name/index.yaml | 2 - .../_bundle/_name/updateExtensionBundle.yaml | 61 - .../paths/extensions/_name/index.yaml | 2 - .../extensions/_name/updateExtensions.yaml | 58 - .bak/api-spec/paths/extensions/index.yaml | 2 - .../paths/extensions/listExtensions.yaml | 37 - .../fields/_collection/_id/deleteField.yaml | 43 - .../_collection/_id/getCollectionField.yaml | 50 - .../paths/fields/_collection/_id/index.yaml | 6 - .../fields/_collection/_id/updateField.yaml | 224 - .../paths/fields/_collection/createField.yaml | 231 - .../_collection/getCollectionFields.yaml | 47 - .../paths/fields/_collection/index.yaml | 4 - .bak/api-spec/paths/fields/getFields.yaml | 42 - .bak/api-spec/paths/fields/index.yaml | 2 - .bak/api-spec/paths/files/_id/deleteFile.yaml | 30 - .bak/api-spec/paths/files/_id/getFile.yaml | 37 - .bak/api-spec/paths/files/_id/index.yaml | 6 - .bak/api-spec/paths/files/_id/updateFile.yaml | 54 - .bak/api-spec/paths/files/deleteFiles.yaml | 40 - .bak/api-spec/paths/files/getFiles.yaml | 47 - .../paths/files/import/importFile.yaml | 50 - .bak/api-spec/paths/files/import/index.yaml | 3 - .bak/api-spec/paths/files/index.yaml | 8 - .bak/api-spec/paths/files/updateFiles.yaml | 65 - .bak/api-spec/paths/files/uploadFile.yaml | 43 - .bak/api-spec/paths/flows/_id/deleteFlow.yaml | 32 - .bak/api-spec/paths/flows/_id/getFlow.yaml | 39 - .bak/api-spec/paths/flows/_id/index.yaml | 6 - .bak/api-spec/paths/flows/_id/updateFlow.yaml | 47 - .bak/api-spec/paths/flows/createFlows.yaml | 59 - .bak/api-spec/paths/flows/deleteFlows.yaml | 36 - .bak/api-spec/paths/flows/getFlows.yaml | 49 - .bak/api-spec/paths/flows/index.yaml | 8 - .../paths/flows/trigger/_id/index.yaml | 4 - .../flows/trigger/_id/triggerFlowGET.yaml | 36 - .../flows/trigger/_id/triggerFlowPOST.yaml | 44 - .bak/api-spec/paths/flows/updateFlows.yaml | 63 - .../paths/folders/_id/deleteFolder.yaml | 32 - .../api-spec/paths/folders/_id/getFolder.yaml | 41 - .bak/api-spec/paths/folders/_id/index.yaml | 6 - .../paths/folders/_id/updateFolder.yaml | 55 - .../api-spec/paths/folders/createFolders.yaml | 59 - .../api-spec/paths/folders/deleteFolders.yaml | 36 - .bak/api-spec/paths/folders/getFolders.yaml | 49 - .bak/api-spec/paths/folders/index.yaml | 8 - .../api-spec/paths/folders/updateFolders.yaml | 76 - .../items/_collection/_id/deleteItem.yaml | 36 - .../_collection/_id/getCollectionItem.yaml | 45 - .../paths/items/_collection/_id/index.yaml | 7 - .../items/_collection/_id/updateItem.yaml | 51 - .../paths/items/_collection/createItems.yaml | 59 - .../paths/items/_collection/deleteItems.yaml | 59 - .../items/_collection/getCollectionItems.yaml | 51 - .../paths/items/_collection/index.yaml | 8 - .../_collection/singleton/getSingleton.yaml | 47 - .../items/_collection/singleton/index.yaml | 4 - .../singleton/updateSingleton.yaml | 48 - .../paths/items/_collection/updateItems.yaml | 64 - .../notifications/_id/deleteNotification.yaml | 36 - .../notifications/_id/getNotification.yaml | 44 - .../paths/notifications/_id/index.yaml | 6 - .../notifications/_id/updateNotification.yaml | 50 - .../notifications/createNotifications.yaml | 57 - .../notifications/deleteNotifications.yaml | 45 - .../paths/notifications/getNotifications.yaml | 49 - .bak/api-spec/paths/notifications/index.yaml | 8 - .../notifications/updateNotifications.yaml | 63 - .../paths/operations/_id/deleteOperation.yaml | 32 - .../paths/operations/_id/getOperation.yaml | 44 - .bak/api-spec/paths/operations/_id/index.yaml | 8 - .../operations/_id/triggerOperation.yaml | 40 - .../paths/operations/_id/updateOperation.yaml | 47 - .../paths/operations/createOperations.yaml | 60 - .../paths/operations/deleteOperations.yaml | 36 - .../paths/operations/getOperations.yaml | 50 - .bak/api-spec/paths/operations/index.yaml | 8 - .../paths/operations/updateOperations.yaml | 61 - .../paths/panels/_id/deletePanel.yaml | 36 - .bak/api-spec/paths/panels/_id/getPanel.yaml | 44 - .bak/api-spec/paths/panels/_id/index.yaml | 6 - .../paths/panels/_id/updatePanel.yaml | 50 - .bak/api-spec/paths/panels/createPanels.yaml | 57 - .bak/api-spec/paths/panels/deletePanels.yaml | 37 - .bak/api-spec/paths/panels/getPanels.yaml | 49 - .bak/api-spec/paths/panels/index.yaml | 8 - .bak/api-spec/paths/panels/updatePanels.yaml | 63 - .../permissions/_id/deletePermission.yaml | 32 - .../paths/permissions/_id/getPermission.yaml | 41 - .../api-spec/paths/permissions/_id/index.yaml | 6 - .../permissions/_id/updatePermission.yaml | 110 - .../paths/permissions/createPermissions.yaml | 63 - .../paths/permissions/deletePermissions.yaml | 36 - .../paths/permissions/getPermissions.yaml | 50 - .bak/api-spec/paths/permissions/index.yaml | 8 - .../_collection/_id/getItemPermissions.yaml | 59 - .../permissions/me/_collection/_id/index.yaml | 2 - .../permissions/me/getUserPermissions.yaml | 60 - .bak/api-spec/paths/permissions/me/index.yaml | 2 - .../paths/permissions/updatePermissions.yaml | 62 - .../paths/policies/_id/deletePolicy.yaml | 36 - .../paths/policies/_id/getPolicy.yaml | 44 - .bak/api-spec/paths/policies/_id/index.yaml | 6 - .../paths/policies/_id/updatePolicy.yaml | 50 - .../paths/policies/createPolicies.yaml | 57 - .../paths/policies/deletePolicies.yaml | 37 - .bak/api-spec/paths/policies/getPolicies.yaml | 49 - .bak/api-spec/paths/policies/index.yaml | 8 - .../paths/policies/updatePolicies.yaml | 62 - .../paths/presets/_id/deletePreset.yaml | 30 - .../api-spec/paths/presets/_id/getPreset.yaml | 39 - .bak/api-spec/paths/presets/_id/index.yaml | 6 - .../paths/presets/_id/updatePreset.yaml | 92 - .../api-spec/paths/presets/createPresets.yaml | 59 - .../api-spec/paths/presets/deletePresets.yaml | 36 - .bak/api-spec/paths/presets/getPresets.yaml | 48 - .bak/api-spec/paths/presets/index.yaml | 8 - .../api-spec/paths/presets/updatePresets.yaml | 113 - .../_collection/getRelationByCollection.yaml | 39 - .../paths/relations/_collection/index.yaml | 3 - .../paths/relations/_id/deleteRelation.yaml | 32 - .../paths/relations/_id/getRelation.yaml | 41 - .bak/api-spec/paths/relations/_id/index.yaml | 6 - .../paths/relations/_id/updateRelation.yaml | 65 - .../paths/relations/createRelation.yaml | 67 - .../paths/relations/getRelations.yaml | 51 - .bak/api-spec/paths/relations/index.yaml | 4 - .../paths/revisions/_id/getRevision.yaml | 41 - .bak/api-spec/paths/revisions/_id/index.yaml | 2 - .../paths/revisions/getRevisions.yaml | 53 - .bak/api-spec/paths/revisions/index.yaml | 2 - .bak/api-spec/paths/roles/_id/deleteRole.yaml | 32 - .bak/api-spec/paths/roles/_id/getRole.yaml | 39 - .bak/api-spec/paths/roles/_id/index.yaml | 6 - .bak/api-spec/paths/roles/_id/updateRole.yaml | 68 - .bak/api-spec/paths/roles/createRoles.yaml | 59 - .bak/api-spec/paths/roles/deleteRoles.yaml | 36 - .bak/api-spec/paths/roles/getRoles.yaml | 50 - .bak/api-spec/paths/roles/index.yaml | 8 - .bak/api-spec/paths/roles/updateRoles.yaml | 85 - .bak/api-spec/paths/schema/apply/index.yaml | 2 - .../paths/schema/apply/schemaApply.yaml | 189 - .bak/api-spec/paths/schema/diff/index.yaml | 2 - .../paths/schema/diff/schemaDiff.yaml | 120 - .../api-spec/paths/schema/snapshot/index.yaml | 2 - .../paths/schema/snapshot/schemaSnapshot.yaml | 38 - .bak/api-spec/paths/server/health/index.yaml | 2 - .../paths/server/health/serverHealth.yaml | 51 - .bak/api-spec/paths/server/info/index.yaml | 2 - .../paths/server/info/serverInfo.yaml | 46 - .bak/api-spec/paths/server/ping/index.yaml | 2 - .bak/api-spec/paths/server/ping/ping.yaml | 32 - .../paths/server/specs/graphql/index.yaml | 2 - .../server/specs/graphql/readGraphqlSdl.yaml | 30 - .../paths/server/specs/oas/index.yaml | 2 - .../server/specs/oas/readOpenApiSpec.yaml | 35 - .bak/api-spec/paths/settings/getSettings.yaml | 42 - .bak/api-spec/paths/settings/index.yaml | 4 - .../paths/settings/updateSettings.yaml | 46 - .../paths/shares/_id/deleteShare.yaml | 36 - .bak/api-spec/paths/shares/_id/getShare.yaml | 44 - .bak/api-spec/paths/shares/_id/index.yaml | 6 - .../paths/shares/_id/updateShare.yaml | 50 - .../shares/_share/getPublicShareInfo.yaml | 40 - .bak/api-spec/paths/shares/_share/index.yaml | 2 - .../paths/shares/auth/authenticateShare.yaml | 73 - .bak/api-spec/paths/shares/auth/index.yaml | 2 - .bak/api-spec/paths/shares/createShares.yaml | 57 - .bak/api-spec/paths/shares/deleteShares.yaml | 37 - .bak/api-spec/paths/shares/getShares.yaml | 49 - .bak/api-spec/paths/shares/index.yaml | 8 - .../paths/shares/info/_id/getShareInfo.yaml | 40 - .../api-spec/paths/shares/info/_id/index.yaml | 2 - .bak/api-spec/paths/shares/invite/index.yaml | 2 - .../paths/shares/invite/inviteShare.yaml | 41 - .bak/api-spec/paths/shares/updateShares.yaml | 63 - .../translations/_id/deleteTranslation.yaml | 34 - .../translations/_id/getTranslation.yaml | 42 - .../paths/translations/_id/index.yaml | 6 - .../translations/_id/updateTranslation.yaml | 48 - .../translations/createTranslations.yaml | 55 - .../translations/deleteTranslations.yaml | 35 - .../paths/translations/getTranslations.yaml | 47 - .bak/api-spec/paths/translations/index.yaml | 8 - .../translations/updateTranslations.yaml | 58 - .bak/api-spec/paths/users/_id/deleteUser.yaml | 32 - .bak/api-spec/paths/users/_id/getUser.yaml | 41 - .bak/api-spec/paths/users/_id/index.yaml | 6 - .bak/api-spec/paths/users/_id/updateUser.yaml | 46 - .bak/api-spec/paths/users/createUsers.yaml | 61 - .bak/api-spec/paths/users/deleteUsers.yaml | 36 - .bak/api-spec/paths/users/getUsers.yaml | 49 - .bak/api-spec/paths/users/index.yaml | 8 - .../users/invite/accept/acceptInvite.yaml | 47 - .../paths/users/invite/accept/index.yaml | 2 - .bak/api-spec/paths/users/invite/index.yaml | 2 - .bak/api-spec/paths/users/invite/invite.yaml | 51 - .bak/api-spec/paths/users/me/getMe.yaml | 40 - .bak/api-spec/paths/users/me/index.yaml | 4 - .../paths/users/me/tfa/disable/index.yaml | 2 - .../users/me/tfa/disable/meTfaDisable.yaml | 41 - .../paths/users/me/tfa/enable/index.yaml | 2 - .../users/me/tfa/enable/meTfaEnable.yaml | 45 - .../tfa/generate/generateTwoFactorSecret.yaml | 52 - .../paths/users/me/tfa/generate/index.yaml | 2 - .../paths/users/me/track/page/index.yaml | 2 - .../me/track/page/updateLastUsedPageMe.yaml | 24 - .bak/api-spec/paths/users/me/updateMe.yaml | 40 - .bak/api-spec/paths/users/register/index.yaml | 2 - .../paths/users/register/registerUser.yaml | 57 - .../register/verify-email/_token/index.yaml | 2 - .../_token/registerUserVerify.yaml | 37 - .bak/api-spec/paths/users/updateUsers.yaml | 59 - .../paths/utils/cache/clear/clear-cache.yaml | 24 - .../paths/utils/cache/clear/index.yaml | 2 - .../utils/export/_collection/export.yaml | 66 - .../paths/utils/export/_collection/index.yaml | 2 - .../utils/hash/generate/hash-generate.yaml | 45 - .../paths/utils/hash/generate/index.yaml | 2 - .../paths/utils/hash/verify/hash-verify.yaml | 48 - .../paths/utils/hash/verify/index.yaml | 2 - .../utils/import/_collection/import.yaml | 41 - .../paths/utils/import/_collection/index.yaml | 2 - .../paths/utils/random/string/index.yaml | 2 - .../paths/utils/random/string/random.yaml | 41 - .../paths/utils/sort/_collection/index.yaml | 2 - .../paths/utils/sort/_collection/sort.yaml | 44 - .../_id/compare/compareContentVersion.yaml | 35 - .../paths/versions/_id/compare/index.yaml | 2 - .../versions/_id/deleteContentVersion.yaml | 32 - .../paths/versions/_id/getContentVersion.yaml | 41 - .bak/api-spec/paths/versions/_id/index.yaml | 6 - .../paths/versions/_id/promote/index.yaml | 2 - .../_id/promote/promoteContentVersion.yaml | 46 - .../paths/versions/_id/save/index.yaml | 2 - .../versions/_id/save/saveContentVersion.yaml | 35 - .../versions/_id/updateContentVersion.yaml | 47 - .../paths/versions/createContentVersions.yaml | 57 - .../paths/versions/deleteContentVersions.yaml | 36 - .../paths/versions/getContentVersions.yaml | 49 - .bak/api-spec/paths/versions/index.yaml | 8 - .../paths/versions/updateContentVersions.yaml | 63 - .bak/app/app.vue | 35 - .bak/app/assets/css/_reset.scss | 40 - .bak/app/assets/css/_vars.scss | 58 - .bak/app/assets/css/colors.scss | 79 - .bak/app/assets/css/main.scss | 163 - .bak/app/assets/icons/frameworks/angular.svg | 3 - .bak/app/assets/icons/frameworks/apple.svg | 3 - .bak/app/assets/icons/frameworks/astro.svg | 4 - .bak/app/assets/icons/frameworks/next.svg | 3 - .bak/app/assets/icons/frameworks/nuxt.svg | 3 - .bak/app/assets/icons/frameworks/react.svg | 4 - .bak/app/assets/icons/frameworks/remix.svg | 4 - .bak/app/assets/icons/frameworks/svelte.svg | 3 - .bak/app/assets/icons/frameworks/vue.svg | 4 - .bak/app/assets/icons/products/auth-pink.svg | 16 - .../app/assets/icons/products/auth-purple.svg | 16 - .bak/app/assets/icons/products/auth-white.svg | 16 - .bak/app/assets/icons/products/auth.svg | 27 - .../assets/icons/products/automate-pink.svg | 4 - .../assets/icons/products/automate-purple.svg | 4 - .../assets/icons/products/automate-white.svg | 4 - .bak/app/assets/icons/products/automate.svg | 14 - .../assets/icons/products/connect-pink.svg | 4 - .../assets/icons/products/connect-purple.svg | 4 - .../assets/icons/products/connect-white.svg | 4 - .bak/app/assets/icons/products/connect.svg | 14 - .../app/assets/icons/products/editor-pink.svg | 16 - .../assets/icons/products/editor-purple.svg | 16 - .../assets/icons/products/editor-white.svg | 16 - .bak/app/assets/icons/products/editor.svg | 11 - .../assets/icons/products/explore-pink.svg | 4 - .../assets/icons/products/explore-purple.svg | 4 - .../assets/icons/products/explore-white.svg | 4 - .bak/app/assets/icons/products/explore.svg | 14 - .bak/app/assets/icons/products/files-pink.svg | 4 - .../assets/icons/products/files-purple.svg | 4 - .../app/assets/icons/products/files-white.svg | 4 - .bak/app/assets/icons/products/files.svg | 4 - .../assets/icons/products/insights-pink.svg | 4 - .../assets/icons/products/insights-purple.svg | 4 - .../assets/icons/products/insights-white.svg | 4 - .bak/app/assets/icons/products/insights.svg | 4 - .../icons/products/marketplace-pink.svg | 16 - .../icons/products/marketplace-purple.svg | 16 - .../icons/products/marketplace-white.svg | 16 - .../app/assets/icons/products/marketplace.svg | 27 - .../assets/icons/products/realtime-pink.svg | 4 - .../assets/icons/products/realtime-purple.svg | 4 - .../assets/icons/products/realtime-white.svg | 4 - .bak/app/assets/icons/products/realtime.svg | 4 - .bak/app/assets/img/cloud-cta-bg.svg | 506 - .bak/app/assets/img/cloud-logo.svg | 14 - .bak/app/assets/img/pink-cta-bg.svg | 687 - .bak/app/assets/img/purple-cta-bg.svg | 687 - .bak/app/assets/img/tv-logo.svg | 1 - .bak/app/components/Button.vue | 134 - .bak/app/components/DefaultLayout.vue | 16 - .bak/app/components/LayoutFooter.vue | 380 - .bak/app/components/NavTree.vue | 99 - .bak/app/components/OgImage/Default.vue | 81 - .bak/app/components/articles/ArticlesCard.vue | 117 - .../articles/ArticlesCategoryNav.vue | 56 - .bak/app/components/articles/ArticlesGrid.vue | 29 - .../components/articles/ArticlesLayout.vue | 84 - .../articles/ArticlesTagsFilter.vue | 84 - .bak/app/components/aside/AsideFeedback.vue | 85 - .bak/app/components/aside/AsideNav.vue | 61 - .bak/app/components/aside/AsideNewsletter.vue | 113 - .bak/app/components/aside/AsideSlideover.vue | 78 - .../components/aside/AsideTableOfContents.vue | 47 - .bak/app/components/aside/AsideWidget.vue | 81 - .bak/app/components/content/ArticleCards.vue | 39 - .bak/app/components/content/Badge.vue | 59 - .bak/app/components/content/Box.vue | 16 - .bak/app/components/content/Callout.vue | 212 - .bak/app/components/content/DirectusCloud.vue | 54 - .bak/app/components/content/DirectusImage.vue | 24 - .../components/content/EngineStudioBox.vue | 121 - .../components/content/HeaderWithBadge.vue | 43 - .bak/app/components/content/ListChildren.vue | 17 - .bak/app/components/content/Partial.vue | 23 - .bak/app/components/content/ProductLink.vue | 107 - .bak/app/components/content/ProsePre.vue | 77 - .bak/app/components/content/ProseTable.vue | 17 - .bak/app/components/content/Snippets.vue | 13 - .bak/app/components/content/Tab.vue | 6 - .bak/app/components/content/Tabs.vue | 116 - .bak/app/components/content/VideoEmbed.vue | 90 - .bak/app/components/header/HeaderBanner.vue | 53 - .bak/app/components/header/HeaderHat.vue | 120 - .bak/app/components/header/HeaderHero.vue | 228 - .bak/app/components/header/HeaderLogo.vue | 64 - .bak/app/components/header/HeaderNav.vue | 163 - .../app/components/header/HeaderSlideover.vue | 283 - .../components/pages/ArticleArea.global.vue | 98 - .../pages/ArticleCategory.global.vue | 114 - .../components/pages/ArticlePage.global.vue | 292 - .../pages/DocumentationPage.global.vue | 184 - .../components/search/SearchButton.client.vue | 92 - .bak/app/composables/data.ts | 54 - .bak/app/composables/tags.ts | 34 - .bak/app/pages/[...slug].vue | 81 - .bak/app/pages/api/index.vue | 240 - .bak/app/plugins/format-title.ts | 12 - .bak/app/utils/directus.ts | 12 - .bak/app/utils/file-icons.ts | 52 - .bak/app/utils/product-links.ts | 10 - .bak/app/utils/products.ts | 106 - .bak/content/1.getting-started/0.home.md | 61 - .../1.getting-started/0.platform-overview.md | 47 - .../1.getting-started/1.create-a-project.md | 116 - .bak/content/1.getting-started/2.resources.md | 90 - .bak/content/1.getting-started/_dir.yml | 1 - .bak/content/10.extensions/0.overview.md | 70 - .bak/content/10.extensions/1.quickstart.md | 54 - .../10.extensions/2.api-extensions/0.index.md | 14 - .../10.extensions/2.api-extensions/1.hooks.md | 274 - .../2.api-extensions/2.endpoints.md | 90 - .../2.api-extensions/3.operations.md | 124 - .../2.api-extensions/4.services.md | 317 - .../2.api-extensions/5.sandbox.md | 114 - .../10.extensions/3.app-extensions/0.index.md | 14 - .../3.app-extensions/1.interfaces.md | 115 - .../3.app-extensions/2.displays.md | 110 - .../3.app-extensions/3.layouts.md | 120 - .../3.app-extensions/4.panels.md | 108 - .../3.app-extensions/5.modules.md | 100 - .../3.app-extensions/6.themes.md | 93 - .../3.app-extensions/7.ui-library.md | 62 - .../3.app-extensions/8.composables.md | 207 - .bak/content/10.extensions/4.bundles.md | 46 - .../10.extensions/5.marketplace/0.index.md | 29 - .../5.marketplace/1.publishing.md | 113 - .bak/content/10.extensions/_dir.yml | 1 - .bak/content/11.configuration/1.general.md | 53 - .../content/11.configuration/10.extensions.md | 36 - .bak/content/11.configuration/11.logging.md | 66 - .bak/content/11.configuration/12.email.md | 76 - .../content/11.configuration/13.migrations.md | 55 - .bak/content/11.configuration/14.theming.md | 60 - .../11.configuration/15.translations.md | 36 - .bak/content/11.configuration/2.database.md | 30 - .bak/content/11.configuration/3.files.md | 125 - .../11.configuration/4.synchronization.md | 27 - .bak/content/11.configuration/5.realtime.md | 51 - .bak/content/11.configuration/6.flows.md | 21 - .../11.configuration/7.security-limits.md | 131 - .bak/content/11.configuration/8.auth-sso.md | 167 - .bak/content/11.configuration/9.pm2.md | 27 - .bak/content/11.configuration/_dir.yml | 1 - .bak/content/12.self-hosting/1.overview.md | 46 - .../content/12.self-hosting/2.requirements.md | 34 - .bak/content/12.self-hosting/3.deploying.md | 109 - .bak/content/12.self-hosting/4.upgrading.md | 26 - .../12.self-hosting/5.including-extensions.md | 76 - .bak/content/12.self-hosting/_dir.yml | 1 - .bak/content/13.releases/1.overview.md | 22 - .../13.releases/2.breaking-changes/0.index.md | 10 - .../2.breaking-changes/1.version-10.md | 477 - .../2.breaking-changes/2.version-11.md | 114 - .bak/content/13.releases/3.changelog.md | 4 - .bak/content/13.releases/_dir.yml | 1 - .bak/content/2.data-modeling/1.quickstart.md | 47 - .bak/content/2.data-modeling/2.collections.md | 172 - .bak/content/2.data-modeling/3.fields.md | 109 - .bak/content/2.data-modeling/4.interfaces.md | 604 - .../2.data-modeling/5.relationships.md | 72 - .bak/content/2.data-modeling/_dir.yml | 1 - .bak/content/3.content/1.explore.md | 73 - .bak/content/3.content/2.editor.md | 86 - .bak/content/3.content/3.layouts.md | 238 - .bak/content/3.content/4.import-export.md | 56 - .bak/content/3.content/5.live-preview.md | 41 - .../content/3.content/6.content-versioning.md | 73 - .bak/content/3.content/7.translations.md | 67 - .bak/content/3.content/_dir.yml | 1 - .bak/content/4.auth/1.quickstart.md | 125 - .bak/content/4.auth/2.tokens-cookies.md | 69 - .bak/content/4.auth/3.access-control.md | 101 - .bak/content/4.auth/4.creating-users.md | 102 - .bak/content/4.auth/5.email-login.md | 292 - .bak/content/4.auth/6.2fa.md | 47 - .bak/content/4.auth/7.sso/1.index.md | 97 - .bak/content/4.auth/7.sso/2.seamless.md | 97 - .bak/content/4.auth/8.accountability.md | 47 - .bak/content/4.auth/_dir.yml | 1 - .bak/content/5.connect/1.quickstart.md | 82 - .bak/content/5.connect/2.authentication.md | 11 - .bak/content/5.connect/3.filter-rules.md | 239 - .bak/content/5.connect/4.query-parameters.md | 569 - .bak/content/5.connect/5.errors.md | 26 - .bak/content/5.connect/6.sdk.md | 372 - .bak/content/5.connect/_dir.yml | 1 - .bak/content/6.files/1.quickstart.md | 63 - .bak/content/6.files/2.upload.md | 60 - .bak/content/6.files/3.manage.md | 84 - .bak/content/6.files/4.access.md | 51 - .bak/content/6.files/5.transform.md | 170 - .bak/content/6.files/_dir.yml | 1 - .bak/content/7.automate/1.quickstart.md | 53 - .bak/content/7.automate/2.flows.md | 54 - .bak/content/7.automate/3.data-chain.md | 76 - .bak/content/7.automate/4.triggers.md | 176 - .bak/content/7.automate/5.operations.md | 372 - .bak/content/7.automate/_dir.yml | 1 - .bak/content/8.realtime/1.quickstart.md | 120 - .bak/content/8.realtime/2.authentication.md | 136 - .bak/content/8.realtime/3.subscriptions.md | 209 - .bak/content/8.realtime/4.actions.md | 167 - .bak/content/8.realtime/_dir.yml | 1 - .bak/content/9.insights/1.overview.md | 25 - .bak/content/9.insights/2.panels.md | 268 - .bak/content/9.insights/_dir.yml | 1 - .bak/content/_partials/authentication.md | 24 - .bak/content/_partials/config-env-vars.md | 3 - .../_partials/extension-hook-exceptions.md | 5 - .../_partials/extension-hook-footguns.md | 1 - .../_partials/extensions-api-internals.md | 23 - .bak/content/_partials/extensions-api.md | 1 - .../_partials/extensions-app-internals.md | 25 - .bak/content/_partials/extensions-app.md | 1 - .bak/content/_partials/extensions-theme.md | 3 - .bak/content/_partials/extensions-uid.md | 3 - .bak/content/_partials/home-hero/auth.md | 13 - .bak/content/_partials/home-hero/data.md | 13 - .bak/content/_partials/home-hero/file.md | 13 - .bak/content/_partials/home-hero/realtime.md | 13 - .bak/content/_partials/license.md | 5 - .bak/content/_partials/query-functions.md | 15 - .../_partials/quickstart-making-calls.md | 1 - .bak/content/_partials/snippet-auth-token.md | 7 - .bak/eslint.config.mjs | 4 - .bak/nuxt.config.ts | 198 - .bak/package.json | 62 - .bak/pnpm-lock.yaml | 15063 ---------------- .bak/public/1.icon.png | Bin 16057 -> 0 bytes .bak/public/2.icon.png | Bin 5607 -> 0 bytes .bak/public/3.icon.png | Bin 1038 -> 0 bytes .bak/public/4.icon.png | Bin 744 -> 0 bytes .bak/public/apple-touch-icon.png | Bin 5256 -> 0 bytes .bak/public/browserconfig.xml | 9 - .bak/public/favicon.ico | Bin 15086 -> 0 bytes .bak/public/favicon.svg | 6 - .bak/public/og-image-background.png | Bin 436893 -> 0 bytes .bak/public/waves-dark.svg | 766 - .bak/public/waves.svg | 764 - .bak/server/tsconfig.json | 3 - .bak/server/utils/remote-content.ts | 154 - .bak/todo.md | 1 - .bak/tsconfig.json | 4 - .bak/types/content.ts | 57 - .bak/types/directus.ts | 168 - .bak/types/posthog.d.ts | 23 - .bak/utils/app-config.ts | 119 - .bak/utils/directus.ts | 6 - 583 files changed, 48218 deletions(-) delete mode 100644 .bak/.editorconfig delete mode 100644 .bak/.env.example delete mode 100644 .bak/.github/actions/prepare/action.yaml delete mode 100644 .bak/.github/workflows/lint-app.yaml delete mode 100644 .bak/.github/workflows/lint-oas.yaml delete mode 100644 .bak/.github/workflows/typecheck.yaml delete mode 100644 .bak/.gitignore delete mode 100644 .bak/README.md delete mode 100644 .bak/api-spec/components/parameters.yaml delete mode 100644 .bak/api-spec/components/responses.yaml delete mode 100644 .bak/api-spec/components/schemas/_index.yaml delete mode 100644 .bak/api-spec/components/schemas/activity.yaml delete mode 100644 .bak/api-spec/components/schemas/collections.yaml delete mode 100644 .bak/api-spec/components/schemas/comments.yaml delete mode 100644 .bak/api-spec/components/schemas/dashboards.yaml delete mode 100644 .bak/api-spec/components/schemas/diff.yaml delete mode 100644 .bak/api-spec/components/schemas/extensions.yaml delete mode 100644 .bak/api-spec/components/schemas/fields.yaml delete mode 100644 .bak/api-spec/components/schemas/files.yaml delete mode 100644 .bak/api-spec/components/schemas/flows.yaml delete mode 100644 .bak/api-spec/components/schemas/folders.yaml delete mode 100644 .bak/api-spec/components/schemas/items.yaml delete mode 100644 .bak/api-spec/components/schemas/notifications.yaml delete mode 100644 .bak/api-spec/components/schemas/operations.yaml delete mode 100644 .bak/api-spec/components/schemas/panels.yaml delete mode 100644 .bak/api-spec/components/schemas/permissions.yaml delete mode 100644 .bak/api-spec/components/schemas/policies.yaml delete mode 100644 .bak/api-spec/components/schemas/presets.yaml delete mode 100644 .bak/api-spec/components/schemas/query.yaml delete mode 100644 .bak/api-spec/components/schemas/relations.yaml delete mode 100644 .bak/api-spec/components/schemas/revisions.yaml delete mode 100644 .bak/api-spec/components/schemas/roles.yaml delete mode 100644 .bak/api-spec/components/schemas/schema.yaml delete mode 100644 .bak/api-spec/components/schemas/settings.yaml delete mode 100644 .bak/api-spec/components/schemas/shares.yaml delete mode 100644 .bak/api-spec/components/schemas/translations.yaml delete mode 100644 .bak/api-spec/components/schemas/users.yaml delete mode 100644 .bak/api-spec/components/schemas/versions.yaml delete mode 100644 .bak/api-spec/components/schemas/x-metadata.yaml delete mode 100644 .bak/api-spec/components/security.yaml delete mode 100644 .bak/api-spec/index.yaml delete mode 100644 .bak/api-spec/paths/activity/_id/getActivity.yaml delete mode 100644 .bak/api-spec/paths/activity/_id/index.yaml delete mode 100644 .bak/api-spec/paths/activity/getActivities.yaml delete mode 100644 .bak/api-spec/paths/activity/index.yaml delete mode 100644 .bak/api-spec/paths/assets/_id/getAsset.yaml delete mode 100644 .bak/api-spec/paths/assets/_id/index.yaml delete mode 100644 .bak/api-spec/paths/auth/login/index.yaml delete mode 100644 .bak/api-spec/paths/auth/login/login.yaml delete mode 100644 .bak/api-spec/paths/auth/logout/index.yaml delete mode 100644 .bak/api-spec/paths/auth/logout/logout.yaml delete mode 100644 .bak/api-spec/paths/auth/oauth/_provider/index.yaml delete mode 100644 .bak/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml delete mode 100644 .bak/api-spec/paths/auth/oauth/index.yaml delete mode 100644 .bak/api-spec/paths/auth/oauth/oauth.yaml delete mode 100644 .bak/api-spec/paths/auth/password/request/index.yaml delete mode 100644 .bak/api-spec/paths/auth/password/request/passwordRequest.yaml delete mode 100644 .bak/api-spec/paths/auth/password/reset/index.yaml delete mode 100644 .bak/api-spec/paths/auth/password/reset/passwordReset.yaml delete mode 100644 .bak/api-spec/paths/auth/refresh/index.yaml delete mode 100644 .bak/api-spec/paths/auth/refresh/refresh.yaml delete mode 100644 .bak/api-spec/paths/collections/_id/deleteCollection.yaml delete mode 100644 .bak/api-spec/paths/collections/_id/getCollection.yaml delete mode 100644 .bak/api-spec/paths/collections/_id/index.yaml delete mode 100644 .bak/api-spec/paths/collections/_id/updateCollection.yaml delete mode 100644 .bak/api-spec/paths/collections/createCollection.yaml delete mode 100644 .bak/api-spec/paths/collections/getCollections.yaml delete mode 100644 .bak/api-spec/paths/collections/index.yaml delete mode 100644 .bak/api-spec/paths/comments/_id/deleteComment.yaml delete mode 100644 .bak/api-spec/paths/comments/_id/getComment.yaml delete mode 100644 .bak/api-spec/paths/comments/_id/index.yaml delete mode 100644 .bak/api-spec/paths/comments/_id/updateComment.yaml delete mode 100644 .bak/api-spec/paths/comments/createComments.yaml delete mode 100644 .bak/api-spec/paths/comments/deleteComments.yaml delete mode 100644 .bak/api-spec/paths/comments/getComments.yaml delete mode 100644 .bak/api-spec/paths/comments/index.yaml delete mode 100644 .bak/api-spec/paths/comments/updateComments.yaml delete mode 100644 .bak/api-spec/paths/dashboards/_id/deleteDashboard.yaml delete mode 100644 .bak/api-spec/paths/dashboards/_id/getDashboard.yaml delete mode 100644 .bak/api-spec/paths/dashboards/_id/index.yaml delete mode 100644 .bak/api-spec/paths/dashboards/_id/updateDashboard.yaml delete mode 100644 .bak/api-spec/paths/dashboards/createDashboards.yaml delete mode 100644 .bak/api-spec/paths/dashboards/deleteDashboards.yaml delete mode 100644 .bak/api-spec/paths/dashboards/getDashboards.yaml delete mode 100644 .bak/api-spec/paths/dashboards/index.yaml delete mode 100644 .bak/api-spec/paths/dashboards/updateDashboards.yaml delete mode 100644 .bak/api-spec/paths/extensions/_bundle/_name/index.yaml delete mode 100644 .bak/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml delete mode 100644 .bak/api-spec/paths/extensions/_name/index.yaml delete mode 100644 .bak/api-spec/paths/extensions/_name/updateExtensions.yaml delete mode 100644 .bak/api-spec/paths/extensions/index.yaml delete mode 100644 .bak/api-spec/paths/extensions/listExtensions.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/_id/deleteField.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/_id/getCollectionField.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/_id/index.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/_id/updateField.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/createField.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/getCollectionFields.yaml delete mode 100644 .bak/api-spec/paths/fields/_collection/index.yaml delete mode 100644 .bak/api-spec/paths/fields/getFields.yaml delete mode 100644 .bak/api-spec/paths/fields/index.yaml delete mode 100644 .bak/api-spec/paths/files/_id/deleteFile.yaml delete mode 100644 .bak/api-spec/paths/files/_id/getFile.yaml delete mode 100644 .bak/api-spec/paths/files/_id/index.yaml delete mode 100644 .bak/api-spec/paths/files/_id/updateFile.yaml delete mode 100644 .bak/api-spec/paths/files/deleteFiles.yaml delete mode 100644 .bak/api-spec/paths/files/getFiles.yaml delete mode 100644 .bak/api-spec/paths/files/import/importFile.yaml delete mode 100644 .bak/api-spec/paths/files/import/index.yaml delete mode 100644 .bak/api-spec/paths/files/index.yaml delete mode 100644 .bak/api-spec/paths/files/updateFiles.yaml delete mode 100644 .bak/api-spec/paths/files/uploadFile.yaml delete mode 100644 .bak/api-spec/paths/flows/_id/deleteFlow.yaml delete mode 100644 .bak/api-spec/paths/flows/_id/getFlow.yaml delete mode 100644 .bak/api-spec/paths/flows/_id/index.yaml delete mode 100644 .bak/api-spec/paths/flows/_id/updateFlow.yaml delete mode 100644 .bak/api-spec/paths/flows/createFlows.yaml delete mode 100644 .bak/api-spec/paths/flows/deleteFlows.yaml delete mode 100644 .bak/api-spec/paths/flows/getFlows.yaml delete mode 100644 .bak/api-spec/paths/flows/index.yaml delete mode 100644 .bak/api-spec/paths/flows/trigger/_id/index.yaml delete mode 100644 .bak/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml delete mode 100644 .bak/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml delete mode 100644 .bak/api-spec/paths/flows/updateFlows.yaml delete mode 100644 .bak/api-spec/paths/folders/_id/deleteFolder.yaml delete mode 100644 .bak/api-spec/paths/folders/_id/getFolder.yaml delete mode 100644 .bak/api-spec/paths/folders/_id/index.yaml delete mode 100644 .bak/api-spec/paths/folders/_id/updateFolder.yaml delete mode 100644 .bak/api-spec/paths/folders/createFolders.yaml delete mode 100644 .bak/api-spec/paths/folders/deleteFolders.yaml delete mode 100644 .bak/api-spec/paths/folders/getFolders.yaml delete mode 100644 .bak/api-spec/paths/folders/index.yaml delete mode 100644 .bak/api-spec/paths/folders/updateFolders.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/_id/deleteItem.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/_id/getCollectionItem.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/_id/index.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/_id/updateItem.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/createItems.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/deleteItems.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/getCollectionItems.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/index.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/singleton/getSingleton.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/singleton/index.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/singleton/updateSingleton.yaml delete mode 100644 .bak/api-spec/paths/items/_collection/updateItems.yaml delete mode 100644 .bak/api-spec/paths/notifications/_id/deleteNotification.yaml delete mode 100644 .bak/api-spec/paths/notifications/_id/getNotification.yaml delete mode 100644 .bak/api-spec/paths/notifications/_id/index.yaml delete mode 100644 .bak/api-spec/paths/notifications/_id/updateNotification.yaml delete mode 100644 .bak/api-spec/paths/notifications/createNotifications.yaml delete mode 100644 .bak/api-spec/paths/notifications/deleteNotifications.yaml delete mode 100644 .bak/api-spec/paths/notifications/getNotifications.yaml delete mode 100644 .bak/api-spec/paths/notifications/index.yaml delete mode 100644 .bak/api-spec/paths/notifications/updateNotifications.yaml delete mode 100644 .bak/api-spec/paths/operations/_id/deleteOperation.yaml delete mode 100644 .bak/api-spec/paths/operations/_id/getOperation.yaml delete mode 100644 .bak/api-spec/paths/operations/_id/index.yaml delete mode 100644 .bak/api-spec/paths/operations/_id/triggerOperation.yaml delete mode 100644 .bak/api-spec/paths/operations/_id/updateOperation.yaml delete mode 100644 .bak/api-spec/paths/operations/createOperations.yaml delete mode 100644 .bak/api-spec/paths/operations/deleteOperations.yaml delete mode 100644 .bak/api-spec/paths/operations/getOperations.yaml delete mode 100644 .bak/api-spec/paths/operations/index.yaml delete mode 100644 .bak/api-spec/paths/operations/updateOperations.yaml delete mode 100644 .bak/api-spec/paths/panels/_id/deletePanel.yaml delete mode 100644 .bak/api-spec/paths/panels/_id/getPanel.yaml delete mode 100644 .bak/api-spec/paths/panels/_id/index.yaml delete mode 100644 .bak/api-spec/paths/panels/_id/updatePanel.yaml delete mode 100644 .bak/api-spec/paths/panels/createPanels.yaml delete mode 100644 .bak/api-spec/paths/panels/deletePanels.yaml delete mode 100644 .bak/api-spec/paths/panels/getPanels.yaml delete mode 100644 .bak/api-spec/paths/panels/index.yaml delete mode 100644 .bak/api-spec/paths/panels/updatePanels.yaml delete mode 100644 .bak/api-spec/paths/permissions/_id/deletePermission.yaml delete mode 100644 .bak/api-spec/paths/permissions/_id/getPermission.yaml delete mode 100644 .bak/api-spec/paths/permissions/_id/index.yaml delete mode 100644 .bak/api-spec/paths/permissions/_id/updatePermission.yaml delete mode 100644 .bak/api-spec/paths/permissions/createPermissions.yaml delete mode 100644 .bak/api-spec/paths/permissions/deletePermissions.yaml delete mode 100644 .bak/api-spec/paths/permissions/getPermissions.yaml delete mode 100644 .bak/api-spec/paths/permissions/index.yaml delete mode 100644 .bak/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml delete mode 100644 .bak/api-spec/paths/permissions/me/_collection/_id/index.yaml delete mode 100644 .bak/api-spec/paths/permissions/me/getUserPermissions.yaml delete mode 100644 .bak/api-spec/paths/permissions/me/index.yaml delete mode 100644 .bak/api-spec/paths/permissions/updatePermissions.yaml delete mode 100644 .bak/api-spec/paths/policies/_id/deletePolicy.yaml delete mode 100644 .bak/api-spec/paths/policies/_id/getPolicy.yaml delete mode 100644 .bak/api-spec/paths/policies/_id/index.yaml delete mode 100644 .bak/api-spec/paths/policies/_id/updatePolicy.yaml delete mode 100644 .bak/api-spec/paths/policies/createPolicies.yaml delete mode 100644 .bak/api-spec/paths/policies/deletePolicies.yaml delete mode 100644 .bak/api-spec/paths/policies/getPolicies.yaml delete mode 100644 .bak/api-spec/paths/policies/index.yaml delete mode 100644 .bak/api-spec/paths/policies/updatePolicies.yaml delete mode 100644 .bak/api-spec/paths/presets/_id/deletePreset.yaml delete mode 100644 .bak/api-spec/paths/presets/_id/getPreset.yaml delete mode 100644 .bak/api-spec/paths/presets/_id/index.yaml delete mode 100644 .bak/api-spec/paths/presets/_id/updatePreset.yaml delete mode 100644 .bak/api-spec/paths/presets/createPresets.yaml delete mode 100644 .bak/api-spec/paths/presets/deletePresets.yaml delete mode 100644 .bak/api-spec/paths/presets/getPresets.yaml delete mode 100644 .bak/api-spec/paths/presets/index.yaml delete mode 100644 .bak/api-spec/paths/presets/updatePresets.yaml delete mode 100644 .bak/api-spec/paths/relations/_collection/getRelationByCollection.yaml delete mode 100644 .bak/api-spec/paths/relations/_collection/index.yaml delete mode 100644 .bak/api-spec/paths/relations/_id/deleteRelation.yaml delete mode 100644 .bak/api-spec/paths/relations/_id/getRelation.yaml delete mode 100644 .bak/api-spec/paths/relations/_id/index.yaml delete mode 100644 .bak/api-spec/paths/relations/_id/updateRelation.yaml delete mode 100644 .bak/api-spec/paths/relations/createRelation.yaml delete mode 100644 .bak/api-spec/paths/relations/getRelations.yaml delete mode 100644 .bak/api-spec/paths/relations/index.yaml delete mode 100644 .bak/api-spec/paths/revisions/_id/getRevision.yaml delete mode 100644 .bak/api-spec/paths/revisions/_id/index.yaml delete mode 100644 .bak/api-spec/paths/revisions/getRevisions.yaml delete mode 100644 .bak/api-spec/paths/revisions/index.yaml delete mode 100644 .bak/api-spec/paths/roles/_id/deleteRole.yaml delete mode 100644 .bak/api-spec/paths/roles/_id/getRole.yaml delete mode 100644 .bak/api-spec/paths/roles/_id/index.yaml delete mode 100644 .bak/api-spec/paths/roles/_id/updateRole.yaml delete mode 100644 .bak/api-spec/paths/roles/createRoles.yaml delete mode 100644 .bak/api-spec/paths/roles/deleteRoles.yaml delete mode 100644 .bak/api-spec/paths/roles/getRoles.yaml delete mode 100644 .bak/api-spec/paths/roles/index.yaml delete mode 100644 .bak/api-spec/paths/roles/updateRoles.yaml delete mode 100644 .bak/api-spec/paths/schema/apply/index.yaml delete mode 100644 .bak/api-spec/paths/schema/apply/schemaApply.yaml delete mode 100644 .bak/api-spec/paths/schema/diff/index.yaml delete mode 100644 .bak/api-spec/paths/schema/diff/schemaDiff.yaml delete mode 100644 .bak/api-spec/paths/schema/snapshot/index.yaml delete mode 100644 .bak/api-spec/paths/schema/snapshot/schemaSnapshot.yaml delete mode 100644 .bak/api-spec/paths/server/health/index.yaml delete mode 100644 .bak/api-spec/paths/server/health/serverHealth.yaml delete mode 100644 .bak/api-spec/paths/server/info/index.yaml delete mode 100644 .bak/api-spec/paths/server/info/serverInfo.yaml delete mode 100644 .bak/api-spec/paths/server/ping/index.yaml delete mode 100644 .bak/api-spec/paths/server/ping/ping.yaml delete mode 100644 .bak/api-spec/paths/server/specs/graphql/index.yaml delete mode 100644 .bak/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml delete mode 100644 .bak/api-spec/paths/server/specs/oas/index.yaml delete mode 100644 .bak/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml delete mode 100644 .bak/api-spec/paths/settings/getSettings.yaml delete mode 100644 .bak/api-spec/paths/settings/index.yaml delete mode 100644 .bak/api-spec/paths/settings/updateSettings.yaml delete mode 100644 .bak/api-spec/paths/shares/_id/deleteShare.yaml delete mode 100644 .bak/api-spec/paths/shares/_id/getShare.yaml delete mode 100644 .bak/api-spec/paths/shares/_id/index.yaml delete mode 100644 .bak/api-spec/paths/shares/_id/updateShare.yaml delete mode 100644 .bak/api-spec/paths/shares/_share/getPublicShareInfo.yaml delete mode 100644 .bak/api-spec/paths/shares/_share/index.yaml delete mode 100644 .bak/api-spec/paths/shares/auth/authenticateShare.yaml delete mode 100644 .bak/api-spec/paths/shares/auth/index.yaml delete mode 100644 .bak/api-spec/paths/shares/createShares.yaml delete mode 100644 .bak/api-spec/paths/shares/deleteShares.yaml delete mode 100644 .bak/api-spec/paths/shares/getShares.yaml delete mode 100644 .bak/api-spec/paths/shares/index.yaml delete mode 100644 .bak/api-spec/paths/shares/info/_id/getShareInfo.yaml delete mode 100644 .bak/api-spec/paths/shares/info/_id/index.yaml delete mode 100644 .bak/api-spec/paths/shares/invite/index.yaml delete mode 100644 .bak/api-spec/paths/shares/invite/inviteShare.yaml delete mode 100644 .bak/api-spec/paths/shares/updateShares.yaml delete mode 100644 .bak/api-spec/paths/translations/_id/deleteTranslation.yaml delete mode 100644 .bak/api-spec/paths/translations/_id/getTranslation.yaml delete mode 100644 .bak/api-spec/paths/translations/_id/index.yaml delete mode 100644 .bak/api-spec/paths/translations/_id/updateTranslation.yaml delete mode 100644 .bak/api-spec/paths/translations/createTranslations.yaml delete mode 100644 .bak/api-spec/paths/translations/deleteTranslations.yaml delete mode 100644 .bak/api-spec/paths/translations/getTranslations.yaml delete mode 100644 .bak/api-spec/paths/translations/index.yaml delete mode 100644 .bak/api-spec/paths/translations/updateTranslations.yaml delete mode 100644 .bak/api-spec/paths/users/_id/deleteUser.yaml delete mode 100644 .bak/api-spec/paths/users/_id/getUser.yaml delete mode 100644 .bak/api-spec/paths/users/_id/index.yaml delete mode 100644 .bak/api-spec/paths/users/_id/updateUser.yaml delete mode 100644 .bak/api-spec/paths/users/createUsers.yaml delete mode 100644 .bak/api-spec/paths/users/deleteUsers.yaml delete mode 100644 .bak/api-spec/paths/users/getUsers.yaml delete mode 100644 .bak/api-spec/paths/users/index.yaml delete mode 100644 .bak/api-spec/paths/users/invite/accept/acceptInvite.yaml delete mode 100644 .bak/api-spec/paths/users/invite/accept/index.yaml delete mode 100644 .bak/api-spec/paths/users/invite/index.yaml delete mode 100644 .bak/api-spec/paths/users/invite/invite.yaml delete mode 100644 .bak/api-spec/paths/users/me/getMe.yaml delete mode 100644 .bak/api-spec/paths/users/me/index.yaml delete mode 100644 .bak/api-spec/paths/users/me/tfa/disable/index.yaml delete mode 100644 .bak/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml delete mode 100644 .bak/api-spec/paths/users/me/tfa/enable/index.yaml delete mode 100644 .bak/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml delete mode 100644 .bak/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml delete mode 100644 .bak/api-spec/paths/users/me/tfa/generate/index.yaml delete mode 100644 .bak/api-spec/paths/users/me/track/page/index.yaml delete mode 100644 .bak/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml delete mode 100644 .bak/api-spec/paths/users/me/updateMe.yaml delete mode 100644 .bak/api-spec/paths/users/register/index.yaml delete mode 100644 .bak/api-spec/paths/users/register/registerUser.yaml delete mode 100644 .bak/api-spec/paths/users/register/verify-email/_token/index.yaml delete mode 100644 .bak/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml delete mode 100644 .bak/api-spec/paths/users/updateUsers.yaml delete mode 100644 .bak/api-spec/paths/utils/cache/clear/clear-cache.yaml delete mode 100644 .bak/api-spec/paths/utils/cache/clear/index.yaml delete mode 100644 .bak/api-spec/paths/utils/export/_collection/export.yaml delete mode 100644 .bak/api-spec/paths/utils/export/_collection/index.yaml delete mode 100644 .bak/api-spec/paths/utils/hash/generate/hash-generate.yaml delete mode 100644 .bak/api-spec/paths/utils/hash/generate/index.yaml delete mode 100644 .bak/api-spec/paths/utils/hash/verify/hash-verify.yaml delete mode 100644 .bak/api-spec/paths/utils/hash/verify/index.yaml delete mode 100644 .bak/api-spec/paths/utils/import/_collection/import.yaml delete mode 100644 .bak/api-spec/paths/utils/import/_collection/index.yaml delete mode 100644 .bak/api-spec/paths/utils/random/string/index.yaml delete mode 100644 .bak/api-spec/paths/utils/random/string/random.yaml delete mode 100644 .bak/api-spec/paths/utils/sort/_collection/index.yaml delete mode 100644 .bak/api-spec/paths/utils/sort/_collection/sort.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/compare/compareContentVersion.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/compare/index.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/deleteContentVersion.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/getContentVersion.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/index.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/promote/index.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/save/index.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/save/saveContentVersion.yaml delete mode 100644 .bak/api-spec/paths/versions/_id/updateContentVersion.yaml delete mode 100644 .bak/api-spec/paths/versions/createContentVersions.yaml delete mode 100644 .bak/api-spec/paths/versions/deleteContentVersions.yaml delete mode 100644 .bak/api-spec/paths/versions/getContentVersions.yaml delete mode 100644 .bak/api-spec/paths/versions/index.yaml delete mode 100644 .bak/api-spec/paths/versions/updateContentVersions.yaml delete mode 100644 .bak/app/app.vue delete mode 100644 .bak/app/assets/css/_reset.scss delete mode 100644 .bak/app/assets/css/_vars.scss delete mode 100644 .bak/app/assets/css/colors.scss delete mode 100644 .bak/app/assets/css/main.scss delete mode 100644 .bak/app/assets/icons/frameworks/angular.svg delete mode 100644 .bak/app/assets/icons/frameworks/apple.svg delete mode 100644 .bak/app/assets/icons/frameworks/astro.svg delete mode 100644 .bak/app/assets/icons/frameworks/next.svg delete mode 100644 .bak/app/assets/icons/frameworks/nuxt.svg delete mode 100644 .bak/app/assets/icons/frameworks/react.svg delete mode 100644 .bak/app/assets/icons/frameworks/remix.svg delete mode 100644 .bak/app/assets/icons/frameworks/svelte.svg delete mode 100644 .bak/app/assets/icons/frameworks/vue.svg delete mode 100644 .bak/app/assets/icons/products/auth-pink.svg delete mode 100644 .bak/app/assets/icons/products/auth-purple.svg delete mode 100644 .bak/app/assets/icons/products/auth-white.svg delete mode 100644 .bak/app/assets/icons/products/auth.svg delete mode 100644 .bak/app/assets/icons/products/automate-pink.svg delete mode 100644 .bak/app/assets/icons/products/automate-purple.svg delete mode 100644 .bak/app/assets/icons/products/automate-white.svg delete mode 100644 .bak/app/assets/icons/products/automate.svg delete mode 100644 .bak/app/assets/icons/products/connect-pink.svg delete mode 100644 .bak/app/assets/icons/products/connect-purple.svg delete mode 100644 .bak/app/assets/icons/products/connect-white.svg delete mode 100644 .bak/app/assets/icons/products/connect.svg delete mode 100644 .bak/app/assets/icons/products/editor-pink.svg delete mode 100644 .bak/app/assets/icons/products/editor-purple.svg delete mode 100644 .bak/app/assets/icons/products/editor-white.svg delete mode 100644 .bak/app/assets/icons/products/editor.svg delete mode 100644 .bak/app/assets/icons/products/explore-pink.svg delete mode 100644 .bak/app/assets/icons/products/explore-purple.svg delete mode 100644 .bak/app/assets/icons/products/explore-white.svg delete mode 100644 .bak/app/assets/icons/products/explore.svg delete mode 100644 .bak/app/assets/icons/products/files-pink.svg delete mode 100644 .bak/app/assets/icons/products/files-purple.svg delete mode 100644 .bak/app/assets/icons/products/files-white.svg delete mode 100644 .bak/app/assets/icons/products/files.svg delete mode 100644 .bak/app/assets/icons/products/insights-pink.svg delete mode 100644 .bak/app/assets/icons/products/insights-purple.svg delete mode 100644 .bak/app/assets/icons/products/insights-white.svg delete mode 100644 .bak/app/assets/icons/products/insights.svg delete mode 100644 .bak/app/assets/icons/products/marketplace-pink.svg delete mode 100644 .bak/app/assets/icons/products/marketplace-purple.svg delete mode 100644 .bak/app/assets/icons/products/marketplace-white.svg delete mode 100644 .bak/app/assets/icons/products/marketplace.svg delete mode 100644 .bak/app/assets/icons/products/realtime-pink.svg delete mode 100644 .bak/app/assets/icons/products/realtime-purple.svg delete mode 100644 .bak/app/assets/icons/products/realtime-white.svg delete mode 100644 .bak/app/assets/icons/products/realtime.svg delete mode 100644 .bak/app/assets/img/cloud-cta-bg.svg delete mode 100644 .bak/app/assets/img/cloud-logo.svg delete mode 100644 .bak/app/assets/img/pink-cta-bg.svg delete mode 100644 .bak/app/assets/img/purple-cta-bg.svg delete mode 100644 .bak/app/assets/img/tv-logo.svg delete mode 100644 .bak/app/components/Button.vue delete mode 100644 .bak/app/components/DefaultLayout.vue delete mode 100644 .bak/app/components/LayoutFooter.vue delete mode 100644 .bak/app/components/NavTree.vue delete mode 100644 .bak/app/components/OgImage/Default.vue delete mode 100644 .bak/app/components/articles/ArticlesCard.vue delete mode 100644 .bak/app/components/articles/ArticlesCategoryNav.vue delete mode 100644 .bak/app/components/articles/ArticlesGrid.vue delete mode 100644 .bak/app/components/articles/ArticlesLayout.vue delete mode 100644 .bak/app/components/articles/ArticlesTagsFilter.vue delete mode 100644 .bak/app/components/aside/AsideFeedback.vue delete mode 100644 .bak/app/components/aside/AsideNav.vue delete mode 100644 .bak/app/components/aside/AsideNewsletter.vue delete mode 100644 .bak/app/components/aside/AsideSlideover.vue delete mode 100644 .bak/app/components/aside/AsideTableOfContents.vue delete mode 100644 .bak/app/components/aside/AsideWidget.vue delete mode 100644 .bak/app/components/content/ArticleCards.vue delete mode 100644 .bak/app/components/content/Badge.vue delete mode 100644 .bak/app/components/content/Box.vue delete mode 100644 .bak/app/components/content/Callout.vue delete mode 100644 .bak/app/components/content/DirectusCloud.vue delete mode 100644 .bak/app/components/content/DirectusImage.vue delete mode 100644 .bak/app/components/content/EngineStudioBox.vue delete mode 100644 .bak/app/components/content/HeaderWithBadge.vue delete mode 100644 .bak/app/components/content/ListChildren.vue delete mode 100644 .bak/app/components/content/Partial.vue delete mode 100644 .bak/app/components/content/ProductLink.vue delete mode 100644 .bak/app/components/content/ProsePre.vue delete mode 100644 .bak/app/components/content/ProseTable.vue delete mode 100644 .bak/app/components/content/Snippets.vue delete mode 100644 .bak/app/components/content/Tab.vue delete mode 100644 .bak/app/components/content/Tabs.vue delete mode 100644 .bak/app/components/content/VideoEmbed.vue delete mode 100644 .bak/app/components/header/HeaderBanner.vue delete mode 100644 .bak/app/components/header/HeaderHat.vue delete mode 100644 .bak/app/components/header/HeaderHero.vue delete mode 100644 .bak/app/components/header/HeaderLogo.vue delete mode 100644 .bak/app/components/header/HeaderNav.vue delete mode 100644 .bak/app/components/header/HeaderSlideover.vue delete mode 100644 .bak/app/components/pages/ArticleArea.global.vue delete mode 100644 .bak/app/components/pages/ArticleCategory.global.vue delete mode 100644 .bak/app/components/pages/ArticlePage.global.vue delete mode 100644 .bak/app/components/pages/DocumentationPage.global.vue delete mode 100644 .bak/app/components/search/SearchButton.client.vue delete mode 100644 .bak/app/composables/data.ts delete mode 100644 .bak/app/composables/tags.ts delete mode 100644 .bak/app/pages/[...slug].vue delete mode 100644 .bak/app/pages/api/index.vue delete mode 100644 .bak/app/plugins/format-title.ts delete mode 100644 .bak/app/utils/directus.ts delete mode 100644 .bak/app/utils/file-icons.ts delete mode 100644 .bak/app/utils/product-links.ts delete mode 100644 .bak/app/utils/products.ts delete mode 100644 .bak/content/1.getting-started/0.home.md delete mode 100644 .bak/content/1.getting-started/0.platform-overview.md delete mode 100644 .bak/content/1.getting-started/1.create-a-project.md delete mode 100644 .bak/content/1.getting-started/2.resources.md delete mode 100644 .bak/content/1.getting-started/_dir.yml delete mode 100644 .bak/content/10.extensions/0.overview.md delete mode 100644 .bak/content/10.extensions/1.quickstart.md delete mode 100644 .bak/content/10.extensions/2.api-extensions/0.index.md delete mode 100644 .bak/content/10.extensions/2.api-extensions/1.hooks.md delete mode 100644 .bak/content/10.extensions/2.api-extensions/2.endpoints.md delete mode 100644 .bak/content/10.extensions/2.api-extensions/3.operations.md delete mode 100644 .bak/content/10.extensions/2.api-extensions/4.services.md delete mode 100644 .bak/content/10.extensions/2.api-extensions/5.sandbox.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/0.index.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/1.interfaces.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/2.displays.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/3.layouts.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/4.panels.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/5.modules.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/6.themes.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/7.ui-library.md delete mode 100644 .bak/content/10.extensions/3.app-extensions/8.composables.md delete mode 100644 .bak/content/10.extensions/4.bundles.md delete mode 100644 .bak/content/10.extensions/5.marketplace/0.index.md delete mode 100644 .bak/content/10.extensions/5.marketplace/1.publishing.md delete mode 100644 .bak/content/10.extensions/_dir.yml delete mode 100644 .bak/content/11.configuration/1.general.md delete mode 100644 .bak/content/11.configuration/10.extensions.md delete mode 100644 .bak/content/11.configuration/11.logging.md delete mode 100644 .bak/content/11.configuration/12.email.md delete mode 100644 .bak/content/11.configuration/13.migrations.md delete mode 100644 .bak/content/11.configuration/14.theming.md delete mode 100644 .bak/content/11.configuration/15.translations.md delete mode 100644 .bak/content/11.configuration/2.database.md delete mode 100644 .bak/content/11.configuration/3.files.md delete mode 100644 .bak/content/11.configuration/4.synchronization.md delete mode 100644 .bak/content/11.configuration/5.realtime.md delete mode 100644 .bak/content/11.configuration/6.flows.md delete mode 100644 .bak/content/11.configuration/7.security-limits.md delete mode 100644 .bak/content/11.configuration/8.auth-sso.md delete mode 100644 .bak/content/11.configuration/9.pm2.md delete mode 100644 .bak/content/11.configuration/_dir.yml delete mode 100644 .bak/content/12.self-hosting/1.overview.md delete mode 100644 .bak/content/12.self-hosting/2.requirements.md delete mode 100644 .bak/content/12.self-hosting/3.deploying.md delete mode 100644 .bak/content/12.self-hosting/4.upgrading.md delete mode 100644 .bak/content/12.self-hosting/5.including-extensions.md delete mode 100644 .bak/content/12.self-hosting/_dir.yml delete mode 100644 .bak/content/13.releases/1.overview.md delete mode 100644 .bak/content/13.releases/2.breaking-changes/0.index.md delete mode 100644 .bak/content/13.releases/2.breaking-changes/1.version-10.md delete mode 100644 .bak/content/13.releases/2.breaking-changes/2.version-11.md delete mode 100644 .bak/content/13.releases/3.changelog.md delete mode 100644 .bak/content/13.releases/_dir.yml delete mode 100644 .bak/content/2.data-modeling/1.quickstart.md delete mode 100644 .bak/content/2.data-modeling/2.collections.md delete mode 100644 .bak/content/2.data-modeling/3.fields.md delete mode 100644 .bak/content/2.data-modeling/4.interfaces.md delete mode 100644 .bak/content/2.data-modeling/5.relationships.md delete mode 100644 .bak/content/2.data-modeling/_dir.yml delete mode 100644 .bak/content/3.content/1.explore.md delete mode 100644 .bak/content/3.content/2.editor.md delete mode 100644 .bak/content/3.content/3.layouts.md delete mode 100644 .bak/content/3.content/4.import-export.md delete mode 100644 .bak/content/3.content/5.live-preview.md delete mode 100644 .bak/content/3.content/6.content-versioning.md delete mode 100644 .bak/content/3.content/7.translations.md delete mode 100644 .bak/content/3.content/_dir.yml delete mode 100644 .bak/content/4.auth/1.quickstart.md delete mode 100644 .bak/content/4.auth/2.tokens-cookies.md delete mode 100644 .bak/content/4.auth/3.access-control.md delete mode 100644 .bak/content/4.auth/4.creating-users.md delete mode 100644 .bak/content/4.auth/5.email-login.md delete mode 100644 .bak/content/4.auth/6.2fa.md delete mode 100644 .bak/content/4.auth/7.sso/1.index.md delete mode 100644 .bak/content/4.auth/7.sso/2.seamless.md delete mode 100644 .bak/content/4.auth/8.accountability.md delete mode 100644 .bak/content/4.auth/_dir.yml delete mode 100644 .bak/content/5.connect/1.quickstart.md delete mode 100644 .bak/content/5.connect/2.authentication.md delete mode 100644 .bak/content/5.connect/3.filter-rules.md delete mode 100644 .bak/content/5.connect/4.query-parameters.md delete mode 100644 .bak/content/5.connect/5.errors.md delete mode 100644 .bak/content/5.connect/6.sdk.md delete mode 100644 .bak/content/5.connect/_dir.yml delete mode 100644 .bak/content/6.files/1.quickstart.md delete mode 100644 .bak/content/6.files/2.upload.md delete mode 100644 .bak/content/6.files/3.manage.md delete mode 100644 .bak/content/6.files/4.access.md delete mode 100644 .bak/content/6.files/5.transform.md delete mode 100644 .bak/content/6.files/_dir.yml delete mode 100644 .bak/content/7.automate/1.quickstart.md delete mode 100644 .bak/content/7.automate/2.flows.md delete mode 100644 .bak/content/7.automate/3.data-chain.md delete mode 100644 .bak/content/7.automate/4.triggers.md delete mode 100644 .bak/content/7.automate/5.operations.md delete mode 100644 .bak/content/7.automate/_dir.yml delete mode 100644 .bak/content/8.realtime/1.quickstart.md delete mode 100644 .bak/content/8.realtime/2.authentication.md delete mode 100644 .bak/content/8.realtime/3.subscriptions.md delete mode 100644 .bak/content/8.realtime/4.actions.md delete mode 100644 .bak/content/8.realtime/_dir.yml delete mode 100644 .bak/content/9.insights/1.overview.md delete mode 100644 .bak/content/9.insights/2.panels.md delete mode 100644 .bak/content/9.insights/_dir.yml delete mode 100644 .bak/content/_partials/authentication.md delete mode 100644 .bak/content/_partials/config-env-vars.md delete mode 100644 .bak/content/_partials/extension-hook-exceptions.md delete mode 100644 .bak/content/_partials/extension-hook-footguns.md delete mode 100644 .bak/content/_partials/extensions-api-internals.md delete mode 100644 .bak/content/_partials/extensions-api.md delete mode 100644 .bak/content/_partials/extensions-app-internals.md delete mode 100644 .bak/content/_partials/extensions-app.md delete mode 100644 .bak/content/_partials/extensions-theme.md delete mode 100644 .bak/content/_partials/extensions-uid.md delete mode 100644 .bak/content/_partials/home-hero/auth.md delete mode 100644 .bak/content/_partials/home-hero/data.md delete mode 100644 .bak/content/_partials/home-hero/file.md delete mode 100644 .bak/content/_partials/home-hero/realtime.md delete mode 100644 .bak/content/_partials/license.md delete mode 100644 .bak/content/_partials/query-functions.md delete mode 100644 .bak/content/_partials/quickstart-making-calls.md delete mode 100644 .bak/content/_partials/snippet-auth-token.md delete mode 100644 .bak/eslint.config.mjs delete mode 100644 .bak/nuxt.config.ts delete mode 100644 .bak/package.json delete mode 100644 .bak/pnpm-lock.yaml delete mode 100644 .bak/public/1.icon.png delete mode 100644 .bak/public/2.icon.png delete mode 100644 .bak/public/3.icon.png delete mode 100644 .bak/public/4.icon.png delete mode 100644 .bak/public/apple-touch-icon.png delete mode 100644 .bak/public/browserconfig.xml delete mode 100644 .bak/public/favicon.ico delete mode 100644 .bak/public/favicon.svg delete mode 100644 .bak/public/og-image-background.png delete mode 100644 .bak/public/waves-dark.svg delete mode 100644 .bak/public/waves.svg delete mode 100644 .bak/server/tsconfig.json delete mode 100644 .bak/server/utils/remote-content.ts delete mode 100644 .bak/todo.md delete mode 100644 .bak/tsconfig.json delete mode 100644 .bak/types/content.ts delete mode 100644 .bak/types/directus.ts delete mode 100644 .bak/types/posthog.d.ts delete mode 100644 .bak/utils/app-config.ts delete mode 100644 .bak/utils/directus.ts diff --git a/.bak/.editorconfig b/.bak/.editorconfig deleted file mode 100644 index 59b4173c..00000000 --- a/.bak/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -root=true - -[*] -end_of_line = lf -insert_final_newline = true -charset = utf-8 -trim_trailing_whitespace = true - -[*.{mjs,cjs,js,mts,cts,ts,json,vue,html,scss,css,toml,md}] -indent_style = tab - -[*.md] -trim_trailing_whitespace = false - -[*.{yml,yaml}] -indent_style = space \ No newline at end of file diff --git a/.bak/.env.example b/.bak/.env.example deleted file mode 100644 index fa3c27f1..00000000 --- a/.bak/.env.example +++ /dev/null @@ -1,9 +0,0 @@ -NUXT_PUBLIC_SITE_URL=http://localhost:3000 -NUXT_SITE_ENV=preview -NUXT_PUBLIC_NEWSLETTER_URL=https://product-team.directus.app/flows/trigger/webhook_id -NUXT_PUBLIC_PRODUCT_DIRECTUS_URL=https://product-team.directus.app -NUXT_IMAGE_DOMAINS="product-team.directus.app" -POSTHOG_API_KEY="phc_api_key" -POSTHOG_API_HOST="https://us.i.posthog.com" -ALGOLIA_API_KEY="api_key" -ALGOLIA_APPLICATION_ID="application_id" diff --git a/.bak/.github/actions/prepare/action.yaml b/.bak/.github/actions/prepare/action.yaml deleted file mode 100644 index 249cb17d..00000000 --- a/.bak/.github/actions/prepare/action.yaml +++ /dev/null @@ -1,39 +0,0 @@ -name: Prepare -description: Install and build the app -inputs: - registry: - description: NPM registry to set up for auth - required: false - -runs: - using: 'composite' - steps: - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: ${{ inputs.registry }} - - - uses: pnpm/action-setup@v3 - name: Install pnpm - id: pnpm-install - with: - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT - - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Install dependencies - shell: bash - run: pnpm install diff --git a/.bak/.github/workflows/lint-app.yaml b/.bak/.github/workflows/lint-app.yaml deleted file mode 100644 index b7b1821a..00000000 --- a/.bak/.github/workflows/lint-app.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: App Lint - -on: - push: - branches: - - main - pull_request: - branches: - - main - -concurrency: - group: app-lint-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_OPTIONS: --max_old_space_size=6144 - NUXT_PUBLIC_PRODUCT_DIRECTUS_URL: https://product-team.directus.app - -jobs: - app-lint: - name: App Lint - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Prepare - uses: ./.github/actions/prepare - - - name: Run Linter - run: pnpm eslint:lint diff --git a/.bak/.github/workflows/lint-oas.yaml b/.bak/.github/workflows/lint-oas.yaml deleted file mode 100644 index 4ec749b5..00000000 --- a/.bak/.github/workflows/lint-oas.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: OAS Lint - -on: - push: - branches: - - main - pull_request: - branches: - - main - -concurrency: - group: oas-lint-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_OPTIONS: --max_old_space_size=6144 - NUXT_PUBLIC_PRODUCT_DIRECTUS_URL: https://product-team.directus.app - -jobs: - oas-lint: - name: OAS Lint - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Prepare - uses: ./.github/actions/prepare - - - name: Run Linter - run: pnpm oas:lint diff --git a/.bak/.github/workflows/typecheck.yaml b/.bak/.github/workflows/typecheck.yaml deleted file mode 100644 index 42ba49d1..00000000 --- a/.bak/.github/workflows/typecheck.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: Typecheck - -on: - push: - branches: - - main - pull_request: - branches: - - main - -concurrency: - group: typecheck-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_OPTIONS: --max_old_space_size=6144 - NUXT_PUBLIC_PRODUCT_DIRECTUS_URL: https://product-team.directus.app - -jobs: - typecheck: - name: Typecheck - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Prepare - uses: ./.github/actions/prepare - - - name: Run Typechecker - run: pnpm typecheck - diff --git a/.bak/.gitignore b/.bak/.gitignore deleted file mode 100644 index b8b47024..00000000 --- a/.bak/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# Nuxt dev/build outputs -.output -.data -.nuxt -.nitro -.cache -dist - -# Node dependencies -node_modules - -# Logs -logs -*.log - -# Misc -.DS_Store -.fleet -.idea - -# Local env files -.env -.env.* -!.env.example - -.remote - - -public/oas.yaml diff --git a/.bak/README.md b/.bak/README.md deleted file mode 100644 index ba98e390..00000000 --- a/.bak/README.md +++ /dev/null @@ -1 +0,0 @@ -# Directus Docs \ No newline at end of file diff --git a/.bak/api-spec/components/parameters.yaml b/.bak/api-spec/components/parameters.yaml deleted file mode 100644 index 21ca0632..00000000 --- a/.bak/api-spec/components/parameters.yaml +++ /dev/null @@ -1,110 +0,0 @@ -Id: - description: Identifier for the object. - name: id - in: path - required: true - schema: - type: integer -UUId: - description: Unique identifier for the object. - name: id - in: path - required: true - schema: - example: 8cbb43fe-4cdf-4991-8352-c461779cec02 - type: string -Collection: - description: Collection of which you want to retrieve the items from. - name: collection - in: path - required: true - schema: - type: string -Search: - description: Filter by items that contain the given search query in one of their fields. - in: query - name: search - required: false - schema: - type: string -Page: - description: Cursor for use in pagination. Often used in combination with limit. - in: query - name: page - required: false - schema: - type: integer -Offset: - description: How many items to skip when fetching data. - in: query - name: offset - required: false - schema: - type: integer -Sort: - description: >- - How to sort the returned items. `sort` is a CSV of fields used to sort the fetched items. Sorting defaults to ascending (ASC) order but a minus sign (` - `) can be used to reverse this to descending (DESC) order. Fields are prioritized by their order in the CSV. You can also use a ` ? ` to sort randomly. - in: query - name: sort - required: false - explode: false - schema: - type: array - items: - type: string -Meta: - description: What metadata to return in the response. - in: query - name: meta - required: false - schema: - type: string -Limit: - description: A limit on the number of objects that are returned. - in: query - name: limit - required: false - schema: - type: integer -Filter: - description: Select items in collection by given conditions. - in: query - name: filter - required: false - content: - application/json: - schema: - type: object - example: - : - : -Fields: - description: Control what fields are being returned in the object. - in: query - name: fields - required: false - explode: false - schema: - type: array - items: - type: string -Export: - name: export - description: Saves the API response to a file. Accepts one of `csv`, `json`, `xml`, `yaml`. - in: query - required: false - schema: - type: string - enum: - - csv - - json - - xml - - yaml -Version: - name: version - description: >- - Retrieve an item's state from a specific Content Version. The value corresponds to the "key" of the Content Version. - in: query - required: false - schema: - type: string diff --git a/.bak/api-spec/components/responses.yaml b/.bak/api-spec/components/responses.yaml deleted file mode 100644 index 1d6d39eb..00000000 --- a/.bak/api-spec/components/responses.yaml +++ /dev/null @@ -1,30 +0,0 @@ -NotFoundError: - description: "Error: Not found." - content: - application/json: - schema: - type: object - properties: - error: - type: object - properties: - code: - type: integer - format: int64 - message: - type: string -UnauthorizedError: - description: "Error: Unauthorized request" - content: - application/json: - schema: - type: object - properties: - error: - type: object - properties: - code: - type: integer - format: int64 - message: - type: string \ No newline at end of file diff --git a/.bak/api-spec/components/schemas/_index.yaml b/.bak/api-spec/components/schemas/_index.yaml deleted file mode 100644 index 5d4624a0..00000000 --- a/.bak/api-spec/components/schemas/_index.yaml +++ /dev/null @@ -1,56 +0,0 @@ -x-metadata: - $ref: x-metadata.yaml -Activity: - $ref: Activity.yaml -Collections: - $ref: Collections.yaml -Comments: - $ref: Comments.yaml -Dashboards: - $ref: Dashboards.yaml -Diff: - $ref: Diff.yaml -Extensions: - $ref: Extensions.yaml -Fields: - $ref: Fields.yaml -Files: - $ref: Files.yaml -Flows: - $ref: Flows.yaml -Folders: - $ref: Folders.yaml -Items: - $ref: Items.yaml -Notifications: - $ref: Notifications.yaml -Operations: - $ref: Operations.yaml -Panels: - $ref: Panels.yaml -Permissions: - $ref: Permissions.yaml -Policies: - $ref: Policies.yaml -Presets: - $ref: Presets.yaml -Query: - $ref: Query.yaml -Relations: - $ref: Relations.yaml -Revisions: - $ref: Revisions.yaml -Roles: - $ref: Roles.yaml -Schema: - $ref: Schema.yaml -Settings: - $ref: Settings.yaml -Shares: - $ref: Shares.yaml -Translations: - $ref: Translations.yaml -Users: - $ref: Users.yaml -Versions: - $ref: Versions.yaml diff --git a/.bak/api-spec/components/schemas/activity.yaml b/.bak/api-spec/components/schemas/activity.yaml deleted file mode 100644 index d3d0fce3..00000000 --- a/.bak/api-spec/components/schemas/activity.yaml +++ /dev/null @@ -1,62 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the object. - example: 2 - type: integer - action: - description: Action that was performed. - example: update - type: string - enum: - - create - - update - - delete - - login - user: - description: The user who performed this action. Many-to-one to users. - type: string - oneOf: - - $ref: Users.yaml - nullable: true - timestamp: - description: When the action happened. - example: '2019-12-05T22:52:09Z' - type: string - format: date-time - ip: - description: The IP address of the user at the time the action took place. - example: 127.0.0.1 - oneOf: - - type: string - - format: ipv4 - user_agent: - description: User agent string of the browser the user used when the action took place. - example: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/78.0.3904.108 Safari/537.36 - type: string - collection: - description: Collection identifier in which the item resides. - oneOf: - - type: string - - $ref: Collections.yaml - item: - description: Unique identifier for the item the action applied to. This is always a string, even for integer primary keys. - example: '328' - type: string - comment: - description: User comment. This will store the comments that show up in the right sidebar of the item edit page in the admin app. - example: null - type: string - nullable: true - origin: - description: Origin of the request when the action took place. - example: https://directus.io - type: string - revisions: - description: Any changes that were made in this activity. One-to-many to revisions. - nullable: true - type: array - items: - oneOf: - - $ref: Revisions.yaml -x-collection: directus_activity diff --git a/.bak/api-spec/components/schemas/collections.yaml b/.bak/api-spec/components/schemas/collections.yaml deleted file mode 100644 index 7a963fa7..00000000 --- a/.bak/api-spec/components/schemas/collections.yaml +++ /dev/null @@ -1,76 +0,0 @@ -type: object -properties: - collection: - description: Name of the collection. This matches the table name in the database. - example: customers - type: string - icon: - nullable: true - description: Icon displayed in the Data Studio when working with this collection. - type: string - note: - nullable: true - description: Short description displayed in the Data Studio. - type: string - display_template: - nullable: true - description: How items in this collection should be displayed when viewed relationally in the Data Studio. - type: string - hidden: - nullable: false - description: Whether or not this collection is hidden in the Data Studio. - type: boolean - singleton: - nullable: false - description: Whether or not this collection is treated as a singleton. - type: boolean - translations: - description: How this collection's name is displayed in the different languages in the Data Studio. - type: array - nullable: true - archive_field: - description: What field in the collection holds the archived state. - nullable: true - type: string - archive_app_filter: - nullable: false - type: boolean - archive_value: - nullable: true - description: What value the archive field should be set to when archiving an item. - type: string - unarchive_value: - nullable: true - description: What value the archive field should be set to when unarchiving an item. - type: string - sort_field: - nullable: true - description: What field holds the sort value on the collection. The Data Studio uses this to allow drag-and-drop manual sorting. - type: string - accountability: - nullable: true - description: What data is tracked. One of `all`, `activity`. - type: string - item_duplication_fields: - nullable: true - description: What fields are duplicated during "Save as copy" action of an item in this collection. - type: array - sort: - nullable: true - description: What sort order of the collection relative to other collections of the same level. - type: integer - group: - nullable: true - description: The name of the parent collection. - type: string - oneOf: - - $ref: Collections.yaml - collapse: - nullable: false - description: What is the default behavior of this collection or "folder" collection when it has nested collections. One of `open`, `closed`, `locked`. - type: string - versioning: - nullable: false - description: Whether or not Content Versioning is enabled for this collection. - type: boolean -x-collection: directus_collections diff --git a/.bak/api-spec/components/schemas/comments.yaml b/.bak/api-spec/components/schemas/comments.yaml deleted file mode 100644 index c2824fd4..00000000 --- a/.bak/api-spec/components/schemas/comments.yaml +++ /dev/null @@ -1,42 +0,0 @@ -type: object -properties: - collection: - description: Collection identifier in which the item resides. - example: articles - type: string - id: - description: Unique identifier for the object. - example: 2fab3b9d-0543-4b87-8a30-3c5ee66fedf1 - type: string - format: uuid - item: - description: The item the comment is created for. - example: 15 - type: string - comment: - description: User comment. This will store the comments that show up in the right sidebar of the item edit page in the Data Studio. - example: This is a comment on an article - type: string - date_created: - description: Timestamp in ISO8601 when the comment was created. - example: 2023-01-15T09:14:52Z - type: string - format: date-time - date_updated: - description: Timestamp in ISO8601 when the comment was last updated. - example: 2023-01-15T09:00:00Z - type: string - format: date-time - user_created: - description: The user who created the comment. Many-to-one to users. - example: 12e62fd0-29c7-4fd3-b3d3-c7a39933e8af - type: string - oneOf: - - $ref: Users.yaml - user_updated: - description: The user who last updated the comment. Many-to-one to users. - example: 12e62fd0-29c7-4fd3-b3d3-c7a39933e8af - type: string - oneOf: - - $ref: Users.yaml -x-collection: directus_comments diff --git a/.bak/api-spec/components/schemas/dashboards.yaml b/.bak/api-spec/components/schemas/dashboards.yaml deleted file mode 100644 index 77eaea32..00000000 --- a/.bak/api-spec/components/schemas/dashboards.yaml +++ /dev/null @@ -1,43 +0,0 @@ -type: object -properties: - id: - description: Primary key of the dashboard; - example: a79bd1b2-beb2-49fc-8a26-0b3eec0e2697 - type: string - format: uuid - name: - description: Name of the dashboard. - example: My dashboard - type: string - icon: - description: Material icon for dashboard. - example: space_dashboard - type: string - note: - description: Descriptive text about the dashboard. - example: Test - type: string - date_created: - description: When the dashboard was created. - example: 2023-01-25T19:16:49.009Z - type: string - format: date-time - user_created: - description: User that created the dashboard. Many-to-one to users. - example: fd066644-c8e5-499d-947b-fe6c6e1a1473 - type: string - format: relation - oneOf: - - $ref: Users.yaml - color: - description: Accent color for the dashboard. - example: #6644FF - type: string - format: hexcode - panels: - description: Panels that are in this dashboard. One-to-may to panels. - example: 22640672-eef0-4ee9-ab04-591f3afb2883 - type: string - oneOf: - - $ref: Panels.yaml -x-collection: directus_shares diff --git a/.bak/api-spec/components/schemas/diff.yaml b/.bak/api-spec/components/schemas/diff.yaml deleted file mode 100644 index be0bbf3b..00000000 --- a/.bak/api-spec/components/schemas/diff.yaml +++ /dev/null @@ -1,46 +0,0 @@ -type: object -properties: - hash: - type: string - diff: - type: object - properties: - collections: - type: array - items: - type: object - properties: - collection: - type: string - diff: - type: array - items: - type: object - fields: - type: array - items: - type: object - properties: - collection: - type: string - field: - type: string - diff: - type: array - items: - type: object - relations: - type: array - items: - type: object - properties: - collection: - type: string - field: - type: string - related_collection: - type: string - diff: - type: array - items: - type: object \ No newline at end of file diff --git a/.bak/api-spec/components/schemas/extensions.yaml b/.bak/api-spec/components/schemas/extensions.yaml deleted file mode 100644 index 2a24a5ec..00000000 --- a/.bak/api-spec/components/schemas/extensions.yaml +++ /dev/null @@ -1,45 +0,0 @@ -type: object -properties: - enabled: - description: Whether or not the extension is enabled. - nullable: false - type: boolean - id: - nullable: false - description: Unique identifier of the extension. - type: string - format: uuid - bundle: - description: Name of the bundle the extension is in. - example: my-bundle - type: string - nullable: true - type: - description: Type of the extension. One of `'interface'`, `'display'`, `'layout'`, `'module'`, `'panel'`, `'hook'`, `'endpoint'`, `'operation'`, `'bundle'. - type: string - local: - description: Whether the extension exists in the local extensions folder or is loaded from `node_modules`. - type: boolean - version: - description: The currently loaded version of the plugin as defined by its `package.json`. - type: string - partial: - description: | - Whether or not a bundles entries can be individually disabled. This is applicable to bundle type extensions only. - - ``` - { - "name": "my-bundle-operation", - "bundle": "directus-extension-my-bundle", - "schema": { - "type": "operation", - "local": true, - "version": "1.0.0" - }, - "meta": { - "enabled": true - } - } - ``` - type: boolean -x-collection: directus_extensions diff --git a/.bak/api-spec/components/schemas/fields.yaml b/.bak/api-spec/components/schemas/fields.yaml deleted file mode 100644 index 0c90e950..00000000 --- a/.bak/api-spec/components/schemas/fields.yaml +++ /dev/null @@ -1,75 +0,0 @@ -type: object -properties: - id: - nullable: false - type: integer - collection: - description: Unique name of the collection this field is in. - example: about_us - type: string - field: - description: Unique name of the field. Field name is unique within the collection. - example: id - type: string - special: - nullable: true - description: Any special transform flags that apply to this field. - type: array - items: - type: string - interface: - description: The interface used for this field. - nullable: true - type: string - options: - type: object - description: The interface options configured for this field. The structure is based on the interface used. - nullable: true - display: - nullable: true - description: The display used for this field. - type: string - display_options: - type: string - description: The configured options for the used display. - nullable: true - readonly: - nullable: false - description: If the field is considered readonly in the Data Studio. - type: boolean - hidden: - nullable: false - description: If the field is hidden from the edit page in the Data Studio. - type: boolean - sort: - nullable: true - description: Where this field is shown on the edit page in the Data Studio. - type: integer - width: - nullable: true - description: How wide the interface is rendered on the edit page in the Data Studio. One of `half`, `half-left`, `half-right`, `half-space`, `full`, `fill`. - type: string - translations: - nullable: true - description: How this field's name is displayed in the different languages in the Data Studio. - type: array - note: - nullable: true - description: Short description displayed in the Data Studio. - type: string - # conditions: - # nullable: true - required: - nullable: true - type: boolean - group: - nullable: true - type: integer - oneOf: - - $ref: Fields.yaml - # validation: - # nullable: true - validation_message: - nullable: true - type: string -x-collection: directus_fields diff --git a/.bak/api-spec/components/schemas/files.yaml b/.bak/api-spec/components/schemas/files.yaml deleted file mode 100644 index 164a79e7..00000000 --- a/.bak/api-spec/components/schemas/files.yaml +++ /dev/null @@ -1,114 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the file. - example: 8cbb43fe-4cdf-4991-8352-c461779cec02 - type: string - format: uuid - storage: - description: Where the file is stored. Either `local` for the local filesystem or the name of the storage adapter (for example `s3`). - example: local - type: string - filename_disk: - description: Name of the file on disk. By default, Directus uses a random hash for the filename. - example: a88c3b72-ac58-5436-a4ec-b2858531333a.jpg - type: string - filename_download: - description: How you want to the file to be named when it's being downloaded. - example: avatar.jpg - type: string - title: - description: Title for the file. Is extracted from the filename on upload, but can be edited by the user. - example: User Avatar - type: string - type: - description: MIME type of the file. - example: image/jpeg - type: string - folder: - description: Virtual folder where this file resides in. - example: null - type: string - oneOf: - - $ref: Folders.yaml - nullable: true - uploaded_by: - description: Who uploaded the file. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - oneOf: - - type: string - - $ref: Users.yaml - created_on: - description: When the file was created. - example: 2019-12-03T00:10:15+00:00 - type: string - format: date-time - modified_by: - type: string - format: uuid - oneOf: - - $ref: Users.yaml - nullable: true - modified_on: - nullable: false - type: string - format: date-time - charset: - description: Character set of the file. - example: binary - type: string - nullable: true - filesize: - description: Size of the file in bytes. - example: 137862 - type: integer - width: - description: Width of the file in pixels. Only applies to images. - example: 800 - type: integer - nullable: true - height: - description: Height of the file in pixels. Only applies to images. - example: 838 - type: integer - nullable: true - duration: - description: Duration of the file in seconds. Only applies to audio and video. - example: 0 - type: integer - nullable: true - embed: - description: Where the file was embedded from. - example: null - type: string - nullable: true - description: - description: Description for the file. - type: string - nullable: true - location: - description: Where the file was created. Is automatically populated based on Exif data for images. - type: string - nullable: true - tags: - description: Tags for the file. Is automatically populated based on Exif data for images. - type: array - nullable: true - items: - type: string - metadata: - description: IPTC, Exif, and ICC metadata extracted from file - type: object - nullable: true - focal_point_x: - nullable: true - type: integer - focal_point_y: - nullable: true - type: integer - uploaded_on: - description: When the file was last uploaded/replaced. - example: '2019-12-03T00:10:15+00:00' - type: string - format: date-time -x-collection: directus_files diff --git a/.bak/api-spec/components/schemas/flows.yaml b/.bak/api-spec/components/schemas/flows.yaml deleted file mode 100644 index 58c90f57..00000000 --- a/.bak/api-spec/components/schemas/flows.yaml +++ /dev/null @@ -1,73 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the flow. - type: string - format: uuid - example: 2f24211d-d928-469a-aea3-3c8f53d4e426 - name: - description: The name of the flow. - type: string - example: Update Articles Flow - icon: - description: Icon displayed in the Admin App for the flow. - type: string - example: bolt - color: - description: Color of the icon displayed in the Admin App for the flow. - type: string - example: #112233 - format: hexcode - nullable: true - description: - nullable: true - type: string - status: - description: Current status of the flow. - type: string - example: active - default: active - enum: - - active - - inactive - trigger: - description: Type of trigger for the flow. One of `hook`, `webhook`, `operation`, `schedule`, `manual`. - type: string - example: manual - accountability: - description: The permission used during the flow. One of `$public`, `$trigger`, `$full`, or UUID of a role. - type: string - example: $trigger - options: - description: Options of the selected trigger for the flow. - type: object - example: null - nullable: true - operation: - description: UUID of the operation connected to the trigger in the flow. - example: 92e82998-e421-412f-a513-13701e83e4ce - oneOf: - - type: string - - format: uuid - - $ref: Operations.yaml - date_created: - description: Timestamp in ISO8601 when the flow was created. - type: string - example: '2022-05-11T13:14:52Z' - format: date-time - nullable: true - user_created: - description: The user who created the flow. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - oneOf: - - type: string - - $ref: Users.yaml - operations: - nullable: true - type: array - items: - oneOf: - - type: string - format: uuid - - $ref: Operations.yaml -x-collection: directus_flows diff --git a/.bak/api-spec/components/schemas/folders.yaml b/.bak/api-spec/components/schemas/folders.yaml deleted file mode 100644 index 008cbbf4..00000000 --- a/.bak/api-spec/components/schemas/folders.yaml +++ /dev/null @@ -1,26 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the folder. - example: 0cf0e03d-4364-45df-b77b-ca61f61869d2 - type: string - format: uuid - name: - description: Name of the folder. - example: New York - type: string - parent: - description: Unique identifier of the parent folder. This allows for nested folders. - example: | - { - "data": { - "id": "fc02d733-95b8-4e27-bd4b-08a32cbe4e66", - "name": "Test", - "parent": null - } - } - type: string - oneOf: - - $ref: Folders.yaml - nullable: true -x-collection: directus_folders diff --git a/.bak/api-spec/components/schemas/items.yaml b/.bak/api-spec/components/schemas/items.yaml deleted file mode 100644 index 7ae728e2..00000000 --- a/.bak/api-spec/components/schemas/items.yaml +++ /dev/null @@ -1,7 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the item. - example: 2 - type: integer -x-collection: directus_items diff --git a/.bak/api-spec/components/schemas/notifications.yaml b/.bak/api-spec/components/schemas/notifications.yaml deleted file mode 100644 index 3ed106cc..00000000 --- a/.bak/api-spec/components/schemas/notifications.yaml +++ /dev/null @@ -1,44 +0,0 @@ -type: object -properties: - id: - description: Primary key of the revision. - example: 2 - type: integer - timestamp: - description: Timestamp in ISO8601 when the notification was created. - example: '2021-11-24T13:57:35Z' - type: string - format: date-time - status: - description: Current status of the notification. One of "inbox", "archived" - example: inbox - type: string - recipient: - description: User that received the notification. - example: 3EE34828-B43C-4FB2-A721-5151579B08EA - oneOf: - - type: string - - $ref: Users.yaml - sender: - description: User that sent the notification, if any. - example: 497a495e-5529-4e46-8feb-2f35e9b85601 - oneOf: - - type: string - - $ref: Users.yaml - subject: - description: Subject line of the message. - example: inbox - type: string - message: - description: Subject line of the message. - example: \nHello admin@example.com,\n\rijk@directus.io has mentioned you in a comment:\n\n> Hello admin@example.com!\n\nClick here to view.\n - type: string - collection: - description: Collection this notification references. - example: articles - type: string - item: - description: Primary key of the item this notification references. - example: '1' - type: string -x-collection: directus_notifications diff --git a/.bak/api-spec/components/schemas/operations.yaml b/.bak/api-spec/components/schemas/operations.yaml deleted file mode 100644 index e919e877..00000000 --- a/.bak/api-spec/components/schemas/operations.yaml +++ /dev/null @@ -1,63 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the operation. - type: string - format: uuid - example: 2f24211d-d928-469a-aea3-3c8f53d4e426 - name: - description: The name of the operation. - type: string - example: Log to Console - key: - description: Key for the operation. Must be unique within a given flow. - type: string - example: log_console - type: - description: Type of operation. One of `log`, `mail`, `notification`, `create`, `read`, `request`, `sleep`, `transform`, `trigger`, `condition`, or any type of custom operation extensions. - type: string - example: log - position_x: - description: Position of the operation on the X axis within the flow workspace. - type: integer - example: 12 - position_y: - description: Position of the operation on the Y axis within the flow workspace. - type: integer - example: 12 - options: - description: Options depending on the type of the operation. - type: object - example: null - nullable: true - resolve: - description: The operation triggered when the current operation succeeds (or `then` logic of a condition operation). - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - oneOf: - - type: string - - $ref: Operations.yaml - reject: - description: The operation triggered when the current operation fails (or `otherwise` logic of a condition operation). - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - oneOf: - - type: string - - $ref: Operations.yaml - flow: - nullable: false - type: string - format: uuid - oneOf: - - $ref: Flows.yaml - date_created: - description: Timestamp in ISO8601 when the operation was created. - type: string - example: '2022-05-11T13:14:52Z' - format: date-time - nullable: true - user_created: - description: The user who created the operation. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - oneOf: - - type: string - - $ref: Users.yaml -x-collection: directus_operations diff --git a/.bak/api-spec/components/schemas/panels.yaml b/.bak/api-spec/components/schemas/panels.yaml deleted file mode 100644 index 212a292c..00000000 --- a/.bak/api-spec/components/schemas/panels.yaml +++ /dev/null @@ -1,70 +0,0 @@ -type: object -properties: - id: - description: Primary key of the panel. - example: 22640672-eef0-4ee9-ab04-591f3afb288 - type: string - format: uuid - dashboard: - description: Dashboard where this panel is visible. Many-to-one to dashboards. - example: a79bd1b2-beb2-49fc-8a26-0b3eec0e269 - oneOf: - - type: string - - $ref: Dashboards.yaml - name: - description: Name of the panel. - example: 30-day sales - type: string - icon: - description: Material design icon for the panel. - example: paid - type: string - color: - description: Accent color of the panel. - example: #6B8068 - type: string - format: hexcode - show_header: - description: Whether or not the header should be rendered for this panel. - example: true - type: boolean - note: - description: Description for the panel. - example: Overview of the sales numbers in the last 30 day - type: string - type: - description: The panel type used for this panel. - example: time-series - type: string - position_x: - description: The X position on the workspace grid. - example: 1 - type: integer - position_y: - description: The Y position on the workspace grid. - example: 1 - type: integer - width: - description: Width of the panel in number of workspace dots. - example: 1 - type: integer - height: - description: Height of the panel in number of workspace dots. - example: 1 - type: integer - options: - description: Description for the panel. - example: {} - type: object - date_created: - description: When the panel was created - example: 2023-01-05T19:05:51.884Z - type: string - format: date-time - user_created: - description: User that created the panel. Many-to-one to users. - example: fd066644-c8e5-499d-947b-fe6c6e1a1473 - oneOf: - - type: string - - $ref: Users.yaml -x-collection: directus_panels diff --git a/.bak/api-spec/components/schemas/permissions.yaml b/.bak/api-spec/components/schemas/permissions.yaml deleted file mode 100644 index 24af7f29..00000000 --- a/.bak/api-spec/components/schemas/permissions.yaml +++ /dev/null @@ -1,45 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the permission. - example: 1 - type: integer - collection: - description: What collection this permission applies to. - example: customers - type: string - action: - description: What action this permission applies to. - example: create - type: string - enum: - - create - - read - - update - - delete - permissions: - description: JSON structure containing the permissions checks for this permission. - type: object - nullable: true - validation: - description: JSON structure containing the validation checks for this permission. - type: object - nullable: true - presets: - description: JSON structure containing the preset value for created/updated items. - type: object - nullable: true - fields: - description: CSV of fields that the user is allowed to interact with. - type: array - items: - type: string - nullable: true - policy: - description: Policy this permission applies to. Many-to-one to policies. - nullable: false - format: uuid - type: string - oneOf: - - $ref: Policies.yaml -x-collection: directus_permissions diff --git a/.bak/api-spec/components/schemas/policies.yaml b/.bak/api-spec/components/schemas/policies.yaml deleted file mode 100644 index 25c32892..00000000 --- a/.bak/api-spec/components/schemas/policies.yaml +++ /dev/null @@ -1,58 +0,0 @@ -type: object -properties: - id: - description: Primary key of the policy; - example: 22640672-eef0-4ee9-ab04-591f3afb288 - type: string - format: uuid - name: - description: Name of the policy. - example: Admin - type: string - icon: - description: Icon for the policy. Displayed in the Data Studio. - example: supervised_user_circle - type: string - description: - description: Description for the policy. Displayed in the Data Studio. - example: null - type: string - ip_access: - description: A CSV of IP addresses that this policy applies to. Allows you to configure an allowlist of IP addresses. If empty, no IP restrictions are applied. - example: null - type: string - format: csv - enforce_tfa: - description: Whether or not Two-Factor Authentication is required for users that have this policy. - example: false - type: boolean - admin_access: - description: If this policy grants the user admin access. This means that users with this policy have full permissions to everything. - example: true - type: boolean - app_access: - description: Whether or not users with this policy have access to use the Data Studio. - example: true - type: boolean - users: - description: The users this policy is assigned to directly, this does not include users which receive this policy through a role. It expects and returns data from the directus_access collection. Many-to-many to users via access. - example: ["0bc7b36a-9ba9-4ce0-83f0-0a526f354e07"] - oneOf: - - type: array - - format: many-to-many - - $ref: Users.yaml - roles: - description: The roles this policy is assigned to. It expects and returns data from the directus_access collection. Many-to-many to roles via access. - example: ["8b4474c0-288d-4bb8-b62e-8330646bb6aa"] - oneOf: - - type: array - - format: many-to-many - - $ref: Roles.yaml - permissions: - description: The permissions assigned to this policy. One-to-many to permissions. - example: ["5c74c86f-cab0-4b14-a3c4-cd4f2363e826"] - oneOf: - - type: array - - format: one-to-many - - $ref: Permissions.yaml -x-collection: directus_policies diff --git a/.bak/api-spec/components/schemas/presets.yaml b/.bak/api-spec/components/schemas/presets.yaml deleted file mode 100644 index 361bb42c..00000000 --- a/.bak/api-spec/components/schemas/presets.yaml +++ /dev/null @@ -1,59 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for this single collection preset. - example: 155 - type: integer - bookmark: - description: Name for the bookmark. If this is set, the preset will be considered a bookmark. - nullable: true - type: string - user: - description: The unique identifier of the user to whom this collection preset applies. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - nullable: true - type: string - oneOf: - - $ref: Users.yaml - role: - description: The unique identifier of a role in the platform. If `user` is null, this will be used to apply the collection preset or bookmark for all users in the role. - example: 50419801-0f30-8644-2b3c-9bc2d980d0a0 - nullable: true - type: string - oneOf: - - $ref: Roles.yaml - collection: - description: What collection this collection preset is used for. - example: articles - oneOf: - - type: string - - $ref: Collections.yaml - search: - description: Search query. - type: string - nullable: true - layout: - description: Key of the layout that is used. - type: string - example: null - layout_query: - description: Layout query that's saved per layout type. Controls what data is fetched on load. These follow the same format as the JS SDK parameters. - type: object - example: - cards: - sort: -published_on - nullable: true - layout_options: - description: Options of the views. The properties in here are controlled by the layout. - type: object - example: - cards: - icon: account_circle - title: "{{ first_name }} {{ last_name }}" - subtitle: "{{ title }}" - size: 3 - nullable: true - filters: - type: array - nullable: true -x-collection: directus_presets diff --git a/.bak/api-spec/components/schemas/query.yaml b/.bak/api-spec/components/schemas/query.yaml deleted file mode 100644 index ac304e0b..00000000 --- a/.bak/api-spec/components/schemas/query.yaml +++ /dev/null @@ -1,40 +0,0 @@ -type: object -properties: - fields: - type: array - items: - type: string - description: Control what fields are being returned in the object. - example: - - "*" - - "*.*" - filter: - type: object - example: - : - : - search: - description: Filter by items that contain the given search query in one of their fields. - type: string - sort: - type: array - items: - type: string - description: How to sort the returned items. - example: - - "-date_created" - limit: - type: number - description: Set the maximum number of items that will be returned - offset: - type: number - description: How many items to skip when fetching data. - page: - type: number - description: Cursor for use in pagination. Often used in combination with limit. - deep: - type: object - description: Deep allows you to set any of the other query parameters on a nested relational dataset. - example: - related_articles: - _limit: 3 \ No newline at end of file diff --git a/.bak/api-spec/components/schemas/relations.yaml b/.bak/api-spec/components/schemas/relations.yaml deleted file mode 100644 index 57a08b74..00000000 --- a/.bak/api-spec/components/schemas/relations.yaml +++ /dev/null @@ -1,43 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the relation. - example: 1 - type: integer - many_collection: - description: Collection that has the field that holds the foreign key. - example: directus_activity - type: string - many_field: - description: Foreign key. Field that holds the primary key of the related collection. - example: user - type: string - one_collection: - description: Collection on the _one_ side of the relationship. - example: directus_users - type: string - one_field: - description: Alias column that serves as the _one_ side of the relationship. - example: null - type: string - nullable: true - one_collection_field: - nullable: true - type: string - one_allowed_collections: - nullable: true - type: array - items: - type: string - junction_field: - description: Field on the junction table that holds the many field of the related relation. - example: null - type: string - nullable: true - sort_field: - nullable: true - type: string - one_deselect_action: - nullable: false - type: string -x-collection: directus_relations \ No newline at end of file diff --git a/.bak/api-spec/components/schemas/revisions.yaml b/.bak/api-spec/components/schemas/revisions.yaml deleted file mode 100644 index 87f89158..00000000 --- a/.bak/api-spec/components/schemas/revisions.yaml +++ /dev/null @@ -1,49 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the revision. - example: 1 - type: integer - activity: - description: Unique identifier for the activity record. Many-to-one to activity. - example: 2 - type: integer - oneOf: - - $ref: Activity.yaml - collection: - description: Collection of the updated item. - example: articles - type: string - oneOf: - - $ref: Collections.yaml - item: - description: Primary key of updated item. - example: '168' - type: string - data: - description: Copy of item state at time of update. - example: - author: 1 - body: This is my first post - featured_image: 15 - id: '168' - title: Hello, World! - type: object - nullable: true - delta: - description: Changes between the previous and the current revision. - example: - title: Hello, World! - type: object - parent: - description: If the current item was updated relationally, this is the id of the parent revision record. Many-to-one to revisions. - example: null - type: integer - nullable: true - version: - description: Associated version of this revision. Many-to-one to versions. - example: draft - type: string - oneOf: - - $ref: Versions.yaml -x-collection: directus_revisions diff --git a/.bak/api-spec/components/schemas/roles.yaml b/.bak/api-spec/components/schemas/roles.yaml deleted file mode 100644 index fced4b49..00000000 --- a/.bak/api-spec/components/schemas/roles.yaml +++ /dev/null @@ -1,52 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the role. - example: 2f24211d-d928-469a-aea3-3c8f53d4e426 - type: string - format: uuid - name: - description: Name of the role. - example: Administrator - type: string - icon: - description: The role's icon. - example: verified_user - type: string - description: - description: Description of the role. - example: Admins have access to all managed data within the system by default - type: string - nullable: true - parent: - nullable: true - description: Optional parent role that this role inherits permissions from. Many-to-one to roles. - type: string - format: uuid - oneOf: - - $ref: Roles.yaml - children: - nullable: true - description: Nested child roles that inherit this roles permissions. One-to-many to roles. One-to-many to roles. - type: array - format: uuid - items: - oneOf: - - $ref: Roles.yaml - policies: - nullable: true - description: The policies in this role. Many-to-many to roles. - type: array - format: uuid - items: - oneOf: - - $ref: Roles.yaml - users: - nullable: true - description: The users in this role. One-to-many to users. - type: array - format: uuid - items: - oneOf: - - $ref: Users.yaml -x-collection: directus_roles diff --git a/.bak/api-spec/components/schemas/schema.yaml b/.bak/api-spec/components/schemas/schema.yaml deleted file mode 100644 index ab97da45..00000000 --- a/.bak/api-spec/components/schemas/schema.yaml +++ /dev/null @@ -1,21 +0,0 @@ -type: object -properties: - version: - type: integer - example: 1 - directus: - type: string - vendor: - type: string - collections: - type: array - items: - $ref: Collections.yaml - fields: - type: array - items: - $ref: Fields.yaml - relations: - type: array - items: - $ref: Relations.yaml diff --git a/.bak/api-spec/components/schemas/settings.yaml b/.bak/api-spec/components/schemas/settings.yaml deleted file mode 100644 index 4923c5b2..00000000 --- a/.bak/api-spec/components/schemas/settings.yaml +++ /dev/null @@ -1,230 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the setting. - type: integer - example: 1 - project_name: - description: Name of the project, shown in the Data Studio. - type: string - example: Directus - project_url: - description: The url of the project. Link to the (public) website that goes with this project. - type: string - example: null - nullable: true - project_color: - description: The brand color of the project. - type: string - format: hexcode - example: null - nullable: true - project_logo: - description: The logo of the project. Many-to-one to files. - type: string - example: null - nullable: true - oneOf: - - $ref: Files.yaml - public_foreground: - description: The foreground of the project. Many-to-one to files. - type: string - example: null - nullable: true - oneOf: - - $ref: Files.yaml - public_background: - description: The background of the project. Many-to-one to files. - type: object - example: null - nullable: true - oneOf: - - $ref: Files.yaml - public_note: - description: Note rendered on the public pages of the app. - type: string - example: null - nullable: true - auth_login_attempts: - description: Allowed authentication login attempts before the user's status is set to blocked. - type: integer - example: 25 - auth_password_policy: - description: Authentication password policy. What regex passwords must pass in order to be valid. - type: string - format: regex - nullable: true - storage_asset_transform: - description: If the transform endpoints are allowed to be used on the assets endpoint. One of all, none or presets. - type: string - enum: - - all - - none - - presets - example: all - nullable: true - storage_asset_presets: - description: What preset keys exist in the assets endpoint. - type: array - items: - type: object - properties: - key: - description: Key for the asset. Used in the assets endpoint. - type: string - fit: - description: Whether to crop the thumbnail to match the size, or maintain the aspect ratio. - type: string - enum: - - cover - - contain - - inside - - outside - width: - description: Width of the thumbnail. - type: integer - height: - description: Height of the thumbnail. - type: integer - withoutEnlargement: - description: No image upscale - type: boolean - quality: - description: Quality of the compression used. - type: integer - format: - description: Reformat output image - type: string - enum: - - jpeg - - png - - webp - - tiff - - avif - transforms: - description: Additional transformations to apply - type: array - nullable: true - items: - type: object - properties: - method: - description: The Sharp method name - type: string - arguments: - description: A list of arguments to pass to the Sharp method - type: array - nullable: true - items: - type: object - properties: - argument: - description: A JSON representation of the argument value - type: string - example: null - nullable: true - custom_css: - description: CSS rules to override the App's default styling. - nullable: true - type: string - storage_default_folder: - description: Folder for uploaded files. Does not affect existing files. - type: string - format: uuid - basemaps: - description: Custom tiles to overriding the Mapbox defaults. - type: array - nullable: true - mapbox_key: - description: Mapbox Access Token. - nullable: true - type: string - module_bar: - description: What modules are enabled/added globally. - type: array - nullable: true - project_descriptor: - description: Descriptor of the project, shown in the Data Studio. - nullable: true - type: string - custom_aspect_ratios: - description: Custom aspect ratios in the image editor. - type: array - nullable: true - public_favicon: - nullable: true - description: Favicon for the Data Studio. Many-to-one to files. - type: string - oneOf: - - $ref: Files.yaml - default_appearance: - description: One of auto, light, dark. - nullable: false - type: string - enum: - - auto - - light - - dark - default_theme_light: - description: Default theme to use in light mode. - nullable: true - type: string - theme_light_overrides: - description: Default customization for light theme in use. - type: object - nullable: true - default_theme_dark: - description: Default theme to use in dark mode. - nullable: true - type: string - theme_dark_overrides: - description: Default customization for dark theme in use. - type: object - nullable: true - report_error_url: - description: | - Link to the error report page. This is a template URL that has access to the following object - - ``` - { - error: { - name?: string; - message?: string; - }; - route: { - fullPath: string; - hash: string; - name: string; - path: string; - query: string; - }; - navigator: { - language: string; - userAgent: string; - }; - user: { - id?: string | number; - first_name?: string; - last_name?: string; - title?: string; - description?: string; - location?: string; - status?: string; - }; - role: { - id?: string; - name?: string; - }; - } - ``` - nullable: true - type: string - report_bug_url: - description: Link to the bug report page. - nullable: true - type: string - report_feature_url: - description: Link to the feature request page. - nullable: true - type: string -x-collection: directus_settings diff --git a/.bak/api-spec/components/schemas/shares.yaml b/.bak/api-spec/components/schemas/shares.yaml deleted file mode 100644 index 5880f9de..00000000 --- a/.bak/api-spec/components/schemas/shares.yaml +++ /dev/null @@ -1,64 +0,0 @@ -type: object -properties: - id: - description: Primary key of the share; - example: 3a606c3e-9d4d-4556-b7bb-f00860613da3 - type: string - format: uuid - name: - description: Custom (optional) name for the share. - example: My Share - type: string - collection: - description: Collection in which the current item is shared. Many-to-one to Collections. - example: articles - type: string - oneOf: - - $ref: Collections.yaml - item: - description: Primary key of the item that's shared. - example: '1' - type: string - role: - description: Role of which the share will inherit the permissions. Many-to-one to shares. - example: 2b34fba4-a6cb-49f4-a070-2daee7ac44f0 - type: string - format: uuid - oneOf: - - $ref: Shares.yaml - password: - description: Optional password that's required to view this shared item. - example: '**********' - type: string - format: hash - user_created: - description: Reference to the user who created this share. Many-to-one to Users. - example: b13072b7-73e9-4904-89e0-34aaf4403766 - type: string - format: uuid - oneOf: - - $ref: Users.yaml - date_created: - description: When the share was created. - example: 2023-01-25T19:16:49.009Z - type: string - format: date-time - date_start: - description: Optional timestamp that controls from what date/time the shared item can be viewed. - example: 2023-01-26T17:00:00.000Z - type: string - format: date-time - date_end: - description: Optional timestamp that controls until what date/time the shared item can be viewed. - example: 2023-01-28T17:00:00.000Z - type: string - format: date-time - times_used: - description: The number of times the shared item has been viewed. - example: 0 - type: integer - max_uses: - description: The maximum number of times the shared item can be viewed. - example: 15 - type: integer -x-collection: directus_shares diff --git a/.bak/api-spec/components/schemas/translations.yaml b/.bak/api-spec/components/schemas/translations.yaml deleted file mode 100644 index a3cec5c9..00000000 --- a/.bak/api-spec/components/schemas/translations.yaml +++ /dev/null @@ -1,20 +0,0 @@ -type: object -properties: - id: - description: Primary key of the translations. - example: sc4346aa4-81a8-4885-b3a8-f647e4f6f769 - type: string - format: uuid - key: - description: The translation key. - example: Test - type: string - language: - description: The language of the translation. - example: en-US - type: string - string: - description: The translation value. - example: Test - type: string -x-collection: directus_translations diff --git a/.bak/api-spec/components/schemas/users.yaml b/.bak/api-spec/components/schemas/users.yaml deleted file mode 100644 index b90defc4..00000000 --- a/.bak/api-spec/components/schemas/users.yaml +++ /dev/null @@ -1,140 +0,0 @@ -type: object -properties: - id: - description: Unique identifier for the user. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - type: string - first_name: - description: First name of the user. - example: Admin - type: string - last_name: - description: Last name of the user. - example: User - type: string - email: - description: Unique email address for the user. - example: admin@example.com - type: string - format: email - password: - description: Password of the user. - type: string - format: string - location: - description: The user's location. - example: null - type: string - nullable: true - title: - description: The user's title. - example: null - type: string - nullable: true - description: - description: The user's description. - example: null - type: string - nullable: true - tags: - description: The user's tags. - example: null - type: array - nullable: true - items: - type: string - avatar: - description: The user's avatar. Many-to-one to files. - example: null - type: string - oneOf: - - $ref: Files.yaml - nullable: true - language: - description: The user's language used in Directus. Language the Data Studio is rendered in. See our Crowdin page for all available languages and translations. - example: en-US - type: string - tfa_secret: - description: The 2FA secret string that's used to generate one time passwords. - example: null - type: string - nullable: true - status: - description: Status of the user. - example: active - type: string - enum: - - active - - invited - - draft - - suspended - - deleted - role: - description: Unique identifier of the role of this user. Many-to-one to roles. - example: 2f24211d-d928-469a-aea3-3c8f53d4e426 - type: string - oneOf: - - $ref: Roles.yaml - token: - description: Static token for the user. - type: string - nullable: true - policies: - nullable: true - description: The policies associated with this user. Many-to-many to policies. - example: 2f24211d-d928-469a-aea3-3c8f53d4e426 - type: string - oneOf: - - $ref: Policies.yaml - last_access: - description: When this user used the API last. - example: '2020-05-31T14:32:37Z' - type: string - nullable: true - format: date-time - last_page: - description: Last page that the user was on. - example: /my-project/settings/collections/a - type: string - nullable: true - provider: - description: What auth provider was used to register this user. - nullable: false - type: string - external_identifier: - description: Primary key of the user in the third party authentication provider, if used. - nullable: true - type: string - auth_data: - description: Required data about the user as provided by the third party auth provider, if used. - nullable: true - type: object - email_notifications: - description: When this is enabled, the user will receive emails for notifications. - nullable: true - type: boolean - appearance: - description: One of auto, light, dark. - nullable: true - type: string - enum: - - auto - - light - - dark - theme_dark: - description: Theme to use in dark mode. - nullable: true - type: string - theme_light: - description: Theme to use in light mode. - nullable: true - type: string - theme_light_overrides: - description: Customization for light theme in use. - nullable: true - type: object - theme_dark_overrides: - description: Customization for dark theme in use. - nullable: true - type: object -x-collection: directus_users diff --git a/.bak/api-spec/components/schemas/versions.yaml b/.bak/api-spec/components/schemas/versions.yaml deleted file mode 100644 index d1ec3f70..00000000 --- a/.bak/api-spec/components/schemas/versions.yaml +++ /dev/null @@ -1,57 +0,0 @@ -type: object -properties: - id: - description: Primary key of the Content Version. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - type: string - key: - description: Key of the Content Version, used as the value for the "version" query parameter. - example: draft - type: string - name: - description: Descriptive name of the Content Version. - example: My Draft - type: string - collection: - description: Name of the collection the Content Version is created on. - example: articles - type: string - oneOf: - - $ref: Collections.yaml - item: - description: The item the Content Version is created on. Many-to-one to items. - example: '168' - type: string - oneOf: - - $ref: Items.yaml - hash: - nullable: true - type: string - date_created: - description: When the Content Version was created. - type: string - example: '2022-05-11T13:14:52Z' - format: date-time - nullable: true - date_updated: - description: When the Content Version was updated. - type: string - example: '2022-05-11T13:14:53Z' - format: date-time - nullable: true - user_created: - description: User that created the Content Version. Many-to-one to users. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - type: string - oneOf: - - $ref: Users.yaml - user_updated: - description: User that updated the Content Version. Many-to-one to users. - example: 63716273-0f29-4648-8a2a-2af2948f6f78 - type: string - oneOf: - - $ref: Users.yaml - delta: - description: The current changes compared to the main version of the item. - type: object -x-collection: directus_versions diff --git a/.bak/api-spec/components/schemas/x-metadata.yaml b/.bak/api-spec/components/schemas/x-metadata.yaml deleted file mode 100644 index f98608d3..00000000 --- a/.bak/api-spec/components/schemas/x-metadata.yaml +++ /dev/null @@ -1,8 +0,0 @@ -type: object -properties: - total_count: - description: Returns the total item count of the collection you're querying. - type: integer - filter_count: - description: Returns the item count of the collection you're querying, taking the current filter/search parameters into account. - type: integer \ No newline at end of file diff --git a/.bak/api-spec/components/security.yaml b/.bak/api-spec/components/security.yaml deleted file mode 100644 index a9562bb8..00000000 --- a/.bak/api-spec/components/security.yaml +++ /dev/null @@ -1,8 +0,0 @@ -KeyAuth: - type: apiKey - in: query - name: access_token -Auth: - type: apiKey - in: header - name: Authorization \ No newline at end of file diff --git a/.bak/api-spec/index.yaml b/.bak/api-spec/index.yaml deleted file mode 100644 index b059573e..00000000 --- a/.bak/api-spec/index.yaml +++ /dev/null @@ -1,295 +0,0 @@ -openapi: '3.0.1' -info: - title: Directus API Reference - description: This is a dynamically generated API specification for all endpoints existing on the current project! - version: '11.1.0' - license: - name: Business Source License 1.1 (BUSL-1.1) - url: https://github.com/directus/directus/blob/main/license -servers: - - url: https://example.directus.app - description: Your current Directus project. - -paths: - "/activity": - $ref: paths/activity/index.yaml - "/activity/{id}": - $ref: paths/activity/_id/index.yaml - "/assets/{id}": - $ref: paths/assets/_id/index.yaml - "/auth/login": - $ref: paths/auth/login/index.yaml - "/auth/logout": - $ref: paths/auth/logout/index.yaml - "/auth/oauth": - $ref: paths/auth/oauth/index.yaml - "/auth/oauth/{provider}": - $ref: paths/auth/oauth/_provider/index.yaml - "/auth/password/request": - $ref: paths/auth/password/request/index.yaml - "/auth/password/reset": - $ref: paths/auth/password/reset/index.yaml - "/auth/refresh": - $ref: paths/auth/refresh/index.yaml - "/collections": - $ref: paths/collections/index.yaml - "/collections/{id}": - $ref: paths/collections/_id/index.yaml - "/comments": - $ref: paths/comments/index.yaml - "/comments/{id}": - $ref: paths/comments/_id/index.yaml - "/dashboards": - $ref: paths/dashboards/index.yaml - "/dashboards/{id}": - $ref: paths/dashboards/_id/index.yaml - "/extensions": - $ref: paths/extensions/index.yaml - "/extensions/{bundle}/{name}": - $ref: paths/extensions/_bundle/_name/index.yaml - "/extensions/{name}": - $ref: paths/extensions/_name/index.yaml - "/fields": - $ref: paths/fields/index.yaml - "/fields/{collection}": - $ref: paths/fields/_collection/index.yaml - "/fields/{collection}/{id}": - $ref: paths/fields/_collection/_id/index.yaml - "/files": - $ref: paths/files/index.yaml - "/files/{id}": - $ref: paths/files/_id/index.yaml - "/flows": - $ref: paths/flows/index.yaml - "/flows/{id}": - $ref: paths/flows/_id/index.yaml - "/flows/trigger/{id}": - $ref: paths/flows/trigger/_id/index.yaml - "/folders": - $ref: paths/folders/index.yaml - "/folders/{id}": - $ref: paths/folders/_id/index.yaml - "/items/{collection}": - $ref: paths/items/_collection/index.yaml - "/items/{collection}/singleton": - $ref: paths/items/_collection/singleton/index.yaml - "/items/{collection}/{id}": - $ref: paths/items/_collection/_id/index.yaml - "/notifications": - $ref: paths/notifications/index.yaml - "/notifications/{id}": - $ref: paths/notifications/_id/index.yaml - "/operations": - $ref: paths/operations/index.yaml - "/operations/{id}": - $ref: paths/operations/_id/index.yaml - "/panels": - $ref: paths/panels/index.yaml - "/panels/{id}": - $ref: paths/panels/_id/index.yaml - "/permissions": - $ref: paths/permissions/index.yaml - "/permissions/{id}": - $ref: paths/permissions/_id/index.yaml - "/permissions/me": - $ref: paths/permissions/me/index.yaml - "/permissions/me/{collection}/{id}": - $ref: paths/permissions/me/_collection/_id/index.yaml - "/policies": - $ref: paths/policies/index.yaml - "/policies/{id}": - $ref: paths/policies/_id/index.yaml - "/presets": - $ref: paths/presets/index.yaml - "/presets/{id}": - $ref: paths/presets/_id/index.yaml - "/relations": - $ref: paths/relations/index.yaml - "/relations/{id}": - $ref: paths/relations/_id/index.yaml - "/revisions": - $ref: paths/revisions/index.yaml - "/revisions/{id}": - $ref: paths/revisions/_id/index.yaml - "/roles": - $ref: paths/roles/index.yaml - "/roles/{id}": - $ref: paths/roles/_id/index.yaml - "/schema/apply": - $ref: paths/schema/apply/index.yaml - "/schema/diff": - $ref: paths/schema/diff/index.yaml - "/schema/snapshot": - $ref: paths/schema/snapshot/index.yaml - "/server/info": - $ref: paths/server/info/index.yaml - "/server/ping": - $ref: paths/server/ping/index.yaml - "/server/specs/graphql": - $ref: paths/server/specs/graphql/index.yaml - "/server/specs/oas": - $ref: paths/server/specs/oas/index.yaml - "/server/health": - $ref: paths/server/health/index.yaml - "/settings": - $ref: paths/settings/index.yaml - "/shares": - $ref: paths/shares/index.yaml - "/shares/{id}": - $ref: paths/shares/_id/index.yaml - "/shares/auth": - $ref: paths/shares/auth/index.yaml - "/shares/info/{id}": - $ref: paths/shares/info/_id/index.yaml - "/translations": - $ref: paths/translations/index.yaml - "/translations/{id}": - $ref: paths/translations/_id/index.yaml - "/users": - $ref: paths/users/index.yaml - "/users/{id}": - $ref: paths/users/_id/index.yaml - "/users/invite": - $ref: paths/users/invite/index.yaml - "/users/invite/accept": - $ref: paths/users/invite/accept/index.yaml - "/users/me": - $ref: paths/users/me/index.yaml - "/users/me/tfa/disable": - $ref: paths/users/me/tfa/disable/index.yaml - "/users/me/tfa/enable": - $ref: paths/users/me/tfa/enable/index.yaml - "/users/me/tfa/generate": - $ref: paths/users/me/tfa/generate/index.yaml - "/users/me/track/page": - $ref: paths/users/me/track/page/index.yaml - "/users/register": - $ref: paths/users/register/index.yaml - "/users/register/verify-email/{token}": - $ref: paths/users/register/verify-email/_token/index.yaml - "/utils/cache/clear": - $ref: paths/utils/cache/clear/index.yaml - "/utils/export/{collection}": - $ref: paths/utils/export/_collection/index.yaml - "/utils/hash/generate": - $ref: paths/utils/hash/generate/index.yaml - "/utils/hash/verify": - $ref: paths/utils/hash/verify/index.yaml - "/utils/import/{collection}": - $ref: paths/utils/import/_collection/index.yaml - "/utils/random/string": - $ref: paths/utils/random/string/index.yaml - "/utils/sort/{collection}": - $ref: paths/utils/sort/_collection/index.yaml - "/versions": - $ref: paths/versions/index.yaml - "/versions/{id}": - $ref: paths/versions/_id/index.yaml - "/versions/{id}/compare": - $ref: paths/versions/_id/compare/index.yaml - "/versions/{id}/promote": - $ref: paths/versions/_id/promote/index.yaml - "/versions/{id}/save": - $ref: paths/versions/_id/save/index.yaml -components: - parameters: - $ref: components/parameters.yaml - responses: - $ref: components/responses.yaml - securitySchemes: - $ref: components/security.yaml - schemas: - $ref: components/schemas/_index.yaml -security: [] -tags: - - name: Activity - description: All events that happen within Directus are tracked and stored in the activities collection. This gives you full accountability over everything that happens. - x-collection: directus_activity - - name: Assets - description: Image typed files can be dynamically resized and transformed to fit any need. - - name: Authentication - description: All data within the platform is private by default. The public role can be configured to expose data without authentication, or you can pass an access token to the API to access private data. - - name: Collections - description: Collections are the individual collections of items, similar to tables in a database. Changes to collections will alter the schema of the database. - x-collection: directus_collections - - name: Comments - description: Comments are a collaboration tool and can be left on items from the sidebar. - x-collection: directus_comments - - name: Dashboards - description: Dashboards within the Insights module organize different Panels into an at-a-glance view. They can be used to group data based on department, objective, business process or anything you choose. - - name: Extensions - description: Directus can easily be extended through the addition of several types of extensions, including layouts, interfaces, and modules. - x-collection: directus_extensions - - name: Fields - description: Fields are individual pieces of content within an item. They are mapped to columns in the database. - x-collection: directus_fields - - name: Files - description: Every file managed by the platform is uploaded to the configured storage adapter, and its associated metadata is tracked within the `directus_files` system collection. Any requested file transformations are handled on the fly, and are only saved to storage. - x-collection: directus_files - - name: Folders - description: Folders can be used to organize files within the platform. Folders are virtual, and aren't mirrored within the storage adapter. - x-collection: directus_folders - - name: Flows - description: Flows enable custom, event-driven data processing and task automation. - x-collection: directus_flows - - name: Items - description: Items are individual pieces of data in your database. They can be anything, from articles, to IoT status checks. - x-collection: directus_items - - name: Operations - description: Operations are the building blocks within Data Flows. - x-collection: directus_operations - - name: Notifications - description: Notifications allow you to send/receive messages to/from other users of the platform. - x-collection: directus_notifications - - name: Panels - description: Panels are modular units of data visualization that exist within the Insights module. Each panel exists within a Dashboard and can be positioned and resized as needed. - x-collection: directus_panels - - name: Permissions - description: Permissions are assigned to Policies, and control data access throughout the platform. [Learn more about permissions](/auth/access-control). - x-collection: directus_permissions - - name: Policies - description: Policies define a specific set of access permissions, and are a composable unit that can be assigned to both roles and users. - x-collection: directus_policies - - name: Presets - description: Presets hold the preferences of individual users of the platform. This allows Directus to show and maintain custom item listings for users of the app. - x-collection: directus_presets - - name: Relations - description: What data is linked to what other data. Allows you to assign authors to articles, products to sales, and whatever other structures you can think of. - x-collection: directus_relations - - name: Revisions - description: Revisions are individual changes to items made. Directus keeps track of changes made, so you're able to revert to a previous state at will. - x-collection: directus_revisions - - name: Roles - description: Roles are the primary organizational structure for users within the platform. - x-collection: directus_roles - - name: Schema - description: Retrieve and update the schema of an instance. - x-authentication: admin - x-schemas: - - Schema - - Diff - - name: Shares - description: Shares are a way to publicly share an otherwise private item. - x-collection: directus_shares - - name: Settings - description: Settings are key-value pairs that are stored in the database, and control different aspects of the project. Only administrators have access to manage Settings. - x-collection: directus_settings - - name: Server - description: Access to where Directus runs. Allows you to make sure your server has everything needed to run the platform, and check what kind of latency we're dealing with. - - name: Translations - description: Custom translations in Directus. - x-collection: directus_translations - - name: Utilities - description: Directus comes with various utility endpoints you can use to simplify your development flow. - x-authentication: user - x-schemas: - - Files - - Folders - - Users - - Roles - - name: Users - description: Directus Users are the individual accounts that let you authenticate into the API and App. Each user can belong to a Role. - x-collection: directus_users - - name: Versions - description: Enables users to create unpublished copies of an item, modify them independently from the main version, and promote them to become the new main version when ready. - x-collection: directus_versions diff --git a/.bak/api-spec/paths/activity/_id/getActivity.yaml b/.bak/api-spec/paths/activity/_id/getActivity.yaml deleted file mode 100644 index c8711fc8..00000000 --- a/.bak/api-spec/paths/activity/_id/getActivity.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve an Activity Action -description: Retrieves the details of an existing activity action. -operationId: getActivity -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Activity.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Activity -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readActivity } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readActivity(activity_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - activity_by_id(id: ID!): directus_activity - } diff --git a/.bak/api-spec/paths/activity/_id/index.yaml b/.bak/api-spec/paths/activity/_id/index.yaml deleted file mode 100644 index 985bf563..00000000 --- a/.bak/api-spec/paths/activity/_id/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getActivity.yaml diff --git a/.bak/api-spec/paths/activity/getActivities.yaml b/.bak/api-spec/paths/activity/getActivities.yaml deleted file mode 100644 index a2d14370..00000000 --- a/.bak/api-spec/paths/activity/getActivities.yaml +++ /dev/null @@ -1,49 +0,0 @@ -summary: List Activity Actions -operationId: getActivities -description: Returns a list of activity actions. -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Activity.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - description: Successful request - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Activity -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readActivities } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readActivities(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - activity: [directus_activity] - } diff --git a/.bak/api-spec/paths/activity/index.yaml b/.bak/api-spec/paths/activity/index.yaml deleted file mode 100644 index b05679c7..00000000 --- a/.bak/api-spec/paths/activity/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getActivities.yaml diff --git a/.bak/api-spec/paths/assets/_id/getAsset.yaml b/.bak/api-spec/paths/assets/_id/getAsset.yaml deleted file mode 100644 index d97703d3..00000000 --- a/.bak/api-spec/paths/assets/_id/getAsset.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Get an Asset -security: [] -tags: -- Assets -operationId: getAsset -description: Image typed files can be retrieved, dynamically resized and transformed to fit any - need. -parameters: -- name: id - in: path - description: The id of the file. - required: true - schema: - type: string -- name: key - in: query - description: The key of the asset size configured in settings. - schema: - type: string -- name: transforms - in: query - description: A JSON array of image transformations. - schema: - type: string -- name: download - in: query - description: Download the asset to your computer - schema: - type: boolean -responses: - '200': - description: Successful request - content: - text/plain: - schema: - type: string - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readAssetRaw } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readAssetRaw('', { key: '' })); - - label: GraphQL - lang: GraphQL - source: Not available in Directus SDK/GraphQL diff --git a/.bak/api-spec/paths/assets/_id/index.yaml b/.bak/api-spec/paths/assets/_id/index.yaml deleted file mode 100644 index 1138df10..00000000 --- a/.bak/api-spec/paths/assets/_id/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getAsset.yaml diff --git a/.bak/api-spec/paths/auth/login/index.yaml b/.bak/api-spec/paths/auth/login/index.yaml deleted file mode 100644 index 32141b2b..00000000 --- a/.bak/api-spec/paths/auth/login/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: login.yaml diff --git a/.bak/api-spec/paths/auth/login/login.yaml b/.bak/api-spec/paths/auth/login/login.yaml deleted file mode 100644 index 1b2d7f80..00000000 --- a/.bak/api-spec/paths/auth/login/login.yaml +++ /dev/null @@ -1,85 +0,0 @@ -summary: Login -description: Authenticate as a user. -operationId: login -requestBody: - content: - application/json: - schema: - type: object - required: - - email - - password - properties: - email: - type: string - example: admin@example.com - description: Email address of the user you're logging in as. - for. - password: - type: string - description: Password of the user. - format: password - example: password - mode: - type: string - enum: - - json - - cookie - - session - default: json - description: Whether to retrieve the refresh token in the JSON response, - or in a `httpOnly` cookie. - otp: - type: string - description: The user's one-time-password (if MFA is enabled). -responses: - '200': - description: Successful authentification - content: - application/json: - schema: - type: object - properties: - data: - type: object - properties: - access_token: - type: string - example: eyJhbGciOiJI... - expires: - type: integer - example: 900 - refresh_token: - type: string - example: yuOJkjdPXMd... - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Authentication -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, authentication, rest, login } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(authentication('json')).with(rest()); - - // login using the authentication composable - const result = await client.login(email, password); - - // login http request - const result = await client.request(login(email, password)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - mutation { - auth_login(email: "user_email", password: "user_password") { - access_token - refresh_token - } - } diff --git a/.bak/api-spec/paths/auth/logout/index.yaml b/.bak/api-spec/paths/auth/logout/index.yaml deleted file mode 100644 index 565859e9..00000000 --- a/.bak/api-spec/paths/auth/logout/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: logout.yaml diff --git a/.bak/api-spec/paths/auth/logout/logout.yaml b/.bak/api-spec/paths/auth/logout/logout.yaml deleted file mode 100644 index c4767c97..00000000 --- a/.bak/api-spec/paths/auth/logout/logout.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Logout -description: Invalidate the refresh token thus destroying the user's session. -operationId: logout -requestBody: - content: - application/json: - schema: - type: object - properties: - refresh_token: - type: string - example: eyJ0eXAiOiJKV... - description: The refresh token to invalidate. If you have the refresh - token in a cookie through /auth/login, you don't have to submit it here. - mode: - type: string - enum: - - json - - cookie - - session - description: Whether the refresh token is submitted in the JSON response, - or in a `httpOnly` cookie. -responses: - '204': - description: Successful request, empty body - content: - application/json: - schema: - type: object - properties: - data: {} - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Authentication -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, authentication, rest, logout } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(authentication()).with(rest()); - - // logout using the authentication composable - const result = await client.logout(); - - // logout http request - const result = await client.request(logout(refresh_token)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - mutation { - auth_logout(refresh_token: "refresh_token") - } diff --git a/.bak/api-spec/paths/auth/oauth/_provider/index.yaml b/.bak/api-spec/paths/auth/oauth/_provider/index.yaml deleted file mode 100644 index 20997031..00000000 --- a/.bak/api-spec/paths/auth/oauth/_provider/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: oauthProvider.yaml diff --git a/.bak/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml b/.bak/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml deleted file mode 100644 index 824227d7..00000000 --- a/.bak/api-spec/paths/auth/oauth/_provider/oauthProvider.yaml +++ /dev/null @@ -1,37 +0,0 @@ -summary: Login Using an OAuth Provider -description: Start OAuth flow using the specified provider. -operationId: oauthProvider -parameters: -- name: provider - in: path - description: Key of the activated OAuth provider. - required: true - schema: - type: string -- name: redirect - in: query - required: false - description: Where to redirect on successful login.
    If set the authentication - details are set inside cookies otherwise a JSON is returned. - schema: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - public: - type: boolean - data: - type: object - properties: - token: - type: string - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Authentication diff --git a/.bak/api-spec/paths/auth/oauth/index.yaml b/.bak/api-spec/paths/auth/oauth/index.yaml deleted file mode 100644 index 2cfea1e0..00000000 --- a/.bak/api-spec/paths/auth/oauth/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: oauth.yaml diff --git a/.bak/api-spec/paths/auth/oauth/oauth.yaml b/.bak/api-spec/paths/auth/oauth/oauth.yaml deleted file mode 100644 index 516cad37..00000000 --- a/.bak/api-spec/paths/auth/oauth/oauth.yaml +++ /dev/null @@ -1,37 +0,0 @@ -summary: List Auth Providers -security: [] -tags: -- Authentication -operationId: oauth -description: List all the configured auth providers. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - public: - type: boolean - data: - type: array - example: - - github - - facebook - items: - type: string - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readProviders } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readProviders()); - - label: GraphQL - lang: GraphQL - source: Not available in GraphQL diff --git a/.bak/api-spec/paths/auth/password/request/index.yaml b/.bak/api-spec/paths/auth/password/request/index.yaml deleted file mode 100644 index 03ce820b..00000000 --- a/.bak/api-spec/paths/auth/password/request/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: passwordRequest.yaml diff --git a/.bak/api-spec/paths/auth/password/request/passwordRequest.yaml b/.bak/api-spec/paths/auth/password/request/passwordRequest.yaml deleted file mode 100644 index 7bfa2e73..00000000 --- a/.bak/api-spec/paths/auth/password/request/passwordRequest.yaml +++ /dev/null @@ -1,51 +0,0 @@ -summary: Request a Password Reset -operationId: passwordRequest -description: Request a reset password email to be sent. -requestBody: - content: - application/json: - schema: - type: object - required: - - email - properties: - email: - type: string - example: admin@example.com - description: Email address of the user you're requesting a reset for. - reset_url: - type: string - description: Provide a custom reset url which the link in the email will lead to. The reset token will be passed as a parameter. You need to configure the `PASSWORD_RESET_URL_ALLOW_LIST` environment variable to enable this feature. -responses: - '204': - description: Successful request, empty body - content: - application/json: - schema: - type: object - properties: - data: {} - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Authentication -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, passwordRequest } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(passwordRequest(user_email)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - mutation { - auth_password_request(email: "user_email") - } diff --git a/.bak/api-spec/paths/auth/password/reset/index.yaml b/.bak/api-spec/paths/auth/password/reset/index.yaml deleted file mode 100644 index ae11c481..00000000 --- a/.bak/api-spec/paths/auth/password/reset/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: passwordReset.yaml diff --git a/.bak/api-spec/paths/auth/password/reset/passwordReset.yaml b/.bak/api-spec/paths/auth/password/reset/passwordReset.yaml deleted file mode 100644 index 95d6958a..00000000 --- a/.bak/api-spec/paths/auth/password/reset/passwordReset.yaml +++ /dev/null @@ -1,55 +0,0 @@ -summary: Reset a Password -operationId: passwordReset -description: The request a password reset endpoint sends an email with a link to the - admin app which in turn uses this endpoint to allow the user to reset their password. -requestBody: - content: - application/json: - schema: - type: object - required: - - token - - password - properties: - token: - type: string - example: eyJ0eXAiOiJKV1Qi... - description: One-time use JWT token that is used to verify the user, as provided in the email sent by the request endpoint. - password: - type: string - example: password - format: password - description: New password for the user. -responses: - '204': - description: Successful request, empty body - content: - application/json: - schema: - type: object - properties: - data: {} - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Authentication -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, passwordReset } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(passwordReset(reset_token, new_password)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - mutation { - auth_password_reset(token: "password_reset_token", password: "password") - } diff --git a/.bak/api-spec/paths/auth/refresh/index.yaml b/.bak/api-spec/paths/auth/refresh/index.yaml deleted file mode 100644 index abe63c27..00000000 --- a/.bak/api-spec/paths/auth/refresh/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: refresh.yaml diff --git a/.bak/api-spec/paths/auth/refresh/refresh.yaml b/.bak/api-spec/paths/auth/refresh/refresh.yaml deleted file mode 100644 index e23d1e41..00000000 --- a/.bak/api-spec/paths/auth/refresh/refresh.yaml +++ /dev/null @@ -1,75 +0,0 @@ -summary: Refresh Token -description: Retrieve a new access token using a refresh token. -security: [] -tags: -- Authentication -operationId: refresh -requestBody: - content: - application/json: - schema: - type: object - properties: - refresh_token: - type: string - example: eyJ0eXAiOiJKV... - description: JWT access token you want to refresh. This token can't be - expired. - mode: - type: string - enum: - - json - - cookie - - session - default: json - description: Whether to submit and retrieve the refresh token in the JSON - response, or in a `httpOnly` cookie. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: object - properties: - access_token: - type: string - example: eyJhbGciOiJI... - expires: - type: integer - example: 900 - refresh_token: - type: string - example: Gy-caJMpmGTA... - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, authentication, rest, refresh } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(authentication()).with(rest()); - - // refresh using the authentication composable - const result = await client.refresh(); - - // refresh http request using a cookie - const result = await client.request(refresh('cookie')); - - // refresh http request using json - const result = await client.request(refresh('json', refresh_token)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - mutation { - auth_refresh(refresh_token: "refresh_token", mode: refresh_mode) { - access_token - refresh_token - } - } diff --git a/.bak/api-spec/paths/collections/_id/deleteCollection.yaml b/.bak/api-spec/paths/collections/_id/deleteCollection.yaml deleted file mode 100644 index d33dd62f..00000000 --- a/.bak/api-spec/paths/collections/_id/deleteCollection.yaml +++ /dev/null @@ -1,38 +0,0 @@ -summary: Delete a Collection -description: 'Delete an existing collection. Warning: This will delete the whole collection, - including the items within. Proceed with caution.' -operationId: deleteCollection -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Collections -parameters: -- name: id - in: path - required: true - description: Unique identifier of the collection. - schema: - type: string -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteCollection } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteCollection(collection_name)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_collections_item(collection: String!): delete_collection - } diff --git a/.bak/api-spec/paths/collections/_id/getCollection.yaml b/.bak/api-spec/paths/collections/_id/getCollection.yaml deleted file mode 100644 index d151e57e..00000000 --- a/.bak/api-spec/paths/collections/_id/getCollection.yaml +++ /dev/null @@ -1,45 +0,0 @@ -summary: Retrieve a Collection -description: Retrieves the details of a single collection. -operationId: getCollection -parameters: -- name: id - in: path - required: true - description: Unique identifier of the collection. - schema: - type: string -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Collections.yaml - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Collections -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readCollection } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readCollection(collection_name)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - collections_by_name(name: String!): directus_collections - } diff --git a/.bak/api-spec/paths/collections/_id/index.yaml b/.bak/api-spec/paths/collections/_id/index.yaml deleted file mode 100644 index 63fd9689..00000000 --- a/.bak/api-spec/paths/collections/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getCollection.yaml -patch: - $ref: updateCollection.yaml -delete: - $ref: deleteCollection.yaml diff --git a/.bak/api-spec/paths/collections/_id/updateCollection.yaml b/.bak/api-spec/paths/collections/_id/updateCollection.yaml deleted file mode 100644 index 9c0c4872..00000000 --- a/.bak/api-spec/paths/collections/_id/updateCollection.yaml +++ /dev/null @@ -1,126 +0,0 @@ -summary: Update a Collection -description: | - Update the metadata for an existing collection. - - You can only update the `meta` values of the collection object. Updating the collection name is not supported at this time. -operationId: updateCollection -parameters: -- name: id - in: path - required: true - description: Unique identifier of the collection. - schema: - type: string -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - meta: - type: object - description: Metadata of the collection. - properties: - icon: - type: string - description: Name of a Google Material Design Icon that's assigned - to this collection. - example: people - nullable: true - color: - type: string - description: Choose the color for the icon assigned to this collection. - example: '#6644ff' - nullable: true - note: - type: string - description: A note describing the collection. - example: - nullable: true - display_template: - type: string - description: Text representation of how items from this collection - are shown across the system. - example: - nullable: true - hidden: - type: boolean - description: Whether or not the collection is hidden from the navigation - in the admin app. - example: false - singleton: - type: boolean - description: Whether or not the collection is treated as a single - object. - example: false - translation: - type: string - description: Key value pairs of how to show this collection's name - in different languages in the admin app. - example: - nullable: true - versioning: - type: boolean - description: Whether or not Content Versioning is enabled for this - collection. - example: false - archive_field: - type: string - description: What field holds the archive value. - example: - nullable: true - archive_app_filter: - type: string - description: What value to use for "archived" items. - example: - nullable: true - archive_value: - type: string - description: What value to use to "unarchive" items. - example: - nullable: true - unarchive_value: - type: string - description: Whether or not to show the "archived" filter. - example: - nullable: true - sort_field: - type: string - description: The sort field in the collection. - example: - nullable: true -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Collections.yaml - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Collections -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateCollection } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateCollection(collection_name, partial_collection_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_collections_item(collection: String!, data: update_directus_collections_input!): directus_collections - } diff --git a/.bak/api-spec/paths/collections/createCollection.yaml b/.bak/api-spec/paths/collections/createCollection.yaml deleted file mode 100644 index 83474ac9..00000000 --- a/.bak/api-spec/paths/collections/createCollection.yaml +++ /dev/null @@ -1,127 +0,0 @@ -summary: Create a Collection -description: | - Create a new collection in Directus. - - The `collection` and `schema` properties are required. To create a collection folder that doesn't have an underlying table, you can set `schema` to `null`. - - You are able to provide an array of `fields` to be created during the creation of the collection. See the fields object for more information on what properties are available in a field. -operationId: createCollection -parameters: -- $ref: ../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - required: - - collection - - fields - properties: - collection: - type: string - description: Unique name of the collection. - example: my_collection - fields: - type: array - description: The fields contained in this collection. See the fields reference - for more information. Each individual field requires field, type, and - interface to be provided. - items: - type: object - icon: - type: string - description: Name of a Google Material Design Icon that's assigned to - this collection. - example: people - nullable: true - note: - type: string - description: A note describing the collection. - example: - nullable: true - display_template: - type: string - description: Text representation of how items from this collection are - shown across the system. - example: - nullable: true - hidden: - type: boolean - description: Whether or not the collection is hidden from the navigation - in the admin app. - example: false - singleton: - type: boolean - description: Whether or not the collection is treated as a single object. - example: false - translation: - type: string - description: Key value pairs of how to show this collection's name in - different languages in the admin app. - example: - nullable: true - versioning: - type: boolean - description: Whether or not Content Versioning is enabled for this collection. - example: false - archive_field: - type: string - description: What field holds the archive value. - example: - nullable: true - archive_app_filter: - type: string - description: What value to use for "archived" items. - example: - nullable: true - archive_value: - type: string - description: What value to use to "unarchive" items. - example: - nullable: true - unarchive_value: - type: string - description: Whether or not to show the "archived" filter. - example: - nullable: true - sort_field: - type: string - description: The sort field in the collection. - example: - nullable: true -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Collections.yaml - description: Successful request - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Collections -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createCollection } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request( - createCollection(collection_object) - ); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_collections_item(data: directus_collections): directus_collections - } diff --git a/.bak/api-spec/paths/collections/getCollections.yaml b/.bak/api-spec/paths/collections/getCollections.yaml deleted file mode 100644 index b6f2e123..00000000 --- a/.bak/api-spec/paths/collections/getCollections.yaml +++ /dev/null @@ -1,42 +0,0 @@ -summary: List Collections -description: Returns a list of the collections available in the project. -operationId: getCollections -parameters: -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Collections.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Collections -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readCollections } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readCollections()); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - collections: [directus_collections] - } diff --git a/.bak/api-spec/paths/collections/index.yaml b/.bak/api-spec/paths/collections/index.yaml deleted file mode 100644 index 3e1ce06f..00000000 --- a/.bak/api-spec/paths/collections/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: getCollections.yaml -post: - $ref: createCollection.yaml diff --git a/.bak/api-spec/paths/comments/_id/deleteComment.yaml b/.bak/api-spec/paths/comments/_id/deleteComment.yaml deleted file mode 100644 index 827c4097..00000000 --- a/.bak/api-spec/paths/comments/_id/deleteComment.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Comment -description: Delete an existing comment. Deleted comments can not be retrieved. -operationId: deleteComment -parameters: -- $ref: ../../../components/parameters.yaml#/Id -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteComment } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteComment(comment_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_comment(id: ID): delete_one - } diff --git a/.bak/api-spec/paths/comments/_id/getComment.yaml b/.bak/api-spec/paths/comments/_id/getComment.yaml deleted file mode 100644 index c2b02f24..00000000 --- a/.bak/api-spec/paths/comments/_id/getComment.yaml +++ /dev/null @@ -1,39 +0,0 @@ -summary: Get Comment by ID -description: Returns a single comment by primary key. -operationId: getComment -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Comments.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readComment } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readComment(comment_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - comment_by_id(id: ID!): directus_comments - } diff --git a/.bak/api-spec/paths/comments/_id/index.yaml b/.bak/api-spec/paths/comments/_id/index.yaml deleted file mode 100644 index c8bd2274..00000000 --- a/.bak/api-spec/paths/comments/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getComment.yaml -patch: - $ref: updateComment.yaml -delete: - $ref: deleteComment.yaml diff --git a/.bak/api-spec/paths/comments/_id/updateComment.yaml b/.bak/api-spec/paths/comments/_id/updateComment.yaml deleted file mode 100644 index 7dddc0ff..00000000 --- a/.bak/api-spec/paths/comments/_id/updateComment.yaml +++ /dev/null @@ -1,46 +0,0 @@ -summary: Update a Comment -description: Update the content of an existing comment. -operationId: updateComment -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Comments.yaml -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Activity.yaml - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateComment } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateComment(comment_id, partial_comment_object)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_comments_item(id: ID!, data: update_directus_comments_input): directus_comments - } diff --git a/.bak/api-spec/paths/comments/createComments.yaml b/.bak/api-spec/paths/comments/createComments.yaml deleted file mode 100644 index ab7b75c5..00000000 --- a/.bak/api-spec/paths/comments/createComments.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Create Multiple comments -description: Create multiple new comments. -operationId: createComments -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Comments.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Comments.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createComments } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createComments(comments_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_comments_items(data: [create_directus_comments_input!]!): [directus_comments] - } diff --git a/.bak/api-spec/paths/comments/deleteComments.yaml b/.bak/api-spec/paths/comments/deleteComments.yaml deleted file mode 100644 index be4769a7..00000000 --- a/.bak/api-spec/paths/comments/deleteComments.yaml +++ /dev/null @@ -1,39 +0,0 @@ - -summary: Delete Multiple Comments -description: Delete multiple existing Comments. -operationId: deleteComments -requestBody: - description: An array of comment primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteComments } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteComments(comment_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_Comments_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/comments/getComments.yaml b/.bak/api-spec/paths/comments/getComments.yaml deleted file mode 100644 index fb76b414..00000000 --- a/.bak/api-spec/paths/comments/getComments.yaml +++ /dev/null @@ -1,48 +0,0 @@ - -summary: Get Comments -description: Returns a list of comments. -operationId: getComments -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Comments.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - description: Successful request - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readComments } from '@directus/sdk'; - - const client = createDirectus('directus_comment_example').with(rest()); - - const result = await client.request(readComments(query)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - flows: [directus_comments] - } diff --git a/.bak/api-spec/paths/comments/index.yaml b/.bak/api-spec/paths/comments/index.yaml deleted file mode 100644 index a7cbc056..00000000 --- a/.bak/api-spec/paths/comments/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getComments.yaml -post: - $ref: createComments.yaml -patch: - $ref: updateComments.yaml -delete: - $ref: deleteComments.yaml diff --git a/.bak/api-spec/paths/comments/updateComments.yaml b/.bak/api-spec/paths/comments/updateComments.yaml deleted file mode 100644 index 1e5c66a1..00000000 --- a/.bak/api-spec/paths/comments/updateComments.yaml +++ /dev/null @@ -1,62 +0,0 @@ - -summary: Update Multiple comments -description: Update multiple existing comments. -operationId: updateComments -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Comments.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Comments.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Comments -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateComments } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateComments(comments_id_array, partial_comment_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_comments_items(ids: [ID!]!, data: update_directus_comments_input): [directus_comments] - } diff --git a/.bak/api-spec/paths/dashboards/_id/deleteDashboard.yaml b/.bak/api-spec/paths/dashboards/_id/deleteDashboard.yaml deleted file mode 100644 index 43ed59ca..00000000 --- a/.bak/api-spec/paths/dashboards/_id/deleteDashboard.yaml +++ /dev/null @@ -1,36 +0,0 @@ - -summary: Delete a Dashboard -description: Delete an existing dashboard. -operationId: deleteDashboard -parameters: -- name: id - in: path - description: Unique identifier of the dashboard. - required: true - schema: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteDashboard } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteDashboard(dashboard_id)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_dashboards_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/dashboards/_id/getDashboard.yaml b/.bak/api-spec/paths/dashboards/_id/getDashboard.yaml deleted file mode 100644 index 17ff516b..00000000 --- a/.bak/api-spec/paths/dashboards/_id/getDashboard.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Retrieve a Dashboard -description: List an existing dashboard by primary key. -operationId: getDashboard -parameters: -- name: id - in: path - description: Unique identifier of the Dashboard. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Dashboards.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readDashboard } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readDashboard(dashboard_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - dashboards_by_id(id: ID!): directus_dashboards - } diff --git a/.bak/api-spec/paths/dashboards/_id/index.yaml b/.bak/api-spec/paths/dashboards/_id/index.yaml deleted file mode 100644 index d26268ce..00000000 --- a/.bak/api-spec/paths/dashboards/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getDashboard.yaml -patch: - $ref: updateDashboard.yaml -delete: - $ref: deleteDashboard.yaml diff --git a/.bak/api-spec/paths/dashboards/_id/updateDashboard.yaml b/.bak/api-spec/paths/dashboards/_id/updateDashboard.yaml deleted file mode 100644 index 27040fd1..00000000 --- a/.bak/api-spec/paths/dashboards/_id/updateDashboard.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Update a Dashboard -description: Update an existing dashboard. -operationId: updateDashboard -parameters: -- name: id - in: path - description: Unique identifier of the dashboard. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Dashboards.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Dashboards.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateDashboard } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateDashboard(dashboard_id, partial_dashboard_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_dashboards_item(id: ID!, data: update_directus_dashboards_input): directus_dashboards - } diff --git a/.bak/api-spec/paths/dashboards/createDashboards.yaml b/.bak/api-spec/paths/dashboards/createDashboards.yaml deleted file mode 100644 index a0e6c778..00000000 --- a/.bak/api-spec/paths/dashboards/createDashboards.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Create Multiple Dashboards -description: Create multiple new dashboards. -operationId: createDashboards -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Dashboards.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Dashboards.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createDashboards } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createDashboards(dashboard_object_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - create_dashboards_items(data: [create_directus_dashboards_input!]!): [directus_dashboards] - } diff --git a/.bak/api-spec/paths/dashboards/deleteDashboards.yaml b/.bak/api-spec/paths/dashboards/deleteDashboards.yaml deleted file mode 100644 index bb86d021..00000000 --- a/.bak/api-spec/paths/dashboards/deleteDashboards.yaml +++ /dev/null @@ -1,37 +0,0 @@ - -summary: Delete Multiple Dashboards -description: Delete multiple existing dashboards. -operationId: deleteDashboards -requestBody: - description: An array of dashboard primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteDashboards } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteDashboards(dashboard_id_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_dashboards_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/dashboards/getDashboards.yaml b/.bak/api-spec/paths/dashboards/getDashboards.yaml deleted file mode 100644 index 2eb8c443..00000000 --- a/.bak/api-spec/paths/dashboards/getDashboards.yaml +++ /dev/null @@ -1,49 +0,0 @@ - -summary: List Dashboards -description: List all dashboards that exist in Directus. -operationId: getDashboards -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Dashboards.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, (readDashboards } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readDashboards(query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - dashboards: [directus_dashboards] - } diff --git a/.bak/api-spec/paths/dashboards/index.yaml b/.bak/api-spec/paths/dashboards/index.yaml deleted file mode 100644 index 9b328ed0..00000000 --- a/.bak/api-spec/paths/dashboards/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getDashboards.yaml -post: - $ref: createDashboards.yaml -patch: - $ref: updateDashboards.yaml -delete: - $ref: deleteDashboards.yaml diff --git a/.bak/api-spec/paths/dashboards/updateDashboards.yaml b/.bak/api-spec/paths/dashboards/updateDashboards.yaml deleted file mode 100644 index 60c6dbe8..00000000 --- a/.bak/api-spec/paths/dashboards/updateDashboards.yaml +++ /dev/null @@ -1,63 +0,0 @@ - -summary: Update Multiple Dashboards -description: Update multiple dashboards at the same time. -operationId: updateDashboards -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - $ref: ../../components/schemas/Dashboards.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Dashboards.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Dashboards -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateDashboards } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateDashboards(dashboard_id_array, partial_dashboard_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_dashboards_items(ids: [ID!]!, data: update_directus_dashboards_input): [directus_dashboards] - } diff --git a/.bak/api-spec/paths/extensions/_bundle/_name/index.yaml b/.bak/api-spec/paths/extensions/_bundle/_name/index.yaml deleted file mode 100644 index 21c418d0..00000000 --- a/.bak/api-spec/paths/extensions/_bundle/_name/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -patch: - $ref: updateExtensionBundle.yaml diff --git a/.bak/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml b/.bak/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml deleted file mode 100644 index aeec9ec3..00000000 --- a/.bak/api-spec/paths/extensions/_bundle/_name/updateExtensionBundle.yaml +++ /dev/null @@ -1,61 +0,0 @@ -summary: Update an Extension Bundle -description: Update an existing extension bundle. -operationId: updateExtensionBundle -parameters: -- in: path - name: bundle - required: true - schema: - type: string -- in: path - name: name - required: true - schema: - type: string -requestBody: - content: - application/json: - schema: - type: object - properties: - meta: - type: object - description: Directus metadata for the extension. Where the configuration - for the extension in the current project is stored. - properties: - enabled: - type: boolean - description: Whether or not the extension is enabled. - example: true -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Extensions.yaml - description: Successful request - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Extensions -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateExtension } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateExtension(bundle, name, partial_extension_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_extensions_item(bundle: String, name: String!, data: update_directus_extensions_input!): directus_extensions - } diff --git a/.bak/api-spec/paths/extensions/_name/index.yaml b/.bak/api-spec/paths/extensions/_name/index.yaml deleted file mode 100644 index 1b969eb4..00000000 --- a/.bak/api-spec/paths/extensions/_name/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -patch: - $ref: updateExtensions.yaml diff --git a/.bak/api-spec/paths/extensions/_name/updateExtensions.yaml b/.bak/api-spec/paths/extensions/_name/updateExtensions.yaml deleted file mode 100644 index c1541bc4..00000000 --- a/.bak/api-spec/paths/extensions/_name/updateExtensions.yaml +++ /dev/null @@ -1,58 +0,0 @@ -summary: Update an Extension -description: Update an existing extension. -operationId: updateExtensions -parameters: -- in: path - name: name - required: true - schema: - type: string -requestBody: - content: - application/json: - schema: - type: object - properties: - meta: - type: object - description: Directus metadata for the extension. Where the configuration - for the extension in the current project is stored. - properties: - enabled: - type: boolean - description: Whether or not the extension is enabled. - example: true -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Extensions.yaml - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Extensions -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateExtension } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateExtension(bundle, name, partial_extension_object)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_extensions_item(bundle: String, name: String!, data: update_directus_extensions_input!): directus_extensions - } diff --git a/.bak/api-spec/paths/extensions/index.yaml b/.bak/api-spec/paths/extensions/index.yaml deleted file mode 100644 index 889d8e08..00000000 --- a/.bak/api-spec/paths/extensions/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: listExtensions.yaml diff --git a/.bak/api-spec/paths/extensions/listExtensions.yaml b/.bak/api-spec/paths/extensions/listExtensions.yaml deleted file mode 100644 index 39ec67a0..00000000 --- a/.bak/api-spec/paths/extensions/listExtensions.yaml +++ /dev/null @@ -1,37 +0,0 @@ -summary: List Extensions -description: List the installed extensions and their configuration in the project. -operationId: listExtensions -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Extensions.yaml - description: Successful request - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Extensions -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readExtensions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readExtensions()); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - extensions: [extension] - } diff --git a/.bak/api-spec/paths/fields/_collection/_id/deleteField.yaml b/.bak/api-spec/paths/fields/_collection/_id/deleteField.yaml deleted file mode 100644 index e65ea59d..00000000 --- a/.bak/api-spec/paths/fields/_collection/_id/deleteField.yaml +++ /dev/null @@ -1,43 +0,0 @@ -summary: Delete a Field -description: Delete an existing field. This action can't be undone. -operationId: deleteField -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Fields -parameters: -- name: collection - in: path - description: Unique identifier of the collection the item resides in. - schema: - type: string - required: true -- name: id - in: path - description: Unique identifier of the field. - schema: - type: string - required: true -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteField } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteField(collection_name, field_name)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_fields_item(collection: String!, field: String!): delete_field - } diff --git a/.bak/api-spec/paths/fields/_collection/_id/getCollectionField.yaml b/.bak/api-spec/paths/fields/_collection/_id/getCollectionField.yaml deleted file mode 100644 index b7214861..00000000 --- a/.bak/api-spec/paths/fields/_collection/_id/getCollectionField.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Retrieve a Field -description: Retrieves the details of a single field in a given collection. -operationId: getCollectionField -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Fields.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Fields -parameters: -- name: collection - in: path - description: Unique identifier of the collection the item resides in. - schema: - type: string - required: true -- name: id - in: path - description: Unique identifier of the field. - schema: - type: string - required: true -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readField } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readField(collection_name, field_name)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - fields_by_name(collection: String!, field: String!): directus_fields - } diff --git a/.bak/api-spec/paths/fields/_collection/_id/index.yaml b/.bak/api-spec/paths/fields/_collection/_id/index.yaml deleted file mode 100644 index bc9b50f6..00000000 --- a/.bak/api-spec/paths/fields/_collection/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getCollectionField.yaml -patch: - $ref: updateField.yaml -delete: - $ref: deleteField.yaml diff --git a/.bak/api-spec/paths/fields/_collection/_id/updateField.yaml b/.bak/api-spec/paths/fields/_collection/_id/updateField.yaml deleted file mode 100644 index 6cdf2ab6..00000000 --- a/.bak/api-spec/paths/fields/_collection/_id/updateField.yaml +++ /dev/null @@ -1,224 +0,0 @@ -summary: Update a Field -description: Update an existing field. -operationId: updateField -requestBody: - content: - application/json: - schema: - type: object - properties: - type: - description: Directus specific data type. Used to cast values in the API. - example: integer - type: string - field: - type: string - description: Unique name of the field. Field name is unique within the - collection. - example: id - schema: - type: object - description: The schema info. - properties: - type: - description: The type of the field. - example: string - type: string - name: - type: string - description: The name of the field. - example: title - table: - type: string - description: The collection of the field. - example: posts - default_value: - type: string - description: The default value of the field. - example: - nullable: true - max_length: - type: integer - description: The max length of the field. - example: - nullable: true - is_nullable: - type: boolean - description: If the field is nullable. - example: false - is_primary_key: - type: boolean - description: If the field is primary key. - example: false - has_auto_increment: - type: boolean - description: If the field has auto increment. - example: false - foreign_key_column: - type: string - description: Related column from the foreign key constraint. - example: - nullable: true - foreign_key_table: - type: string - description: Related table from the foreign key constraint. - example: - nullable: true - comment: - type: string - description: Comment as saved in the database. - example: - nullable: true - schema: - type: string - description: Database schema (pg only). - example: public - foreign_key_schema: - type: string - description: Related schema from the foreign key constraint (pg only). - example: - nullable: true - meta: - type: object - description: The meta info. - nullable: true - properties: - id: - type: integer - description: Unique identifier for the field in the `directus_fields` - collection. - example: 3 - collection: - type: string - description: Unique name of the collection this field is in. - example: posts - field: - type: string - description: Unique name of the field. Field name is unique within - the collection. - example: title - special: - type: array - description: Transformation flag for field - example: - items: - type: string - nullable: true - system-interface: - type: string - description: What interface is used in the admin app to edit the value - for this field. - example: primary-key - nullable: true - options: - type: object - description: Options for the interface that's used. This format is - based on the individual interface. - example: - nullable: true - display: - type: string - description: What display is used in the admin app to display the - value for this field. - example: - nullable: true - display_options: - type: object - description: Options for the display that's used. This format is based - on the individual display. - example: - nullable: true - locked: - type: boolean - description: If the field can be altered by the end user. Directus - system fields have this value set to `true`. - example: true - readonly: - type: boolean - description: Prevents the user from editing the value in the field. - example: false - hidden: - type: boolean - description: If this field should be hidden. - example: true - sort: - type: integer - description: Sort order of this field on the edit page of the admin - app. - example: 1 - nullable: true - width: - type: string - description: Width of the field on the edit form. - example: - nullable: true - enum: - - half - - half-left - - half-right - - full - - fill - - - group: - type: integer - description: What field group this field is part of. - example: - nullable: true - translation: - type: object - description: 'Key value pair of `: ` that allows - the user to change the displayed name of the field in the admin - app.' - example: - nullable: true - note: - type: string - description: A user provided note for the field. Will be rendered - alongside the interface on the edit page. - example: '' - nullable: true -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Fields.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Fields -parameters: -- name: collection - in: path - description: Unique identifier of the collection the item resides in. - schema: - type: string - required: true -- name: id - in: path - description: Unique identifier of the field. - schema: - type: string - required: true -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateField } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateField(collection_name, field_name, partial_field_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_fields_item(collection: String!, field: String!, data: update_directus_fields_input!): directus_fields - } diff --git a/.bak/api-spec/paths/fields/_collection/createField.yaml b/.bak/api-spec/paths/fields/_collection/createField.yaml deleted file mode 100644 index 11e3bf66..00000000 --- a/.bak/api-spec/paths/fields/_collection/createField.yaml +++ /dev/null @@ -1,231 +0,0 @@ -summary: Create Field in Collection -description: Create a new field in a given collection. -operationId: createField -requestBody: - content: - application/json: - schema: - type: object - required: - - field - - datatype - - type - - length - properties: - type: - description: Directus specific data type. Used to cast values in the API. - example: integer - type: string - field: - type: string - description: Unique name of the field. Field name is unique within the - collection. - example: id - schema: - type: object - description: The schema info. - properties: - type: - description: The type of the field. - example: string - type: string - name: - type: string - description: The name of the field. - example: title - table: - type: string - description: The collection of the field. - example: posts - default_value: - type: string - description: The default value of the field. - example: - nullable: true - max_length: - type: integer - description: The max length of the field. - example: - nullable: true - is_nullable: - type: boolean - description: If the field is nullable. - example: false - is_primary_key: - type: boolean - description: If the field is primary key. - example: false - has_auto_increment: - type: boolean - description: If the field has auto increment. - example: false - foreign_key_column: - type: string - description: Related column from the foreign key constraint. - example: - nullable: true - foreign_key_table: - type: string - description: Related table from the foreign key constraint. - example: - nullable: true - comment: - type: string - description: Comment as saved in the database. - example: - nullable: true - schema: - type: string - description: Database schema (pg only). - example: public - foreign_key_schema: - type: string - description: Related schema from the foreign key constraint (pg only). - example: - nullable: true - meta: - type: object - description: The meta info. - nullable: true - properties: - id: - type: integer - description: Unique identifier for the field in the `directus_fields` - collection. - example: 3 - collection: - type: string - description: Unique name of the collection this field is in. - example: posts - field: - type: string - description: Unique name of the field. Field name is unique within - the collection. - example: title - special: - type: array - description: Transformation flag for field - example: - items: - type: string - nullable: true - system-interface: - type: string - description: What interface is used in the admin app to edit the value - for this field. - example: primary-key - nullable: true - options: - type: object - description: Options for the interface that's used. This format is - based on the individual interface. - example: - nullable: true - display: - type: string - description: What display is used in the admin app to display the - value for this field. - example: - nullable: true - display_options: - type: object - description: Options for the display that's used. This format is based - on the individual display. - example: - nullable: true - locked: - type: boolean - description: If the field can be altered by the end user. Directus - system fields have this value set to `true`. - example: true - readonly: - type: boolean - description: Prevents the user from editing the value in the field. - example: false - hidden: - type: boolean - description: If this field should be hidden. - example: true - sort: - type: integer - description: Sort order of this field on the edit page of the admin - app. - example: 1 - nullable: true - width: - type: string - description: Width of the field on the edit form. - example: - nullable: true - enum: - - half - - half-left - - half-right - - full - - fill - - - group: - type: integer - description: What field group this field is part of. - example: - nullable: true - translation: - type: object - description: 'Key value pair of `: ` that allows - the user to change the displayed name of the field in the admin - app.' - example: - nullable: true - note: - type: string - description: A user provided note for the field. Will be rendered - alongside the interface on the edit page. - example: '' - nullable: true -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Fields.yaml - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Fields -parameters: -- description: Unique identifier of the collection the item resides in. - in: path - name: collection - required: true - schema: - type: string -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createField } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request( - createField(collection_name, { - field: field_name, - type: field_type, - field_field: value, - }) - ); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_fields_item(collection: String!, data: create_directus_fields_input!): directus_fields - } diff --git a/.bak/api-spec/paths/fields/_collection/getCollectionFields.yaml b/.bak/api-spec/paths/fields/_collection/getCollectionFields.yaml deleted file mode 100644 index 997b9e9d..00000000 --- a/.bak/api-spec/paths/fields/_collection/getCollectionFields.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: List Fields in Collection -description: Returns a list of the fields available in the given collection. -operationId: getCollectionFields -parameters: -- description: Unique identifier of the collection the item resides in. - in: path - name: collection - required: true - schema: - type: string -- $ref: ../../../components/parameters.yaml#/Sort -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../../components/schemas/Fields.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Fields -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFieldsByCollection } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFieldsByCollection(collection_name)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - fields_in_collection(collection: String!): directus_fields - } diff --git a/.bak/api-spec/paths/fields/_collection/index.yaml b/.bak/api-spec/paths/fields/_collection/index.yaml deleted file mode 100644 index 2f3bc207..00000000 --- a/.bak/api-spec/paths/fields/_collection/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: getCollectionFields.yaml -post: - $ref: createField.yaml diff --git a/.bak/api-spec/paths/fields/getFields.yaml b/.bak/api-spec/paths/fields/getFields.yaml deleted file mode 100644 index dcf49f2b..00000000 --- a/.bak/api-spec/paths/fields/getFields.yaml +++ /dev/null @@ -1,42 +0,0 @@ -summary: List All Fields -description: Returns a list of the fields available in the project. -operationId: getFields -parameters: -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Sort -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Fields.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Fields -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFields } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFields()); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - fields: [directus_fields] - } diff --git a/.bak/api-spec/paths/fields/index.yaml b/.bak/api-spec/paths/fields/index.yaml deleted file mode 100644 index bee5b769..00000000 --- a/.bak/api-spec/paths/fields/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getFields.yaml diff --git a/.bak/api-spec/paths/files/_id/deleteFile.yaml b/.bak/api-spec/paths/files/_id/deleteFile.yaml deleted file mode 100644 index 1593b059..00000000 --- a/.bak/api-spec/paths/files/_id/deleteFile.yaml +++ /dev/null @@ -1,30 +0,0 @@ -summary: Delete a File -description: Delete an existing file. This will also delete the file from disk. -security: [] -tags: -- Files -operationId: deleteFile -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteFile } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteFile(file_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_files_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/files/_id/getFile.yaml b/.bak/api-spec/paths/files/_id/getFile.yaml deleted file mode 100644 index 876cf991..00000000 --- a/.bak/api-spec/paths/files/_id/getFile.yaml +++ /dev/null @@ -1,37 +0,0 @@ -summary: Retrieve a File -description: Retrieve a single file by primary key. -security: [] -tags: -- Files -operationId: getFile -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Files.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFiles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFile(file_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - files_by_id(id: ID!): directus_files - } diff --git a/.bak/api-spec/paths/files/_id/index.yaml b/.bak/api-spec/paths/files/_id/index.yaml deleted file mode 100644 index 141ffa40..00000000 --- a/.bak/api-spec/paths/files/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getFile.yaml -patch: - $ref: updateFile.yaml -delete: - $ref: deleteFile.yaml diff --git a/.bak/api-spec/paths/files/_id/updateFile.yaml b/.bak/api-spec/paths/files/_id/updateFile.yaml deleted file mode 100644 index 3a45e3a8..00000000 --- a/.bak/api-spec/paths/files/_id/updateFile.yaml +++ /dev/null @@ -1,54 +0,0 @@ -summary: Update a File -description: Update an existing file, and/or replace it's file contents. -security: [] -tags: -- Files -operationId: updateFile -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - multipart/data: - schema: - type: object - required: - - file - properties: - file: - description: File contents. - format: binary - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Items.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Files.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateFile } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateFile(file_id, partial_file_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_files_item(id: ID!, data: update_directus_files_input!): directus_files - } diff --git a/.bak/api-spec/paths/files/deleteFiles.yaml b/.bak/api-spec/paths/files/deleteFiles.yaml deleted file mode 100644 index a9ae9319..00000000 --- a/.bak/api-spec/paths/files/deleteFiles.yaml +++ /dev/null @@ -1,40 +0,0 @@ -summary: Delete Multiple Files -description: Delete multiple existing files at once. This will also delete the files from disk. -security: [] -tags: -- Files -operationId: deleteFiles -requestBody: - description: An array of file primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteFiles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteFiles(file_id_array)); - - //or - - const result = await client.request(deleteFiles(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_files_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/files/getFiles.yaml b/.bak/api-spec/paths/files/getFiles.yaml deleted file mode 100644 index e12a45b6..00000000 --- a/.bak/api-spec/paths/files/getFiles.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: List Files -description: List all files that exist in Directus. -security: [] -tags: -- Files -operationId: getFiles -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Files.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFiles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFile(file_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - files_by_id(id: ID!): directus_files - } diff --git a/.bak/api-spec/paths/files/import/importFile.yaml b/.bak/api-spec/paths/files/import/importFile.yaml deleted file mode 100644 index 8292e448..00000000 --- a/.bak/api-spec/paths/files/import/importFile.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Import a File -description: Import a file from the web -operationId: importFile -requestBody: - content: - application/json: - schema: - type: object - required: - - url - properties: - url: - type: string - description: The URL to download the file from. - anyOf: - - $ref: ../../components/schemas/Files.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Files.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Files -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, importFile } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(importFile(file_url, file_object)); - - const result = await client.request(uploadFiles(formData)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - import_file(url: String!, data: create_directus_files_input!): directus_files - } diff --git a/.bak/api-spec/paths/files/import/index.yaml b/.bak/api-spec/paths/files/import/index.yaml deleted file mode 100644 index ff6549c4..00000000 --- a/.bak/api-spec/paths/files/import/index.yaml +++ /dev/null @@ -1,3 +0,0 @@ -post: - $ref: importFile.yaml - diff --git a/.bak/api-spec/paths/files/index.yaml b/.bak/api-spec/paths/files/index.yaml deleted file mode 100644 index 2706eaee..00000000 --- a/.bak/api-spec/paths/files/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getFiles.yaml -post: - $ref: uploadFile.yaml -patch: - $ref: updateFiles.yaml -delete: - $ref: deleteFiles.yaml diff --git a/.bak/api-spec/paths/files/updateFiles.yaml b/.bak/api-spec/paths/files/updateFiles.yaml deleted file mode 100644 index 7fe31929..00000000 --- a/.bak/api-spec/paths/files/updateFiles.yaml +++ /dev/null @@ -1,65 +0,0 @@ -summary: Update Multiple Files -description: Update multiple files at the same time. -security: [] -tags: -- Files -operationId: updateFiles -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - type: object - properties: - data: - type: string - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Files.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateFiles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateFiles(file_id_array, partial_file_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_files_items(ids: [ID!]!, data: update_directus_files!): [directus_files] - } diff --git a/.bak/api-spec/paths/files/uploadFile.yaml b/.bak/api-spec/paths/files/uploadFile.yaml deleted file mode 100644 index 90436515..00000000 --- a/.bak/api-spec/paths/files/uploadFile.yaml +++ /dev/null @@ -1,43 +0,0 @@ -summary: Upload a File -description: Upload a new file. -operationId: uploadFile -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../components/schemas/Files.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Files.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Files -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, uploadFiles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const formData = new FormData(); - formData.append('file_1_property', 'Value'); - formData.append('file', raw_file); - formData.append('file_2_property', 'Value'); - formData.append('file', raw_file_2); - - const result = await client.request(uploadFiles(formData)); -- label: GraphQL - lang: GraphQL - source: | - //Not currently supported by GraphQL. diff --git a/.bak/api-spec/paths/flows/_id/deleteFlow.yaml b/.bak/api-spec/paths/flows/_id/deleteFlow.yaml deleted file mode 100644 index 1bf128db..00000000 --- a/.bak/api-spec/paths/flows/_id/deleteFlow.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Flow -description: Delete an existing flow -operationId: deleteFlow -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteFlow } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteFlow(flow_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_flows_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/flows/_id/getFlow.yaml b/.bak/api-spec/paths/flows/_id/getFlow.yaml deleted file mode 100644 index 88c75fff..00000000 --- a/.bak/api-spec/paths/flows/_id/getFlow.yaml +++ /dev/null @@ -1,39 +0,0 @@ -summary: Retrieve a Flow -description: Retrieve a single flow by unique identifier. -operationId: getFlow -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Flows.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFlow } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFlow(flow_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - flows_by_id(id: ID!): directus_flows - } diff --git a/.bak/api-spec/paths/flows/_id/index.yaml b/.bak/api-spec/paths/flows/_id/index.yaml deleted file mode 100644 index 1a52dac0..00000000 --- a/.bak/api-spec/paths/flows/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getFlow.yaml -patch: - $ref: updateFlow.yaml -delete: - $ref: deleteFlow.yaml diff --git a/.bak/api-spec/paths/flows/_id/updateFlow.yaml b/.bak/api-spec/paths/flows/_id/updateFlow.yaml deleted file mode 100644 index e87fa3a5..00000000 --- a/.bak/api-spec/paths/flows/_id/updateFlow.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: Update a Flow -description: Update an existing flow. -operationId: updateFlow -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Flows.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Flows.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateFlow } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateFlow(flow_id, partial_flow_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_flows_item(id: ID!, data: update_directus_flows_input): directus_flows - } diff --git a/.bak/api-spec/paths/flows/createFlows.yaml b/.bak/api-spec/paths/flows/createFlows.yaml deleted file mode 100644 index a38b931a..00000000 --- a/.bak/api-spec/paths/flows/createFlows.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Create Multiple Flows -description: Create multiple new flows. -operationId: createFlows -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Flows.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Flows.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createFlows } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createFlows(flows_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_flows_items(data: [create_directus_flows_input!]!): [directus_flows] - } diff --git a/.bak/api-spec/paths/flows/deleteFlows.yaml b/.bak/api-spec/paths/flows/deleteFlows.yaml deleted file mode 100644 index 381b5434..00000000 --- a/.bak/api-spec/paths/flows/deleteFlows.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Flows -description: Delete multiple existing flows. -operationId: deleteFlows -requestBody: - description: An array of flows primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Flows -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteFlows } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteFlows(flow_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_flows_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/flows/getFlows.yaml b/.bak/api-spec/paths/flows/getFlows.yaml deleted file mode 100644 index 67b2f964..00000000 --- a/.bak/api-spec/paths/flows/getFlows.yaml +++ /dev/null @@ -1,49 +0,0 @@ -summary: List Flows -description: List all flows that exist in Directus. -operationId: getFlows -parameters: - - $ref: ../../components/parameters.yaml#/Fields - - $ref: ../../components/parameters.yaml#/Limit - - $ref: ../../components/parameters.yaml#/Offset - - $ref: ../../components/parameters.yaml#/Sort - - $ref: ../../components/parameters.yaml#/Filter - - $ref: ../../components/parameters.yaml#/Search - - $ref: ../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Flows.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFlows } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFlows(query)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - flows: [directus_flows] - } diff --git a/.bak/api-spec/paths/flows/index.yaml b/.bak/api-spec/paths/flows/index.yaml deleted file mode 100644 index 28552ce9..00000000 --- a/.bak/api-spec/paths/flows/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getFlows.yaml -post: - $ref: createFlows.yaml -patch: - $ref: updateFlows.yaml -delete: - $ref: deleteFlows.yaml diff --git a/.bak/api-spec/paths/flows/trigger/_id/index.yaml b/.bak/api-spec/paths/flows/trigger/_id/index.yaml deleted file mode 100644 index ad9ff77f..00000000 --- a/.bak/api-spec/paths/flows/trigger/_id/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: triggerFlowGET.yaml -post: - $ref: triggerFlowPOST.yaml diff --git a/.bak/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml b/.bak/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml deleted file mode 100644 index 0d898cf6..00000000 --- a/.bak/api-spec/paths/flows/trigger/_id/triggerFlowGET.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Flow with GET webhook trigger -description: Start a flow with GET webhook trigger. -operationId: triggerFlowGET -parameters: -- $ref: ../../../../components/parameters.yaml#/Id -- $ref: ../../../../components/parameters.yaml#/Fields -- $ref: ../../../../components/parameters.yaml#/Meta -responses: - '200': - description: Result of the flow, if any. - content: - application/json: - schema: - type: object - properties: - data: {} - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, triggerFlow } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(triggerFlow('GET', flow_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml b/.bak/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml deleted file mode 100644 index 8cdeae32..00000000 --- a/.bak/api-spec/paths/flows/trigger/_id/triggerFlowPOST.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Flow with POST webhook trigger -description: Start a flow with POST webhook trigger. -operationId: triggerFlowPOST -parameters: - - $ref: ../../../../components/parameters.yaml#/Id - - $ref: ../../../../components/parameters.yaml#/Fields - - $ref: ../../../../components/parameters.yaml#/Meta -requestBody: - description: Payload for the POST request. - content: - application/json: - schema: - type: object - properties: - data: {} -responses: - '200': - description: Result of the flow, if any. - content: - application/json: - schema: - type: object - properties: - data: {} - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Flows -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, triggerFlow } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(triggerFlow('POST', flow_id, webhook_payload)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/flows/updateFlows.yaml b/.bak/api-spec/paths/flows/updateFlows.yaml deleted file mode 100644 index c3eb9d8a..00000000 --- a/.bak/api-spec/paths/flows/updateFlows.yaml +++ /dev/null @@ -1,63 +0,0 @@ -summary: Update Multiple Flows -description: Update multiple flows at the same time. -security: [] -tags: -- Flows -operationId: updateFlows -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - anyOf: - - $ref: ../../components/schemas/Flows.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Flows.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateFlows } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateFlows(flow_id_array, partial_flow_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_flows_items(ids: [ID!]!, data: update_directus_flows_input): [directus_flows] - } diff --git a/.bak/api-spec/paths/folders/_id/deleteFolder.yaml b/.bak/api-spec/paths/folders/_id/deleteFolder.yaml deleted file mode 100644 index 07e6f6fa..00000000 --- a/.bak/api-spec/paths/folders/_id/deleteFolder.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Folder -description: Delete an existing folder. Any files in this folder will be moved to the root folder. -operationId: deleteFolder -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Folders -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteFolder } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteFolder(folder_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_folders_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/folders/_id/getFolder.yaml b/.bak/api-spec/paths/folders/_id/getFolder.yaml deleted file mode 100644 index 55c35c97..00000000 --- a/.bak/api-spec/paths/folders/_id/getFolder.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve a Folder -description: List an existing folder by primary key. -operationId: getFolder -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Folders.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Folders -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFolder } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFolder(folder_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - folders_by_id(id: ID!): directus_folders - } diff --git a/.bak/api-spec/paths/folders/_id/index.yaml b/.bak/api-spec/paths/folders/_id/index.yaml deleted file mode 100644 index 6501c995..00000000 --- a/.bak/api-spec/paths/folders/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getFolder.yaml -patch: - $ref: updateFolder.yaml -delete: - $ref: deleteFolder.yaml diff --git a/.bak/api-spec/paths/folders/_id/updateFolder.yaml b/.bak/api-spec/paths/folders/_id/updateFolder.yaml deleted file mode 100644 index c771a896..00000000 --- a/.bak/api-spec/paths/folders/_id/updateFolder.yaml +++ /dev/null @@ -1,55 +0,0 @@ -summary: Update a Folder -description: Update an existing folder. -operationId: updateFolder -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - name: - type: string - description: Name of the folder. Can't be null or empty. - parent: - type: integer - example: 3 - description: Unique identifier of the parent folder. This allows for nested - folders. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Folders.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Folders -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateFolder } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateFolder(folder_id, partial_folder_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_folders_item(id: ID!, data: update_directus_folders_input): directus_folders - } diff --git a/.bak/api-spec/paths/folders/createFolders.yaml b/.bak/api-spec/paths/folders/createFolders.yaml deleted file mode 100644 index 553534d3..00000000 --- a/.bak/api-spec/paths/folders/createFolders.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Create Multiple Folders -description: Create multiple new folders. -operationId: createFolders -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Folders.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Folders.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Folders -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createFolders } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createFolders(folder_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_folders_items(data: [create_directus_folders_input!]!): [directus_folders] - } diff --git a/.bak/api-spec/paths/folders/deleteFolders.yaml b/.bak/api-spec/paths/folders/deleteFolders.yaml deleted file mode 100644 index a7138c4c..00000000 --- a/.bak/api-spec/paths/folders/deleteFolders.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Folders -description: Delete multiple existing folders. -operationId: deleteFolders -requestBody: - description: An array of folder primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Folders -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteFolders } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteFolders(folder_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_folders_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/folders/getFolders.yaml b/.bak/api-spec/paths/folders/getFolders.yaml deleted file mode 100644 index 61a7f5ed..00000000 --- a/.bak/api-spec/paths/folders/getFolders.yaml +++ /dev/null @@ -1,49 +0,0 @@ -summary: List Folders -description: List all folders that exist in Directus. -operationId: getFolders -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Folders.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Folders -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readFolders } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readFolders(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - folders: directus_folders - } diff --git a/.bak/api-spec/paths/folders/index.yaml b/.bak/api-spec/paths/folders/index.yaml deleted file mode 100644 index 657aae67..00000000 --- a/.bak/api-spec/paths/folders/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getFolders.yaml -post: - $ref: createFolders.yaml -patch: - $ref: updateFolders.yaml -delete: - $ref: deleteFolders.yaml diff --git a/.bak/api-spec/paths/folders/updateFolders.yaml b/.bak/api-spec/paths/folders/updateFolders.yaml deleted file mode 100644 index 70658639..00000000 --- a/.bak/api-spec/paths/folders/updateFolders.yaml +++ /dev/null @@ -1,76 +0,0 @@ -summary: Update Multiple Folders -description: | - Update multiple folders at the same time. - - Any files in these folders will be moved to the root folder. -security: [] -tags: -- Folders -operationId: updateFolders -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - type: object - properties: - name: - type: string - example: Amsterdam - description: Name of the folder. - parent: - type: integer - description: Unique identifier of the parent folder. This allows for - nested folders. - required: - - name - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Folders.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateFolders } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateFolders(folder_id_array, partial_folder_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_folders_items(ids: [ID!]!, data: update_directus_folders_input): [directus_folders] - } diff --git a/.bak/api-spec/paths/items/_collection/_id/deleteItem.yaml b/.bak/api-spec/paths/items/_collection/_id/deleteItem.yaml deleted file mode 100644 index e5e0887f..00000000 --- a/.bak/api-spec/paths/items/_collection/_id/deleteItem.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete an item -description: Delete an existing item. -operationId: deleteItem -parameters: -- name: id - in: path - required: true - description: Unique identifier of the item. - schema: - type: string -- $ref: ../../../../components/parameters.yaml#/Collection -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteItem } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteItem(collection_name, item_id)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete__item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/items/_collection/_id/getCollectionItem.yaml b/.bak/api-spec/paths/items/_collection/_id/getCollectionItem.yaml deleted file mode 100644 index 81839ef0..00000000 --- a/.bak/api-spec/paths/items/_collection/_id/getCollectionItem.yaml +++ /dev/null @@ -1,45 +0,0 @@ -summary: Retrieve an Item -description: Retrieves an item in a given collection. -operationId: getCollectionItem -parameters: -- $ref: ../../../../components/parameters.yaml#/Id -- $ref: ../../../../components/parameters.yaml#/Collection -- $ref: ../../../../components/parameters.yaml#/Version -- $ref: ../../../../components/parameters.yaml#/Fields -- $ref: ../../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Items.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readItem } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readItem(collection_name, item_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - _by_id(id: ID!, version: String): - } - - type Query { - _by_version(id: ID!, version: String!): - } diff --git a/.bak/api-spec/paths/items/_collection/_id/index.yaml b/.bak/api-spec/paths/items/_collection/_id/index.yaml deleted file mode 100644 index 02d714a2..00000000 --- a/.bak/api-spec/paths/items/_collection/_id/index.yaml +++ /dev/null @@ -1,7 +0,0 @@ -get: - $ref: getCollectionItem.yaml -patch: - $ref: updateItem.yaml -delete: - $ref: deleteItem.yaml - diff --git a/.bak/api-spec/paths/items/_collection/_id/updateItem.yaml b/.bak/api-spec/paths/items/_collection/_id/updateItem.yaml deleted file mode 100644 index 5a1bc5ca..00000000 --- a/.bak/api-spec/paths/items/_collection/_id/updateItem.yaml +++ /dev/null @@ -1,51 +0,0 @@ -summary: Update an item -description: Update an existing item. -operationId: updateItem -parameters: -- name: id - in: path - description: Unique identifier of the item. - required: true - schema: - type: string -- $ref: ../../../../components/parameters.yaml#/Collection -- $ref: ../../../../components/parameters.yaml#/Fields -- $ref: ../../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../../components/schemas/Items.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Items.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateItem } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateItem(collection_name, item_id, partial_item_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update__item(id: ID!, data: update__input!): - } diff --git a/.bak/api-spec/paths/items/_collection/createItems.yaml b/.bak/api-spec/paths/items/_collection/createItems.yaml deleted file mode 100644 index 2fc4f6bc..00000000 --- a/.bak/api-spec/paths/items/_collection/createItems.yaml +++ /dev/null @@ -1,59 +0,0 @@ - -summary: Create Multiple Items -description: Create new items in the given collection. -operationId: createItems -parameters: -- $ref: ../../../components/parameters.yaml#/Collection -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Limit -- $ref: ../../../components/parameters.yaml#/Offset -- $ref: ../../../components/parameters.yaml#/Sort -- $ref: ../../../components/parameters.yaml#/Filter -- $ref: ../../../components/parameters.yaml#/Search -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../../components/schemas/Items.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../../components/schemas/Items.yaml - meta: - $ref: ../../../components/schemas/x-metadata.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createItems } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createItems(collection_name, item_object_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - create__items(data: [create__input]): [] - } diff --git a/.bak/api-spec/paths/items/_collection/deleteItems.yaml b/.bak/api-spec/paths/items/_collection/deleteItems.yaml deleted file mode 100644 index 9462ec49..00000000 --- a/.bak/api-spec/paths/items/_collection/deleteItems.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Delete Multiple Items -description: Delete multiple items at the same time. -operationId: deleteItems -parameters: -- $ref: ../../../components/parameters.yaml#/Collection -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Limit -- $ref: ../../../components/parameters.yaml#/Meta -- $ref: ../../../components/parameters.yaml#/Offset -- $ref: ../../../components/parameters.yaml#/Sort -- $ref: ../../../components/parameters.yaml#/Filter -- $ref: ../../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - anyOf: - - type: array - description: Primary keys of items to be deleted. - items: - type: string - - type: object - description: Object containing either `keys` or `query` to selected what items to update. - properties: - keys: - type: array - items: - type: string - items: - type: object -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteItems } from '@directus/sdk'; - - const client = createDirectus('https://directus.example.com').with(rest()); - - const result = await client.request(deleteItems(collection_name, item_id_array)); - - //or - - const result = await client.request(deleteItems(collection_name, query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete__items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/items/_collection/getCollectionItems.yaml b/.bak/api-spec/paths/items/_collection/getCollectionItems.yaml deleted file mode 100644 index c9adce0b..00000000 --- a/.bak/api-spec/paths/items/_collection/getCollectionItems.yaml +++ /dev/null @@ -1,51 +0,0 @@ -summary: List all items in a collection. -description: Returns a list of the items in the given collection. -operationId: getCollectionItems -parameters: -- description: Unique identifier of the collection the item resides in. - in: path - name: collection - required: true - schema: - type: string -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Limit -- $ref: ../../../components/parameters.yaml#/Offset -- $ref: ../../../components/parameters.yaml#/Meta -- $ref: ../../../components/parameters.yaml#/Sort -- $ref: ../../../components/parameters.yaml#/Filter -- $ref: ../../../components/parameters.yaml#/Search -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../../components/schemas/Items.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readItems } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readItems('collection_name', query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - : [] - } diff --git a/.bak/api-spec/paths/items/_collection/index.yaml b/.bak/api-spec/paths/items/_collection/index.yaml deleted file mode 100644 index f372168d..00000000 --- a/.bak/api-spec/paths/items/_collection/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getCollectionItems.yaml -post: - $ref: createItems.yaml -patch: - $ref: updateItems.yaml -delete: - $ref: deleteItems.yaml diff --git a/.bak/api-spec/paths/items/_collection/singleton/getSingleton.yaml b/.bak/api-spec/paths/items/_collection/singleton/getSingleton.yaml deleted file mode 100644 index 2c0f888b..00000000 --- a/.bak/api-spec/paths/items/_collection/singleton/getSingleton.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: Retrieve a Singleton -description: | - Retrieves a singleton of a given collection. - - The REST and GraphQL requests for singletons are the same as those used to Get Items but in contrast the response consists of a plain item object (the singleton) instead of an array of items. -operationId: getSingleton -parameters: -- $ref: ../../../../components/parameters.yaml#/Collection -- $ref: ../../../../components/parameters.yaml#/Version -- $ref: ../../../../components/parameters.yaml#/Fields -- $ref: ../../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Items.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readSingleton } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readSingleton(collection_name)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - (version: String): - } - - type Query { - _by_version(version: String!): - } diff --git a/.bak/api-spec/paths/items/_collection/singleton/index.yaml b/.bak/api-spec/paths/items/_collection/singleton/index.yaml deleted file mode 100644 index 5a466884..00000000 --- a/.bak/api-spec/paths/items/_collection/singleton/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: getSingleton.yaml -patch: - $ref: updateSingleton.yaml diff --git a/.bak/api-spec/paths/items/_collection/singleton/updateSingleton.yaml b/.bak/api-spec/paths/items/_collection/singleton/updateSingleton.yaml deleted file mode 100644 index 9a20f03e..00000000 --- a/.bak/api-spec/paths/items/_collection/singleton/updateSingleton.yaml +++ /dev/null @@ -1,48 +0,0 @@ -summary: Update Singleton -description: | - Update a singleton item. - - The REST and GraphQL requests for singletons are the same as those used to Update Multiple Items but in contrast the request should consist of the plain item object. -operationId: updateSingleton -parameters: -- $ref: ../../../../components/parameters.yaml#/Collection -- $ref: ../../../../components/parameters.yaml#/Fields -- $ref: ../../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../../components/schemas/Items.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Items.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateSingleton } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateSingleton(collection_name, partial_item_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update__items(data: [update__input]): [] - } diff --git a/.bak/api-spec/paths/items/_collection/updateItems.yaml b/.bak/api-spec/paths/items/_collection/updateItems.yaml deleted file mode 100644 index c40980fc..00000000 --- a/.bak/api-spec/paths/items/_collection/updateItems.yaml +++ /dev/null @@ -1,64 +0,0 @@ - -summary: Update Multiple Items -description: Update multiple items at the same time. -operationId: updateItems -parameters: -- $ref: ../../../components/parameters.yaml#/Collection -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Limit -- $ref: ../../../components/parameters.yaml#/Meta -- $ref: ../../../components/parameters.yaml#/Offset -- $ref: ../../../components/parameters.yaml#/Sort -- $ref: ../../../components/parameters.yaml#/Filter -- $ref: ../../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - $ref: ../../../components/schemas/Items.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../../components/schemas/Items.yaml - meta: - $ref: ../../../components/schemas/x-metadata.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Items -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateItems } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateItems(collection_name, item_id_array, partial_item_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update__items(ids: [ID!]!, data: [update__input]): [] - } diff --git a/.bak/api-spec/paths/notifications/_id/deleteNotification.yaml b/.bak/api-spec/paths/notifications/_id/deleteNotification.yaml deleted file mode 100644 index 24dc92f0..00000000 --- a/.bak/api-spec/paths/notifications/_id/deleteNotification.yaml +++ /dev/null @@ -1,36 +0,0 @@ - -summary: Delete an notification -description: Delete an existing notification. -operationId: deleteNotification -parameters: -- name: id - in: path - required: true - description: Unique identifier of the notification. - schema: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteNotification } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteNotification(notification_id)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_notifications_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/notifications/_id/getNotification.yaml b/.bak/api-spec/paths/notifications/_id/getNotification.yaml deleted file mode 100644 index 3a7848d3..00000000 --- a/.bak/api-spec/paths/notifications/_id/getNotification.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Retrieve a notification -description: List an existing notification by primary key. -operationId: getNotification -parameters: -- name: id - in: path - description: Unique identifier of the notification. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Notifications.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readNotification } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readNotification(notification_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - notifications_by_id(id: ID!): directus_notifications - } diff --git a/.bak/api-spec/paths/notifications/_id/index.yaml b/.bak/api-spec/paths/notifications/_id/index.yaml deleted file mode 100644 index 75214d12..00000000 --- a/.bak/api-spec/paths/notifications/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getNotification.yaml -patch: - $ref: updateNotification.yaml -delete: - $ref: deleteNotification.yaml diff --git a/.bak/api-spec/paths/notifications/_id/updateNotification.yaml b/.bak/api-spec/paths/notifications/_id/updateNotification.yaml deleted file mode 100644 index 9e27f96d..00000000 --- a/.bak/api-spec/paths/notifications/_id/updateNotification.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Update a Notification -description: Update an existing notification. -operationId: updateNotification -parameters: - - name: id - in: path - description: Unique identifier of the notification. - schema: - type: string - required: true - - $ref: ../../../components/parameters.yaml#/Fields - - $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Notifications.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Notifications.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateNotification } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateNotification(notification_id, partial_notification_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_notifications_item(id: ID!, data: update_directus_notifications_input): directus_notifications - } diff --git a/.bak/api-spec/paths/notifications/createNotifications.yaml b/.bak/api-spec/paths/notifications/createNotifications.yaml deleted file mode 100644 index 353c064d..00000000 --- a/.bak/api-spec/paths/notifications/createNotifications.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Create Multiple notifications -description: Create multiple new notifications. -operationId: createNotifications -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Notifications.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Notifications.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createNotifications } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createNotifications(notification_object_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - create_notifications_items(data: [create_directus_notifications_input!]!): [directus_notifications] - } diff --git a/.bak/api-spec/paths/notifications/deleteNotifications.yaml b/.bak/api-spec/paths/notifications/deleteNotifications.yaml deleted file mode 100644 index 0dedb59e..00000000 --- a/.bak/api-spec/paths/notifications/deleteNotifications.yaml +++ /dev/null @@ -1,45 +0,0 @@ - -summary: Delete Multiple notifications -description: Delete multiple existing notifications. -operationId: deleteNotifications -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - description: An array of notification primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteNotifications } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteNotifications(notification_id_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_notifications_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/notifications/getNotifications.yaml b/.bak/api-spec/paths/notifications/getNotifications.yaml deleted file mode 100644 index c23c3b43..00000000 --- a/.bak/api-spec/paths/notifications/getNotifications.yaml +++ /dev/null @@ -1,49 +0,0 @@ - -summary: List notifications -description: List all notifications that exist in Directus. -operationId: getNotifications -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Notifications.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readNotifications } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readNotifications(query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - notifications: [directus_notifications] - } diff --git a/.bak/api-spec/paths/notifications/index.yaml b/.bak/api-spec/paths/notifications/index.yaml deleted file mode 100644 index 8568cbd1..00000000 --- a/.bak/api-spec/paths/notifications/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getNotifications.yaml -post: - $ref: createNotifications.yaml -patch: - $ref: updateNotifications.yaml -delete: - $ref: deleteNotifications.yaml diff --git a/.bak/api-spec/paths/notifications/updateNotifications.yaml b/.bak/api-spec/paths/notifications/updateNotifications.yaml deleted file mode 100644 index 440c2c72..00000000 --- a/.bak/api-spec/paths/notifications/updateNotifications.yaml +++ /dev/null @@ -1,63 +0,0 @@ - -summary: Update Multiple notifications -description: Update multiple notifications at the same time. -operationId: updateNotifications -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - $ref: ../../components/schemas/Notifications.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Notifications.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Notifications -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateNotifications } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateNotifications(notification_id_array, partial_notification_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_notifications_items(ids: [ID!]!, data: update_directus_notifications_input): [directus_notifications] - } diff --git a/.bak/api-spec/paths/operations/_id/deleteOperation.yaml b/.bak/api-spec/paths/operations/_id/deleteOperation.yaml deleted file mode 100644 index e3e503a1..00000000 --- a/.bak/api-spec/paths/operations/_id/deleteOperation.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete an Operation -description: Delete an existing operation -operationId: deleteOperation -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Operations -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteOperation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteOperation(operation_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_operations_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/operations/_id/getOperation.yaml b/.bak/api-spec/paths/operations/_id/getOperation.yaml deleted file mode 100644 index 2e3d3c6c..00000000 --- a/.bak/api-spec/paths/operations/_id/getOperation.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Retrieve an Operation -description: Retrieve a single operation by primary key. -operationId: getOperation -parameters: - - $ref: ../../../components/parameters.yaml#/UUId - - $ref: ../../../components/parameters.yaml#/Fields - - $ref: ../../../components/parameters.yaml#/Limit - - $ref: ../../../components/parameters.yaml#/Meta - - $ref: ../../../components/parameters.yaml#/Offset - - $ref: ../../../components/parameters.yaml#/Sort - - $ref: ../../../components/parameters.yaml#/Filter - - $ref: ../../../components/parameters.yaml#/Search -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Operations.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Operations -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readOperation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readOperation(operation_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - operations_by_id(id: ID!): directus_operations - } diff --git a/.bak/api-spec/paths/operations/_id/index.yaml b/.bak/api-spec/paths/operations/_id/index.yaml deleted file mode 100644 index 542617f4..00000000 --- a/.bak/api-spec/paths/operations/_id/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getOperation.yaml -post: - $ref: triggerOperation.yaml -patch: - $ref: updateOperation.yaml -delete: - $ref: deleteOperation.yaml diff --git a/.bak/api-spec/paths/operations/_id/triggerOperation.yaml b/.bak/api-spec/paths/operations/_id/triggerOperation.yaml deleted file mode 100644 index c4929fcd..00000000 --- a/.bak/api-spec/paths/operations/_id/triggerOperation.yaml +++ /dev/null @@ -1,40 +0,0 @@ -summary: Triggering an Operation -description: Trigger an operation based on primary key. -operationId: triggerOperation -parameters: - - $ref: ../../../components/parameters.yaml#/Id -requestBody: - description: Payload for the operation, if needed. - content: - application/json: - schema: - type: object -responses: - '200': - description: Result of the operation, if any. - content: - application/json: - schema: - type: object - properties: - data: {} - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: - - Operations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, triggerOperation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(triggerOperation(operation_id, webhook_payload_object)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently supported in GraphQL diff --git a/.bak/api-spec/paths/operations/_id/updateOperation.yaml b/.bak/api-spec/paths/operations/_id/updateOperation.yaml deleted file mode 100644 index 82bfd2e0..00000000 --- a/.bak/api-spec/paths/operations/_id/updateOperation.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: Update an Operation -description: Update an existing operation. -operationId: updateOperation -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Operations.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Operations.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Operations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateOperation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateOperation(operation_id, partial_operation_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_operations_item(id: ID!, data: update_directus_operations_input): directus_operations - } diff --git a/.bak/api-spec/paths/operations/createOperations.yaml b/.bak/api-spec/paths/operations/createOperations.yaml deleted file mode 100644 index f3ed5ac4..00000000 --- a/.bak/api-spec/paths/operations/createOperations.yaml +++ /dev/null @@ -1,60 +0,0 @@ - -summary: Create Multiple Operations -description: Create multiple new operations. -operationId: createOperations -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Operations.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Operations.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Operations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createOperations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createOperations(operations_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_operations_items(data: [create_directus_operations_input!]!): [directus_operations] - } diff --git a/.bak/api-spec/paths/operations/deleteOperations.yaml b/.bak/api-spec/paths/operations/deleteOperations.yaml deleted file mode 100644 index c3485f41..00000000 --- a/.bak/api-spec/paths/operations/deleteOperations.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Operations -description: Delete multiple existing operations. -operationId: deleteOperations -requestBody: - description: An array of operations primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Operations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteOperations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteOperations(operations_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_operations_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/operations/getOperations.yaml b/.bak/api-spec/paths/operations/getOperations.yaml deleted file mode 100644 index e62efe84..00000000 --- a/.bak/api-spec/paths/operations/getOperations.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: List Operations -description: List all operations that exist in Directus. -operationId: getOperations -parameters: - - $ref: ../../components/parameters.yaml#/Fields - - $ref: ../../components/parameters.yaml#/Limit - - $ref: ../../components/parameters.yaml#/Offset - - $ref: ../../components/parameters.yaml#/Meta - - $ref: ../../components/parameters.yaml#/Sort - - $ref: ../../components/parameters.yaml#/Filter - - $ref: ../../components/parameters.yaml#/Search - - $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Operations.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Operations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readOperations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readOperations(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - operations: [directus_operations] - } diff --git a/.bak/api-spec/paths/operations/index.yaml b/.bak/api-spec/paths/operations/index.yaml deleted file mode 100644 index d3a7d90e..00000000 --- a/.bak/api-spec/paths/operations/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getOperations.yaml -post: - $ref: createOperations.yaml -patch: - $ref: updateOperations.yaml -delete: - $ref: deleteOperations.yaml diff --git a/.bak/api-spec/paths/operations/updateOperations.yaml b/.bak/api-spec/paths/operations/updateOperations.yaml deleted file mode 100644 index 3f215762..00000000 --- a/.bak/api-spec/paths/operations/updateOperations.yaml +++ /dev/null @@ -1,61 +0,0 @@ -summary: Update Multiple Operations -description: Update multiple operations at the same time. -security: [] -tags: -- Operations -operationId: updateOperations -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - anyOf: - - $ref: ../../components/schemas/Operations.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Operations.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateOperations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateOperations(operations_id_array, partial_operations_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_operations_items(ids: [ID!]!, data: update_directus_operations_input): [directus_operations] - } diff --git a/.bak/api-spec/paths/panels/_id/deletePanel.yaml b/.bak/api-spec/paths/panels/_id/deletePanel.yaml deleted file mode 100644 index 83af36a0..00000000 --- a/.bak/api-spec/paths/panels/_id/deletePanel.yaml +++ /dev/null @@ -1,36 +0,0 @@ - -summary: Delete an panel -description: Delete an existing panel. -operationId: deletePanel -parameters: -- name: id - in: path - description: Unique identifier of the panel. - required: true - schema: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePanel } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePanel(panel_id)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_panels_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/panels/_id/getPanel.yaml b/.bak/api-spec/paths/panels/_id/getPanel.yaml deleted file mode 100644 index 8e1b0276..00000000 --- a/.bak/api-spec/paths/panels/_id/getPanel.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Retrieve a panel -description: List an existing panel by primary key. -operationId: getPanel -parameters: -- name: id - in: path - description: Unique identifier of the panel. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Panels.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPanel } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPanel(panel_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - panels_by_id(id: ID!): directus_panels - } diff --git a/.bak/api-spec/paths/panels/_id/index.yaml b/.bak/api-spec/paths/panels/_id/index.yaml deleted file mode 100644 index 4bf1388a..00000000 --- a/.bak/api-spec/paths/panels/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getPanel.yaml -patch: - $ref: updatePanel.yaml -delete: - $ref: deletePanel.yaml diff --git a/.bak/api-spec/paths/panels/_id/updatePanel.yaml b/.bak/api-spec/paths/panels/_id/updatePanel.yaml deleted file mode 100644 index 4ccce0dd..00000000 --- a/.bak/api-spec/paths/panels/_id/updatePanel.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Update a panel -description: Update an existing panel. -operationId: updatePanel -parameters: -- name: id - in: path - description: Unique identifier of the panel. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Panels.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Panels.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePanel } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePanel(panel_id, partial_panel_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_panels_item(id: ID!, data: update_directus_panels_input): directus_panels - } diff --git a/.bak/api-spec/paths/panels/createPanels.yaml b/.bak/api-spec/paths/panels/createPanels.yaml deleted file mode 100644 index 3408758b..00000000 --- a/.bak/api-spec/paths/panels/createPanels.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Create Multiple panels -description: Create multiple new panels. -operationId: createPanels -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Panels.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Panels.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createPanel } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createPanels(panel_object_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - create_panels_items(data: [create_directus_panels_input!]!): [directus_panels] - } diff --git a/.bak/api-spec/paths/panels/deletePanels.yaml b/.bak/api-spec/paths/panels/deletePanels.yaml deleted file mode 100644 index 56da57c8..00000000 --- a/.bak/api-spec/paths/panels/deletePanels.yaml +++ /dev/null @@ -1,37 +0,0 @@ - -summary: Delete Multiple panels -description: Delete multiple existing panels. -operationId: deletePanels -requestBody: - description: An array of panel primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePanels } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePanels(panel_id_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_panels_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/panels/getPanels.yaml b/.bak/api-spec/paths/panels/getPanels.yaml deleted file mode 100644 index aa09ab31..00000000 --- a/.bak/api-spec/paths/panels/getPanels.yaml +++ /dev/null @@ -1,49 +0,0 @@ - -summary: List panels -description: List all panels that exist in Directus. -operationId: getPanels -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Panels.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPanels } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPanels(query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - panels: [directus_panels] - } diff --git a/.bak/api-spec/paths/panels/index.yaml b/.bak/api-spec/paths/panels/index.yaml deleted file mode 100644 index 40dc6123..00000000 --- a/.bak/api-spec/paths/panels/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getPanels.yaml -post: - $ref: createPanels.yaml -patch: - $ref: updatePanels.yaml -delete: - $ref: deletePanels.yaml diff --git a/.bak/api-spec/paths/panels/updatePanels.yaml b/.bak/api-spec/paths/panels/updatePanels.yaml deleted file mode 100644 index 92902ab2..00000000 --- a/.bak/api-spec/paths/panels/updatePanels.yaml +++ /dev/null @@ -1,63 +0,0 @@ - -summary: Update Multiple panels -description: Update multiple panels at the same time. -operationId: updatePanels -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - keys - - data - properties: - data: - $ref: ../../components/schemas/Panels.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Panels.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Panels -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePanels } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePanels(panel_id_array, partial_panel_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_panels_items(ids: [ID!]!, data: update_directus_panels_input): [directus_panels] - } diff --git a/.bak/api-spec/paths/permissions/_id/deletePermission.yaml b/.bak/api-spec/paths/permissions/_id/deletePermission.yaml deleted file mode 100644 index f7d2db5a..00000000 --- a/.bak/api-spec/paths/permissions/_id/deletePermission.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Permission -description: Delete an existing permission -operationId: deletePermission -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -parameters: -- $ref: ../../../components/parameters.yaml#/Id -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePermission } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePermission(permission_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_permissions_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/permissions/_id/getPermission.yaml b/.bak/api-spec/paths/permissions/_id/getPermission.yaml deleted file mode 100644 index 32553f32..00000000 --- a/.bak/api-spec/paths/permissions/_id/getPermission.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve a Permission Rule -description: Retrieve a single permission rules object by unique identifier. -operationId: getPermission -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Permissions.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPermission } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPermission(permission_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - permissions_by_id(id: ID!): directus_permissions - } diff --git a/.bak/api-spec/paths/permissions/_id/index.yaml b/.bak/api-spec/paths/permissions/_id/index.yaml deleted file mode 100644 index 9f4e4d71..00000000 --- a/.bak/api-spec/paths/permissions/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getPermission.yaml -patch: - $ref: updatePermission.yaml -delete: - $ref: deletePermission.yaml diff --git a/.bak/api-spec/paths/permissions/_id/updatePermission.yaml b/.bak/api-spec/paths/permissions/_id/updatePermission.yaml deleted file mode 100644 index ed1e0ce2..00000000 --- a/.bak/api-spec/paths/permissions/_id/updatePermission.yaml +++ /dev/null @@ -1,110 +0,0 @@ -summary: Update a Permission Rule -description: Update an existing permission rule -operationId: updatePermission -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - collection: - type: object - description: What collection this permission applies to. - comment: - type: string - description: If the user can post comments. full. - enum: - - none - - create - - update - create: - type: string - description: If the user can create items. - enum: - - none - - full - delete: - type: string - description: If the user can update items. - enum: - - none - - mine - - role - - full - explain: - type: string - description: If the user is required to leave a comment explaining what - was changed. - enum: - - none - - create - - update - - always - read: - type: string - description: If the user can read items. - enum: - - none - - mine - - role - - full - read_field_blacklist: - type: object - description: Explicitly denies read access for specific fields. - role: - type: object - description: Unique identifier of the role this permission applies to. - status: - type: object - description: What status this permission applies to. - status_blacklist: - type: object - description: Explicitly denies specific statuses to be used. - update: - type: string - description: If the user can update items. - enum: - - none - - mine - - role - - full - write_field_blacklist: - type: object - description: Explicitly denies write access for specific fields. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Permissions.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePermission } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePermission(permission_id, partial_permission_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_permissions_item(id: ID!, data: update_directus_permissions_input!): directus_permissions - } diff --git a/.bak/api-spec/paths/permissions/createPermissions.yaml b/.bak/api-spec/paths/permissions/createPermissions.yaml deleted file mode 100644 index cd6709f7..00000000 --- a/.bak/api-spec/paths/permissions/createPermissions.yaml +++ /dev/null @@ -1,63 +0,0 @@ -summary: Create Multiple Permission Rules -description: Create multiple new permission rules -operationId: createPermissions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -requestBody: - content: - application/json: - schema: - type: object - required: - - action - - collection - properties: - data: - type: array - items: - $ref: ../../components/schemas/Permissions.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Permissions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createPermissions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createPermissions(permission_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_permissions_items(data: [create_directus_permissions_input!]!): [directus_permissions] - } diff --git a/.bak/api-spec/paths/permissions/deletePermissions.yaml b/.bak/api-spec/paths/permissions/deletePermissions.yaml deleted file mode 100644 index 33e70dcc..00000000 --- a/.bak/api-spec/paths/permissions/deletePermissions.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Permission Ruless -description: Delete multiple existing permission rules. -operationId: deletePermissions -requestBody: - description: An array of permissions primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Permissions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePermissions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePermissions(permission_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_permissions_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/permissions/getPermissions.yaml b/.bak/api-spec/paths/permissions/getPermissions.yaml deleted file mode 100644 index ea4e02d9..00000000 --- a/.bak/api-spec/paths/permissions/getPermissions.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: List Permissions -description: List all permissions that exist in Directus. -operationId: getPermissions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Permissions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPermissions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPermissions(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - permissions: directus_permissions - } diff --git a/.bak/api-spec/paths/permissions/index.yaml b/.bak/api-spec/paths/permissions/index.yaml deleted file mode 100644 index 349bd9a1..00000000 --- a/.bak/api-spec/paths/permissions/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getPermissions.yaml -post: - $ref: createPermissions.yaml -patch: - $ref: updatePermissions.yaml -delete: - $ref: deletePermissions.yaml diff --git a/.bak/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml b/.bak/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml deleted file mode 100644 index 7987513d..00000000 --- a/.bak/api-spec/paths/permissions/me/_collection/_id/getItemPermissions.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Check Permissions for a Specific Item -description: | - Check the current user's permissions on a specific item. - - For a singleton where update access is given, the presets and fields properties from the corresponding update permission are additionally returned. - - The response structure is maintained in any case, even if the collection or item does not exist. To check for the existence of an item, use the get items endpoint instead. -operationId: readItemPermissions -parameters: - - $ref: ../../../../../components/parameters.yaml#/Collection - - $ref: ../../../../../components/parameters.yaml#/Id -responses: - '200': - description: Successful request - content: - application/json: - examples: - collection: - value: - update: - access: boolean - delete: - access: boolean - share: - access: boolean - singleton: - value: - update: - access: boolean - presets: permission_presets - fields: permission_fields - delete: - access: boolean - share: - access: boolean - '401': - $ref: ../../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readItemPermissions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - // collection item - const result = await client.request(readItemPermissions(collection_name, item_id)); - - // singleton - const result = await client.request(readItemPermissions(collection_name)); - - label: GraphQL - lang: GraphQL - source: | - //Currently not supported in GraphQL. diff --git a/.bak/api-spec/paths/permissions/me/_collection/_id/index.yaml b/.bak/api-spec/paths/permissions/me/_collection/_id/index.yaml deleted file mode 100644 index 14aa0205..00000000 --- a/.bak/api-spec/paths/permissions/me/_collection/_id/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getItemPermissions.yaml diff --git a/.bak/api-spec/paths/permissions/me/getUserPermissions.yaml b/.bak/api-spec/paths/permissions/me/getUserPermissions.yaml deleted file mode 100644 index 67b7bafa..00000000 --- a/.bak/api-spec/paths/permissions/me/getUserPermissions.yaml +++ /dev/null @@ -1,60 +0,0 @@ -summary: Get Current User Permissions -description: | - Check the current user's permissions across all collections. - - The response is an object that contains one entry for every collection with at least one permission. Each collection has entries corresponding to the actions the user is able to perform on the collection. - - The `access` property indicates the level of access the user has for an action for a collection. `"none"` means the user has no access, `"partial"` means the user has access to some items, but may not have access to all items, and `"full"` means the user has access to all items. -operationId: getUserPermissions -responses: - '200': - description: The request was successful. - content: - application/json: - examples: - example: - value: - "": - create: - access: "none | partial | full" - fields: permission_fields - presets: permission_presets - read: - access: "none | partial | full" - full_access: boolean - presets: permission_presets - update: - access: "none | partial | full" - full_access: boolean - fields: permission_fields - presets: permission_presets - delete: - access: "none | partial | full" - full_access: boolean - share: - access: "none | partial | full" - full_access: boolean - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Permissions -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readUserPermissions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readUserPermissions()); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - query { - permissions_me - } diff --git a/.bak/api-spec/paths/permissions/me/index.yaml b/.bak/api-spec/paths/permissions/me/index.yaml deleted file mode 100644 index fd6ed7e9..00000000 --- a/.bak/api-spec/paths/permissions/me/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getUserPermissions.yaml diff --git a/.bak/api-spec/paths/permissions/updatePermissions.yaml b/.bak/api-spec/paths/permissions/updatePermissions.yaml deleted file mode 100644 index 64b4e641..00000000 --- a/.bak/api-spec/paths/permissions/updatePermissions.yaml +++ /dev/null @@ -1,62 +0,0 @@ -summary: Update Multiple Permission Rules -description: Update multiple permissions at the same time. -security: [] -tags: -- Permissions -operationId: updatePermissions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - $ref: ../../components/schemas/Permissions.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Permissions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePermissions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePermissions(permission_id_array, permission_object_panel)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_permissions_items(id: [ID!]!, data: update_directus_permissions_input!): [directus_permissions] - } diff --git a/.bak/api-spec/paths/policies/_id/deletePolicy.yaml b/.bak/api-spec/paths/policies/_id/deletePolicy.yaml deleted file mode 100644 index 9e4ff026..00000000 --- a/.bak/api-spec/paths/policies/_id/deletePolicy.yaml +++ /dev/null @@ -1,36 +0,0 @@ - -summary: Delete a policy -description: Delete an existing policy. -operationId: deletePolicy -parameters: -- name: id - in: path - description: Unique identifier of the policy. - required: true - schema: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePolicy } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePolicy(policy_id)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_policies_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/policies/_id/getPolicy.yaml b/.bak/api-spec/paths/policies/_id/getPolicy.yaml deleted file mode 100644 index 9d3be769..00000000 --- a/.bak/api-spec/paths/policies/_id/getPolicy.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Retrieve a policy -description: List an existing policy by primary key. -operationId: getPolicy -parameters: -- name: id - in: path - description: Unique identifier of the Policy. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Policies.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPolicy } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPolicy(policy_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - policies_by_id(id: ID!): directus_policies - } diff --git a/.bak/api-spec/paths/policies/_id/index.yaml b/.bak/api-spec/paths/policies/_id/index.yaml deleted file mode 100644 index f002ab0e..00000000 --- a/.bak/api-spec/paths/policies/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getPolicy.yaml -patch: - $ref: updatePolicy.yaml -delete: - $ref: deletePolicy.yaml diff --git a/.bak/api-spec/paths/policies/_id/updatePolicy.yaml b/.bak/api-spec/paths/policies/_id/updatePolicy.yaml deleted file mode 100644 index 60a46f3f..00000000 --- a/.bak/api-spec/paths/policies/_id/updatePolicy.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Update a policy -description: Update an existing policy. -operationId: updatePolicy -parameters: -- name: id - in: path - description: Unique identifier of the policy. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Policies.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Policies.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePolicy } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePolicy(policy_id, partial_policy_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_policies_item(id: ID!, data: update_directus_policys_input): directus_policies - } diff --git a/.bak/api-spec/paths/policies/createPolicies.yaml b/.bak/api-spec/paths/policies/createPolicies.yaml deleted file mode 100644 index 069c1e0f..00000000 --- a/.bak/api-spec/paths/policies/createPolicies.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Create Multiple policies -description: Create multiple new policies. -operationId: createPolicies -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Policies.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Policies.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createPolies } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createPolicies(policy_object_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - create_policies_items(data: [create_directus_policies_input!]!): [directus_policies] - } diff --git a/.bak/api-spec/paths/policies/deletePolicies.yaml b/.bak/api-spec/paths/policies/deletePolicies.yaml deleted file mode 100644 index a3209101..00000000 --- a/.bak/api-spec/paths/policies/deletePolicies.yaml +++ /dev/null @@ -1,37 +0,0 @@ - -summary: Delete Multiple policies -description: Delete multiple existing policies. -operationId: deletePolicies -requestBody: - description: An array of policy primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePolicies } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePolicies(policy_id_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_policies_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/policies/getPolicies.yaml b/.bak/api-spec/paths/policies/getPolicies.yaml deleted file mode 100644 index 64a3c512..00000000 --- a/.bak/api-spec/paths/policies/getPolicies.yaml +++ /dev/null @@ -1,49 +0,0 @@ - -summary: List policies -description: List all policies that exist in Directus. -operationId: getPolicies -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Policies.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPolicies } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPolicies(query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - policies: [directus_policies] - } diff --git a/.bak/api-spec/paths/policies/index.yaml b/.bak/api-spec/paths/policies/index.yaml deleted file mode 100644 index 9eed50e8..00000000 --- a/.bak/api-spec/paths/policies/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getPolicies.yaml -post: - $ref: createPolicies.yaml -patch: - $ref: updatePolicies.yaml -delete: - $ref: deletePolicies.yaml diff --git a/.bak/api-spec/paths/policies/updatePolicies.yaml b/.bak/api-spec/paths/policies/updatePolicies.yaml deleted file mode 100644 index 52e3c20e..00000000 --- a/.bak/api-spec/paths/policies/updatePolicies.yaml +++ /dev/null @@ -1,62 +0,0 @@ -summary: Update Multiple policies -description: Update multiple existing policies. -operationId: updatePolicies -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - keys - - data - properties: - data: - $ref: ../../components/schemas/Policies.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Policies.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Policies -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePolicies } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePolicies(policies_id_array, partial_policy_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_policies_items(ids: [ID!]!, data: update_directus_policies_input): [directus_policies] - } diff --git a/.bak/api-spec/paths/presets/_id/deletePreset.yaml b/.bak/api-spec/paths/presets/_id/deletePreset.yaml deleted file mode 100644 index a21a30ca..00000000 --- a/.bak/api-spec/paths/presets/_id/deletePreset.yaml +++ /dev/null @@ -1,30 +0,0 @@ -summary: Delete a Preset -security: [] -tags: -- Presets -operationId: deletePreset -description: Delete an existing preset. -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -parameters: -- $ref: ../../../components/parameters.yaml#/Id -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePreset } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePreset(preset_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_presets_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/presets/_id/getPreset.yaml b/.bak/api-spec/paths/presets/_id/getPreset.yaml deleted file mode 100644 index 758c6a2b..00000000 --- a/.bak/api-spec/paths/presets/_id/getPreset.yaml +++ /dev/null @@ -1,39 +0,0 @@ -summary: Retrieve a Preset -security: [] -tags: -- Presets -operationId: getPreset -description: Retrieve a single preset by unique identifier. -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Presets.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPreset } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPreset(preset_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - presets_by_id(id: ID!): directus_presets - } diff --git a/.bak/api-spec/paths/presets/_id/index.yaml b/.bak/api-spec/paths/presets/_id/index.yaml deleted file mode 100644 index 5c500613..00000000 --- a/.bak/api-spec/paths/presets/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getPreset.yaml -patch: - $ref: updatePreset.yaml -delete: - $ref: deletePreset.yaml diff --git a/.bak/api-spec/paths/presets/_id/updatePreset.yaml b/.bak/api-spec/paths/presets/_id/updatePreset.yaml deleted file mode 100644 index 551d4995..00000000 --- a/.bak/api-spec/paths/presets/_id/updatePreset.yaml +++ /dev/null @@ -1,92 +0,0 @@ -summary: Update a Preset -security: [] -tags: -- Presets -operationId: updatePreset -description: Update an existing preset. -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - required: - - collection - properties: - collection: - type: string - description: What collection this collection preset is used for. - example: articles - title: - type: string - description: Name for the bookmark. If this is set, the collection preset - will be considered to be a bookmark. - example: Highly rated articles - role: - type: integer - description: The unique identifier of a role in the platform. If user - is null, this will be used to apply the collection preset or bookmark - for all users in the role. - search_query: - type: string - description: What the user searched for in search/filter in the header - bar. - filters: - type: array - items: - type: object - properties: - field: - type: string - example: rating - operator: - type: string - example: gte - value: - type: integer - example: 4.5 - view_type: - type: string - description: Name of the view type that is used. Defaults to tabular. - view_query: - type: string - description: View query that's saved per view type. Controls what data - is fetched on load. These follow the same format as the JS SDK parameters. - view_options: - type: string - description: Options of the views. The properties in here are controlled - by the layout. - translation: - type: object - description: Key value pair of language-translation. Can be used to translate - the bookmark title in multiple languages. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Presets.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePresets } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePreset(preset_id, partial_preset_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_presets_item(id: ID!, data: update_directus_presets_input): directus_presets - } diff --git a/.bak/api-spec/paths/presets/createPresets.yaml b/.bak/api-spec/paths/presets/createPresets.yaml deleted file mode 100644 index a6bbfacc..00000000 --- a/.bak/api-spec/paths/presets/createPresets.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Create Multiple Presets -description: Create multiple new Presets. -operationId: createPresets -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Presets.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Presets.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Presets -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createPresets } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createPresets(presets_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_presets_items(data: [create_directus_presets_input!]!): [directus_presets] - } diff --git a/.bak/api-spec/paths/presets/deletePresets.yaml b/.bak/api-spec/paths/presets/deletePresets.yaml deleted file mode 100644 index a35a7051..00000000 --- a/.bak/api-spec/paths/presets/deletePresets.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Presets -description: Delete multiple existing presets. -operationId: deletePresets -requestBody: - description: An array of preset primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Presets -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deletePresets } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deletePreset(preset_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_presets_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/presets/getPresets.yaml b/.bak/api-spec/paths/presets/getPresets.yaml deleted file mode 100644 index c884d502..00000000 --- a/.bak/api-spec/paths/presets/getPresets.yaml +++ /dev/null @@ -1,48 +0,0 @@ -summary: List Presets -security: [] -tags: -- Presets -operationId: getPresets -description: List all presets that exist in Directus. The data returned in this endpoint will be filtered based on the user's permissions. For example, presets for a role other than the current user's role won't be returned. -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Page -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Presets.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readPresets } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readPresets(object_field)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - presets: [directus_presets] - } diff --git a/.bak/api-spec/paths/presets/index.yaml b/.bak/api-spec/paths/presets/index.yaml deleted file mode 100644 index ab55a860..00000000 --- a/.bak/api-spec/paths/presets/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getPresets.yaml -post: - $ref: createPresets.yaml -patch: - $ref: updatePresets.yaml -delete: - $ref: deletePresets.yaml diff --git a/.bak/api-spec/paths/presets/updatePresets.yaml b/.bak/api-spec/paths/presets/updatePresets.yaml deleted file mode 100644 index d6780373..00000000 --- a/.bak/api-spec/paths/presets/updatePresets.yaml +++ /dev/null @@ -1,113 +0,0 @@ -summary: Update Multiple Presets -description: Update multiple presets at the same time. -security: [] -tags: -- Presets -operationId: updatePresets -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - keys - - data - properties: - keys: - type: array - items: - type: string - data: - type: object - required: - - collection - properties: - collection: - type: string - description: What collection this collection preset is used for. - example: articles - title: - type: string - description: Name for the bookmark. If this is set, the collection - preset will be considered to be a bookmark. - example: Highly rated articles - role: - type: string - description: The unique identifier of a role in the platform. If user - is null, this will be used to apply the collection preset or bookmark - for all users in the role. - example: - search: - type: string - description: What the user searched for in search/filter in the header - bar. - filters: - type: array - items: - type: object - properties: - key: - type: string - example: aHKLAakdVghzD - field: - type: string - example: rating - operator: - type: string - example: gte - value: - type: integer - example: 4.5 - layout: - type: string - description: Name of the view type that is used. - layout_query: - type: string - description: Layout query that's saved per layout type. Controls what - data is fetched on load. These follow the same format as the JS - SDK parameters. - layout_options: - type: string - description: Options of the views. The properties in here are controlled - by the layout. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Presets.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updatePresets } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updatePresets(preset_id_array, partial_preset_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_presets_items(ids: [ID!]!, data: update_directus_presets_input): [directus_presets] - } diff --git a/.bak/api-spec/paths/relations/_collection/getRelationByCollection.yaml b/.bak/api-spec/paths/relations/_collection/getRelationByCollection.yaml deleted file mode 100644 index 8e5c1d67..00000000 --- a/.bak/api-spec/paths/relations/_collection/getRelationByCollection.yaml +++ /dev/null @@ -1,39 +0,0 @@ -summary: List relations in collection -description: List all relations that exist in a given collection. -operationId: getRelationByCollection -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Relations.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Relations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRelationByCollection } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRelationByCollection(collection_name)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - relations_in_collection(collection: String!): [directus_relations] - } diff --git a/.bak/api-spec/paths/relations/_collection/index.yaml b/.bak/api-spec/paths/relations/_collection/index.yaml deleted file mode 100644 index 48e39768..00000000 --- a/.bak/api-spec/paths/relations/_collection/index.yaml +++ /dev/null @@ -1,3 +0,0 @@ -post: - $ref: getRelationByCollection.yaml - diff --git a/.bak/api-spec/paths/relations/_id/deleteRelation.yaml b/.bak/api-spec/paths/relations/_id/deleteRelation.yaml deleted file mode 100644 index dbd5a319..00000000 --- a/.bak/api-spec/paths/relations/_id/deleteRelation.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Relation -description: Delete an existing relation. -operationId: deleteRelation -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Relations -parameters: -- $ref: ../../../components/parameters.yaml#/Id -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteRelation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteRelation(collection_name, field_name)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_relations_item(collection: String!, field: String!): delete_one - } diff --git a/.bak/api-spec/paths/relations/_id/getRelation.yaml b/.bak/api-spec/paths/relations/_id/getRelation.yaml deleted file mode 100644 index 597a5903..00000000 --- a/.bak/api-spec/paths/relations/_id/getRelation.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve a Relation -description: Retrieve a single relation by unique identifier. -operationId: getRelation -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Relations.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Relations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRelation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRelation(collection_name, field_name, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - relations_by_name(collection: String!, field: String!): directus_relations - } diff --git a/.bak/api-spec/paths/relations/_id/index.yaml b/.bak/api-spec/paths/relations/_id/index.yaml deleted file mode 100644 index e6fc7c4c..00000000 --- a/.bak/api-spec/paths/relations/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getRelation.yaml -patch: - $ref: updateRelation.yaml -delete: - $ref: deleteRelation.yaml diff --git a/.bak/api-spec/paths/relations/_id/updateRelation.yaml b/.bak/api-spec/paths/relations/_id/updateRelation.yaml deleted file mode 100644 index d1d7ed8c..00000000 --- a/.bak/api-spec/paths/relations/_id/updateRelation.yaml +++ /dev/null @@ -1,65 +0,0 @@ -summary: Update a Relation -description: Update an existing relation -operationId: updateRelation -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - collection_many: - type: string - description: Collection that has the field that holds the foreign key. - collection_one: - type: string - description: Collection on the _one_ side of the relationship. - field_many: - type: string - description: Foreign key. Field that holds the primary key of the related - collection. - field_one: - type: string - description: Alias column that serves as the _one_ side of the relationship. - example: books - junction_field: - type: string - description: Field on the junction table that holds the primary key of - the related collection. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Relations.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Relations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateRelation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateRelation(collection_name, field_name, partial_relation_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_relations_item(collection: String!, field: String!, data: update_directus_relations_input!): directus_relations - } diff --git a/.bak/api-spec/paths/relations/createRelation.yaml b/.bak/api-spec/paths/relations/createRelation.yaml deleted file mode 100644 index efd34957..00000000 --- a/.bak/api-spec/paths/relations/createRelation.yaml +++ /dev/null @@ -1,67 +0,0 @@ -summary: Create a Relation -description: Create a new relation. -operationId: createRelation -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - collection_many: - type: string - description: Collection that has the field that holds the foreign key. - example: articles - collection_one: - type: string - description: Collection on the _one_ side of the relationship. - example: authors - field_many: - type: string - description: Foreign key. Field that holds the primary key of the related - collection. - example: author - field_one: - type: string - description: Alias column that serves as the _one_ side of the relationship. - example: books - junction_field: - type: string - description: Field on the junction table that holds the primary key of - the related collection. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Relations.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Relations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createRelation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createRelation(relation_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_relations_item(data: create_directus_relations_input!): directus_relations - } diff --git a/.bak/api-spec/paths/relations/getRelations.yaml b/.bak/api-spec/paths/relations/getRelations.yaml deleted file mode 100644 index c777003d..00000000 --- a/.bak/api-spec/paths/relations/getRelations.yaml +++ /dev/null @@ -1,51 +0,0 @@ -summary: List Relations -description: | - List all relations that exist in Directus. - - The data returned in this endpoint will be filtered based on the user's permissions. For example, relations that apply to a collection that the current user doesn't have access to are stripped out. -operationId: getRelations -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Relations.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Relations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRelations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRelations(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - relations: [directus_relations] - } diff --git a/.bak/api-spec/paths/relations/index.yaml b/.bak/api-spec/paths/relations/index.yaml deleted file mode 100644 index e1b72808..00000000 --- a/.bak/api-spec/paths/relations/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: getRelations.yaml -post: - $ref: createRelation.yaml diff --git a/.bak/api-spec/paths/revisions/_id/getRevision.yaml b/.bak/api-spec/paths/revisions/_id/getRevision.yaml deleted file mode 100644 index c2bff6ae..00000000 --- a/.bak/api-spec/paths/revisions/_id/getRevision.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve a Revision -description: List an existing revision by primary key. -operationId: getRevision -parameters: -- $ref: ../../../components/parameters.yaml#/Id -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Revisions.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Revisions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRevision } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRevision(revision_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - revisions_by_id(id: ID!): directus_revisions - } diff --git a/.bak/api-spec/paths/revisions/_id/index.yaml b/.bak/api-spec/paths/revisions/_id/index.yaml deleted file mode 100644 index b87dc0d3..00000000 --- a/.bak/api-spec/paths/revisions/_id/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getRevision.yaml diff --git a/.bak/api-spec/paths/revisions/getRevisions.yaml b/.bak/api-spec/paths/revisions/getRevisions.yaml deleted file mode 100644 index c6893b41..00000000 --- a/.bak/api-spec/paths/revisions/getRevisions.yaml +++ /dev/null @@ -1,53 +0,0 @@ -summary: List Revisions -description: | - List the revisions. - - The data returned in this endpoint will be filtered based on the user's permissions. For example, revisions that apply to a collection that the current user doesn't have access to are stripped out. -operationId: getRevisions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Revisions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Revisions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRevisions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRevisions(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - revisions: [directus_revisions] - } diff --git a/.bak/api-spec/paths/revisions/index.yaml b/.bak/api-spec/paths/revisions/index.yaml deleted file mode 100644 index 1c8be5e8..00000000 --- a/.bak/api-spec/paths/revisions/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getRevisions.yaml diff --git a/.bak/api-spec/paths/roles/_id/deleteRole.yaml b/.bak/api-spec/paths/roles/_id/deleteRole.yaml deleted file mode 100644 index 78410a83..00000000 --- a/.bak/api-spec/paths/roles/_id/deleteRole.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Role -description: Delete an existing role -operationId: deleteRole -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Roles -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteRole } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteRole(role_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_roles_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/roles/_id/getRole.yaml b/.bak/api-spec/paths/roles/_id/getRole.yaml deleted file mode 100644 index 249dd8fe..00000000 --- a/.bak/api-spec/paths/roles/_id/getRole.yaml +++ /dev/null @@ -1,39 +0,0 @@ -summary: Retrieve a Role -description: Retrieve a single role by unique identifier. -operationId: getRole -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Roles.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Roles -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRole } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRole(role_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - roles_by_id(id: ID!): directus_roles - } diff --git a/.bak/api-spec/paths/roles/_id/index.yaml b/.bak/api-spec/paths/roles/_id/index.yaml deleted file mode 100644 index dd6b7539..00000000 --- a/.bak/api-spec/paths/roles/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getRole.yaml -patch: - $ref: updateRole.yaml -delete: - $ref: deleteRole.yaml diff --git a/.bak/api-spec/paths/roles/_id/updateRole.yaml b/.bak/api-spec/paths/roles/_id/updateRole.yaml deleted file mode 100644 index ee9bf9e6..00000000 --- a/.bak/api-spec/paths/roles/_id/updateRole.yaml +++ /dev/null @@ -1,68 +0,0 @@ -summary: Update a Role -description: Update an existing role -operationId: updateRole -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - properties: - description: - type: string - description: Description of the role. - enforce_tfa: - type: boolean - description: Whether or not this role enforces the use of 2FA. - external_id: - type: string - description: ID used with external services in SCIM. - ip_access: - type: array - description: Array of IP addresses that are allowed to connect to the - API as a user of this role. - items: - type: string - module_listing: - type: string - description: Custom override for the admin app module bar navigation. - name: - type: string - description: Name of the role. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Roles.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Roles -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateRole } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateRole(role_id, partial_role_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_roles_item(id: ID!, data: update_directus_roles_input): directus_roles - } diff --git a/.bak/api-spec/paths/roles/createRoles.yaml b/.bak/api-spec/paths/roles/createRoles.yaml deleted file mode 100644 index aff31d2f..00000000 --- a/.bak/api-spec/paths/roles/createRoles.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Create Multiple Roles -description: Create multiple new roles. -operationId: createRoles -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Roles.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Roles.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Roles -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createRoles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createRoles(roles_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_roles_items(data: [create_directus_roles_input!]!): [directus_roles] - } diff --git a/.bak/api-spec/paths/roles/deleteRoles.yaml b/.bak/api-spec/paths/roles/deleteRoles.yaml deleted file mode 100644 index 3ebef4e1..00000000 --- a/.bak/api-spec/paths/roles/deleteRoles.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Roles -description: Delete multiple existing roles. -operationId: deleteRoles -requestBody: - description: An array of role primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Roles -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteRoles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteRoles(role_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_roles_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/roles/getRoles.yaml b/.bak/api-spec/paths/roles/getRoles.yaml deleted file mode 100644 index 913a8515..00000000 --- a/.bak/api-spec/paths/roles/getRoles.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: List Roles -description: List all roles that exist in Directus. -operationId: getRoles -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Roles.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Roles -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readRoles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readRoles(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - roles: [directus_roles] - } diff --git a/.bak/api-spec/paths/roles/index.yaml b/.bak/api-spec/paths/roles/index.yaml deleted file mode 100644 index 36fc1245..00000000 --- a/.bak/api-spec/paths/roles/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getRoles.yaml -post: - $ref: createRoles.yaml -patch: - $ref: updateRoles.yaml -delete: - $ref: deleteRoles.yaml diff --git a/.bak/api-spec/paths/roles/updateRoles.yaml b/.bak/api-spec/paths/roles/updateRoles.yaml deleted file mode 100644 index d3406a60..00000000 --- a/.bak/api-spec/paths/roles/updateRoles.yaml +++ /dev/null @@ -1,85 +0,0 @@ -summary: Update Multiple Roles -description: Update multiple roles at the same time. -security: [] -tags: -- Roles -operationId: updateRoles -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - keys - - data - properties: - keys: - type: array - items: - type: string - data: - type: object - properties: - description: - type: string - description: Description of the role. - enforce_tfa: - type: boolean - description: Whether or not this role enforces the use of 2FA. - external_id: - type: string - description: ID used with external services in SCIM. - ip_access: - type: array - description: Array of IP addresses that are allowed to connect to - the API as a user of this role. - items: - type: string - module_listing: - type: string - description: Custom override for the admin app module bar navigation. - name: - type: string - description: Name of the role. - example: Interns -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Roles.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateRoles } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateRoles(role_id_array, partial_role_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_roles_items(ids: [ID!]!, data: update_directus_roles_input): [directus_roles] - } diff --git a/.bak/api-spec/paths/schema/apply/index.yaml b/.bak/api-spec/paths/schema/apply/index.yaml deleted file mode 100644 index 988b3ea2..00000000 --- a/.bak/api-spec/paths/schema/apply/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: schemaApply.yaml diff --git a/.bak/api-spec/paths/schema/apply/schemaApply.yaml b/.bak/api-spec/paths/schema/apply/schemaApply.yaml deleted file mode 100644 index e5e0b601..00000000 --- a/.bak/api-spec/paths/schema/apply/schemaApply.yaml +++ /dev/null @@ -1,189 +0,0 @@ -summary: Apply Schema Difference -description: Update the instance's schema by passing the diff previously retrieved - via `/schema/diff` endpoint in the JSON request body or a JSON/YAML file. This endpoint - is only available to admin users. -operationId: schemaApply -requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Diff.yaml - multipart/form-data: - schema: - type: object - properties: - file: - type: string - format: binary -responses: - '204': - description: Successful request - '403': - $ref: ../../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Schema -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, schemaApply } from '@directus/sdk'; - - const client = createDirectus('https://directus.example.com').with(rest()); - - const result = await client.request( - schemaApply({ - hash: '7d4499bc1e09bab3558b46cc09cd83fea2c05144', - diff: { - collections: [ - { - collection: 'articles', - diff: [ - { - kind: 'N', - rhs: { - collection: 'articles', - meta: { - accountability: 'all', - archive_app_filter: true, - archive_field: null, - archive_value: null, - collapse: 'open', - collection: 'articles', - color: null, - display_template: null, - group: null, - hidden: false, - icon: null, - item_duplication_fields: null, - note: null, - singleton: false, - sort: null, - sort_field: null, - translations: null, - unarchive_value: null, - }, - schema: { - name: 'articles', - }, - }, - }, - ], - }, - ], - fields: [ - { - collection: 'articles', - field: 'id', - diff: [ - { - kind: 'N', - rhs: { - collection: 'articles', - field: 'id', - type: 'integer', - meta: { - collection: 'articles', - conditions: null, - display: null, - display_options: null, - field: 'id', - group: null, - hidden: true, - interface: 'input', - note: null, - options: null, - readonly: true, - required: false, - sort: null, - special: null, - translations: null, - validation: null, - validation_message: null, - width: 'full', - }, - schema: { - name: 'id', - table: 'articles', - data_type: 'integer', - default_value: null, - max_length: null, - numeric_precision: null, - numeric_scale: null, - is_nullable: false, - is_unique: false, - is_primary_key: true, - is_generated: false, - generation_expression: null, - has_auto_increment: true, - foreign_key_table: null, - foreign_key_column: null, - }, - }, - }, - ], - }, - { - collection: 'articles', - field: 'title', - diff: [ - { - kind: 'N', - rhs: { - collection: 'articles', - field: 'title', - type: 'string', - meta: { - collection: 'articles', - conditions: null, - display: null, - display_options: null, - field: 'title', - group: null, - hidden: false, - interface: 'input', - note: null, - options: null, - readonly: false, - required: false, - sort: null, - special: null, - translations: null, - validation: null, - validation_message: null, - width: 'full', - }, - schema: { - name: 'title', - table: 'articles', - data_type: 'varchar', - default_value: null, - max_length: 255, - numeric_precision: null, - numeric_scale: null, - is_nullable: true, - is_unique: false, - is_primary_key: false, - is_generated: false, - generation_expression: null, - has_auto_increment: false, - foreign_key_table: null, - foreign_key_column: null, - }, - }, - }, - ], - }, - ], - relations: [], - }, - }) - ); - - label: GraphQL - lang: GraphQL - source: | - // Not supported in GraphQL diff --git a/.bak/api-spec/paths/schema/diff/index.yaml b/.bak/api-spec/paths/schema/diff/index.yaml deleted file mode 100644 index c55a8aee..00000000 --- a/.bak/api-spec/paths/schema/diff/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: schemaDiff.yaml diff --git a/.bak/api-spec/paths/schema/diff/schemaDiff.yaml b/.bak/api-spec/paths/schema/diff/schemaDiff.yaml deleted file mode 100644 index 2fdf2dd8..00000000 --- a/.bak/api-spec/paths/schema/diff/schemaDiff.yaml +++ /dev/null @@ -1,120 +0,0 @@ -summary: Retrieve Schema Difference -description: | - Compare the current instance's schema against the schema snapshot in JSON request body and retrieve the difference. This endpoint is only available to admin users. - - Alternatively, upload a JSON or YAML schema file. - - Does not allow different Directus versions and database vendors by default. You can opt in to bypass these checks by passing the `force` query parameter. -operationId: schemaDiff -parameters: -- name: force - description: Bypass version and database vendor restrictions. - in: query - required: false - schema: - type: boolean -requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Schema.yaml - multipart/form-data: - schema: - type: object - properties: - file: - type: string - format: binary -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Diff.yaml - '204': - description: No schema difference. - '403': - $ref: ../../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Schema -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - ::: details **Toggle Open to See Request** - - import { createDirectus, rest, schemaDiff } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request( - schemaDiff({ - version: version_num, - directus: 'directus_version', - vendor: 'database_type', - collections: [ - { - collection: 'collection_name', - meta: { - // Meta fields - }, - schema: { - // Schema fields - }, - }, - ], - fields: [ - { - collection: 'collection_name', - field: 'field_1_id', - type: 'field_1_type', - meta: { - // Meta fields - }, - schema: { - // Meta fields - }, - }, - { - collection: 'collection_name', - field: 'field_2_id', - type: 'field_2_type', - meta: { - // Meta fields - }, - schema: { - // Meta fields - }, - }, - { - collection: 'collection_name', - field: 'field_3_id', - type: 'field_3_type', - meta: { - // Meta fields - }, - schema: { - // Meta fields - }, - }, - ], - relations: [], - }) - ); - - console.dir(result, { depth: null }); - - ::: -- label: GraphQL - lang: GraphQL - source: | - // Not supported in GraphQL diff --git a/.bak/api-spec/paths/schema/snapshot/index.yaml b/.bak/api-spec/paths/schema/snapshot/index.yaml deleted file mode 100644 index ede78ad1..00000000 --- a/.bak/api-spec/paths/schema/snapshot/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: schemaSnapshot.yaml diff --git a/.bak/api-spec/paths/schema/snapshot/schemaSnapshot.yaml b/.bak/api-spec/paths/schema/snapshot/schemaSnapshot.yaml deleted file mode 100644 index 73615ad6..00000000 --- a/.bak/api-spec/paths/schema/snapshot/schemaSnapshot.yaml +++ /dev/null @@ -1,38 +0,0 @@ -summary: Retrieve Schema Snapshot -description: Retrieve the current schema. This endpoint is only available to admin - users. -operationId: schemaSnapshot -parameters: -- $ref: ../../../components/parameters.yaml#/Export -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Schema.yaml - text/yaml: - schema: - type: string - format: binary - '403': - $ref: ../../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Schema -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, schemaSnapshot } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(schemaSnapshot()); -- label: GraphQL - lang: GraphQL - source: | - // Not supported in GraphQL diff --git a/.bak/api-spec/paths/server/health/index.yaml b/.bak/api-spec/paths/server/health/index.yaml deleted file mode 100644 index 970ff89e..00000000 --- a/.bak/api-spec/paths/server/health/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: serverHealth.yaml diff --git a/.bak/api-spec/paths/server/health/serverHealth.yaml b/.bak/api-spec/paths/server/health/serverHealth.yaml deleted file mode 100644 index abfba648..00000000 --- a/.bak/api-spec/paths/server/health/serverHealth.yaml +++ /dev/null @@ -1,51 +0,0 @@ -summary: Health -description: | - Shows you a general health status for the server and all connected (third party) services. - - By default, the endpoint only returns a status of ok, warn or error. - - By authenticating as an admin, it will return more in-depth information about the current health status of the system. -operationId: serverHealth -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - status: - description: One of ok, warn, error. - type: string - example: warn - releaseId: - description: Directus version in use. - type: string - example: '10.0.0' - serviceId: - description: Public URL of the current Directus instance. - type: string - example: https://directus.example.com - checks: - description: Array with the status of all individually connected services. - type: array -security: [] -tags: -- Server -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, serverHealth } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(serverHealth()); - - label: GraphQL - lang: GraphQL - source: | - GET /graphql/system - - type Query { - server_health: JSON - } diff --git a/.bak/api-spec/paths/server/info/index.yaml b/.bak/api-spec/paths/server/info/index.yaml deleted file mode 100644 index 46016aa1..00000000 --- a/.bak/api-spec/paths/server/info/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: serverInfo.yaml diff --git a/.bak/api-spec/paths/server/info/serverInfo.yaml b/.bak/api-spec/paths/server/info/serverInfo.yaml deleted file mode 100644 index 95e793f4..00000000 --- a/.bak/api-spec/paths/server/info/serverInfo.yaml +++ /dev/null @@ -1,46 +0,0 @@ -summary: System Info -description: Provides detailed information about the project server, its schema, and its health. -operationId: serverInfo -parameters: -- description: The first time you create a project, the provided token will be saved - and required for subsequent project installs. It can also be found and configured - in `/config/__api.json` on your server. - in: query - name: super_admin_token - required: true - schema: - type: integer -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Settings.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Server -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, serverInfo } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(serverInfo()); -- label: GraphQL - lang: GraphQL - source: | - GET /graphql/system - - type Query { - server_info: server_info - } diff --git a/.bak/api-spec/paths/server/ping/index.yaml b/.bak/api-spec/paths/server/ping/index.yaml deleted file mode 100644 index fa33ebcc..00000000 --- a/.bak/api-spec/paths/server/ping/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: ping.yaml diff --git a/.bak/api-spec/paths/server/ping/ping.yaml b/.bak/api-spec/paths/server/ping/ping.yaml deleted file mode 100644 index 146c3929..00000000 --- a/.bak/api-spec/paths/server/ping/ping.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Ping -description: Ping, pong. Ping.. pong. -operationId: ping -responses: - '200': - content: - application/text: - schema: - type: string - pattern: pong - example: pong - description: Successful request -security: [] -tags: -- Server -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, serverPing } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(serverPing()); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - server_ping: String - } diff --git a/.bak/api-spec/paths/server/specs/graphql/index.yaml b/.bak/api-spec/paths/server/specs/graphql/index.yaml deleted file mode 100644 index 91dfb692..00000000 --- a/.bak/api-spec/paths/server/specs/graphql/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: readGraphqlSdl.yaml diff --git a/.bak/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml b/.bak/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml deleted file mode 100644 index f0748edf..00000000 --- a/.bak/api-spec/paths/server/specs/graphql/readGraphqlSdl.yaml +++ /dev/null @@ -1,30 +0,0 @@ -summary: Get GraphQL SDL -description: Retrieve the GraphQL SDL for the current project. -operationId: readGraphqlSdl -responses: - '200': - description: GraphQL SDL file. - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Server -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readGraphqlSdl } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readGraphqlSdl(scope)); -- label: GraphQL - lang: GraphQL - source: | - GET /graphql/system - - type Query { - server_specs_graphql(scope: graphql_sdl_scope): String - } diff --git a/.bak/api-spec/paths/server/specs/oas/index.yaml b/.bak/api-spec/paths/server/specs/oas/index.yaml deleted file mode 100644 index 145ffe8a..00000000 --- a/.bak/api-spec/paths/server/specs/oas/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: readOpenApiSpec.yaml diff --git a/.bak/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml b/.bak/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml deleted file mode 100644 index 8d74f1bc..00000000 --- a/.bak/api-spec/paths/server/specs/oas/readOpenApiSpec.yaml +++ /dev/null @@ -1,35 +0,0 @@ -summary: Get OpenAPI Specification -description: Retrieve the OpenAPI spec for the current project. -operationId: readOpenApiSpec -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - description: Object conforming to the OpenAPI Specification - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Server -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readOpenApiSpec } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readOpenApiSpec()); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - server_specs_oas: String - } diff --git a/.bak/api-spec/paths/settings/getSettings.yaml b/.bak/api-spec/paths/settings/getSettings.yaml deleted file mode 100644 index 9f4dd59c..00000000 --- a/.bak/api-spec/paths/settings/getSettings.yaml +++ /dev/null @@ -1,42 +0,0 @@ -summary: Retrieve Settings -description: List the settings. -operationId: getSettings -parameters: -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Settings.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Settings -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readSettings } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readSettings()); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - settings: directus_settings - } diff --git a/.bak/api-spec/paths/settings/index.yaml b/.bak/api-spec/paths/settings/index.yaml deleted file mode 100644 index 8af76254..00000000 --- a/.bak/api-spec/paths/settings/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: getSettings.yaml -patch: - $ref: updateSettings.yaml diff --git a/.bak/api-spec/paths/settings/updateSettings.yaml b/.bak/api-spec/paths/settings/updateSettings.yaml deleted file mode 100644 index e4d06e76..00000000 --- a/.bak/api-spec/paths/settings/updateSettings.yaml +++ /dev/null @@ -1,46 +0,0 @@ -summary: Update Settings -description: Update the settings -operationId: updateSettings -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../components/schemas/Settings.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Settings.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Settings -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateSettings } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateSettings(settings_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_settings(data: update_directus_settings_input!): directus_settings - } diff --git a/.bak/api-spec/paths/shares/_id/deleteShare.yaml b/.bak/api-spec/paths/shares/_id/deleteShare.yaml deleted file mode 100644 index ae25b413..00000000 --- a/.bak/api-spec/paths/shares/_id/deleteShare.yaml +++ /dev/null @@ -1,36 +0,0 @@ - -summary: Delete an share -description: Delete an existing share. -operationId: deleteShare -parameters: -- name: id - in: path - required: true - description: Unique identifier of the share. - schema: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteShare } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteShare(share_id)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_shares_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/shares/_id/getShare.yaml b/.bak/api-spec/paths/shares/_id/getShare.yaml deleted file mode 100644 index 6dff150a..00000000 --- a/.bak/api-spec/paths/shares/_id/getShare.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Retrieve a share -description: List an existing share by primary key. -operationId: getShare -parameters: -- name: id - in: path - description: Unique identifier of the share. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Shares.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readShare } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readShare(share_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - type Query { - shares_by_id(id: ID!): directus_shares - } diff --git a/.bak/api-spec/paths/shares/_id/index.yaml b/.bak/api-spec/paths/shares/_id/index.yaml deleted file mode 100644 index c58f5cb8..00000000 --- a/.bak/api-spec/paths/shares/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getShare.yaml -patch: - $ref: updateShare.yaml -delete: - $ref: deleteShare.yaml diff --git a/.bak/api-spec/paths/shares/_id/updateShare.yaml b/.bak/api-spec/paths/shares/_id/updateShare.yaml deleted file mode 100644 index 09523713..00000000 --- a/.bak/api-spec/paths/shares/_id/updateShare.yaml +++ /dev/null @@ -1,50 +0,0 @@ -summary: Update a share -description: Update an existing share. -operationId: updateShare -parameters: -- name: id - in: path - description: Unique identifier of the share. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Shares.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Shares.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateShare } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateShare(share_id, partial_share_object)); - - label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_shares_item(id: ID!, data: update_directus_shares_input): directus_shares - } diff --git a/.bak/api-spec/paths/shares/_share/getPublicShareInfo.yaml b/.bak/api-spec/paths/shares/_share/getPublicShareInfo.yaml deleted file mode 100644 index c6553b29..00000000 --- a/.bak/api-spec/paths/shares/_share/getPublicShareInfo.yaml +++ /dev/null @@ -1,40 +0,0 @@ -summary: Send a Share by Email -description: Allows unauthenticated users to retrieve information about the share. -operationId: getPublicShareInfo -parameters: -- name: share - in: path - description: Unique identifier of the share. - schema: - type: string - required: true -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Shares.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readShareInfo } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readShareInfo(share_id)); - - label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/shares/_share/index.yaml b/.bak/api-spec/paths/shares/_share/index.yaml deleted file mode 100644 index 9a6260cc..00000000 --- a/.bak/api-spec/paths/shares/_share/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getPublicShareInfo.yaml diff --git a/.bak/api-spec/paths/shares/auth/authenticateShare.yaml b/.bak/api-spec/paths/shares/auth/authenticateShare.yaml deleted file mode 100644 index fd522ed2..00000000 --- a/.bak/api-spec/paths/shares/auth/authenticateShare.yaml +++ /dev/null @@ -1,73 +0,0 @@ -summary: Authenticate a Share -description: Authenticate as a share user. Shares work by returning a token, as it is the case with the regular login endpoint. These tokens are limited to a permissions set that only allows access to the item that was shared, and any relationally linked items that that associated role has access to. This means that all regular endpoints can be used with the token returned by this endpoint. -operationId: authenticateShare -requestBody: - content: - application/json: - schema: - type: object - required: - - share - properties: - share: - type: string - format: uuid - description: Primary key of the share you're authenticating against. - example: 3a606c3e-9d4d-4556-b7bb-f00860613da3 - password: - type: string - format: hash - description: Password for the share, if one is configured. - example: '**********' - mode: - type: string - enum: - - json - - cookie - - session - default: json - description: Whether to retrieve the refresh token in the JSON response, - or in a `httpOnly` cookie. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: object - properties: - access_token: - type: string - description: 'Temporary access token to be used in follow-up requests. Note: if you used `session` as the mode in the request, the access token won\u0027t be returned in the JSON.' - example: eyJhbGciOiJI... - expires: - type: integer - description: How long before the access token will expire. Value is in milliseconds. - example: 900 - refresh_token: - type: string - description: 'The token that can be used to retrieve a new access token through `/auth/refresh`. Note: if you used `cookie` or `session` as the mode in the request, the refresh token won\u0027t be returned in the JSON.' - example: yuOJkjdPXMd... - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, authenticateShare } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(authenticateShare('share_key', 'password')); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/shares/auth/index.yaml b/.bak/api-spec/paths/shares/auth/index.yaml deleted file mode 100644 index 1b8441e1..00000000 --- a/.bak/api-spec/paths/shares/auth/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: authenticateShare.yaml diff --git a/.bak/api-spec/paths/shares/createShares.yaml b/.bak/api-spec/paths/shares/createShares.yaml deleted file mode 100644 index f7cd60da..00000000 --- a/.bak/api-spec/paths/shares/createShares.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Create Multiple shares -description: Create multiple new shares. -operationId: createShares -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Shares.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Shares.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createShare } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createShares(share_object_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - create_shares_items(data: [create_directus_shares_input!]!): [directus_shares] - } diff --git a/.bak/api-spec/paths/shares/deleteShares.yaml b/.bak/api-spec/paths/shares/deleteShares.yaml deleted file mode 100644 index a3c5d443..00000000 --- a/.bak/api-spec/paths/shares/deleteShares.yaml +++ /dev/null @@ -1,37 +0,0 @@ - -summary: Delete Multiple shares -description: Delete multiple existing shares. -operationId: deleteShares -requestBody: - description: An array of share primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteShares } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteShares(share_id_array)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - delete_shares_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/shares/getShares.yaml b/.bak/api-spec/paths/shares/getShares.yaml deleted file mode 100644 index 0a630def..00000000 --- a/.bak/api-spec/paths/shares/getShares.yaml +++ /dev/null @@ -1,49 +0,0 @@ - -summary: List shares -description: List all shares that exist in Directus. -operationId: getShares -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Shares.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readShares } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readShares(query_object)); -- label: GraphQL - lang: GraphQL - source: | - type Query { - shares: [directus_shares] - } diff --git a/.bak/api-spec/paths/shares/index.yaml b/.bak/api-spec/paths/shares/index.yaml deleted file mode 100644 index 354697ee..00000000 --- a/.bak/api-spec/paths/shares/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getShares.yaml -post: - $ref: createShares.yaml -patch: - $ref: updateShares.yaml -delete: - $ref: deleteShares.yaml diff --git a/.bak/api-spec/paths/shares/info/_id/getShareInfo.yaml b/.bak/api-spec/paths/shares/info/_id/getShareInfo.yaml deleted file mode 100644 index 44775cf6..00000000 --- a/.bak/api-spec/paths/shares/info/_id/getShareInfo.yaml +++ /dev/null @@ -1,40 +0,0 @@ -summary: Get Share Public Info -description: Allows unauthenticated users to retrieve information about the share. -operationId: getShareInfo -parameters: -- name: id - in: path - description: Unique identifier of the share. - schema: - type: string - required: true -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Shares.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readShareInfo } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readShareInfo(share_id)); - - label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/shares/info/_id/index.yaml b/.bak/api-spec/paths/shares/info/_id/index.yaml deleted file mode 100644 index 6247dd2d..00000000 --- a/.bak/api-spec/paths/shares/info/_id/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: getShareInfo.yaml diff --git a/.bak/api-spec/paths/shares/invite/index.yaml b/.bak/api-spec/paths/shares/invite/index.yaml deleted file mode 100644 index 4f1289cc..00000000 --- a/.bak/api-spec/paths/shares/invite/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: inviteShare.yaml diff --git a/.bak/api-spec/paths/shares/invite/inviteShare.yaml b/.bak/api-spec/paths/shares/invite/inviteShare.yaml deleted file mode 100644 index 3934802b..00000000 --- a/.bak/api-spec/paths/shares/invite/inviteShare.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Send a Share by Email -description: Sends an email to the provided email addresses with a link to the share. -operationId: inviteShare -requestBody: - content: - application/json: - schema: - type: object - required: - - share - properties: - share: - type: uuid - description: Primary key of the share you're authenticating against. - example: 3a606c3e-9d4d-4556-b7bb-f00860613da3 - emails: - type: array - description: Array of email strings to send the share link to. -responses: - '200': - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, inviteShare } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(inviteShare(share_id, email_address_array)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/shares/updateShares.yaml b/.bak/api-spec/paths/shares/updateShares.yaml deleted file mode 100644 index 1b394108..00000000 --- a/.bak/api-spec/paths/shares/updateShares.yaml +++ /dev/null @@ -1,63 +0,0 @@ - -summary: Update Multiple shares -description: Update multiple shares at the same time. -operationId: updatesShares -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - keys - - data - properties: - data: - $ref: ../../components/schemas/Shares.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Shares.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Shares -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateShares } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateShares(share_id_array, partial_share_object)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - update_shares_items(ids: [ID!]!, data: update_directus_shares_input): [directus_shares] - } diff --git a/.bak/api-spec/paths/translations/_id/deleteTranslation.yaml b/.bak/api-spec/paths/translations/_id/deleteTranslation.yaml deleted file mode 100644 index 8e71a731..00000000 --- a/.bak/api-spec/paths/translations/_id/deleteTranslation.yaml +++ /dev/null @@ -1,34 +0,0 @@ - -summary: Delete an Translation -description: Delete an existing Translation. -operationId: deleteTranslation -parameters: -- name: id - in: path - description: Unique identifier of the Translation. - required: true - schema: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteTranslation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteTranslation(translation_id)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/translations/_id/getTranslation.yaml b/.bak/api-spec/paths/translations/_id/getTranslation.yaml deleted file mode 100644 index a5eee523..00000000 --- a/.bak/api-spec/paths/translations/_id/getTranslation.yaml +++ /dev/null @@ -1,42 +0,0 @@ -summary: Retrieve a Translation -description: List an existing Translation by primary key. -operationId: getTranslation -parameters: -- name: id - in: path - description: Unique identifier of the Translation. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Translations.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readTranslation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readTranslation(translation_id, query_object)); - - label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/translations/_id/index.yaml b/.bak/api-spec/paths/translations/_id/index.yaml deleted file mode 100644 index c0aaec91..00000000 --- a/.bak/api-spec/paths/translations/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getTranslation.yaml -patch: - $ref: updateTranslation.yaml -delete: - $ref: deleteTranslation.yaml diff --git a/.bak/api-spec/paths/translations/_id/updateTranslation.yaml b/.bak/api-spec/paths/translations/_id/updateTranslation.yaml deleted file mode 100644 index 5e662496..00000000 --- a/.bak/api-spec/paths/translations/_id/updateTranslation.yaml +++ /dev/null @@ -1,48 +0,0 @@ -summary: Update a Translation -description: Update an existing Translation. -operationId: updateTranslation -parameters: -- name: id - in: path - description: Unique identifier of the Translation. - schema: - type: string - required: true -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Translations.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Translations.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateTranslation } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateTranslation(translation_id, partial_translation_object)); - - label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/translations/createTranslations.yaml b/.bak/api-spec/paths/translations/createTranslations.yaml deleted file mode 100644 index 3b5f9cb9..00000000 --- a/.bak/api-spec/paths/translations/createTranslations.yaml +++ /dev/null @@ -1,55 +0,0 @@ -summary: Create Multiple Translations -description: Create multiple new translations. -operationId: createTranslations -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Translations.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Translations.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createtranslations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createtranslations(translation_object_array)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/translations/deleteTranslations.yaml b/.bak/api-spec/paths/translations/deleteTranslations.yaml deleted file mode 100644 index 0b556858..00000000 --- a/.bak/api-spec/paths/translations/deleteTranslations.yaml +++ /dev/null @@ -1,35 +0,0 @@ - -summary: Delete Multiple Translations -description: Delete multiple existing translations. -operationId: deleteTranslations -requestBody: - description: An array of translation primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteTranslations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteTranslations(translation_id_array)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/translations/getTranslations.yaml b/.bak/api-spec/paths/translations/getTranslations.yaml deleted file mode 100644 index b9ac631c..00000000 --- a/.bak/api-spec/paths/translations/getTranslations.yaml +++ /dev/null @@ -1,47 +0,0 @@ - -summary: List Translations -description: List all Translations that exist in Directus. -operationId: getTranslations -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Translations.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readTranlations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readTranslations(query_object)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/translations/index.yaml b/.bak/api-spec/paths/translations/index.yaml deleted file mode 100644 index cd48acac..00000000 --- a/.bak/api-spec/paths/translations/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getTranslations.yaml -post: - $ref: createTranslations.yaml -patch: - $ref: updateTranslations.yaml -delete: - $ref: deleteTranslations.yaml diff --git a/.bak/api-spec/paths/translations/updateTranslations.yaml b/.bak/api-spec/paths/translations/updateTranslations.yaml deleted file mode 100644 index 6ede47d8..00000000 --- a/.bak/api-spec/paths/translations/updateTranslations.yaml +++ /dev/null @@ -1,58 +0,0 @@ - -summary: Update Multiple Translations -description: Update multiple Translations at the same time. -operationId: updateTranslations -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Translations.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Translations.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Translations -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateTranslations } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateTranslations(translation_id_array, partial_translation_object)); -- label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/users/_id/deleteUser.yaml b/.bak/api-spec/paths/users/_id/deleteUser.yaml deleted file mode 100644 index 92d95c51..00000000 --- a/.bak/api-spec/paths/users/_id/deleteUser.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a User -description: Delete an existing user -operationId: deleteUser -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteUser } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteUser(user_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_users_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/users/_id/getUser.yaml b/.bak/api-spec/paths/users/_id/getUser.yaml deleted file mode 100644 index f184a6b0..00000000 --- a/.bak/api-spec/paths/users/_id/getUser.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve a User -description: List an existing user by primary key. -operationId: getUser -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Users.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readUser } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readUser(user_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - users_by_id(id: ID!): directus_users - } diff --git a/.bak/api-spec/paths/users/_id/index.yaml b/.bak/api-spec/paths/users/_id/index.yaml deleted file mode 100644 index e665e929..00000000 --- a/.bak/api-spec/paths/users/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getUser.yaml -patch: - $ref: updateUser.yaml -delete: - $ref: deleteUser.yaml diff --git a/.bak/api-spec/paths/users/_id/updateUser.yaml b/.bak/api-spec/paths/users/_id/updateUser.yaml deleted file mode 100644 index 16602f95..00000000 --- a/.bak/api-spec/paths/users/_id/updateUser.yaml +++ /dev/null @@ -1,46 +0,0 @@ -summary: Update a User -description: Update an existing user -operationId: updateUser -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - $ref: ../../../components/schemas/Users.yaml -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: object - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateUser } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateUser(user_id, partial_user_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_users_item(id: ID!, data: update_directus_users_input!): directus_users - } diff --git a/.bak/api-spec/paths/users/createUsers.yaml b/.bak/api-spec/paths/users/createUsers.yaml deleted file mode 100644 index 028dc5da..00000000 --- a/.bak/api-spec/paths/users/createUsers.yaml +++ /dev/null @@ -1,61 +0,0 @@ -summary: Create Multiple Users -description: Create multiple new users. -operationId: createUsers -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -- $ref: ../../components/parameters.yaml#/Page -requestBody: - description: "`email` and `password` are required." - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Users.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Users.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, createUsers } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(createUsers(user_object_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - create_users_items(data: [create_directus_users_input!]!): [directus_users] - } diff --git a/.bak/api-spec/paths/users/deleteUsers.yaml b/.bak/api-spec/paths/users/deleteUsers.yaml deleted file mode 100644 index 49a4b8cb..00000000 --- a/.bak/api-spec/paths/users/deleteUsers.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Users -description: Delete multiple existing users. -operationId: deleteUsers -requestBody: - description: An array of user primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteUsers } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteUsers(user_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_users_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/users/getUsers.yaml b/.bak/api-spec/paths/users/getUsers.yaml deleted file mode 100644 index 993dbc1b..00000000 --- a/.bak/api-spec/paths/users/getUsers.yaml +++ /dev/null @@ -1,49 +0,0 @@ -summary: List Users -description: List all users that exist in Directus. -operationId: getUsers -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Users.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readUsers } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readUsers(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - users: [directus_users] - } diff --git a/.bak/api-spec/paths/users/index.yaml b/.bak/api-spec/paths/users/index.yaml deleted file mode 100644 index 88835cd1..00000000 --- a/.bak/api-spec/paths/users/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getUsers.yaml -post: - $ref: createUsers.yaml -patch: - $ref: updateUsers.yaml -delete: - $ref: deleteUsers.yaml diff --git a/.bak/api-spec/paths/users/invite/accept/acceptInvite.yaml b/.bak/api-spec/paths/users/invite/accept/acceptInvite.yaml deleted file mode 100644 index 206b7f7e..00000000 --- a/.bak/api-spec/paths/users/invite/accept/acceptInvite.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: Accept User Invite -description: Accept your invite. The invite user endpoint sends the email a link to the Data Studio. This link includes a token, which is then used to activate the invited user. -operationId: acceptInvite -requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - token - - password - properties: - token: - type: string - example: eyJh...KmUk - description: Accept invite token. - password: - type: string - description: Password of the user. - format: password - example: d1r3ctu5 -responses: - '204': - description: Successful request - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, acceptUserInvite } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(acceptUserInvite(invite_token, user_password)); -- label: GraphQL - lang: GraphQL - source: | - type Mutation { - users_invite_accept(token: String!, password: String!): Boolean - } diff --git a/.bak/api-spec/paths/users/invite/accept/index.yaml b/.bak/api-spec/paths/users/invite/accept/index.yaml deleted file mode 100644 index 678bce1c..00000000 --- a/.bak/api-spec/paths/users/invite/accept/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: acceptInvite.yaml diff --git a/.bak/api-spec/paths/users/invite/index.yaml b/.bak/api-spec/paths/users/invite/index.yaml deleted file mode 100644 index 15bd4363..00000000 --- a/.bak/api-spec/paths/users/invite/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: invite.yaml diff --git a/.bak/api-spec/paths/users/invite/invite.yaml b/.bak/api-spec/paths/users/invite/invite.yaml deleted file mode 100644 index 051018b7..00000000 --- a/.bak/api-spec/paths/users/invite/invite.yaml +++ /dev/null @@ -1,51 +0,0 @@ -summary: Invite User -description: Invites a user to this project. It creates a user with an - invited status, and then sends an email to the user with instructions on how to - activate their account. -operationId: invite -requestBody: - content: - application/json: - schema: - type: object - required: - - email - - role - properties: - email: - type: string - description: Email address of the to-be-invited user. - role: - description: Role of the new user - type: string - invite_url: - description: 'Provide a custom invite url which the link in the email will lead to. The invite token will be passed as a parameter. Note: You need to configure the USER_INVITE_URL_ALLOW_LIST environment variable to enable this feature.' - type: string - format: url -responses: - '204': - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, inviteUser } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(inviteUser('another@example.com', 'c86c2761-65d3-43c3-897f-6f74ad6a5bd7')); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - users_invite(email: String!, role: String!, invite_url: String): Boolean - } diff --git a/.bak/api-spec/paths/users/me/getMe.yaml b/.bak/api-spec/paths/users/me/getMe.yaml deleted file mode 100644 index c6c6bff1..00000000 --- a/.bak/api-spec/paths/users/me/getMe.yaml +++ /dev/null @@ -1,40 +0,0 @@ -summary: Retrieve Current User -description: Retrieve the currently authenticated user. -operationId: getMe -parameters: -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Users.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readMe } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readMe(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - users_me: directus_users - } diff --git a/.bak/api-spec/paths/users/me/index.yaml b/.bak/api-spec/paths/users/me/index.yaml deleted file mode 100644 index 9b9f4567..00000000 --- a/.bak/api-spec/paths/users/me/index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -get: - $ref: getMe.yaml -patch: - $ref: updateMe.yaml diff --git a/.bak/api-spec/paths/users/me/tfa/disable/index.yaml b/.bak/api-spec/paths/users/me/tfa/disable/index.yaml deleted file mode 100644 index 2a0965a4..00000000 --- a/.bak/api-spec/paths/users/me/tfa/disable/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: meTfaDisable.yaml diff --git a/.bak/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml b/.bak/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml deleted file mode 100644 index f0e56ca8..00000000 --- a/.bak/api-spec/paths/users/me/tfa/disable/meTfaDisable.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Disable Two-Factor Authentication -description: Disables two-factor authentication for the currently authenticated user. -operationId: meTfaDisable -requestBody: - content: - application/json: - schema: - type: object - required: - - otp - properties: - otp: - description: One-time password generated by the authenticator app. - type: string -responses: - '204': - description: Successful request - '401': - $ref: ../../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, disableTwoFactor } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(disableTwoFactor(otp)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - users_me_tfa_disable(otp: String!): Boolean - } diff --git a/.bak/api-spec/paths/users/me/tfa/enable/index.yaml b/.bak/api-spec/paths/users/me/tfa/enable/index.yaml deleted file mode 100644 index 007dfb71..00000000 --- a/.bak/api-spec/paths/users/me/tfa/enable/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: meTfaEnable.yaml diff --git a/.bak/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml b/.bak/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml deleted file mode 100644 index 94f28eeb..00000000 --- a/.bak/api-spec/paths/users/me/tfa/enable/meTfaEnable.yaml +++ /dev/null @@ -1,45 +0,0 @@ -summary: Enable 2FA -description: Enables two-factor authentication for the currently authenticated user. -operationId: meTfaEnable -requestBody: - content: - application/json: - schema: - type: object - required: - - secret - - otp - properties: - secret: - description: 'The TFA secret from tfa/generate.' - type: string - otp: - description: OTP generated with the secret, to recheck if the user has a correct TFA setup - type: string -responses: - '204': - description: Successful request - '401': - $ref: ../../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, enableTwoFactor } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(enableTwoFactor(secret, otp)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - users_me_tfa_enable(otp: String!, secret: String!): Boolean - } diff --git a/.bak/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml b/.bak/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml deleted file mode 100644 index 373c3f62..00000000 --- a/.bak/api-spec/paths/users/me/tfa/generate/generateTwoFactorSecret.yaml +++ /dev/null @@ -1,52 +0,0 @@ -summary: Generate Two-Factor Authentication Secret -description: Generates a secret and returns the URL to be used in an authenticator app. -operationId: generateTwoFactorSecret -requestBody: - content: - application/json: - schema: - type: string - required: - - password - properties: - password: - description: The user's password. - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - secret: - type: string - description: OTP secret to be saved in the authenticator app. - otpauth_url: - type: string - description: 'otpauth:// formatted URL. Can be rendered as QR code and used in most authenticator apps.' - '401': - $ref: ../../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, generateTwoFactorSecret } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(generateTwoFactorSecret(user_password)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - users_me_tfa_generate(password: String!): users_me_tfa_generate_data - } diff --git a/.bak/api-spec/paths/users/me/tfa/generate/index.yaml b/.bak/api-spec/paths/users/me/tfa/generate/index.yaml deleted file mode 100644 index b32fdce9..00000000 --- a/.bak/api-spec/paths/users/me/tfa/generate/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: generateTwoFactorSecret.yaml diff --git a/.bak/api-spec/paths/users/me/track/page/index.yaml b/.bak/api-spec/paths/users/me/track/page/index.yaml deleted file mode 100644 index a20d8bc3..00000000 --- a/.bak/api-spec/paths/users/me/track/page/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -patch: - $ref: updateLastUsedPageMe.yaml diff --git a/.bak/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml b/.bak/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml deleted file mode 100644 index 6270ddef..00000000 --- a/.bak/api-spec/paths/users/me/track/page/updateLastUsedPageMe.yaml +++ /dev/null @@ -1,24 +0,0 @@ -summary: Update Last Page -description: Updates the last used page field of the currently authenticated user. - This is used internally to be able to open the Directus admin app from the last - page you used. -operationId: updateLastUsedPageMe -requestBody: - content: - application/json: - schema: - type: object - properties: - last_page: - type: string - description: Path of the page you used last. -responses: - '200': - description: Successful request - '401': - $ref: ../../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users diff --git a/.bak/api-spec/paths/users/me/updateMe.yaml b/.bak/api-spec/paths/users/me/updateMe.yaml deleted file mode 100644 index 0a943f2a..00000000 --- a/.bak/api-spec/paths/users/me/updateMe.yaml +++ /dev/null @@ -1,40 +0,0 @@ -summary: Update Current User -description: Update the currently authenticated user. -operationId: updateMe -parameters: -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Users.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateMe } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateMe(partial_user_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_users_me(data: update_directus_users_input!): directus_users - } diff --git a/.bak/api-spec/paths/users/register/index.yaml b/.bak/api-spec/paths/users/register/index.yaml deleted file mode 100644 index b3983b93..00000000 --- a/.bak/api-spec/paths/users/register/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: registerUser.yaml diff --git a/.bak/api-spec/paths/users/register/registerUser.yaml b/.bak/api-spec/paths/users/register/registerUser.yaml deleted file mode 100644 index 8cce1243..00000000 --- a/.bak/api-spec/paths/users/register/registerUser.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Register a new User -description: Register a new user. -operationId: registerUser -parameters: -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - type: object - required: - - email - - password - properties: - email: - type: string - description: 'Email for the new user.' - password: - type: string - description: 'Password for the new user.' - first_name: - type: string - description: 'First name for the new user.' - last_name: - type: string - description: 'Last name for the new user.' - verification_url: - type: string - description: 'Provide a custom verification url which the link in the email will lead to. The verification token will be passed as a parameter. Note: You need to configure the USER_REGISTER_URL_ALLOW_LIST environment variable to enable this feature.' -responses: - '204': - description: Successful request - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, registerUser } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - await client.request(registerUser(user_email, user_password)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - users_register(email: String!, password: String!): True - } diff --git a/.bak/api-spec/paths/users/register/verify-email/_token/index.yaml b/.bak/api-spec/paths/users/register/verify-email/_token/index.yaml deleted file mode 100644 index 446e9475..00000000 --- a/.bak/api-spec/paths/users/register/verify-email/_token/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: registerUserVerify.yaml diff --git a/.bak/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml b/.bak/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml deleted file mode 100644 index 245d62d6..00000000 --- a/.bak/api-spec/paths/users/register/verify-email/_token/registerUserVerify.yaml +++ /dev/null @@ -1,37 +0,0 @@ -summary: Verify Registered Email -description: Verify the registered email address. The register user endpoint sends the email a link for verification. This link includes a token, which is then used to activate the registered user. -operationId: registerUserVerify -parameters: -- description: Emailed registration token. - in: path - name: token - required: true - schema: - type: string -responses: - '204': - description: Successful request - '401': - $ref: ../../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Users -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, verifyUserEmail } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - await client.request(registerUserVerify(emailed_token)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - users_register_verify(token: String!): True - } diff --git a/.bak/api-spec/paths/users/updateUsers.yaml b/.bak/api-spec/paths/users/updateUsers.yaml deleted file mode 100644 index 5bbca484..00000000 --- a/.bak/api-spec/paths/users/updateUsers.yaml +++ /dev/null @@ -1,59 +0,0 @@ -summary: Update Multiple Users -description: Update multiple users at the same time. -security: [] -tags: -- Users -operationId: updateUsers -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../components/schemas/Users.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Users.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateUsers } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateUsers(user_id_array, partial_user_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_users_items(ids: [ID!]!, data: update_directus_users_input!): [directus_users] - } diff --git a/.bak/api-spec/paths/utils/cache/clear/clear-cache.yaml b/.bak/api-spec/paths/utils/cache/clear/clear-cache.yaml deleted file mode 100644 index 567d3b2a..00000000 --- a/.bak/api-spec/paths/utils/cache/clear/clear-cache.yaml +++ /dev/null @@ -1,24 +0,0 @@ -summary: Clear the Internal Cache -description: Resets the data cache of Directus. Optionally, can also clear system cache. This endpoint is only available to admin users. -operationId: clear-cache -responses: - '200': - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, clearCache } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(clearCache()); - - label: GraphQL - lang: GraphQL - source: | - mutation { - utils_cache_clear - } diff --git a/.bak/api-spec/paths/utils/cache/clear/index.yaml b/.bak/api-spec/paths/utils/cache/clear/index.yaml deleted file mode 100644 index 8916579a..00000000 --- a/.bak/api-spec/paths/utils/cache/clear/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: clear-cache.yaml diff --git a/.bak/api-spec/paths/utils/export/_collection/export.yaml b/.bak/api-spec/paths/utils/export/_collection/export.yaml deleted file mode 100644 index 753bc1e2..00000000 --- a/.bak/api-spec/paths/utils/export/_collection/export.yaml +++ /dev/null @@ -1,66 +0,0 @@ -summary: Export Data to a File -description: Export a larger data set to a file in the file library. -operationId: export -parameters: -- description: Collection identifier - in: path - name: collection - required: true - schema: - type: string -requestBody: - content: - application/json: - schema: - properties: - format: - type: string - description: 'What file format to save the export to. One of `csv`, `xml`,`json`' - enum: - - csv - - xml - - json - query: - $ref: ../../../../components/schemas/Query.yaml - file: - $ref: ../../../../components/schemas/Files.yaml - required: - - format - - query - - file -responses: - '200': - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, utilsExport } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request( - utilsExport( - 'collection_name', - 'file_format', - { - query_type: { - field: { - query_operation: 'value', - }, - }, - }, - { - file: { - file_field: 'value', - }, - } - ) - ); - - label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/utils/export/_collection/index.yaml b/.bak/api-spec/paths/utils/export/_collection/index.yaml deleted file mode 100644 index b0fa4462..00000000 --- a/.bak/api-spec/paths/utils/export/_collection/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: export.yaml diff --git a/.bak/api-spec/paths/utils/hash/generate/hash-generate.yaml b/.bak/api-spec/paths/utils/hash/generate/hash-generate.yaml deleted file mode 100644 index c19ce7b7..00000000 --- a/.bak/api-spec/paths/utils/hash/generate/hash-generate.yaml +++ /dev/null @@ -1,45 +0,0 @@ -summary: Generate a Hash. -description: Generate a hash for a given string. -operationId: hash-generate -requestBody: - content: - application/json: - schema: - properties: - string: - type: string - description: String to hash. - required: - - string -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: string - example: - $argon2i$v=19$m=4096,t=3,p=1$pOyIa/zmRAjCVLb2f7kOyg$DasoO6LzMM+6iKfzCDq6JbsYsZWLSm33p7i9NxL9mDc - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, generateHash } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(generateHash(string_to_hash)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - utils_hash_generate(string: String!): String - } diff --git a/.bak/api-spec/paths/utils/hash/generate/index.yaml b/.bak/api-spec/paths/utils/hash/generate/index.yaml deleted file mode 100644 index 43c816f6..00000000 --- a/.bak/api-spec/paths/utils/hash/generate/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: hash-generate.yaml diff --git a/.bak/api-spec/paths/utils/hash/verify/hash-verify.yaml b/.bak/api-spec/paths/utils/hash/verify/hash-verify.yaml deleted file mode 100644 index 1e10e838..00000000 --- a/.bak/api-spec/paths/utils/hash/verify/hash-verify.yaml +++ /dev/null @@ -1,48 +0,0 @@ -summary: Verify a Hash. -description: Verify a string with a hash. -operationId: hash-verify -requestBody: - content: - application/json: - schema: - properties: - string: - type: string - description: String to hash. - hash: - type: string - description: Hash you want to verify against. - required: - - string - - hash -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: boolean - example: true - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, verifyHash } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(verifyHash(string_to_verify, hash)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - utils_hash_verify(hash: String!, string: String!): Boolean - } diff --git a/.bak/api-spec/paths/utils/hash/verify/index.yaml b/.bak/api-spec/paths/utils/hash/verify/index.yaml deleted file mode 100644 index f3b4e0dd..00000000 --- a/.bak/api-spec/paths/utils/hash/verify/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: hash-verify.yaml diff --git a/.bak/api-spec/paths/utils/import/_collection/import.yaml b/.bak/api-spec/paths/utils/import/_collection/import.yaml deleted file mode 100644 index 477cb4d0..00000000 --- a/.bak/api-spec/paths/utils/import/_collection/import.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Import Data from File -description: Import multiple records from a JSON or CSV file into a collection. -operationId: import -parameters: -- description: Collection identifier - in: path - name: collection - required: true - schema: - type: string -requestBody: - content: - multipart/form-data: - schema: - type: object - properties: - file: - type: string - format: binary -responses: - '200': - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, utilsImport } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const formData = new FormData(); - formData.append('file', raw_file); - - const result = await client.request(utilsImport(formData)); - - label: GraphQL - lang: GraphQL - source: | - // Not currently available in GraphQL diff --git a/.bak/api-spec/paths/utils/import/_collection/index.yaml b/.bak/api-spec/paths/utils/import/_collection/index.yaml deleted file mode 100644 index e8223fea..00000000 --- a/.bak/api-spec/paths/utils/import/_collection/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: import.yaml diff --git a/.bak/api-spec/paths/utils/random/string/index.yaml b/.bak/api-spec/paths/utils/random/string/index.yaml deleted file mode 100644 index 137c5188..00000000 --- a/.bak/api-spec/paths/utils/random/string/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: random.yaml diff --git a/.bak/api-spec/paths/utils/random/string/random.yaml b/.bak/api-spec/paths/utils/random/string/random.yaml deleted file mode 100644 index 1a8bffe0..00000000 --- a/.bak/api-spec/paths/utils/random/string/random.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Get a Random String -description: Returns a random string of given length. -operationId: random -parameters: -- description: Length of the random string. - in: query - name: length - required: false - schema: - type: integer -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: string - example: 1>M3+4oh.S - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, randomString } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(randomString(length)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - utils_random_string(length: Int): String - } diff --git a/.bak/api-spec/paths/utils/sort/_collection/index.yaml b/.bak/api-spec/paths/utils/sort/_collection/index.yaml deleted file mode 100644 index c5cbbf52..00000000 --- a/.bak/api-spec/paths/utils/sort/_collection/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: sort.yaml diff --git a/.bak/api-spec/paths/utils/sort/_collection/sort.yaml b/.bak/api-spec/paths/utils/sort/_collection/sort.yaml deleted file mode 100644 index 840cdbca..00000000 --- a/.bak/api-spec/paths/utils/sort/_collection/sort.yaml +++ /dev/null @@ -1,44 +0,0 @@ -summary: Manually Sort Items in Collection -description: Re-sort items in collection based on start and to value of item -operationId: sort -parameters: -- description: Collection identifier - in: path - name: collection - required: true - schema: - type: string -requestBody: - content: - application/json: - schema: - properties: - item: - type: number - description: Primary key of item to move - to: - type: number - description: Primary key of item where to move the current item to -responses: - '200': - description: Successful request -security: [] -tags: -- Utilities -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, utilitySort } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(utilitySort(collection_name, id_item_to_move, id_item_moving_to)); - - label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - utils_sort(collection: String!, item: ID!, to: ID!): Boolean - } diff --git a/.bak/api-spec/paths/versions/_id/compare/compareContentVersion.yaml b/.bak/api-spec/paths/versions/_id/compare/compareContentVersion.yaml deleted file mode 100644 index aaeaf726..00000000 --- a/.bak/api-spec/paths/versions/_id/compare/compareContentVersion.yaml +++ /dev/null @@ -1,35 +0,0 @@ -summary: Compare a Content Version -description: Compare an existing Content Version with the main version of the item. -operationId: compareContentVersion -parameters: -- $ref: ../../../../components/parameters.yaml#/UUId -responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: object - description: Successful request - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, compareContentVersion } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(compareContentVersion(content_version_id)); -- label: GraphQL - lang: GraphQL - source: | - // Not supported in GraphQL diff --git a/.bak/api-spec/paths/versions/_id/compare/index.yaml b/.bak/api-spec/paths/versions/_id/compare/index.yaml deleted file mode 100644 index a9d98a43..00000000 --- a/.bak/api-spec/paths/versions/_id/compare/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -get: - $ref: compareContentVersion.yaml diff --git a/.bak/api-spec/paths/versions/_id/deleteContentVersion.yaml b/.bak/api-spec/paths/versions/_id/deleteContentVersion.yaml deleted file mode 100644 index 02deffb3..00000000 --- a/.bak/api-spec/paths/versions/_id/deleteContentVersion.yaml +++ /dev/null @@ -1,32 +0,0 @@ -summary: Delete a Content Version -description: Delete an existing Content Version. -operationId: deleteContentVersion -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteContentVersion } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteContentVersion(content_version_id)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_versions_item(id: ID!): delete_one - } diff --git a/.bak/api-spec/paths/versions/_id/getContentVersion.yaml b/.bak/api-spec/paths/versions/_id/getContentVersion.yaml deleted file mode 100644 index d2028283..00000000 --- a/.bak/api-spec/paths/versions/_id/getContentVersion.yaml +++ /dev/null @@ -1,41 +0,0 @@ -summary: Retrieve a Content Version -description: Retrieve a single Content Version by unique identifier. -operationId: getContentVersion -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Versions.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readContentVersion } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readContentVersion(content_version_id, query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - versions_by_id(id: ID!): directus_versions - } diff --git a/.bak/api-spec/paths/versions/_id/index.yaml b/.bak/api-spec/paths/versions/_id/index.yaml deleted file mode 100644 index 7eaca2b8..00000000 --- a/.bak/api-spec/paths/versions/_id/index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -get: - $ref: getContentVersion.yaml -patch: - $ref: updateContentVersion.yaml -delete: - $ref: deleteContentVersion.yaml diff --git a/.bak/api-spec/paths/versions/_id/promote/index.yaml b/.bak/api-spec/paths/versions/_id/promote/index.yaml deleted file mode 100644 index 53569720..00000000 --- a/.bak/api-spec/paths/versions/_id/promote/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: promoteContentVersion.yaml diff --git a/.bak/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml b/.bak/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml deleted file mode 100644 index 4161626b..00000000 --- a/.bak/api-spec/paths/versions/_id/promote/promoteContentVersion.yaml +++ /dev/null @@ -1,46 +0,0 @@ -summary: Promote a Content Version -description: Promote an existing Content Version to become the new main version of the item. -operationId: promoteContentVersion -parameters: -- $ref: ../../../../components/parameters.yaml#/UUId -requestBody: - content: - application/json: - schema: - type: object - properties: - mainHash: - type: string - description: Hash of the main version of the item to be promoted. - fields: - type: string - description: Optional array of field names of which the values are to - be promoted. -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: string - description: The primary key of the promoted item. - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, promoteContentVersion } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(promoteContentVersion(content_version_id, promote_object)); -- label: GraphQL - lang: GraphQL - source: | - // Not supported in GraphQL diff --git a/.bak/api-spec/paths/versions/_id/save/index.yaml b/.bak/api-spec/paths/versions/_id/save/index.yaml deleted file mode 100644 index 535c352b..00000000 --- a/.bak/api-spec/paths/versions/_id/save/index.yaml +++ /dev/null @@ -1,2 +0,0 @@ -post: - $ref: saveContentVersion.yaml diff --git a/.bak/api-spec/paths/versions/_id/save/saveContentVersion.yaml b/.bak/api-spec/paths/versions/_id/save/saveContentVersion.yaml deleted file mode 100644 index f3ca8d75..00000000 --- a/.bak/api-spec/paths/versions/_id/save/saveContentVersion.yaml +++ /dev/null @@ -1,35 +0,0 @@ -summary: Save to a Content Version -description: Save item changes to an existing Content Version. -operationId: saveContentVersion -parameters: -- $ref: ../../../../components/parameters.yaml#/UUId -responses: - '200': - description: Successful request, Returns the item object with the new state after save. - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../../components/schemas/Items.yaml - '401': - $ref: ../../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -x-codeSamples: - - label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, saveToContentVersion } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(saveToContentVersion(content_version_id, partial_item_object)); - - label: GraphQL - lang: GraphQL - source: | - // Not supported in GraphQL diff --git a/.bak/api-spec/paths/versions/_id/updateContentVersion.yaml b/.bak/api-spec/paths/versions/_id/updateContentVersion.yaml deleted file mode 100644 index 814aef9e..00000000 --- a/.bak/api-spec/paths/versions/_id/updateContentVersion.yaml +++ /dev/null @@ -1,47 +0,0 @@ -summary: Update a Content Version -description: Update an existing Content Version. -operationId: updateContentVersion -parameters: -- $ref: ../../../components/parameters.yaml#/UUId -- $ref: ../../../components/parameters.yaml#/Fields -- $ref: ../../../components/parameters.yaml#/Meta -requestBody: - content: - application/json: - schema: - anyOf: - - $ref: ../../../components/schemas/Versions.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - $ref: ../../../components/schemas/Versions.yaml - '401': - $ref: ../../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateContentVersion } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateContentVersion(content_version_id, partial_content_version_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_versions_item(id: ID!, data: update_directus_versions_input!): directus_versions - } diff --git a/.bak/api-spec/paths/versions/createContentVersions.yaml b/.bak/api-spec/paths/versions/createContentVersions.yaml deleted file mode 100644 index c224205c..00000000 --- a/.bak/api-spec/paths/versions/createContentVersions.yaml +++ /dev/null @@ -1,57 +0,0 @@ -summary: Create Multiple Content Versions -description: Create multiple new Content Versions. -operationId: createContentVersions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Versions.yaml -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Versions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateContentVersions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateContentVersions(content_version_id_array, partial_content_version_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_versions_items(ids: [ID!]!, data: update_directus_versions_input!): [directus_versions] - } diff --git a/.bak/api-spec/paths/versions/deleteContentVersions.yaml b/.bak/api-spec/paths/versions/deleteContentVersions.yaml deleted file mode 100644 index 7a416230..00000000 --- a/.bak/api-spec/paths/versions/deleteContentVersions.yaml +++ /dev/null @@ -1,36 +0,0 @@ -summary: Delete Multiple Content Versions -description: Delete multiple existing Content Versions. -operationId: deleteContentVersions -requestBody: - description: An array of content version primary keys. - content: - application/json: - schema: - type: array - items: - type: string -responses: - '204': - description: The resource was deleted successfully. - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, deleteContentVersions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(deleteContentVersions(content_version_id_array)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - delete_versions_items(ids: [ID!]!): delete_many - } diff --git a/.bak/api-spec/paths/versions/getContentVersions.yaml b/.bak/api-spec/paths/versions/getContentVersions.yaml deleted file mode 100644 index 3facbc13..00000000 --- a/.bak/api-spec/paths/versions/getContentVersions.yaml +++ /dev/null @@ -1,49 +0,0 @@ -summary: List Content Versions -description: List all Content Versions that exist in Directus. -operationId: getContentVersions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Versions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError - '404': - $ref: ../../components/responses.yaml#/NotFoundError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, readContentVersions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(readContentVersions(query_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Query { - versions: [directus_versions] - } diff --git a/.bak/api-spec/paths/versions/index.yaml b/.bak/api-spec/paths/versions/index.yaml deleted file mode 100644 index 3cbbe567..00000000 --- a/.bak/api-spec/paths/versions/index.yaml +++ /dev/null @@ -1,8 +0,0 @@ -get: - $ref: getContentVersions.yaml -post: - $ref: createContentVersions.yaml -patch: - $ref: updateContentVersions.yaml -delete: - $ref: deleteContentVersions.yaml diff --git a/.bak/api-spec/paths/versions/updateContentVersions.yaml b/.bak/api-spec/paths/versions/updateContentVersions.yaml deleted file mode 100644 index 85f8bed7..00000000 --- a/.bak/api-spec/paths/versions/updateContentVersions.yaml +++ /dev/null @@ -1,63 +0,0 @@ -summary: Update Multiple Content Versions -description: Update multiple Content Versions at the same time. -operationId: updateContentVersions -parameters: -- $ref: ../../components/parameters.yaml#/Fields -- $ref: ../../components/parameters.yaml#/Limit -- $ref: ../../components/parameters.yaml#/Meta -- $ref: ../../components/parameters.yaml#/Offset -- $ref: ../../components/parameters.yaml#/Sort -- $ref: ../../components/parameters.yaml#/Filter -- $ref: ../../components/parameters.yaml#/Search -requestBody: - content: - application/json: - schema: - type: object - required: - - data - - keys - properties: - data: - anyOf: - - $ref: ../../components/schemas/Versions.yaml - keys: - type: array - items: - type: string -responses: - '200': - description: Successful request - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: ../../components/schemas/Versions.yaml - meta: - $ref: ../../components/schemas/x-metadata.yaml - '401': - $ref: ../../components/responses.yaml#/UnauthorizedError -security: [] -tags: -- Versions -x-codeSamples: -- label: Directus SDK - lang: JavaScript - source: | - import { createDirectus, rest, updateContentVersions } from '@directus/sdk'; - - const client = createDirectus('directus_project_url').with(rest()); - - const result = await client.request(updateContentVersions(content_version_id_array, partial_content_version_object)); -- label: GraphQL - lang: GraphQL - source: | - POST /graphql/system - - type Mutation { - update_versions_items(ids: [ID!]!, data: update_directus_versions_input!): [directus_versions] - } diff --git a/.bak/app/app.vue b/.bak/app/app.vue deleted file mode 100644 index f679e8a7..00000000 --- a/.bak/app/app.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/.bak/app/assets/css/_reset.scss b/.bak/app/assets/css/_reset.scss deleted file mode 100644 index 649bc91d..00000000 --- a/.bak/app/assets/css/_reset.scss +++ /dev/null @@ -1,40 +0,0 @@ -*, -*::before, -*::after { - box-sizing: border-box; -} - -* { - margin: 0; -} - -body { - line-height: 1.5; - -webkit-font-smoothing: antialiased; -} - -img, -picture, -video, -canvas, -svg { - display: block; - max-width: 100%; -} - -input, -button, -textarea, -select { - font: inherit; -} - -p, -h1, -h2, -h3, -h4, -h5, -h6 { - overflow-wrap: break-word; -} diff --git a/.bak/app/assets/css/_vars.scss b/.bak/app/assets/css/_vars.scss deleted file mode 100644 index 988f3d95..00000000 --- a/.bak/app/assets/css/_vars.scss +++ /dev/null @@ -1,58 +0,0 @@ -@use 'colors'; -@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,700;1,400&family=Poppins:wght@400;500;600;700&display=swap'); - -:root { - - --font--body: 'Inter', sans-serif; - --font--header: 'Poppins', sans-serif; - --font--code: 'Fira Mono', monospace; - - --width-md: 768px; - --width-lg: 1024px; - --width-xl: 1280px; - --width-2xl: 1440px; - - --border-radius: 6px; - - --typography: var(--black); - --typography-subdued: color-mix(in hsl shorter hue, var(--black) 70%, var(--white) 30%); - - --background: var(--white); - --background-subdued: color-mix(in hsl shorter hue, var(--white) 95%, var(--black) 5%); - --background-subtle: color-mix(in hsl shorter hue, var(--white) 90%, var(--black) 10%); - - --border: color-mix(in hsl shorter hue, var(--white) 95%, var(--black) 5%); - --border-subdued: color-mix(in hsl shorter hue, var(--white) 90%, var(--black) 10%); - --border-subtle: color-mix(in hsl shorter hue, var(--white) 85%, var(--black) 15%); - - --primary: var(--purple); - --secondary: var(--pink); - - --area--dev-docs: var(--purple); - --area--api-reference: var(--green); - --area--tutorials: var(--pink); - --area--cloud: var(--blue); - --area--community: var(--red); -} - -.dark { - --typography: var(--white); - --typography-subdued: color-mix(in hsl shorter hue, var(--white) 70%, var(--black) 30%); - - --background: color-mix(in hsl shorter hue, var(--black) 94%, var(--white) 6%); - --background-subdued: color-mix(in hsl shorter hue, var(--black) 90%, var(--white) 10%); - --background-subtle: color-mix(in hsl shorter hue, var(--black) 85%, var(--white) 15%); - - --border: color-mix(in hsl shorter hue, var(--black) 90%, var(--white) 10%); - --border-subdued: color-mix(in hsl shorter hue, var(--black) 85%, var(--white) 15%); - --border-subtle: color-mix(in hsl shorter hue, var(--black) 80%, var(--white) 20%); - - --primary: var(--purple-3); - --secondary: var(--pink-3); - - --area--dev-docs: var(--purple-2); - --area--api-reference: var(--green-2); - --area--tutorials: var(--pink-2); - --area--cloud: var(--blue-2); - --area--community: var(--red-2); -} diff --git a/.bak/app/assets/css/colors.scss b/.bak/app/assets/css/colors.scss deleted file mode 100644 index 334a64ff..00000000 --- a/.bak/app/assets/css/colors.scss +++ /dev/null @@ -1,79 +0,0 @@ -:root { - --white: #ffffff; - // --black: #091729; - // --black: #182940; - --black: #040710; - // --black: #000; - - --purple-1: #E0DAFF; - --purple-2: #C2B4FF; - --purple-3: #947CFF; - --purple-4: #6644ff; - --purple-5: #4C2DDB; - --purple-6: #201262; - --purple: var(--purple-4); - - --pink-1: #FFEBF8; - --pink-2: #FFD6F1; - --pink-3: #FFB8E7; - --pink-4: #ff99dd; - --pink-5: #D064AC; - --pink-6: #4F133B; - --pink: var(--pink-4); - - --primary-1: var(--purple-1); - --primary-2: var(--purple-2); - --primary-3: var(--purple-3); - --primary-4: var(--purple-4); - --primary-5: var(--purple-5); - --primary-6: var(--purple-6); - --primary: var(--purple); - - --secondary-1: var(--pink-1); - --secondary-2: var(--pink-2); - --secondary-3: var(--pink-3); - --secondary-4: var(--pink-4); - --secondary-5: var(--pink-5); - --secondary-6: var(--pink-6); - --secondary: var(--pink); - - --blue-1: #DAEBFC; - --blue-2: #B3D7F9; - --blue-3: #8FC4F7; - --blue-4: #68B0F4; - --blue-5: #5A93C8; - --blue-6: #4B769B; - --blue: var(--blue-4); - - --green-1: #E6FAF5; - --green-2: #7FE3CA; - --green-3: #40D6B1; - --green-4: #01C897; - --green-5: #08A582; - --green-6: #17826D; - --green: var(--green-4); - - --yellow-1: #FEF0D3; - --yellow-2: #FDE2A7; - --yellow-3: #FCD37B; - --yellow-4: #FBC54E; - --yellow-5: #C8A34B; - --yellow-6: #948049; - --yellow: var(--yellow-4); - - --red-1: #FDEEF0; - --red-2: #F0A7B3; - --red-3: #EA7D8F; - --red-4: #E35169; - --red-5: #B64C5F; - --red-6: #884756; - --red: var(--red-4); - - --gray-1: #eceef2; - --gray-2: #d4d9e3; - --gray-3: #8292ae; - --gray-4: #637594; - --gray-5: #404b64; - --gray-6: #323948; - --gray: var(--gray-4); -} diff --git a/.bak/app/assets/css/main.scss b/.bak/app/assets/css/main.scss deleted file mode 100644 index ec50e800..00000000 --- a/.bak/app/assets/css/main.scss +++ /dev/null @@ -1,163 +0,0 @@ -@use 'reset'; -@use 'vars'; -@use 'colors'; - -body { - background-color: var(--background); - font-family: var(--font--body); - color: var(--typography); - max-width: 100vw; -} - -.light { - color-scheme: light; -} - -.dark { - color-scheme: dark; -} - -html { - overflow: overlay; - scrollbar-color: var(--border-subtle) var(--background-subdued); - scrollbar-width: thin; -} - -a { - text-decoration: underline; - color: inherit; -} - -h1, -h2, -h3, -h4 { - font-family: var(--font--header); - font-weight: 600; - & a { - text-decoration: none; - } -} - -code, -pre { - font-family: var(--font--code); -} - -.container { - max-width: var(--width-2xl); - padding: 0 24px; - margin-left: auto; - margin-right: auto; - @media (max-width: 768px) { - padding: 0 12px; - } -} - -.container .container { - padding-left: 0; - padding-right: 0; -} - -.prose { - line-height: 1.9; - h1 { - font-size: 2rem; - } - > h2, - h2.header-with-badge { - margin-top: 3rem; - } - h3 { - margin-top: 2rem; - } - > h2 + h3 { - margin-top: 1rem; - } - h1, h2, h3, h4 { - margin-bottom: 0.3rem; - code { - font-size: 1.1rem; - } - } - p, img, ul, ol, .prose-table-wrapper, .TabsRoot { - margin-bottom: 1rem; - } - .box, .directus-cloud, .callout, .prose-pre { - margin-bottom: 1.5rem; - margin-top: 1.5rem; - } - ul, ol { - ul, ol { - margin-top: 0.5rem; - } - } - a:not(.article-card):not(.callout):not([href*='directus.io']):not([href*='directus.cloud']):not([href*='localhost']):not([href*='127.0.0.1'])[href*='//']{ - display: inline-block; - &:after { - --size: 1rem; - content: ''; - background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0ibTE2IDguNGwtOC45IDguOXEtLjI3NS4yNzUtLjcuMjc1dC0uNy0uMjc1dC0uMjc1LS43dC4yNzUtLjdMMTQuNiA3SDdxLS40MjUgMC0uNzEyLS4yODhUNiA2dC4yODgtLjcxMlQ3IDVoMTBxLjQyNSAwIC43MTMuMjg4VDE4IDZ2MTBxMCAuNDI1LS4yODguNzEzVDE3IDE3dC0uNzEyLS4yODhUMTYgMTZ6Ii8+PC9zdmc+'); - display: inline-block; - background-size: var(--size); - width: var(--size); - height: var(--size); - vertical-align: sub; } - } - img { - border-radius: var(--border-radius); - display: block; - width: 100%; - } - code { - background: var(--background-subtle); - font-size: 0.8rem; - padding: 0rem 0.2rem; - border-radius: 4px; - border: 1px solid var(--border-subdued); - } - pre code { - font-weight: normal; - background: inherit; - padding: 0; - border-radius: 0; - border: none; - } - table, td, th { - border: 1px solid var(--border-subdued); - border-collapse: collapse; - text-align: left; - } - table { - width: 100%; - border-radius: var(--border-radius); - } - th { - font-weight: bold; - background: var(--bg-2); - } - td, th { - padding: 0.5rem 0.75rem; - } - svg.icon { - margin-bottom: 4px; - } - video { - width: 100%; - border-radius: var(--border-radius); - overflow: hidden; - margin-bottom: 1rem; - } -} - -.section-title { - color: var(--typography-subdued); - text-transform: uppercase; - font-size: 14px; - font-weight: 500; -} - -hr { - border: 0; - border-top: 2px solid var(--border); -} diff --git a/.bak/app/assets/icons/frameworks/angular.svg b/.bak/app/assets/icons/frameworks/angular.svg deleted file mode 100644 index ea02d0b8..00000000 --- a/.bak/app/assets/icons/frameworks/angular.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/.bak/app/assets/icons/frameworks/apple.svg b/.bak/app/assets/icons/frameworks/apple.svg deleted file mode 100644 index 72769a07..00000000 --- a/.bak/app/assets/icons/frameworks/apple.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/.bak/app/assets/icons/frameworks/astro.svg b/.bak/app/assets/icons/frameworks/astro.svg deleted file mode 100644 index f14250bb..00000000 --- a/.bak/app/assets/icons/frameworks/astro.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/frameworks/next.svg b/.bak/app/assets/icons/frameworks/next.svg deleted file mode 100644 index 27bd0cee..00000000 --- a/.bak/app/assets/icons/frameworks/next.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/.bak/app/assets/icons/frameworks/nuxt.svg b/.bak/app/assets/icons/frameworks/nuxt.svg deleted file mode 100644 index 01aa9fb4..00000000 --- a/.bak/app/assets/icons/frameworks/nuxt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/.bak/app/assets/icons/frameworks/react.svg b/.bak/app/assets/icons/frameworks/react.svg deleted file mode 100644 index 89707e4c..00000000 --- a/.bak/app/assets/icons/frameworks/react.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/frameworks/remix.svg b/.bak/app/assets/icons/frameworks/remix.svg deleted file mode 100644 index b30696f6..00000000 --- a/.bak/app/assets/icons/frameworks/remix.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/frameworks/svelte.svg b/.bak/app/assets/icons/frameworks/svelte.svg deleted file mode 100644 index e01f764d..00000000 --- a/.bak/app/assets/icons/frameworks/svelte.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/.bak/app/assets/icons/frameworks/vue.svg b/.bak/app/assets/icons/frameworks/vue.svg deleted file mode 100644 index ae9e325b..00000000 --- a/.bak/app/assets/icons/frameworks/vue.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/auth-pink.svg b/.bak/app/assets/icons/products/auth-pink.svg deleted file mode 100644 index 34abfa3a..00000000 --- a/.bak/app/assets/icons/products/auth-pink.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/auth-purple.svg b/.bak/app/assets/icons/products/auth-purple.svg deleted file mode 100644 index 421cb77a..00000000 --- a/.bak/app/assets/icons/products/auth-purple.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/auth-white.svg b/.bak/app/assets/icons/products/auth-white.svg deleted file mode 100644 index 5a269d31..00000000 --- a/.bak/app/assets/icons/products/auth-white.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/auth.svg b/.bak/app/assets/icons/products/auth.svg deleted file mode 100644 index 7aecbf9d..00000000 --- a/.bak/app/assets/icons/products/auth.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/automate-pink.svg b/.bak/app/assets/icons/products/automate-pink.svg deleted file mode 100644 index 3f8e2e9b..00000000 --- a/.bak/app/assets/icons/products/automate-pink.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/automate-purple.svg b/.bak/app/assets/icons/products/automate-purple.svg deleted file mode 100644 index 0371a056..00000000 --- a/.bak/app/assets/icons/products/automate-purple.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/automate-white.svg b/.bak/app/assets/icons/products/automate-white.svg deleted file mode 100644 index b1a19d24..00000000 --- a/.bak/app/assets/icons/products/automate-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/automate.svg b/.bak/app/assets/icons/products/automate.svg deleted file mode 100644 index 5490e063..00000000 --- a/.bak/app/assets/icons/products/automate.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/connect-pink.svg b/.bak/app/assets/icons/products/connect-pink.svg deleted file mode 100644 index 93597f2b..00000000 --- a/.bak/app/assets/icons/products/connect-pink.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/connect-purple.svg b/.bak/app/assets/icons/products/connect-purple.svg deleted file mode 100644 index e3fa13f6..00000000 --- a/.bak/app/assets/icons/products/connect-purple.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/connect-white.svg b/.bak/app/assets/icons/products/connect-white.svg deleted file mode 100644 index 4a3493e0..00000000 --- a/.bak/app/assets/icons/products/connect-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/connect.svg b/.bak/app/assets/icons/products/connect.svg deleted file mode 100644 index b1b4568d..00000000 --- a/.bak/app/assets/icons/products/connect.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/editor-pink.svg b/.bak/app/assets/icons/products/editor-pink.svg deleted file mode 100644 index 87480ae6..00000000 --- a/.bak/app/assets/icons/products/editor-pink.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/editor-purple.svg b/.bak/app/assets/icons/products/editor-purple.svg deleted file mode 100644 index dfe58e4a..00000000 --- a/.bak/app/assets/icons/products/editor-purple.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/editor-white.svg b/.bak/app/assets/icons/products/editor-white.svg deleted file mode 100644 index a9f55023..00000000 --- a/.bak/app/assets/icons/products/editor-white.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/editor.svg b/.bak/app/assets/icons/products/editor.svg deleted file mode 100644 index 92240082..00000000 --- a/.bak/app/assets/icons/products/editor.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/explore-pink.svg b/.bak/app/assets/icons/products/explore-pink.svg deleted file mode 100644 index 8da00e16..00000000 --- a/.bak/app/assets/icons/products/explore-pink.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/explore-purple.svg b/.bak/app/assets/icons/products/explore-purple.svg deleted file mode 100644 index 279b167c..00000000 --- a/.bak/app/assets/icons/products/explore-purple.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/explore-white.svg b/.bak/app/assets/icons/products/explore-white.svg deleted file mode 100644 index dc052456..00000000 --- a/.bak/app/assets/icons/products/explore-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/explore.svg b/.bak/app/assets/icons/products/explore.svg deleted file mode 100644 index 11f68abf..00000000 --- a/.bak/app/assets/icons/products/explore.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/files-pink.svg b/.bak/app/assets/icons/products/files-pink.svg deleted file mode 100644 index 9eee6c44..00000000 --- a/.bak/app/assets/icons/products/files-pink.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/files-purple.svg b/.bak/app/assets/icons/products/files-purple.svg deleted file mode 100644 index 8595f733..00000000 --- a/.bak/app/assets/icons/products/files-purple.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/files-white.svg b/.bak/app/assets/icons/products/files-white.svg deleted file mode 100644 index ea478132..00000000 --- a/.bak/app/assets/icons/products/files-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/files.svg b/.bak/app/assets/icons/products/files.svg deleted file mode 100644 index 2ad9d588..00000000 --- a/.bak/app/assets/icons/products/files.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/insights-pink.svg b/.bak/app/assets/icons/products/insights-pink.svg deleted file mode 100644 index 832f9f82..00000000 --- a/.bak/app/assets/icons/products/insights-pink.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/insights-purple.svg b/.bak/app/assets/icons/products/insights-purple.svg deleted file mode 100644 index 27fd3170..00000000 --- a/.bak/app/assets/icons/products/insights-purple.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/insights-white.svg b/.bak/app/assets/icons/products/insights-white.svg deleted file mode 100644 index 3ee49681..00000000 --- a/.bak/app/assets/icons/products/insights-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/insights.svg b/.bak/app/assets/icons/products/insights.svg deleted file mode 100644 index 9990c3d2..00000000 --- a/.bak/app/assets/icons/products/insights.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/marketplace-pink.svg b/.bak/app/assets/icons/products/marketplace-pink.svg deleted file mode 100644 index 88a651a8..00000000 --- a/.bak/app/assets/icons/products/marketplace-pink.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/marketplace-purple.svg b/.bak/app/assets/icons/products/marketplace-purple.svg deleted file mode 100644 index 42c8260d..00000000 --- a/.bak/app/assets/icons/products/marketplace-purple.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/marketplace-white.svg b/.bak/app/assets/icons/products/marketplace-white.svg deleted file mode 100644 index b3292bd6..00000000 --- a/.bak/app/assets/icons/products/marketplace-white.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/marketplace.svg b/.bak/app/assets/icons/products/marketplace.svg deleted file mode 100644 index 54123b6a..00000000 --- a/.bak/app/assets/icons/products/marketplace.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/icons/products/realtime-pink.svg b/.bak/app/assets/icons/products/realtime-pink.svg deleted file mode 100644 index aa1ed859..00000000 --- a/.bak/app/assets/icons/products/realtime-pink.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/realtime-purple.svg b/.bak/app/assets/icons/products/realtime-purple.svg deleted file mode 100644 index 7d824e8b..00000000 --- a/.bak/app/assets/icons/products/realtime-purple.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/realtime-white.svg b/.bak/app/assets/icons/products/realtime-white.svg deleted file mode 100644 index c5529a3f..00000000 --- a/.bak/app/assets/icons/products/realtime-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/icons/products/realtime.svg b/.bak/app/assets/icons/products/realtime.svg deleted file mode 100644 index b4e0286d..00000000 --- a/.bak/app/assets/icons/products/realtime.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/.bak/app/assets/img/cloud-cta-bg.svg b/.bak/app/assets/img/cloud-cta-bg.svg deleted file mode 100644 index d6ef7b9a..00000000 --- a/.bak/app/assets/img/cloud-cta-bg.svg +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/img/cloud-logo.svg b/.bak/app/assets/img/cloud-logo.svg deleted file mode 100644 index c019cc4a..00000000 --- a/.bak/app/assets/img/cloud-logo.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/.bak/app/assets/img/pink-cta-bg.svg b/.bak/app/assets/img/pink-cta-bg.svg deleted file mode 100644 index d7108b47..00000000 --- a/.bak/app/assets/img/pink-cta-bg.svg +++ /dev/null @@ -1,687 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/img/purple-cta-bg.svg b/.bak/app/assets/img/purple-cta-bg.svg deleted file mode 100644 index 02543600..00000000 --- a/.bak/app/assets/img/purple-cta-bg.svg +++ /dev/null @@ -1,687 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.bak/app/assets/img/tv-logo.svg b/.bak/app/assets/img/tv-logo.svg deleted file mode 100644 index b8a685af..00000000 --- a/.bak/app/assets/img/tv-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/.bak/app/components/Button.vue b/.bak/app/components/Button.vue deleted file mode 100644 index 7feed765..00000000 --- a/.bak/app/components/Button.vue +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - diff --git a/.bak/app/components/DefaultLayout.vue b/.bak/app/components/DefaultLayout.vue deleted file mode 100644 index fbffb15d..00000000 --- a/.bak/app/components/DefaultLayout.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/.bak/app/components/LayoutFooter.vue b/.bak/app/components/LayoutFooter.vue deleted file mode 100644 index ea878fbb..00000000 --- a/.bak/app/components/LayoutFooter.vue +++ /dev/null @@ -1,380 +0,0 @@ - - - - - diff --git a/.bak/app/components/NavTree.vue b/.bak/app/components/NavTree.vue deleted file mode 100644 index 4703b58f..00000000 --- a/.bak/app/components/NavTree.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - diff --git a/.bak/app/components/OgImage/Default.vue b/.bak/app/components/OgImage/Default.vue deleted file mode 100644 index 101ff9d5..00000000 --- a/.bak/app/components/OgImage/Default.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - diff --git a/.bak/app/components/articles/ArticlesCard.vue b/.bak/app/components/articles/ArticlesCard.vue deleted file mode 100644 index 666b35a3..00000000 --- a/.bak/app/components/articles/ArticlesCard.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - - - diff --git a/.bak/app/components/articles/ArticlesCategoryNav.vue b/.bak/app/components/articles/ArticlesCategoryNav.vue deleted file mode 100644 index a94bdda2..00000000 --- a/.bak/app/components/articles/ArticlesCategoryNav.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/.bak/app/components/articles/ArticlesGrid.vue b/.bak/app/components/articles/ArticlesGrid.vue deleted file mode 100644 index edeb53c1..00000000 --- a/.bak/app/components/articles/ArticlesGrid.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/.bak/app/components/articles/ArticlesLayout.vue b/.bak/app/components/articles/ArticlesLayout.vue deleted file mode 100644 index 35932b60..00000000 --- a/.bak/app/components/articles/ArticlesLayout.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - diff --git a/.bak/app/components/articles/ArticlesTagsFilter.vue b/.bak/app/components/articles/ArticlesTagsFilter.vue deleted file mode 100644 index ac5b59e1..00000000 --- a/.bak/app/components/articles/ArticlesTagsFilter.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - diff --git a/.bak/app/components/aside/AsideFeedback.vue b/.bak/app/components/aside/AsideFeedback.vue deleted file mode 100644 index 11a3d76e..00000000 --- a/.bak/app/components/aside/AsideFeedback.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/.bak/app/components/aside/AsideNav.vue b/.bak/app/components/aside/AsideNav.vue deleted file mode 100644 index b972b745..00000000 --- a/.bak/app/components/aside/AsideNav.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - diff --git a/.bak/app/components/aside/AsideNewsletter.vue b/.bak/app/components/aside/AsideNewsletter.vue deleted file mode 100644 index 9e6692a8..00000000 --- a/.bak/app/components/aside/AsideNewsletter.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/.bak/app/components/aside/AsideSlideover.vue b/.bak/app/components/aside/AsideSlideover.vue deleted file mode 100644 index ce344e76..00000000 --- a/.bak/app/components/aside/AsideSlideover.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/.bak/app/components/aside/AsideTableOfContents.vue b/.bak/app/components/aside/AsideTableOfContents.vue deleted file mode 100644 index 9d223028..00000000 --- a/.bak/app/components/aside/AsideTableOfContents.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/.bak/app/components/aside/AsideWidget.vue b/.bak/app/components/aside/AsideWidget.vue deleted file mode 100644 index bdc93666..00000000 --- a/.bak/app/components/aside/AsideWidget.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/ArticleCards.vue b/.bak/app/components/content/ArticleCards.vue deleted file mode 100644 index bc8d8846..00000000 --- a/.bak/app/components/content/ArticleCards.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/.bak/app/components/content/Badge.vue b/.bak/app/components/content/Badge.vue deleted file mode 100644 index 55f7dea9..00000000 --- a/.bak/app/components/content/Badge.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/Box.vue b/.bak/app/components/content/Box.vue deleted file mode 100644 index 89f3c173..00000000 --- a/.bak/app/components/content/Box.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/.bak/app/components/content/Callout.vue b/.bak/app/components/content/Callout.vue deleted file mode 100644 index db37dc84..00000000 --- a/.bak/app/components/content/Callout.vue +++ /dev/null @@ -1,212 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/DirectusCloud.vue b/.bak/app/components/content/DirectusCloud.vue deleted file mode 100644 index cc203b62..00000000 --- a/.bak/app/components/content/DirectusCloud.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - diff --git a/.bak/app/components/content/DirectusImage.vue b/.bak/app/components/content/DirectusImage.vue deleted file mode 100644 index 95043871..00000000 --- a/.bak/app/components/content/DirectusImage.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/.bak/app/components/content/EngineStudioBox.vue b/.bak/app/components/content/EngineStudioBox.vue deleted file mode 100644 index 38554a4c..00000000 --- a/.bak/app/components/content/EngineStudioBox.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/HeaderWithBadge.vue b/.bak/app/components/content/HeaderWithBadge.vue deleted file mode 100644 index 9137bf67..00000000 --- a/.bak/app/components/content/HeaderWithBadge.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/ListChildren.vue b/.bak/app/components/content/ListChildren.vue deleted file mode 100644 index 9a30c532..00000000 --- a/.bak/app/components/content/ListChildren.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/.bak/app/components/content/Partial.vue b/.bak/app/components/content/Partial.vue deleted file mode 100644 index e32ce9cb..00000000 --- a/.bak/app/components/content/Partial.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/ProductLink.vue b/.bak/app/components/content/ProductLink.vue deleted file mode 100644 index 1fbd1ab5..00000000 --- a/.bak/app/components/content/ProductLink.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/ProsePre.vue b/.bak/app/components/content/ProsePre.vue deleted file mode 100644 index d9fa8a3a..00000000 --- a/.bak/app/components/content/ProsePre.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - diff --git a/.bak/app/components/content/ProseTable.vue b/.bak/app/components/content/ProseTable.vue deleted file mode 100644 index aacf7ec7..00000000 --- a/.bak/app/components/content/ProseTable.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/Snippets.vue b/.bak/app/components/content/Snippets.vue deleted file mode 100644 index 1321c5db..00000000 --- a/.bak/app/components/content/Snippets.vue +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/.bak/app/components/content/Tab.vue b/.bak/app/components/content/Tab.vue deleted file mode 100644 index d5a24903..00000000 --- a/.bak/app/components/content/Tab.vue +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/.bak/app/components/content/Tabs.vue b/.bak/app/components/content/Tabs.vue deleted file mode 100644 index 44d983cd..00000000 --- a/.bak/app/components/content/Tabs.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - diff --git a/.bak/app/components/content/VideoEmbed.vue b/.bak/app/components/content/VideoEmbed.vue deleted file mode 100644 index 614239c4..00000000 --- a/.bak/app/components/content/VideoEmbed.vue +++ /dev/null @@ -1,90 +0,0 @@ - - -