From f58c1ce0834640190809f1f579641bfdc7fc08e6 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Tue, 24 Jun 2025 14:41:29 +0300 Subject: [PATCH] refactor(editor): Move frontend permissions code to `@n8n/permissions` (no-changelog) (#16656) --- packages/@n8n/permissions/src/index.ts | 2 ++ .../utilities/__tests__/get-resource-permissions.test.ts} | 7 ++++--- .../src/utilities/get-resource-permissions.ee.ts} | 4 ++-- .../frontend/editor-ui/src/components/CredentialCard.vue | 2 +- .../src/components/CredentialEdit/CredentialConfig.vue | 2 +- .../src/components/CredentialEdit/CredentialEdit.vue | 2 +- .../src/components/CredentialEdit/CredentialSharing.ee.vue | 2 +- .../CredentialEdit/__tests__/CredentialEdit.test.ts | 2 +- .../editor-ui/src/components/Folders/MoveToFolderModal.vue | 2 +- .../src/components/MainHeader/WorkflowDetails.vue | 2 +- .../editor-ui/src/components/MainSidebarSourceControl.vue | 2 +- .../editor-ui/src/components/PersonalizationModal.vue | 2 +- .../editor-ui/src/components/Projects/ProjectHeader.vue | 2 +- .../src/components/Projects/ProjectMoveResourceModal.vue | 2 +- .../Projects/ProjectMoveResourceModalCredentialsList.vue | 2 +- .../editor-ui/src/components/WorkflowActivator.vue | 2 +- .../frontend/editor-ui/src/components/WorkflowCard.vue | 2 +- .../frontend/editor-ui/src/components/WorkflowSettings.vue | 2 +- .../editor-ui/src/components/WorkflowShareModal.ee.vue | 2 +- .../components/executions/global/GlobalExecutionsList.vue | 4 ++-- .../executions/global/GlobalExecutionsListItem.vue | 2 +- .../workflow/WorkflowExecutionAnnotationPanel.ee.vue | 2 +- .../executions/workflow/WorkflowExecutionsCard.vue | 2 +- .../executions/workflow/WorkflowExecutionsPreview.vue | 2 +- .../executions/workflow/WorkflowExecutionsSidebar.vue | 2 +- .../frontend/editor-ui/src/composables/useContextMenu.ts | 2 +- .../editor-ui/src/composables/useGlobalEntityCreation.ts | 2 +- .../editor-ui/src/features/insights/insights.store.ts | 2 +- packages/frontend/editor-ui/src/routes/projects.routes.ts | 2 +- packages/frontend/editor-ui/src/stores/projects.store.ts | 2 +- packages/frontend/editor-ui/src/views/CredentialsView.vue | 2 +- packages/frontend/editor-ui/src/views/NodeView.vue | 2 +- .../frontend/editor-ui/src/views/SettingsUsageAndPlan.vue | 2 +- packages/frontend/editor-ui/src/views/VariablesView.vue | 2 +- packages/frontend/editor-ui/src/views/WorkflowHistory.vue | 2 +- packages/frontend/editor-ui/src/views/WorkflowsView.vue | 2 +- 36 files changed, 42 insertions(+), 39 deletions(-) rename packages/{frontend/editor-ui/src/permissions.test.ts => @n8n/permissions/src/utilities/__tests__/get-resource-permissions.test.ts} (92%) rename packages/{frontend/editor-ui/src/permissions.ts => @n8n/permissions/src/utilities/get-resource-permissions.ee.ts} (89%) diff --git a/packages/@n8n/permissions/src/index.ts b/packages/@n8n/permissions/src/index.ts index 38139703ac..3e65e5d635 100644 --- a/packages/@n8n/permissions/src/index.ts +++ b/packages/@n8n/permissions/src/index.ts @@ -13,4 +13,6 @@ export { combineScopes } from './utilities/combine-scopes.ee'; export { rolesWithScope } from './utilities/roles-with-scope.ee'; export { getGlobalScopes } from './utilities/get-global-scopes.ee'; export { getRoleScopes } from './utilities/get-role-scopes.ee'; +export { getResourcePermissions } from './utilities/get-resource-permissions.ee'; +export type { PermissionsRecord } from './utilities/get-resource-permissions.ee'; export * from './public-api-permissions.ee'; diff --git a/packages/frontend/editor-ui/src/permissions.test.ts b/packages/@n8n/permissions/src/utilities/__tests__/get-resource-permissions.test.ts similarity index 92% rename from packages/frontend/editor-ui/src/permissions.test.ts rename to packages/@n8n/permissions/src/utilities/__tests__/get-resource-permissions.test.ts index 82f00503a1..ce54f858ce 100644 --- a/packages/frontend/editor-ui/src/permissions.test.ts +++ b/packages/@n8n/permissions/src/utilities/__tests__/get-resource-permissions.test.ts @@ -1,6 +1,7 @@ -import type { PermissionsRecord } from '@/permissions'; -import { getResourcePermissions } from '@/permissions'; -import type { Scope } from '@n8n/permissions'; +import type { Scope } from '@/types.ee'; + +import type { PermissionsRecord } from '../get-resource-permissions.ee'; +import { getResourcePermissions } from '../get-resource-permissions.ee'; describe('permissions', () => { it('getResourcePermissions for empty scopes', () => { diff --git a/packages/frontend/editor-ui/src/permissions.ts b/packages/@n8n/permissions/src/utilities/get-resource-permissions.ee.ts similarity index 89% rename from packages/frontend/editor-ui/src/permissions.ts rename to packages/@n8n/permissions/src/utilities/get-resource-permissions.ee.ts index b26c3b51df..6c434a97a5 100644 --- a/packages/frontend/editor-ui/src/permissions.ts +++ b/packages/@n8n/permissions/src/utilities/get-resource-permissions.ee.ts @@ -1,5 +1,5 @@ -import type { Scope } from '@n8n/permissions'; -import { RESOURCES } from '@n8n/permissions'; +import { RESOURCES } from '../constants.ee'; +import type { Scope } from '../types.ee'; type ExtractScopePrefixSuffix = T extends `${infer Prefix}:${infer Suffix}` ? [Prefix, Suffix] diff --git a/packages/frontend/editor-ui/src/components/CredentialCard.vue b/packages/frontend/editor-ui/src/components/CredentialCard.vue index f23b78239e..db20f79e7a 100644 --- a/packages/frontend/editor-ui/src/components/CredentialCard.vue +++ b/packages/frontend/editor-ui/src/components/CredentialCard.vue @@ -4,7 +4,7 @@ import dateformat from 'dateformat'; import { MODAL_CONFIRM, PROJECT_MOVE_RESOURCE_MODAL } from '@/constants'; import { useMessage } from '@/composables/useMessage'; import CredentialIcon from '@/components/CredentialIcon.vue'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import { useUIStore } from '@/stores/ui.store'; import { useCredentialsStore } from '@/stores/credentials.store'; import TimeAgo from '@/components/TimeAgo.vue'; diff --git a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialConfig.vue b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialConfig.vue index 68a5de7997..96a0e34c35 100644 --- a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialConfig.vue +++ b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialConfig.vue @@ -19,7 +19,7 @@ import { EnterpriseEditionFeature, NEW_ASSISTANT_SESSION_MODAL, } from '@/constants'; -import type { PermissionsRecord } from '@/permissions'; +import type { PermissionsRecord } from '@n8n/permissions'; import { addCredentialTranslation } from '@n8n/i18n'; import { useCredentialsStore } from '@/stores/credentials.store'; import { useNDVStore } from '@/stores/ndv.store'; diff --git a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue index 012242bc61..377a117f64 100644 --- a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue +++ b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue @@ -28,7 +28,7 @@ import { useMessage } from '@/composables/useMessage'; import { useNodeHelpers } from '@/composables/useNodeHelpers'; import { useToast } from '@/composables/useToast'; import { CREDENTIAL_EDIT_MODAL_KEY, EnterpriseEditionFeature, MODAL_CONFIRM } from '@/constants'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import { useCredentialsStore } from '@/stores/credentials.store'; import { useNDVStore } from '@/stores/ndv.store'; import { useNodeTypesStore } from '@/stores/nodeTypes.store'; diff --git a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialSharing.ee.vue b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialSharing.ee.vue index ae784307e4..1898bca873 100644 --- a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialSharing.ee.vue +++ b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialSharing.ee.vue @@ -5,7 +5,7 @@ import { useI18n } from '@n8n/i18n'; import { usePageRedirectionHelper } from '@/composables/usePageRedirectionHelper'; import { EnterpriseEditionFeature } from '@/constants'; import type { ICredentialsDecryptedResponse, ICredentialsResponse } from '@/Interface'; -import type { PermissionsRecord } from '@/permissions'; +import type { PermissionsRecord } from '@n8n/permissions'; import { useProjectsStore } from '@/stores/projects.store'; import { useRolesStore } from '@/stores/roles.store'; import { useSettingsStore } from '@/stores/settings.store'; diff --git a/packages/frontend/editor-ui/src/components/CredentialEdit/__tests__/CredentialEdit.test.ts b/packages/frontend/editor-ui/src/components/CredentialEdit/__tests__/CredentialEdit.test.ts index befdde9e13..4b68d78f08 100644 --- a/packages/frontend/editor-ui/src/components/CredentialEdit/__tests__/CredentialEdit.test.ts +++ b/packages/frontend/editor-ui/src/components/CredentialEdit/__tests__/CredentialEdit.test.ts @@ -180,7 +180,7 @@ const googleBigQueryOAuth2Api: ICredentialType = { supportedNodes: ['n8n-nodes-base.googleBigQuery'], }; -vi.mock('@/permissions', () => ({ +vi.mock('@n8n/permissions', () => ({ getResourcePermissions: vi.fn(() => ({ credential: { create: true, diff --git a/packages/frontend/editor-ui/src/components/Folders/MoveToFolderModal.vue b/packages/frontend/editor-ui/src/components/Folders/MoveToFolderModal.vue index 63919c6200..75d4857446 100644 --- a/packages/frontend/editor-ui/src/components/Folders/MoveToFolderModal.vue +++ b/packages/frontend/editor-ui/src/components/Folders/MoveToFolderModal.vue @@ -18,7 +18,7 @@ import type { ICredentialsResponse, IUsedCredential, } from '@/Interface'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import MoveToFolderDropdown from './MoveToFolderDropdown.vue'; import { ResourceType, getTruncatedProjectName } from '@/utils/projects.utils'; import { useWorkflowsStore } from '@/stores/workflows.store'; diff --git a/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue b/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue index 750a154909..663871e263 100644 --- a/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue +++ b/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue @@ -36,7 +36,7 @@ import { saveAs } from 'file-saver'; import { useDocumentTitle } from '@/composables/useDocumentTitle'; import { useMessage } from '@/composables/useMessage'; import { useToast } from '@/composables/useToast'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import { createEventBus } from '@n8n/utils/event-bus'; import { nodeViewEventBus } from '@/event-bus'; import { hasPermission } from '@/utils/rbac/permissions'; diff --git a/packages/frontend/editor-ui/src/components/MainSidebarSourceControl.vue b/packages/frontend/editor-ui/src/components/MainSidebarSourceControl.vue index 19f8fa4d4e..21bd584e98 100644 --- a/packages/frontend/editor-ui/src/components/MainSidebarSourceControl.vue +++ b/packages/frontend/editor-ui/src/components/MainSidebarSourceControl.vue @@ -3,7 +3,7 @@ import { computed, ref } from 'vue'; import { createEventBus } from '@n8n/utils/event-bus'; import { useI18n } from '@n8n/i18n'; import { hasPermission } from '@/utils/rbac/permissions'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import { useToast } from '@/composables/useToast'; import { useLoadingService } from '@/composables/useLoadingService'; import { useUIStore } from '@/stores/ui.store'; diff --git a/packages/frontend/editor-ui/src/components/PersonalizationModal.vue b/packages/frontend/editor-ui/src/components/PersonalizationModal.vue index 0480f988ef..ad0bd925f0 100644 --- a/packages/frontend/editor-ui/src/components/PersonalizationModal.vue +++ b/packages/frontend/editor-ui/src/components/PersonalizationModal.vue @@ -93,7 +93,7 @@ import { useExternalHooks } from '@/composables/useExternalHooks'; import { useI18n } from '@n8n/i18n'; import { useRoute, useRouter } from 'vue-router'; import { useUIStore } from '@/stores/ui.store'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; const SURVEY_VERSION = 'v4'; diff --git a/packages/frontend/editor-ui/src/components/Projects/ProjectHeader.vue b/packages/frontend/editor-ui/src/components/Projects/ProjectHeader.vue index 48e504472a..0e774b42d3 100644 --- a/packages/frontend/editor-ui/src/components/Projects/ProjectHeader.vue +++ b/packages/frontend/editor-ui/src/components/Projects/ProjectHeader.vue @@ -9,7 +9,7 @@ import { type ProjectIcon as ProjectIconType, ProjectTypes } from '@/types/proje import { useProjectsStore } from '@/stores/projects.store'; import ProjectTabs from '@/components/Projects/ProjectTabs.vue'; import ProjectIcon from '@/components/Projects/ProjectIcon.vue'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import { VIEWS } from '@/constants'; import { useSourceControlStore } from '@/stores/sourceControl.store'; import ProjectCreateResource from '@/components/Projects/ProjectCreateResource.vue'; diff --git a/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModal.vue b/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModal.vue index d163cfd1ea..90bbd44170 100644 --- a/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModal.vue +++ b/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModal.vue @@ -6,7 +6,7 @@ import { useTelemetry } from '@/composables/useTelemetry'; import { useToast } from '@/composables/useToast'; import { VIEWS } from '@/constants'; import type { ICredentialsResponse, IUsedCredential, IWorkflowDb } from '@/Interface'; -import { getResourcePermissions } from '@/permissions'; +import { getResourcePermissions } from '@n8n/permissions'; import { useCredentialsStore } from '@/stores/credentials.store'; import { useProjectsStore } from '@/stores/projects.store'; import { useUIStore } from '@/stores/ui.store'; diff --git a/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModalCredentialsList.vue b/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModalCredentialsList.vue index 661c46f845..e895e75d3e 100644 --- a/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModalCredentialsList.vue +++ b/packages/frontend/editor-ui/src/components/Projects/ProjectMoveResourceModalCredentialsList.vue @@ -1,7 +1,7 @@