diff --git a/packages/frontend-2/components/common/tiptap/EmailMentionPopup.vue b/packages/frontend-2/components/common/tiptap/EmailMentionPopup.vue deleted file mode 100644 index cd32cf64af..0000000000 --- a/packages/frontend-2/components/common/tiptap/EmailMentionPopup.vue +++ /dev/null @@ -1,55 +0,0 @@ - - diff --git a/packages/frontend-2/components/common/tiptap/TextEditor.vue b/packages/frontend-2/components/common/tiptap/TextEditor.vue index 506933c64d..d1af117ad2 100644 --- a/packages/frontend-2/components/common/tiptap/TextEditor.vue +++ b/packages/frontend-2/components/common/tiptap/TextEditor.vue @@ -44,13 +44,9 @@ const props = defineProps<{ placeholder?: string readonly?: boolean /** - * Used to invite users to project when their emails are mentioned + * Used to scope things like user mentions to project collaborators etc. */ projectId?: string - /** - * Disable invitation CTA, e.g. if user doesn't have the required accesses - */ - disableInvitationCta?: boolean }>() const editorContentRef = ref(null as Nullable) @@ -65,8 +61,7 @@ const editor = new Editor({ editable: isEditable.value, extensions: getEditorExtensions(props.schemaOptions, { placeholder: props.placeholder, - projectId: - props.projectId && !props.disableInvitationCta ? props.projectId : undefined + projectId: props.projectId }), onUpdate: () => { const data = getData() diff --git a/packages/frontend-2/lib/common/generated/gql/gql.ts b/packages/frontend-2/lib/common/generated/gql/gql.ts index 100ce84483..9db81d89c8 100644 --- a/packages/frontend-2/lib/common/generated/gql/gql.ts +++ b/packages/frontend-2/lib/common/generated/gql/gql.ts @@ -66,7 +66,6 @@ const documents = { "\n fragment ProjectPageAutomationHeader_Project on Project {\n id\n role\n workspaceId\n ...ProjectPageModelsCardProject\n }\n": types.ProjectPageAutomationHeader_ProjectFragmentDoc, "\n fragment ProjectPageAutomationModels_Project on Project {\n id\n ...ProjectPageModelsCardProject\n }\n": types.ProjectPageAutomationModels_ProjectFragmentDoc, "\n fragment ProjectPageAutomationRuns_Automation on Automation {\n id\n name\n enabled\n isTestAutomation\n runs(limit: 10) {\n items {\n ...AutomationRunDetails\n }\n totalCount\n cursor\n }\n }\n": types.ProjectPageAutomationRuns_AutomationFragmentDoc, - "\n fragment ProjectPageAutomationsEmptyState_Query on Query {\n automateFunctions(limit: 9) {\n items {\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateAutomationCreateDialog_AutomateFunction\n }\n }\n }\n": types.ProjectPageAutomationsEmptyState_QueryFragmentDoc, "\n fragment ProjectPageAutomationsRow_Automation on Automation {\n id\n name\n enabled\n isTestAutomation\n currentRevision {\n id\n triggerDefinitions {\n ... on VersionCreatedTriggerDefinition {\n model {\n id\n name\n }\n }\n }\n }\n runs(limit: 10) {\n totalCount\n items {\n ...AutomationRunDetails\n }\n cursor\n }\n }\n": types.ProjectPageAutomationsRow_AutomationFragmentDoc, "\n fragment ProjectDiscussionsPageHeader_Project on Project {\n id\n name\n }\n": types.ProjectDiscussionsPageHeader_ProjectFragmentDoc, "\n fragment ProjectDiscussionsPageResults_Project on Project {\n id\n }\n": types.ProjectDiscussionsPageResults_ProjectFragmentDoc, @@ -176,7 +175,7 @@ const documents = { "\n query ActiveUserFunctions {\n activeUser {\n automateFunctions(limit: 2) {\n items {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n }\n }\n }\n }\n": types.ActiveUserFunctionsDocument, "\n mutation BillingCreateCheckoutSession($input: CheckoutSessionInput!) {\n workspaceMutations {\n billing {\n createCheckoutSession(input: $input) {\n url\n id\n }\n }\n }\n }\n": types.BillingCreateCheckoutSessionDocument, "\n mutation BillingUpgradePlan($input: UpgradePlanInput!) {\n workspaceMutations {\n billing {\n upgradePlan(input: $input)\n }\n }\n }\n": types.BillingUpgradePlanDocument, - "\n query MentionsUserSearch($query: String!, $emailOnly: Boolean = false) {\n userSearch(\n query: $query\n limit: 5\n cursor: null\n archived: false\n emailOnly: $emailOnly\n ) {\n items {\n id\n name\n company\n }\n }\n }\n": types.MentionsUserSearchDocument, + "\n query MentionsUserSearch($query: String!, $projectId: String) {\n users(input: { query: $query, limit: 5, cursor: null, projectId: $projectId }) {\n items {\n id\n name\n company\n }\n }\n }\n": types.MentionsUserSearchDocument, "\n query UserSearch(\n $query: String!\n $limit: Int\n $cursor: String\n $archived: Boolean\n $workspaceId: String\n ) {\n userSearch(query: $query, limit: $limit, cursor: $cursor, archived: $archived) {\n cursor\n items {\n id\n name\n bio\n company\n avatar\n verified\n role\n workspaceDomainPolicyCompliant(workspaceId: $workspaceId)\n }\n }\n }\n": types.UserSearchDocument, "\n query ServerInfoBlobSizeLimit {\n serverInfo {\n configuration {\n blobSizeLimitBytes\n }\n }\n }\n": types.ServerInfoBlobSizeLimitDocument, "\n query ServerInfoAllScopes {\n serverInfo {\n scopes {\n name\n description\n }\n }\n }\n": types.ServerInfoAllScopesDocument, @@ -257,7 +256,7 @@ const documents = { "\n query ProjectModelVersions(\n $projectId: String!\n $modelId: String!\n $versionsCursor: String\n ) {\n project(id: $projectId) {\n id\n ...ProjectModelPageVersionsPagination\n }\n }\n": types.ProjectModelVersionsDocument, "\n query ProjectModelsPage($projectId: String!) {\n project(id: $projectId) {\n id\n ...ProjectModelsPageHeader_Project\n ...ProjectModelsPageResults_Project\n }\n }\n": types.ProjectModelsPageDocument, "\n query ProjectDiscussionsPage($projectId: String!) {\n project(id: $projectId) {\n id\n ...ProjectDiscussionsPageHeader_Project\n ...ProjectDiscussionsPageResults_Project\n }\n }\n": types.ProjectDiscussionsPageDocument, - "\n query ProjectAutomationsTab($projectId: String!) {\n project(id: $projectId) {\n id\n role\n models(limit: 1) {\n items {\n id\n }\n }\n automations(filter: null, cursor: null, limit: 5) {\n totalCount\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n cursor\n }\n workspace {\n id\n slug\n }\n ...FormSelectProjects_Project\n }\n ...ProjectPageAutomationsEmptyState_Query\n }\n": types.ProjectAutomationsTabDocument, + "\n query ProjectAutomationsTab($projectId: String!) {\n project(id: $projectId) {\n id\n role\n models(limit: 1) {\n items {\n id\n }\n }\n automations(filter: null, cursor: null, limit: 5) {\n totalCount\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n cursor\n }\n workspace {\n id\n slug\n }\n ...FormSelectProjects_Project\n }\n }\n": types.ProjectAutomationsTabDocument, "\n query ProjectAutomationsTabAutomationsPagination(\n $projectId: String!\n $search: String = null\n $cursor: String = null\n ) {\n project(id: $projectId) {\n id\n automations(filter: $search, cursor: $cursor, limit: 5) {\n totalCount\n cursor\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n }\n }\n }\n": types.ProjectAutomationsTabAutomationsPaginationDocument, "\n query ProjectAutomationPage($projectId: String!, $automationId: String!) {\n project(id: $projectId) {\n id\n ...ProjectPageAutomationPage_Project\n automation(id: $automationId) {\n id\n ...ProjectPageAutomationPage_Automation\n }\n }\n }\n": types.ProjectAutomationPageDocument, "\n query ProjectAutomationPagePaginatedRuns(\n $projectId: String!\n $automationId: String!\n $cursor: String = null\n ) {\n project(id: $projectId) {\n id\n automation(id: $automationId) {\n id\n runs(cursor: $cursor, limit: 10) {\n totalCount\n cursor\n items {\n id\n ...AutomationRunDetails\n }\n }\n }\n }\n }\n": types.ProjectAutomationPagePaginatedRunsDocument, @@ -598,10 +597,6 @@ export function graphql(source: "\n fragment ProjectPageAutomationModels_Projec * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql(source: "\n fragment ProjectPageAutomationRuns_Automation on Automation {\n id\n name\n enabled\n isTestAutomation\n runs(limit: 10) {\n items {\n ...AutomationRunDetails\n }\n totalCount\n cursor\n }\n }\n"): (typeof documents)["\n fragment ProjectPageAutomationRuns_Automation on Automation {\n id\n name\n enabled\n isTestAutomation\n runs(limit: 10) {\n items {\n ...AutomationRunDetails\n }\n totalCount\n cursor\n }\n }\n"]; -/** - * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function graphql(source: "\n fragment ProjectPageAutomationsEmptyState_Query on Query {\n automateFunctions(limit: 9) {\n items {\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateAutomationCreateDialog_AutomateFunction\n }\n }\n }\n"): (typeof documents)["\n fragment ProjectPageAutomationsEmptyState_Query on Query {\n automateFunctions(limit: 9) {\n items {\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateAutomationCreateDialog_AutomateFunction\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -1041,7 +1036,7 @@ export function graphql(source: "\n mutation BillingUpgradePlan($input: Upgrade /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query MentionsUserSearch($query: String!, $emailOnly: Boolean = false) {\n userSearch(\n query: $query\n limit: 5\n cursor: null\n archived: false\n emailOnly: $emailOnly\n ) {\n items {\n id\n name\n company\n }\n }\n }\n"): (typeof documents)["\n query MentionsUserSearch($query: String!, $emailOnly: Boolean = false) {\n userSearch(\n query: $query\n limit: 5\n cursor: null\n archived: false\n emailOnly: $emailOnly\n ) {\n items {\n id\n name\n company\n }\n }\n }\n"]; +export function graphql(source: "\n query MentionsUserSearch($query: String!, $projectId: String) {\n users(input: { query: $query, limit: 5, cursor: null, projectId: $projectId }) {\n items {\n id\n name\n company\n }\n }\n }\n"): (typeof documents)["\n query MentionsUserSearch($query: String!, $projectId: String) {\n users(input: { query: $query, limit: 5, cursor: null, projectId: $projectId }) {\n items {\n id\n name\n company\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -1365,7 +1360,7 @@ export function graphql(source: "\n query ProjectDiscussionsPage($projectId: St /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query ProjectAutomationsTab($projectId: String!) {\n project(id: $projectId) {\n id\n role\n models(limit: 1) {\n items {\n id\n }\n }\n automations(filter: null, cursor: null, limit: 5) {\n totalCount\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n cursor\n }\n workspace {\n id\n slug\n }\n ...FormSelectProjects_Project\n }\n ...ProjectPageAutomationsEmptyState_Query\n }\n"): (typeof documents)["\n query ProjectAutomationsTab($projectId: String!) {\n project(id: $projectId) {\n id\n role\n models(limit: 1) {\n items {\n id\n }\n }\n automations(filter: null, cursor: null, limit: 5) {\n totalCount\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n cursor\n }\n workspace {\n id\n slug\n }\n ...FormSelectProjects_Project\n }\n ...ProjectPageAutomationsEmptyState_Query\n }\n"]; +export function graphql(source: "\n query ProjectAutomationsTab($projectId: String!) {\n project(id: $projectId) {\n id\n role\n models(limit: 1) {\n items {\n id\n }\n }\n automations(filter: null, cursor: null, limit: 5) {\n totalCount\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n cursor\n }\n workspace {\n id\n slug\n }\n ...FormSelectProjects_Project\n }\n }\n"): (typeof documents)["\n query ProjectAutomationsTab($projectId: String!) {\n project(id: $projectId) {\n id\n role\n models(limit: 1) {\n items {\n id\n }\n }\n automations(filter: null, cursor: null, limit: 5) {\n totalCount\n items {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n cursor\n }\n workspace {\n id\n slug\n }\n ...FormSelectProjects_Project\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/packages/frontend-2/lib/common/generated/gql/graphql.ts b/packages/frontend-2/lib/common/generated/gql/graphql.ts index 3de3293a24..33cc0526a9 100644 --- a/packages/frontend-2/lib/common/generated/gql/graphql.ts +++ b/packages/frontend-2/lib/common/generated/gql/graphql.ts @@ -2555,8 +2555,11 @@ export type Query = { /** * Search for users and return limited metadata about them, if you have the server:user role. * The query looks for matches in name & email + * @deprecated Use users() instead. */ userSearch: UserSearchResultCollection; + /** Look up server users */ + users: UserSearchResultCollection; /** Validates the slug, to make sure it contains only valid characters and its not taken. */ validateWorkspaceSlug: Scalars['Boolean']['output']; workspace: Workspace; @@ -2698,6 +2701,11 @@ export type QueryUserSearchArgs = { }; +export type QueryUsersArgs = { + input: UsersRetrievalInput; +}; + + export type QueryValidateWorkspaceSlugArgs = { slug: Scalars['String']['input']; }; @@ -3870,6 +3878,18 @@ export type UserWorkspacesFilter = { search?: InputMaybe; }; +export type UsersRetrievalInput = { + cursor?: InputMaybe; + /** Only find users with directly matching emails */ + emailOnly?: InputMaybe; + /** Limit defaults to 10 */ + limit?: InputMaybe; + /** Only find users that are collaborators of the specified project */ + projectId?: InputMaybe; + /** The query looks for matches in user name & email */ + query: Scalars['String']['input']; +}; + export type Version = { __typename?: 'Version'; authorUser?: Maybe; @@ -4667,8 +4687,6 @@ export type ProjectPageAutomationModels_ProjectFragment = { __typename?: 'Projec export type ProjectPageAutomationRuns_AutomationFragment = { __typename?: 'Automation', id: string, name: string, enabled: boolean, isTestAutomation: boolean, runs: { __typename?: 'AutomateRunCollection', totalCount: number, cursor?: string | null, items: Array<{ __typename?: 'AutomateRun', id: string, status: AutomateRunStatus, createdAt: string, updatedAt: string, functionRuns: Array<{ __typename?: 'AutomateFunctionRun', statusMessage?: string | null, id: string, status: AutomateRunStatus }>, trigger: { __typename?: 'VersionCreatedTrigger', version?: { __typename?: 'Version', id: string } | null, model?: { __typename?: 'Model', id: string } | null } }> } }; -export type ProjectPageAutomationsEmptyState_QueryFragment = { __typename?: 'Query', automateFunctions: { __typename?: 'AutomateFunctionCollection', items: Array<{ __typename?: 'AutomateFunction', id: string, name: string, isFeatured: boolean, description: string, logo?: string | null, repo: { __typename?: 'BasicGitRepositoryMetadata', id: string, url: string, owner: string, name: string }, releases: { __typename?: 'AutomateFunctionReleaseCollection', items: Array<{ __typename?: 'AutomateFunctionRelease', id: string, inputSchema?: {} | null }> } }> } }; - export type ProjectPageAutomationsRow_AutomationFragment = { __typename?: 'Automation', id: string, name: string, enabled: boolean, isTestAutomation: boolean, currentRevision?: { __typename?: 'AutomationRevision', id: string, triggerDefinitions: Array<{ __typename?: 'VersionCreatedTriggerDefinition', model?: { __typename?: 'Model', id: string, name: string } | null }> } | null, runs: { __typename?: 'AutomateRunCollection', totalCount: number, cursor?: string | null, items: Array<{ __typename?: 'AutomateRun', id: string, status: AutomateRunStatus, createdAt: string, updatedAt: string, functionRuns: Array<{ __typename?: 'AutomateFunctionRun', statusMessage?: string | null, id: string, status: AutomateRunStatus }>, trigger: { __typename?: 'VersionCreatedTrigger', version?: { __typename?: 'Version', id: string } | null, model?: { __typename?: 'Model', id: string } | null } }> } }; export type ProjectDiscussionsPageHeader_ProjectFragment = { __typename?: 'Project', id: string, name: string }; @@ -4997,11 +5015,11 @@ export type BillingUpgradePlanMutation = { __typename?: 'Mutation', workspaceMut export type MentionsUserSearchQueryVariables = Exact<{ query: Scalars['String']['input']; - emailOnly?: InputMaybe; + projectId?: InputMaybe; }>; -export type MentionsUserSearchQuery = { __typename?: 'Query', userSearch: { __typename?: 'UserSearchResultCollection', items: Array<{ __typename?: 'LimitedUser', id: string, name: string, company?: string | null }> } }; +export type MentionsUserSearchQuery = { __typename?: 'Query', users: { __typename?: 'UserSearchResultCollection', items: Array<{ __typename?: 'LimitedUser', id: string, name: string, company?: string | null }> } }; export type UserSearchQueryVariables = Exact<{ query: Scalars['String']['input']; @@ -5536,7 +5554,7 @@ export type ProjectAutomationsTabQueryVariables = Exact<{ }>; -export type ProjectAutomationsTabQuery = { __typename?: 'Query', project: { __typename?: 'Project', id: string, role?: string | null, name: string, models: { __typename?: 'ModelCollection', items: Array<{ __typename?: 'Model', id: string }> }, automations: { __typename?: 'AutomationCollection', totalCount: number, cursor?: string | null, items: Array<{ __typename?: 'Automation', id: string, name: string, enabled: boolean, isTestAutomation: boolean, currentRevision?: { __typename?: 'AutomationRevision', id: string, triggerDefinitions: Array<{ __typename?: 'VersionCreatedTriggerDefinition', model?: { __typename?: 'Model', id: string, name: string } | null }> } | null, runs: { __typename?: 'AutomateRunCollection', totalCount: number, cursor?: string | null, items: Array<{ __typename?: 'AutomateRun', id: string, status: AutomateRunStatus, createdAt: string, updatedAt: string, functionRuns: Array<{ __typename?: 'AutomateFunctionRun', statusMessage?: string | null, id: string, status: AutomateRunStatus }>, trigger: { __typename?: 'VersionCreatedTrigger', version?: { __typename?: 'Version', id: string } | null, model?: { __typename?: 'Model', id: string } | null } }> } }> }, workspace?: { __typename?: 'Workspace', id: string, slug: string } | null }, automateFunctions: { __typename?: 'AutomateFunctionCollection', items: Array<{ __typename?: 'AutomateFunction', id: string, name: string, isFeatured: boolean, description: string, logo?: string | null, repo: { __typename?: 'BasicGitRepositoryMetadata', id: string, url: string, owner: string, name: string }, releases: { __typename?: 'AutomateFunctionReleaseCollection', items: Array<{ __typename?: 'AutomateFunctionRelease', id: string, inputSchema?: {} | null }> } }> } }; +export type ProjectAutomationsTabQuery = { __typename?: 'Query', project: { __typename?: 'Project', id: string, role?: string | null, name: string, models: { __typename?: 'ModelCollection', items: Array<{ __typename?: 'Model', id: string }> }, automations: { __typename?: 'AutomationCollection', totalCount: number, cursor?: string | null, items: Array<{ __typename?: 'Automation', id: string, name: string, enabled: boolean, isTestAutomation: boolean, currentRevision?: { __typename?: 'AutomationRevision', id: string, triggerDefinitions: Array<{ __typename?: 'VersionCreatedTriggerDefinition', model?: { __typename?: 'Model', id: string, name: string } | null }> } | null, runs: { __typename?: 'AutomateRunCollection', totalCount: number, cursor?: string | null, items: Array<{ __typename?: 'AutomateRun', id: string, status: AutomateRunStatus, createdAt: string, updatedAt: string, functionRuns: Array<{ __typename?: 'AutomateFunctionRun', statusMessage?: string | null, id: string, status: AutomateRunStatus }>, trigger: { __typename?: 'VersionCreatedTrigger', version?: { __typename?: 'Version', id: string } | null, model?: { __typename?: 'Model', id: string } | null } }> } }> }, workspace?: { __typename?: 'Workspace', id: string, slug: string } | null } }; export type ProjectAutomationsTabAutomationsPaginationQueryVariables = Exact<{ projectId: Scalars['String']['input']; @@ -6328,7 +6346,6 @@ export const ProjectPageInviteDialog_ProjectFragmentDoc = {"kind":"Document","de export const ProjectPageModelsActions_ProjectFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"}}]}}]} as unknown as DocumentNode; export const ProjectPageModelsCardProjectFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsCardProject"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"}}]}}]} as unknown as DocumentNode; export const ProjectPageAutomationModels_ProjectFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationModels_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsCardProject"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsCardProject"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"}}]}}]} as unknown as DocumentNode; -export const ProjectPageAutomationsEmptyState_QueryFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationsEmptyState_Query"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Query"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"automateFunctions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"9"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateAutomationCreateDialog_AutomateFunction"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"repo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"owner"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"releases"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"inputSchema"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateAutomationCreateDialog_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunction"}}]}}]} as unknown as DocumentNode; export const AutomationRunDetailsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]} as unknown as DocumentNode; export const ProjectPageAutomationsRow_AutomationFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"isTestAutomation"}},{"kind":"Field","name":{"kind":"Name","value":"currentRevision"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"triggerDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTriggerDefinition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"runs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationRunDetails"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; export const ProjectDiscussionsPageHeader_ProjectFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectDiscussionsPageHeader_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; @@ -6476,7 +6493,7 @@ export const AutomateFunctionsPagePaginationDocument = {"kind":"Document","defin export const ActiveUserFunctionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ActiveUserFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"automateFunctions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"2"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"repo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"owner"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode; export const BillingCreateCheckoutSessionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"BillingCreateCheckoutSession"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CheckoutSessionInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workspaceMutations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"billing"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createCheckoutSession"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const BillingUpgradePlanDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"BillingUpgradePlan"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpgradePlanInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workspaceMutations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"billing"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"upgradePlan"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]}}]}}]} as unknown as DocumentNode; -export const MentionsUserSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MentionsUserSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"query"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"emailOnly"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}},"defaultValue":{"kind":"BooleanValue","value":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"query"},"value":{"kind":"Variable","name":{"kind":"Name","value":"query"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}},{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"NullValue"}},{"kind":"Argument","name":{"kind":"Name","value":"archived"},"value":{"kind":"BooleanValue","value":false}},{"kind":"Argument","name":{"kind":"Name","value":"emailOnly"},"value":{"kind":"Variable","name":{"kind":"Name","value":"emailOnly"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"company"}}]}}]}}]}}]} as unknown as DocumentNode; +export const MentionsUserSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MentionsUserSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"query"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"users"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"query"},"value":{"kind":"Variable","name":{"kind":"Name","value":"query"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}},{"kind":"ObjectField","name":{"kind":"Name","value":"cursor"},"value":{"kind":"NullValue"}},{"kind":"ObjectField","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"company"}}]}}]}}]}}]} as unknown as DocumentNode; export const UserSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"query"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"archived"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"query"},"value":{"kind":"Variable","name":{"kind":"Name","value":"query"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}},{"kind":"Argument","name":{"kind":"Name","value":"archived"},"value":{"kind":"Variable","name":{"kind":"Name","value":"archived"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"bio"}},{"kind":"Field","name":{"kind":"Name","value":"company"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}},{"kind":"Field","name":{"kind":"Name","value":"verified"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceDomainPolicyCompliant"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}]}]}}]}}]}}]} as unknown as DocumentNode; export const ServerInfoBlobSizeLimitDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ServerInfoBlobSizeLimit"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"serverInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configuration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"blobSizeLimitBytes"}}]}}]}}]}}]} as unknown as DocumentNode; export const ServerInfoAllScopesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ServerInfoAllScopes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"serverInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"scopes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}}]}}]}}]} as unknown as DocumentNode; @@ -6547,7 +6564,7 @@ export const ProjectModelPageDocument = {"kind":"Document","definitions":[{"kind export const ProjectModelVersionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectModelVersions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"modelId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"versionsCursor"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectModelPageVersionsPagination"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LimitedUserAvatar"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LimitedUser"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectModelPageDialogDeleteVersion"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Version"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectModelPageDialogMoveToVersion"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Version"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"TriggeredAutomationsStatusSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TriggeredAutomationsStatus"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automationRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRun"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"results"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}},{"kind":"Field","name":{"kind":"Name","value":"contextView"}},{"kind":"Field","name":{"kind":"Name","value":"function"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationsStatusOrderedRuns_AutomationRun"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogRunsRows_AutomateRun"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRun"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsStatusOrderedRuns_AutomationRun"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TriggeredAutomationsStatus"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automationRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogRunsRows_AutomateRun"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatus_TriggeredAutomationsStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TriggeredAutomationsStatus"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"TriggeredAutomationsStatusSummary"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectModelPageVersionsCardVersion"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Version"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message"}},{"kind":"Field","name":{"kind":"Name","value":"authorUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LimitedUserAvatar"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"previewUrl"}},{"kind":"Field","name":{"kind":"Name","value":"sourceApplication"}},{"kind":"Field","alias":{"kind":"Name","value":"commentThreadCount"},"name":{"kind":"Name","value":"commentThreads"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"0"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectModelPageDialogDeleteVersion"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectModelPageDialogMoveToVersion"}},{"kind":"Field","name":{"kind":"Name","value":"automationsStatus"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatus_TriggeredAutomationsStatus"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectModelPageVersionsPagination"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"model"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"modelId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"versions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"16"}},{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"Variable","name":{"kind":"Name","value":"versionsCursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectModelPageVersionsCardVersion"}}]}}]}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"}}]}}]} as unknown as DocumentNode; export const ProjectModelsPageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectModelsPage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectModelsPageHeader_Project"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectModelsPageResults_Project"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FormUsersSelectItem"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LimitedUser"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsStructureItem_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageLatestItemsModels"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","alias":{"kind":"Name","value":"modelCount"},"name":{"kind":"Name","value":"models"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"0"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsStructureItem_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectModelsPageHeader_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"sourceApps"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"models"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FormUsersSelectItem"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectModelsPageResults_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageLatestItemsModels"}}]}}]} as unknown as DocumentNode; export const ProjectDiscussionsPageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectDiscussionsPage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectDiscussionsPageHeader_Project"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectDiscussionsPageResults_Project"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectDiscussionsPageHeader_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectDiscussionsPageResults_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]} as unknown as DocumentNode; -export const ProjectAutomationsTabDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectAutomationsTab"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"models"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"automations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"NullValue"}},{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"NullValue"}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"workspace"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"FormSelectProjects_Project"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationsEmptyState_Query"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"repo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"owner"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"releases"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"inputSchema"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateAutomationCreateDialog_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunction"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"isTestAutomation"}},{"kind":"Field","name":{"kind":"Name","value":"currentRevision"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"triggerDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTriggerDefinition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"runs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationRunDetails"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FormSelectProjects_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationsEmptyState_Query"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Query"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"automateFunctions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"9"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateAutomationCreateDialog_AutomateFunction"}}]}}]}}]}}]} as unknown as DocumentNode; +export const ProjectAutomationsTabDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectAutomationsTab"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"models"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"automations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"NullValue"}},{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"NullValue"}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"workspace"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"FormSelectProjects_Project"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"isTestAutomation"}},{"kind":"Field","name":{"kind":"Name","value":"currentRevision"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"triggerDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTriggerDefinition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"runs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationRunDetails"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FormSelectProjects_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; export const ProjectAutomationsTabAutomationsPaginationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectAutomationsTabAutomationsPagination"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"NullValue"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"NullValue"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}},{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationsRow_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"isTestAutomation"}},{"kind":"Field","name":{"kind":"Name","value":"currentRevision"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"triggerDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTriggerDefinition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"runs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationRunDetails"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}}]}}]} as unknown as DocumentNode; export const ProjectAutomationPageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectAutomationPage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationPage_Project"}},{"kind":"Field","name":{"kind":"Name","value":"automation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationPage_Automation"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsPageTeamDialogManagePermissions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectsModelPageEmbed_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsCardProject"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsActions_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationHeader_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsCardProject"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PendingFileUpload"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FileUpload"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"modelName"}},{"kind":"Field","name":{"kind":"Name","value":"convertedStatus"}},{"kind":"Field","name":{"kind":"Name","value":"convertedMessage"}},{"kind":"Field","name":{"kind":"Name","value":"uploadDate"}},{"kind":"Field","name":{"kind":"Name","value":"convertedLastUpdate"}},{"kind":"Field","name":{"kind":"Name","value":"fileType"}},{"kind":"Field","name":{"kind":"Name","value":"fileName"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsCardRenameDialog"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Model"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsCardDeleteDialog"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Model"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageModelsActions"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Model"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"TriggeredAutomationsStatusSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TriggeredAutomationsStatus"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automationRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRun"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"results"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}},{"kind":"Field","name":{"kind":"Name","value":"contextView"}},{"kind":"Field","name":{"kind":"Name","value":"function"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationsStatusOrderedRuns_AutomationRun"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogRunsRows_AutomateRun"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRun"}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsStatusOrderedRuns_AutomationRun"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TriggeredAutomationsStatus"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automationRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialogRunsRows_AutomateRun"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomateRunsTriggerStatus_TriggeredAutomationsStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TriggeredAutomationsStatus"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"TriggeredAutomationsStatusSummary"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageLatestItemsModelItem"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Model"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","alias":{"kind":"Name","value":"versionCount"},"name":{"kind":"Name","value":"versions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"0"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"commentThreadCount"},"name":{"kind":"Name","value":"commentThreads"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"0"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}},{"kind":"Field","name":{"kind":"Name","value":"pendingImportedVersions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PendingFileUpload"}}]}},{"kind":"Field","name":{"kind":"Name","value":"previewUrl"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsCardRenameDialog"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsCardDeleteDialog"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageModelsActions"}},{"kind":"Field","name":{"kind":"Name","value":"automationsStatus"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomateRunsTriggerStatus_TriggeredAutomationsStatus"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationHeader_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"isTestAutomation"}},{"kind":"Field","name":{"kind":"Name","value":"currentRevision"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"triggerDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTriggerDefinition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageLatestItemsModelItem"}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommonModelSelectorModel"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Model"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationFunctionSettingsDialog_AutomationRevision"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomationRevision"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"triggerDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTriggerDefinition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommonModelSelectorModel"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"repo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"owner"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationFunctionSettingsDialog_AutomationRevisionFunction"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomationRevisionFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"inputSchema"}},{"kind":"Field","name":{"kind":"Name","value":"function"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationFunctions_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"currentRevision"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationFunctionSettingsDialog_AutomationRevision"}},{"kind":"Field","name":{"kind":"Name","value":"functions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"function"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationsFunctionsCard_AutomateFunction"}},{"kind":"Field","name":{"kind":"Name","value":"releases"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationFunctionSettingsDialog_AutomationRevisionFunction"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationRuns_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"isTestAutomation"}},{"kind":"Field","name":{"kind":"Name","value":"runs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationRunDetails"}}]}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationPage_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationHeader_Project"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectPageAutomationPage_Automation"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationHeader_Automation"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationFunctions_Automation"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectPageAutomationRuns_Automation"}}]}}]} as unknown as DocumentNode; export const ProjectAutomationPagePaginatedRunsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectAutomationPagePaginatedRuns"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"NullValue"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"automation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"runs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"cursor"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationRunDetails"}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FunctionRunStatusForSummary"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateFunctionRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationRunDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AutomateRun"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"functionRuns"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FunctionRunStatusForSummary"}},{"kind":"Field","name":{"kind":"Name","value":"statusMessage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"VersionCreatedTrigger"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"model"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; @@ -7498,6 +7515,7 @@ export type QueryFieldArgs = { user: QueryUserArgs, userPwdStrength: QueryUserPwdStrengthArgs, userSearch: QueryUserSearchArgs, + users: QueryUsersArgs, validateWorkspaceSlug: QueryValidateWorkspaceSlugArgs, workspace: QueryWorkspaceArgs, workspaceBySlug: QueryWorkspaceBySlugArgs, diff --git a/packages/frontend-2/lib/common/graphql/queries.ts b/packages/frontend-2/lib/common/graphql/queries.ts index 5886c5ef24..ebda39f14b 100644 --- a/packages/frontend-2/lib/common/graphql/queries.ts +++ b/packages/frontend-2/lib/common/graphql/queries.ts @@ -1,14 +1,8 @@ import { graphql } from '~~/lib/common/generated/gql' export const mentionsUserSearchQuery = graphql(` - query MentionsUserSearch($query: String!, $emailOnly: Boolean = false) { - userSearch( - query: $query - limit: 5 - cursor: null - archived: false - emailOnly: $emailOnly - ) { + query MentionsUserSearch($query: String!, $projectId: String) { + users(input: { query: $query, limit: 5, cursor: null, projectId: $projectId }) { items { id name diff --git a/packages/frontend-2/lib/common/helpers/tiptap.ts b/packages/frontend-2/lib/common/helpers/tiptap.ts index 24ad5016c5..0be2ccee6a 100644 --- a/packages/frontend-2/lib/common/helpers/tiptap.ts +++ b/packages/frontend-2/lib/common/helpers/tiptap.ts @@ -16,7 +16,8 @@ import { TextSelection } from '@tiptap/pm/state' import { VALID_HTTP_URL } from '~~/lib/common/helpers/validation' import type { Nullable } from '@speckle/shared' import { getMentionExtension } from '~~/lib/core/tiptap/mentionExtension' -import { EmailMention } from '~~/lib/core/tiptap/emailMentionExtension' +import { LegacyEmailMention } from '~/lib/core/tiptap/emailMentionExtension' +import { EditorInstanceStateStorage } from '~/lib/core/tiptap/editorStateExtension' declare module '@tiptap/core' { interface Commands { @@ -240,7 +241,9 @@ export function getEditorExtensions( const { multiLine = true } = schemaOptions || {} const { placeholder, projectId } = extensionOptions || {} return [ - ...(multiLine ? [Document] : [InlineDoc, EnterKeypressTrackerExtension]), + ...(multiLine + ? [Document] + : [InlineDoc, EnterKeypressTrackerExtension.configure()]), HardBreak, UtilitiesExtension, Text, @@ -257,10 +260,9 @@ export function getEditorExtensions( // Autolink off cause otherwise it's impossible to end the link autolink: false }), + EditorInstanceStateStorage.configure({ projectId, test: new Date().toISOString() }), getMentionExtension(), - EmailMention.configure({ - projectId - }), + LegacyEmailMention, History, ...(placeholder ? [Placeholder.configure({ placeholder })] : []) ] diff --git a/packages/frontend-2/lib/core/tiptap/editorStateExtension.ts b/packages/frontend-2/lib/core/tiptap/editorStateExtension.ts new file mode 100644 index 0000000000..f0581b728d --- /dev/null +++ b/packages/frontend-2/lib/core/tiptap/editorStateExtension.ts @@ -0,0 +1,38 @@ +import type { Nullable } from '@speckle/shared' +import { Extension } from '@tiptap/core' + +type EditorInstanceState = { + projectId: Nullable + test: string +} + +const initState = (): EditorInstanceState => ({ + projectId: null, + test: '' +}) + +export type EditorInstanceStateStorage = { + state: EditorInstanceState +} + +export const EditorInstanceStateStorage = Extension.create< + EditorInstanceState, + EditorInstanceStateStorage +>({ + name: 'editorInstanceState', + + addStorage() { + return { + state: initState() + } + }, + + addOptions() { + return initState() + }, + + onCreate() { + // Populate storage from options + this.storage.state = this.options + } +}) diff --git a/packages/frontend-2/lib/core/tiptap/email-mention/findSuggestionMatch.ts b/packages/frontend-2/lib/core/tiptap/email-mention/findSuggestionMatch.ts deleted file mode 100644 index 70cc87d39b..0000000000 --- a/packages/frontend-2/lib/core/tiptap/email-mention/findSuggestionMatch.ts +++ /dev/null @@ -1,77 +0,0 @@ -import type { Range } from '@tiptap/core' -import type { ResolvedPos } from '@tiptap/pm/model' - -const EMAIL_RGX = /[\w-_.+]+@[\w-_.+]+/ - -export interface Trigger { - allowSpaces: boolean - allowedPrefixes: string[] | null - startOfLine: boolean - $position: ResolvedPos -} - -export type SuggestionMatch = { - range: Range - query: string - text: string -} | null - -export function findSuggestionMatch(config: Trigger): SuggestionMatch { - const { allowSpaces, allowedPrefixes, startOfLine, $position } = config - - const emailRegexSource = EMAIL_RGX.source - const suffix = new RegExp(`\\s${emailRegexSource}$`) - const prefix = startOfLine ? '^' : '' - const regexp = allowSpaces - ? new RegExp(`${prefix}${emailRegexSource}.*?(?=\\s\\w-_.|$)`, 'gm') - : new RegExp(`${prefix}(?:^)?${emailRegexSource}[^\\s\\w-_.]*`, 'gm') - - const text = $position.nodeBefore?.isText && $position.nodeBefore.text - - if (!text) { - return null - } - - const textFrom = $position.pos - text.length - const match = Array.from(text.matchAll(regexp)).pop() - - if (!match || match.input === undefined || match.index === undefined) { - return null - } - - // JavaScript doesn't have lookbehinds. This hacks a check that first character - // is a space or the start of the line - const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index) - const matchPrefixIsAllowed = new RegExp( - `^[${allowedPrefixes?.join('') || ''}\0]?$` - ).test(matchPrefix) - - if (allowedPrefixes !== null && !matchPrefixIsAllowed) { - return null - } - - // The absolute position of the match in the document - const from = textFrom + match.index - let to = from + match[0].length - - // Edge case handling; if spaces are allowed and we're directly in between - // two triggers - if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) { - match[0] += ' ' - to += 1 - } - - // If the $position is located within the matched substring, return that range - if (from < $position.pos && to >= $position.pos) { - return { - range: { - from, - to - }, - query: match[0], - text: match[0] - } - } - - return null -} diff --git a/packages/frontend-2/lib/core/tiptap/email-mention/suggestion.ts b/packages/frontend-2/lib/core/tiptap/email-mention/suggestion.ts deleted file mode 100644 index 892d07ad3d..0000000000 --- a/packages/frontend-2/lib/core/tiptap/email-mention/suggestion.ts +++ /dev/null @@ -1,494 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type { Editor, Range } from '@tiptap/core' -import type { EditorState } from '@tiptap/pm/state' -import { Plugin, PluginKey } from '@tiptap/pm/state' -import type { EditorView } from '@tiptap/pm/view' -import { Decoration, DecorationSet } from '@tiptap/pm/view' - -import tippy from 'tippy.js' -import type { Instance, GetReferenceClientRect } from 'tippy.js' -import TiptapEmailMentionPopup from '~~/components/common/tiptap/EmailMentionPopup.vue' -import { VueRenderer } from '@tiptap/vue-3' -import { mentionsUserSearchQuery } from '~~/lib/common/graphql/queries' -import type { ApolloClient } from '@apollo/client/core' -import type { - MentionData, - SuggestionOptionsItem -} from '~~/lib/core/tiptap/mentionExtension' -import type { Optional } from '@speckle/shared' -import { inviteProjectUserMutation } from '~~/lib/projects/graphql/mutations' -import { - convertThrowIntoFetchResult, - getFirstErrorMessage -} from '~~/lib/common/helpers/graphql' -import { ToastNotificationType, useGlobalToast } from '~~/lib/common/composables/toast' -import { findSuggestionMatch } from '~~/lib/core/tiptap/email-mention/findSuggestionMatch' - -/** - * This is essentially the original Tiptap suggestion extension adapted to support the specialized - * email mention use case. A bit of a mess probably, but this low level prosemirror stuff is quite complicated - * and I just tried my best to reverse engineer it. - */ - -export type SuggestionCommandProps = { - mention: MentionData | null - email: string | null -} - -type SuggestionCommand = (props: { - editor: Editor - range: Range - props: SuggestionCommandProps - nodeName: string - projectId: string -}) => void - -type AllowFn = (props: { - editor: Editor - state: EditorState - range: Range - nodeName: string -}) => boolean - -type SuggestionRenderer = () => { - onBeforeStart?: (props: SuggestionProps) => void - onStart?: (props: SuggestionProps) => void - onBeforeUpdate?: (props: SuggestionProps) => void - onUpdate?: (props: SuggestionProps) => void - onExit?: (props: SuggestionProps) => void - onKeyDown?: (props: SuggestionKeyDownProps) => boolean -} - -export interface SuggestionOptions { - editor: Editor - nodeName: string - projectId: string -} - -export interface SuggestionProps { - editor: Editor - range: Range - query: string | null - text: string | null - items: SuggestionOptionsItem[] - command: (props: SuggestionCommandProps) => void - decorationNode: Element | null - clientRect?: (() => DOMRect | null) | null -} - -export interface SuggestionKeyDownProps { - view: EditorView - event: KeyboardEvent - range: Range -} - -type SuggestionPluginState = { - active: boolean - range: Range - query: null | string - text: null | string - composing: boolean - decorationId?: string | null -} - -const inviteEmail = async (email: string, projectId: string) => { - if (!email) return - - const { $apollo } = useNuxtApp() - const { triggerNotification } = useGlobalToast() - const apolloClient = ($apollo as { default: ApolloClient }).default - - const { data, errors } = await apolloClient - .mutate({ - mutation: inviteProjectUserMutation, - variables: { - input: { email }, - projectId - } - }) - .catch(convertThrowIntoFetchResult) - - if (data?.projectMutations.invites.batchCreate.id) { - triggerNotification({ - type: ToastNotificationType.Success, - title: 'Invite sent' - }) - } else { - const errMsg = getFirstErrorMessage(errors) - triggerNotification({ - type: ToastNotificationType.Danger, - title: 'Invitation failed', - description: errMsg - }) - } -} - -const command: SuggestionCommand = ({ editor, range, props, nodeName, projectId }) => { - // increase range.to by one when the next node is of type "text" - // and starts with a space character - const nodeAfter = editor.view.state.selection.$to.nodeAfter - const overrideSpace = nodeAfter?.text?.startsWith(' ') - - if (overrideSpace) { - range.to += 1 - } - - const chain = editor.chain().focus() - - if (props.mention) { - // Insert mention - chain - .insertContentAt(range, [ - { - type: 'mention', - attrs: props.mention - }, - { - type: 'text', - text: ' ' - } - ]) - .run() - } else if (props.email) { - // Insert email mention - chain - .insertContentAt(range, [ - { - type: nodeName, - attrs: { - email: props.email - } - }, - { - type: 'text', - text: ' ' - } - ]) - .run() - - inviteEmail(props.email, projectId) - } - - window.getSelection()?.collapseToEnd() -} - -const allow: AllowFn = (props) => { - const { state, range, nodeName } = props - - const $from = state.doc.resolve(range.from) - const type = state.schema.nodes[nodeName] - const allow = !!$from.parent.type.contentMatch.matchType(type) - return allow -} - -const getItems = async (params: { editor: Editor; query: string | null }) => { - const { query } = params - if (!query?.length) return [] - - const { $apollo } = useNuxtApp() - const apolloClient = ($apollo as { default: ApolloClient }).default - const { data } = await apolloClient.query({ - query: mentionsUserSearchQuery, - variables: { - query, - emailOnly: true - } - }) - - return data.userSearch?.items || [] -} - -const buildRenderer: SuggestionRenderer = () => { - let component: VueRenderer - let popup: Instance[] - - return { - onStart: (props) => { - component = new VueRenderer(TiptapEmailMentionPopup, { - props, - editor: props.editor - }) - - if (!props.clientRect) { - return - } - - popup = tippy('body', { - getReferenceClientRect: props.clientRect as null | GetReferenceClientRect, - appendTo: () => document.body, - content: component.element, - showOnCreate: true, - interactive: true, - trigger: 'manual', - placement: 'bottom-start', - theme: 'mention' - }) - }, - - onUpdate(props) { - component.updateProps(props) - - if (!props.clientRect) { - return - } - - popup[0].setProps({ - getReferenceClientRect: props.clientRect as null | GetReferenceClientRect - }) - }, - - onKeyDown(props) { - if (props.event.key === 'Escape') { - popup[0].hide() - return true - } - - return ( - ( - component?.ref as Optional<{ - onKeyDown: (props: SuggestionKeyDownProps) => boolean - }> - )?.onKeyDown(props) || false - ) - }, - - onExit() { - popup[0].destroy() - component.destroy() - component.element.remove() - } - } -} - -export const SuggestionPluginKey = new PluginKey( - 'emailSuggestion' -) - -export function EmailSuggestion({ editor, nodeName, projectId }: SuggestionOptions) { - let props: SuggestionProps | undefined - - const allowSpaces = false - const allowedPrefixes = [' '] - const startOfLine = false - const decorationTag = 'span' - const decorationClass = 'emailSuggestion' - const items = getItems - - const renderer = buildRenderer() - - const plugin: Plugin = new Plugin({ - key: SuggestionPluginKey, - - view() { - return { - update: async (view, prevState) => { - const prev = this.key?.getState(prevState) as SuggestionPluginState - const next = this.key?.getState(view.state) as SuggestionPluginState - - // See how the state changed - const moved = - prev.active && next.active && prev.range.from !== next.range.from - const started = !prev.active && next.active - const stopped = prev.active && !next.active - const changed = !started && !stopped && prev.query !== next.query - const handleStart = started || moved - const handleChange = changed && !moved - const handleExit = stopped || moved - - // Cancel when suggestion isn't active - if (!handleStart && !handleChange && !handleExit) { - return - } - - const state = handleExit && !handleStart ? prev : next - const decorationNode = view.dom.querySelector( - `[data-decoration-id="${state.decorationId}"]` - ) - - props = { - editor, - range: state.range, - query: state.query, - text: state.text, - items: [], - command: (commandProps) => { - command({ - editor, - range: state.range, - props: commandProps, - nodeName, - projectId - }) - }, - decorationNode, - // virtual node for popper.js or tippy.js - // this can be used for building popups without a DOM node - clientRect: decorationNode - ? () => { - // because of `items` can be asynchrounous we’ll search for the current decoration node - const { decorationId } = this.key?.getState( - editor.state - ) as SuggestionPluginState - const currentDecorationNode = view.dom.querySelector( - `[data-decoration-id="${decorationId}"]` - ) - - return currentDecorationNode?.getBoundingClientRect() || null - } - : null - } - - if (handleStart) { - renderer?.onBeforeStart?.(props) - } - - if (handleChange) { - renderer?.onBeforeUpdate?.(props) - } - - if (handleChange || handleStart) { - props.items = await items({ - editor, - query: state.query - }) - } - - if (handleExit) { - renderer?.onExit?.(props) - } - - if (handleChange) { - renderer?.onUpdate?.(props) - } - - if (handleStart) { - renderer?.onStart?.(props) - } - }, - - destroy: () => { - if (!props) { - return - } - - renderer?.onExit?.(props) - } - } - }, - - state: { - // Initialize the plugin's internal state. - init() { - const state: { - active: boolean - range: Range - query: null | string - text: null | string - composing: boolean - decorationId?: string | null - } = { - active: false, - range: { - from: 0, - to: 0 - }, - query: null, - text: null, - composing: false - } - - return state - }, - - // Apply changes to the plugin state from a view transaction. - apply(transaction, prev, oldState, state) { - const { isEditable } = editor - const { composing } = editor.view - const { selection } = transaction - const { empty, from } = selection - const next = { ...prev } - - next.composing = composing - - // We can only be suggesting if the view is editable, and: - // * there is no selection, or - // * a composition is active (see: https://github.com/ueberdosis/tiptap/issues/1449) - if (isEditable && (empty || editor.view.composing)) { - // Reset active state if we just left the previous suggestion range - if ( - (from < prev.range.from || from > prev.range.to) && - !composing && - !prev.composing - ) { - next.active = false - } - - // Try to match against where our cursor currently is - const match = findSuggestionMatch({ - allowSpaces, - allowedPrefixes, - startOfLine, - $position: selection.$from as any // some kind of dependency version mismatch bug here - }) - const decorationId = `id_${Math.floor(Math.random() * 0xffffffff)}` - - // If we found a match, update the current state to show it - if (match && allow({ editor, state, range: match.range, nodeName })) { - next.active = true - next.decorationId = prev.decorationId ? prev.decorationId : decorationId - next.range = match.range - next.query = match.query - next.text = match.text - } else { - next.active = false - } - } else { - next.active = false - } - - // Make sure to empty the range if suggestion is inactive - if (!next.active) { - next.decorationId = null - next.range = { from: 0, to: 0 } - next.query = null - next.text = null - } - - return next - } - }, - - props: { - // Call the keydown hook if suggestion is active. - handleKeyDown(view, event) { - const { active, range } = plugin.getState(view.state)! - - if (!active) { - return false - } - - return renderer?.onKeyDown?.({ view, event, range }) || false - }, - - // Setup decorator on the currently active suggestion. - decorations(state) { - const { active, range, decorationId } = plugin.getState(state)! - - if (!active) { - return null - } - - return DecorationSet.create(state.doc, [ - Decoration.inline(range.from, range.to, { - nodeName: decorationTag, - class: decorationClass, - ...(decorationId ? { 'data-decoration-id': decorationId } : {}) - }) - ]) - } - } - }) - - return plugin -} diff --git a/packages/frontend-2/lib/core/tiptap/emailMentionExtension.ts b/packages/frontend-2/lib/core/tiptap/emailMentionExtension.ts index f87cf8760f..1badc966f5 100644 --- a/packages/frontend-2/lib/core/tiptap/emailMentionExtension.ts +++ b/packages/frontend-2/lib/core/tiptap/emailMentionExtension.ts @@ -1,22 +1,13 @@ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import { Node, mergeAttributes } from '@tiptap/core' -import type { Plugin } from '@tiptap/pm/state' -import { EmailSuggestion } from '~~/lib/core/tiptap/email-mention/suggestion' - -export type EmailMentionOptions = { - projectId?: string -} - -export const EmailMention = Node.create({ +import { mergeAttributes, Node } from '@tiptap/core' + +/** + * This has since been removed, but we need it in place for backwards compatibility, otherwise + * older comments that use this node type will break and not render. + * + * So the following extension just renders those node types as plain text, and that's it + */ +export const LegacyEmailMention = Node.create({ name: 'emailMention', - - addOptions() { - return { - projectId: undefined - } - }, - group: 'inline', inline: true, selectable: false, @@ -29,7 +20,7 @@ export const EmailMention = Node.create({ parseHTML: (element) => element.getAttribute('data-email'), renderHTML: (attributes) => { if (!attributes.email) return {} - return { 'data-email': attributes.email } + return { 'data-email': attributes.email as string } } } } @@ -55,46 +46,6 @@ export const EmailMention = Node.create({ }, renderText({ node }) { - return node.attrs.email - }, - - addKeyboardShortcuts() { - return { - Backspace: () => - this.editor.commands.command(({ tr, state }) => { - let isMention = false - const { selection } = state - const { empty, anchor } = selection - - if (!empty) { - return false - } - - state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => { - if (node.type.name === this.name) { - isMention = true - tr.insertText('', pos, pos + node.nodeSize) - return false - } - }) - - return isMention - }) - } - }, - - addProseMirrorPlugins() { - const plugins: Array = [] - if (this.options.projectId) { - plugins.push( - EmailSuggestion({ - editor: this.editor, - nodeName: this.name, - projectId: this.options.projectId - }) - ) - } - - return plugins + return node.attrs.email as string } }) diff --git a/packages/frontend-2/lib/core/tiptap/mentionExtension.ts b/packages/frontend-2/lib/core/tiptap/mentionExtension.ts index 94d7c08270..cde8b50f7a 100644 --- a/packages/frontend-2/lib/core/tiptap/mentionExtension.ts +++ b/packages/frontend-2/lib/core/tiptap/mentionExtension.ts @@ -10,27 +10,32 @@ import type { Get } from 'type-fest' import tippy from 'tippy.js' import type { Instance, GetReferenceClientRect } from 'tippy.js' import type { Optional } from '@speckle/shared' +import type { EditorInstanceStateStorage } from '~/lib/core/tiptap/editorStateExtension' export type SuggestionOptionsItem = NonNullable< - Get + Get > export type MentionData = { label: string; id: string } const suggestionOptions: Omit, 'editor'> = { - items: async ({ query }) => { + async items({ query, editor }) { if (query.length < 3) return [] + const state = editor.storage.editorInstanceState as EditorInstanceStateStorage + const projectId = state.state.projectId + const { $apollo } = useNuxtApp() const apolloClient = ($apollo as { default: ApolloClient }).default const { data } = await apolloClient.query({ query: mentionsUserSearchQuery, variables: { - query + query, + projectId } }) - return data.userSearch?.items || [] + return data.users?.items || [] }, render: () => { let component: VueRenderer @@ -50,7 +55,7 @@ const suggestionOptions: Omit, 'editor' popup = tippy('body', { getReferenceClientRect: props.clientRect as null | GetReferenceClientRect, appendTo: () => document.body, - content: component.element, + content: component.element!, showOnCreate: true, interactive: true, trigger: 'manual', @@ -89,7 +94,7 @@ const suggestionOptions: Omit, 'editor' onExit() { popup[0].destroy() component.destroy() - component.element.remove() + component.element?.remove() } } } diff --git a/packages/frontend-2/lib/projects/graphql/queries.ts b/packages/frontend-2/lib/projects/graphql/queries.ts index a9214e62ee..c426134364 100644 --- a/packages/frontend-2/lib/projects/graphql/queries.ts +++ b/packages/frontend-2/lib/projects/graphql/queries.ts @@ -257,7 +257,6 @@ export const projectAutomationsTabQuery = graphql(` } ...FormSelectProjects_Project } - ...ProjectPageAutomationsEmptyState_Query } `) diff --git a/packages/frontend-2/package.json b/packages/frontend-2/package.json index ac7bbdf28b..a651463abb 100644 --- a/packages/frontend-2/package.json +++ b/packages/frontend-2/package.json @@ -36,22 +36,22 @@ "@speckle/ui-components-nuxt": "workspace:^", "@speckle/viewer": "workspace:^", "@survicate/survicate-web-surveys-wrapper": "^1.2.1", - "@tiptap/core": "2.0.0-beta.220", - "@tiptap/extension-bold": "2.0.0-beta.220", - "@tiptap/extension-document": "2.0.0-beta.220", - "@tiptap/extension-hard-break": "2.0.0-beta.220", - "@tiptap/extension-history": "2.0.0-beta.220", - "@tiptap/extension-italic": "2.0.0-beta.220", - "@tiptap/extension-link": "2.0.0-beta.220", - "@tiptap/extension-mention": "2.0.0-beta.220", - "@tiptap/extension-paragraph": "2.0.0-beta.220", - "@tiptap/extension-placeholder": "2.0.0-beta.220", - "@tiptap/extension-strike": "2.0.0-beta.220", - "@tiptap/extension-text": "2.0.0-beta.220", - "@tiptap/extension-underline": "2.0.0-beta.220", - "@tiptap/pm": "2.0.0-beta.220", - "@tiptap/suggestion": "2.0.0-beta.220", - "@tiptap/vue-3": "2.0.0-beta.220", + "@tiptap/core": "2.10.3", + "@tiptap/extension-bold": "2.10.3", + "@tiptap/extension-document": "2.10.3", + "@tiptap/extension-hard-break": "2.10.3", + "@tiptap/extension-history": "2.10.3", + "@tiptap/extension-italic": "2.10.3", + "@tiptap/extension-link": "2.10.3", + "@tiptap/extension-mention": "2.10.3", + "@tiptap/extension-paragraph": "2.10.3", + "@tiptap/extension-placeholder": "2.10.3", + "@tiptap/extension-strike": "2.10.3", + "@tiptap/extension-text": "2.10.3", + "@tiptap/extension-underline": "2.10.3", + "@tiptap/pm": "2.10.3", + "@tiptap/suggestion": "2.10.3", + "@tiptap/vue-3": "2.10.3", "@tryghost/content-api": "^1.11.21", "@vue/apollo-composable": "4.0.2", "@vue/apollo-ssr": "4.0.0", diff --git a/packages/server/assets/core/typedefs/user.graphql b/packages/server/assets/core/typedefs/user.graphql index 475ea712ce..d8911f09e1 100644 --- a/packages/server/assets/core/typedefs/user.graphql +++ b/packages/server/assets/core/typedefs/user.graphql @@ -42,7 +42,14 @@ extend type Query { cursor: String archived: Boolean = false emailOnly: Boolean = false - ): UserSearchResultCollection! + ): UserSearchResultCollection! @deprecated(reason: "Use users() instead.") + + """ + Look up server users + """ + users(input: UsersRetrievalInput!): UserSearchResultCollection! + @hasServerRole(role: SERVER_GUEST) + @hasScopes(scopes: ["users:read", "profile:read"]) """ Validate password strength @@ -53,6 +60,26 @@ extend type Query { ) } +input UsersRetrievalInput { + """ + The query looks for matches in user name & email + """ + query: String! + cursor: String + """ + Limit defaults to 10 + """ + limit: Int + """ + Only find users with directly matching emails + """ + emailOnly: Boolean + """ + Only find users that are collaborators of the specified project + """ + projectId: String +} + type PasswordStrengthCheckResults { """ Integer from 0-4 (useful for implementing a strength bar): diff --git a/packages/server/logging/logging.ts b/packages/server/logging/logging.ts index 34390451ec..3878375d27 100644 --- a/packages/server/logging/logging.ts +++ b/packages/server/logging/logging.ts @@ -31,6 +31,7 @@ export const crossServerSyncLogger = extendLoggerComponent(logger, 'cross-server export const automateLogger = extendLoggerComponent(logger, 'automate') export const subscriptionLogger = extendLoggerComponent(logger, 'subscription') export const healthCheckLogger = extendLoggerComponent(logger, 'healthcheck') +export const testLogger = extendLoggerComponent(logger, 'test') export type Logger = typeof logger export { extendLoggerComponent, Observability } diff --git a/packages/server/modules/core/domain/streams/operations.ts b/packages/server/modules/core/domain/streams/operations.ts index 499beeba31..055066a354 100644 --- a/packages/server/modules/core/domain/streams/operations.ts +++ b/packages/server/modules/core/domain/streams/operations.ts @@ -64,7 +64,10 @@ export type GetCommitStream = (params: { export type GetStreamCollaborators = ( streamId: string, - type?: StreamRoles + type?: StreamRoles, + options?: Partial<{ + limit: number + }> ) => Promise> export type GetUserDeletableStreams = (userId: string) => Promise> diff --git a/packages/server/modules/core/domain/users/operations.ts b/packages/server/modules/core/domain/users/operations.ts index 58175e99c8..8d35419d0e 100644 --- a/packages/server/modules/core/domain/users/operations.ts +++ b/packages/server/modules/core/domain/users/operations.ts @@ -8,6 +8,7 @@ import { UserUpdateInput } from '@/modules/core/graph/generated/graphql' import { ServerInviteGraphQLReturnType } from '@/modules/core/helpers/graphTypes' import { ServerAclRecord, UserWithRole } from '@/modules/core/helpers/types' import { + MaybeNullOrUndefined, Nullable, NullableKeysToOptional, Optional, @@ -173,6 +174,27 @@ export type SearchLimitedUsers = ( cursor: Nullable }> +export type LookupUsers = (filter: { + query: string + /** + * Only find user with directly matching email + */ + emailOnly?: MaybeNullOrUndefined + /** + * Only find users that are collaborators of the specified project + */ + projectId?: MaybeNullOrUndefined + /** + * Defaults to 10 + */ + limit?: MaybeNullOrUndefined + cursor?: MaybeNullOrUndefined + archived?: MaybeNullOrUndefined +}) => Promise<{ + users: User[] + cursor: Nullable +}> + type AdminUserListArgs = { cursor: string | null query: string | null diff --git a/packages/server/modules/core/graph/generated/graphql.ts b/packages/server/modules/core/graph/generated/graphql.ts index 916015137d..2012e64625 100644 --- a/packages/server/modules/core/graph/generated/graphql.ts +++ b/packages/server/modules/core/graph/generated/graphql.ts @@ -2577,8 +2577,11 @@ export type Query = { /** * Search for users and return limited metadata about them, if you have the server:user role. * The query looks for matches in name & email + * @deprecated Use users() instead. */ userSearch: UserSearchResultCollection; + /** Look up server users */ + users: UserSearchResultCollection; /** Validates the slug, to make sure it contains only valid characters and its not taken. */ validateWorkspaceSlug: Scalars['Boolean']['output']; workspace: Workspace; @@ -2720,6 +2723,11 @@ export type QueryUserSearchArgs = { }; +export type QueryUsersArgs = { + input: UsersRetrievalInput; +}; + + export type QueryValidateWorkspaceSlugArgs = { slug: Scalars['String']['input']; }; @@ -3892,6 +3900,18 @@ export type UserWorkspacesFilter = { search?: InputMaybe; }; +export type UsersRetrievalInput = { + cursor?: InputMaybe; + /** Only find users with directly matching emails */ + emailOnly?: InputMaybe; + /** Limit defaults to 10 */ + limit?: InputMaybe; + /** Only find users that are collaborators of the specified project */ + projectId?: InputMaybe; + /** The query looks for matches in user name & email */ + query: Scalars['String']['input']; +}; + export type Version = { __typename?: 'Version'; authorUser?: Maybe; @@ -4871,6 +4891,7 @@ export type ResolversTypes = { UserStreamCollection: ResolverTypeWrapper & { items?: Maybe> }>; UserUpdateInput: UserUpdateInput; UserWorkspacesFilter: UserWorkspacesFilter; + UsersRetrievalInput: UsersRetrievalInput; Version: ResolverTypeWrapper; VersionCollection: ResolverTypeWrapper & { items: Array }>; VersionCreatedTrigger: ResolverTypeWrapper; @@ -5139,6 +5160,7 @@ export type ResolversParentTypes = { UserStreamCollection: Omit & { items?: Maybe> }; UserUpdateInput: UserUpdateInput; UserWorkspacesFilter: UserWorkspacesFilter; + UsersRetrievalInput: UsersRetrievalInput; Version: VersionGraphQLReturn; VersionCollection: Omit & { items: Array }; VersionCreatedTrigger: AutomationRunTriggerGraphQLReturn; @@ -6106,6 +6128,7 @@ export type QueryResolvers, ParentType, ContextType, Partial>; userPwdStrength?: Resolver>; userSearch?: Resolver>; + users?: Resolver>; validateWorkspaceSlug?: Resolver>; workspace?: Resolver>; workspaceBySlug?: Resolver>; diff --git a/packages/server/modules/core/graph/resolvers/users.ts b/packages/server/modules/core/graph/resolvers/users.ts index 4eafc84c41..2bab5a4e9d 100644 --- a/packages/server/modules/core/graph/resolvers/users.ts +++ b/packages/server/modules/core/graph/resolvers/users.ts @@ -14,7 +14,8 @@ import { searchUsersFactory, markOnboardingCompleteFactory, legacyGetPaginatedUsersCountFactory, - legacyGetPaginatedUsersFactory + legacyGetPaginatedUsersFactory, + lookupUsersFactory } from '@/modules/core/repositories/users' import { UsersMeta } from '@/modules/core/dbSchema' import { throwForNotHavingServerRole } from '@/modules/shared/authz' @@ -68,6 +69,7 @@ const changeUserRole = changeUserRoleFactory({ updateUserServerRole: updateUserServerRoleFactory({ db }) }) const searchUsers = searchUsersFactory({ db }) +const lookupUsers = lookupUsersFactory({ db }) const markOnboardingComplete = markOnboardingCompleteFactory({ db }) const getAdminUsersListCollection = getAdminUsersListCollectionFactory({ countUsers: legacyGetPaginatedUsersCountFactory({ db }), @@ -93,7 +95,7 @@ export = { if (!id) return null return await getUser(id) }, - async user(parent, args, context) { + async user(_parent, args, context) { // User wants info about himself and he's not authenticated - just return null if (!context.auth && !args.id) return null @@ -136,14 +138,27 @@ export = { return { cursor, items: users } }, - async userPwdStrength(parent, args) { + async users(_parent, args) { + if (args.input.query.length < 3) + throw new BadRequestError('Search query must be at least 3 characters.') + + if ((args.input.limit || 0) > 100) + throw new BadRequestError( + 'Cannot return more than 100 items, please use pagination.' + ) + + const { cursor, users } = await lookupUsers(args.input) + return { cursor, items: users } + }, + + async userPwdStrength(_parent, args) { const res = zxcvbn(args.pwd) return { score: res.score, feedback: res.feedback } } }, User: { - async email(parent, args, context) { + async email(parent, _args, context) { // NOTE: we're redacting the field (returning null) rather than throwing a full error which would invalidate the request. if (context.userId === parent.id) { try { diff --git a/packages/server/modules/core/repositories/streams.ts b/packages/server/modules/core/repositories/streams.ts index 59dde302b7..a2cbf98e68 100644 --- a/packages/server/modules/core/repositories/streams.ts +++ b/packages/server/modules/core/repositories/streams.ts @@ -602,7 +602,9 @@ export const getDiscoverableStreamsPageFactory = */ export const getStreamCollaboratorsFactory = (deps: { db: Knex }): GetStreamCollaborators => - async (streamId: string, type?: StreamRoles) => { + async (streamId: string, type?: StreamRoles, options?) => { + const { limit } = options || {} + const q = tables .streamAcl(deps.db) .select>([ @@ -619,6 +621,10 @@ export const getStreamCollaboratorsFactory = q.andWhere(StreamAcl.col.role, type) } + if (limit) { + q.limit(limit) + } + const items = (await q).map((i) => ({ ...removePrivateFields(i), streamRole: i.streamRole, diff --git a/packages/server/modules/core/repositories/users.ts b/packages/server/modules/core/repositories/users.ts index 104814293d..abf8c4af16 100644 --- a/packages/server/modules/core/repositories/users.ts +++ b/packages/server/modules/core/repositories/users.ts @@ -1,4 +1,4 @@ -import { ServerAcl, UserEmails, Users, knex } from '@/modules/core/dbSchema' +import { ServerAcl, StreamAcl, UserEmails, Users, knex } from '@/modules/core/dbSchema' import { ServerAclRecord, UserRecord, UserWithRole } from '@/modules/core/helpers/types' import { Nullable } from '@/modules/shared/helpers/typeHelper' import { clamp, isArray, omit } from 'lodash' @@ -25,6 +25,7 @@ import { LegacyGetUser, LegacyGetUserByEmail, ListPaginatedUsersPage, + LookupUsers, MarkOnboardingComplete, MarkUserAsVerified, SearchLimitedUsers, @@ -33,7 +34,7 @@ import { UpdateUser, UpdateUserServerRole } from '@/modules/core/domain/users/operations' -import { LIMITED_USER_FIELDS } from '@/modules/core/helpers/userHelper' +import { removePrivateFields } from '@/modules/core/helpers/userHelper' export type { UserWithOptionalRole, GetUserParams } const tables = { @@ -449,39 +450,84 @@ export const getUserRoleFactory = } /** - * User search available for normal server users. It's more limited because of the lower access level. + * Used for (Limited)User search. No need to convert users to Limited here, because non-limited fields + * cannot be leaked out from the GQL API. */ -export const searchUsersFactory = - (deps: { db: Knex }): SearchLimitedUsers => - async (searchQuery, limit, cursor, archived = false, emailOnly = false) => { - const prefixedLimitedUserFields = LIMITED_USER_FIELDS.map( - (field) => `users.${field}` - ) +export const lookupUsersFactory = + (deps: { db: Knex }): LookupUsers => + async (filter) => { + const { + query: searchQuery, + limit = 10, + cursor, + archived = false, + emailOnly = false, + projectId + } = filter + const query = tables .users(deps.db) - .join('server_acl', 'users.id', 'server_acl.userId') + .join(ServerAcl.name, Users.col.id, ServerAcl.col.userId) .leftJoin(UserEmails.name, UserEmails.col.userId, Users.col.id) .columns([ - ...Object.values(omit(Users.col, ['email', 'verified'])).filter((col) => - prefixedLimitedUserFields.includes(col) + ...Object.values( + omit(Users.col, [ + Users.col.email, + Users.col.verified, + Users.col.passwordDigest + ]) ), - knex.raw(`(array_agg("user_emails"."verified"))[1] as verified`) + knex.raw(`(array_agg(??))[1] as "verified"`, [UserEmails.col.verified]), + knex.raw(`(array_agg(??))[1] as "email"`, [UserEmails.col.email]) ]) .groupBy(Users.col.id) .where((queryBuilder) => { queryBuilder.where({ [UserEmails.col.email]: searchQuery }) //match full email or partial name - if (!emailOnly) queryBuilder.orWhere('name', 'ILIKE', `%${searchQuery}%`) - if (!archived) queryBuilder.andWhere('role', '!=', Roles.Server.ArchivedUser) + if (!emailOnly) + queryBuilder.orWhere(Users.col.name, 'ILIKE', `%${searchQuery}%`) + if (!archived) + queryBuilder.andWhere(ServerAcl.col.role, '!=', Roles.Server.ArchivedUser) }) - if (cursor) query.andWhere('users.createdAt', '<', cursor) + if (projectId) { + query + .innerJoin(StreamAcl.name, StreamAcl.col.userId, Users.col.id) + .andWhere(StreamAcl.col.resourceId, projectId) + } + + if (cursor) query.andWhere(Users.col.createdAt, '<', cursor) + + const finalLimit = clamp(limit || 10, 1, 100) + query.orderBy(Users.col.createdAt, 'desc').limit(finalLimit) + const rows = (await query) as UserRecord[] + const users = rows.map((u) => sanitizeUserRecord(u)) // pw shouldnt be there, but just making sure + + return { + users, + cursor: users.length > 0 ? users[users.length - 1].createdAt.toISOString() : null + } + } + +/** + * User search available for normal server users. It's more limited because of the lower access level. + * @deprecated Use lookupUsers instead + */ +export const searchUsersFactory = + (deps: { db: Knex }): SearchLimitedUsers => + async (searchQuery, limit, cursor, archived = false, emailOnly = false) => { + const lookupUsers = lookupUsersFactory(deps) const defaultLimit = 25 - query.orderBy('users.createdAt', 'desc').limit(limit || defaultLimit) + const res = await lookupUsers({ + query: searchQuery, + limit: limit || defaultLimit, + cursor, + archived, + emailOnly + }) - const rows = await query return { - users: rows, - cursor: rows.length > 0 ? rows[rows.length - 1].createdAt.toISOString() : null + users: res.users.map(removePrivateFields), + cursor: res.cursor } } diff --git a/packages/server/modules/core/tests/helpers/graphql.ts b/packages/server/modules/core/tests/helpers/graphql.ts index d5597f8b09..5043845c0b 100644 --- a/packages/server/modules/core/tests/helpers/graphql.ts +++ b/packages/server/modules/core/tests/helpers/graphql.ts @@ -118,3 +118,15 @@ export const onBranchDeletedSubscription = gql` branchDeleted(streamId: $streamId) } ` + +export const usersRetrievalQuery = gql` + query UsersRetrieval($input: UsersRetrievalInput!) { + users(input: $input) { + cursor + items { + id + name + } + } + } +` diff --git a/packages/server/modules/core/tests/integration/subs.graph.spec.ts b/packages/server/modules/core/tests/integration/subs.graph.spec.ts index fa82aa354f..854abbc147 100644 --- a/packages/server/modules/core/tests/integration/subs.graph.spec.ts +++ b/packages/server/modules/core/tests/integration/subs.graph.spec.ts @@ -106,7 +106,7 @@ import { BasicTestCommit, createTestCommits } from '@/test/speckle-helpers/commi import { TestError } from '@/test/speckle-helpers/error' import { isMultiRegionTestMode, - waitForRegionUser + waitForRegionUsers } from '@/test/speckle-helpers/regions' import { BasicTestStream, createTestStreams } from '@/test/speckle-helpers/streamHelper' import { faker } from '@faker-js/faker' @@ -297,12 +297,7 @@ describe('Core GraphQL Subscriptions (New)', () => { }) ]) - if (isMultiRegion) { - await Promise.all([ - waitForRegionUser({ userId: me.id }), - waitForRegionUser({ userId: otherGuy.id }) - ]) - } + await waitForRegionUsers([me, otherGuy]) }) describe('Project Subs', () => { diff --git a/packages/server/modules/core/tests/integration/users.graph.spec.ts b/packages/server/modules/core/tests/integration/users.graph.spec.ts new file mode 100644 index 0000000000..32cc784cc1 --- /dev/null +++ b/packages/server/modules/core/tests/integration/users.graph.spec.ts @@ -0,0 +1,306 @@ +import { getFeatureFlags } from '@/modules/shared/helpers/envHelper' +import { + assignToWorkspaces, + BasicTestWorkspace, + createTestWorkspace +} from '@/modules/workspaces/tests/helpers/creation' +import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper' +import { + UsersRetrievalDocument, + UsersRetrievalInput +} from '@/test/graphql/generated/graphql' +import { + ExecuteOperationOptions, + testApolloServer, + TestApolloServer +} from '@/test/graphqlHelper' +import { beforeEachContext, getMainTestRegionKeyIfMultiRegion } from '@/test/hooks' +import { waitForRegionUsers } from '@/test/speckle-helpers/regions' +import { + addAllToStream, + BasicTestStream, + createTestStream +} from '@/test/speckle-helpers/streamHelper' +import { Roles } from '@speckle/shared' +import { expect } from 'chai' + +const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags() + +describe('Users @graphql', () => { + let me: BasicTestUser = { + name: 'Itsame mario!', + email: 'itsame@hehehe.com', + id: '' + } + let apollo: TestApolloServer + + before(async () => { + await beforeEachContext() + me = await createTestUser() + apollo = await testApolloServer({ authUserId: me.id }) + await waitForRegionUsers([me]) + }) + + describe('search', () => { + const RANDOMIZED_USER_COUNT = 20 + const BASIC_COLLABORATOR_PROJECT_USER_COUNT = Math.floor(RANDOMIZED_USER_COUNT / 2) + const WORKSPACE_COLLABORATOR_USER_COUNT = + RANDOMIZED_USER_COUNT - BASIC_COLLABORATOR_PROJECT_USER_COUNT + const WORKSPACE_GUEST_USER_COUNT = FF_WORKSPACES_MODULE_ENABLED + ? Math.floor(WORKSPACE_COLLABORATOR_USER_COUNT / 3) + : 0 + + const firstSpecificUser: BasicTestUser = { + name: 'first specific user', + email: 'lookatmyepicemail@email.com', + id: '' + } + const secondSpecificUser: BasicTestUser = { + name: 'second specific user', + email: 'alsolookatmyepicemail@email.com', + id: '' + } + let randomizedUsers: BasicTestUser[] + + const myWorkspace: BasicTestWorkspace = { + name: 'My Workspace #1', + ownerId: '', + id: '', + slug: '' + } + const myWorkspaceCollaboratorProject: BasicTestStream = { + name: 'My Workspace Collaborator Project #1', + ownerId: '', + id: '', + isPublic: true + } + + const myBasicCollaboratorProject: BasicTestStream = { + name: 'My Basic Collaborator Project #1', + ownerId: '', + id: '', + isPublic: true + } + + const getBasicRandomizedUsers = () => + randomizedUsers.filter((u) => u.name.includes('Basic')) + const getWorkspaceRandomizedUsers = () => + randomizedUsers.filter((u) => u.name.includes('Workspace')) + const getWorkspaceNonGuestRandomizedUsers = () => + getWorkspaceRandomizedUsers().filter((u) => !u.name.includes('Guest')) + + const search = (input: UsersRetrievalInput, options?: ExecuteOperationOptions) => + apollo.execute(UsersRetrievalDocument, { input }, options) + + before(async () => { + await Promise.all([ + createTestStream(myBasicCollaboratorProject, me), + createTestWorkspace(myWorkspace, me, { + regionKey: getMainTestRegionKeyIfMultiRegion() + }).then(() => (myWorkspaceCollaboratorProject.workspaceId = myWorkspace.id)) + ]) + await createTestStream(myWorkspaceCollaboratorProject, me) + + // Seed in users + let remainingBasicProjectCollaborators = BASIC_COLLABORATOR_PROJECT_USER_COUNT + let remainingWorkspaceGuests = WORKSPACE_GUEST_USER_COUNT + + randomizedUsers = await createTestUsers({ + count: RANDOMIZED_USER_COUNT, + mapper: ({ user, idx }) => { + const isBasicProjectCollaborator = remainingBasicProjectCollaborators-- > 0 + const isWorkspaceGuest = !isBasicProjectCollaborator + ? remainingWorkspaceGuests-- > 0 + : false + + return { + ...user, + name: `Randomized ${ + isBasicProjectCollaborator + ? 'Basic' + : 'Workspace ' + (isWorkspaceGuest ? 'Guest' : 'Member') + } User #${idx + 1}` + } + }, + serial: true + }) + + // Seed in specific users + await createTestUsers({ + users: [firstSpecificUser, secondSpecificUser], + serial: true + }) + + // Assign to projects & workspaces + const basicProjectCollaborators = [ + ...randomizedUsers.slice(0, BASIC_COLLABORATOR_PROJECT_USER_COUNT), + firstSpecificUser + ] + await addAllToStream(myBasicCollaboratorProject, basicProjectCollaborators, { + owner: me + }) + + const workspaceCollaborators = [ + ...randomizedUsers.slice(BASIC_COLLABORATOR_PROJECT_USER_COUNT).map((u) => { + const isGuest = u.name.includes('Guest') + const role = isGuest ? Roles.Workspace.Guest : Roles.Workspace.Member + + return { user: u, role } + }), + { user: secondSpecificUser, role: Roles.Workspace.Member } + ] + + // Assign to workspaces (or attach to other project) + if (FF_WORKSPACES_MODULE_ENABLED) { + await assignToWorkspaces( + workspaceCollaborators.map(({ user, role }) => [myWorkspace, user, role]) + ) + } else { + await addAllToStream( + myWorkspaceCollaboratorProject, + workspaceCollaborators.map(({ user }) => user), + { + owner: me + } + ) + } + }) + + it('works with basic query', async () => { + const res1 = await search( + { + query: 'first' + }, + { assertNoErrors: true } + ) + + expect(res1.data?.users.items || []).to.have.lengthOf(1) + expect(res1.data?.users.items[0]?.id).to.equal(firstSpecificUser.id) + + const res2 = await search( + { + query: 'second' + }, + { assertNoErrors: true } + ) + expect(res2.data?.users.items || []).to.have.lengthOf(1) + expect(res2.data?.users.items[0]?.id).to.equal(secondSpecificUser.id) + + const res3 = await search( + { + query: 'specific user' + }, + { assertNoErrors: true } + ) + expect(res3.data?.users.items || []).to.have.lengthOf(2) + expect((res3.data?.users.items || []).map((u) => u.id)).to.have.members([ + firstSpecificUser.id, + secondSpecificUser.id + ]) + }) + + it('doesnt work with less than 3 characters', async () => { + const res = await search({ + query: 'fi' + }) + expect(res).to.haveGraphQLErrors('Search query must be at least 3 characters') + }) + + it('doesnt work with more than 100 items', async () => { + const res = await search({ + query: 'user', + limit: 101 + }) + expect(res).to.haveGraphQLErrors( + 'Cannot return more than 100 items, please use pagination' + ) + }) + + it('works with projectId set', async () => { + const res = await search( + { + query: 'user', + projectId: myBasicCollaboratorProject.id, + limit: 100 + }, + { assertNoErrors: true } + ) + + expect(res.data?.users.items || []).to.have.lengthOf( + BASIC_COLLABORATOR_PROJECT_USER_COUNT + 1 // +1 for the firstSpecificUser + ) + expect((res.data?.users.items || []).map((u) => u.id)).to.have.members([ + ...getBasicRandomizedUsers().map((u) => u.id), + firstSpecificUser.id + ]) + }) + + it('works with a projectId from a workspace', async () => { + const res = await search( + { + query: 'user', + projectId: myWorkspaceCollaboratorProject.id, + limit: 100 + }, + { assertNoErrors: true } + ) + + expect(res.data?.users.items || []).to.have.lengthOf( + WORKSPACE_COLLABORATOR_USER_COUNT - WORKSPACE_GUEST_USER_COUNT + 1 // +1 for the secondSpecificUser + ) + expect((res.data?.users.items || []).map((u) => u.id)).to.have.members([ + ...getWorkspaceNonGuestRandomizedUsers().map((u) => u.id), + secondSpecificUser.id + ]) + }) + + it('works with pagination', async () => { + const totalUserCount = RANDOMIZED_USER_COUNT + 2 // +2 for the specific users + const firstLimit = Math.floor(totalUserCount / 2) + const res1 = await search( + { + query: 'user', + limit: firstLimit + }, + { assertNoErrors: true } + ) + + const firstCursor = res1.data?.users.cursor + const firstBatch = res1.data?.users.items || [] + expect(firstBatch).to.have.lengthOf(firstLimit) + expect(firstCursor).to.be.ok + + const secondLimit = totalUserCount - firstLimit + const res2 = await search( + { + query: 'user', + limit: secondLimit, + cursor: firstCursor + }, + { assertNoErrors: true } + ) + + const secondCursor = res2.data?.users.cursor + const secondBatch = res2.data?.users.items || [] + expect(secondBatch).to.have.lengthOf(secondLimit) + expect(secondCursor).to.be.ok + expect([...firstBatch, ...secondBatch].map((u) => u.id)).to.have.members([ + ...randomizedUsers.map((u) => u.id), + firstSpecificUser.id, + secondSpecificUser.id + ]) + + const res3 = await search( + { + query: 'user', + limit: 100, + cursor: secondCursor + }, + { assertNoErrors: true } + ) + + expect(res3.data?.users.items || []).to.have.lengthOf(0) + expect(res3.data?.users.cursor).to.be.not.ok + }) + }) +}) diff --git a/packages/server/modules/cross-server-sync/graph/generated/graphql.ts b/packages/server/modules/cross-server-sync/graph/generated/graphql.ts index ee9cce8705..34bc3acd8c 100644 --- a/packages/server/modules/cross-server-sync/graph/generated/graphql.ts +++ b/packages/server/modules/cross-server-sync/graph/generated/graphql.ts @@ -2558,8 +2558,11 @@ export type Query = { /** * Search for users and return limited metadata about them, if you have the server:user role. * The query looks for matches in name & email + * @deprecated Use users() instead. */ userSearch: UserSearchResultCollection; + /** Look up server users */ + users: UserSearchResultCollection; /** Validates the slug, to make sure it contains only valid characters and its not taken. */ validateWorkspaceSlug: Scalars['Boolean']['output']; workspace: Workspace; @@ -2701,6 +2704,11 @@ export type QueryUserSearchArgs = { }; +export type QueryUsersArgs = { + input: UsersRetrievalInput; +}; + + export type QueryValidateWorkspaceSlugArgs = { slug: Scalars['String']['input']; }; @@ -3873,6 +3881,18 @@ export type UserWorkspacesFilter = { search?: InputMaybe; }; +export type UsersRetrievalInput = { + cursor?: InputMaybe; + /** Only find users with directly matching emails */ + emailOnly?: InputMaybe; + /** Limit defaults to 10 */ + limit?: InputMaybe; + /** Only find users that are collaborators of the specified project */ + projectId?: InputMaybe; + /** The query looks for matches in user name & email */ + query: Scalars['String']['input']; +}; + export type Version = { __typename?: 'Version'; authorUser?: Maybe; diff --git a/packages/server/modules/multiregion/dbSelector.ts b/packages/server/modules/multiregion/dbSelector.ts index 67c325077a..89a3a8407f 100644 --- a/packages/server/modules/multiregion/dbSelector.ts +++ b/packages/server/modules/multiregion/dbSelector.ts @@ -23,7 +23,7 @@ import { getMainRegionConfig } from '@/modules/multiregion/regionConfig' import { ensureError, MaybeNullOrUndefined } from '@speckle/shared' -import { isTestEnv } from '@/modules/shared/helpers/envHelper' +import { isDevOrTestEnv, isTestEnv } from '@/modules/shared/helpers/envHelper' import { migrateDbToLatest } from '@/db/migrations' let getter: GetProjectDb | undefined = undefined @@ -119,7 +119,8 @@ export const initializeRegisteredRegionClients = async (): Promise initializeRegion({ regionKey })) ) diff --git a/packages/server/modules/notifications/services/handlers/mentionedInComment.ts b/packages/server/modules/notifications/services/handlers/mentionedInComment.ts index eee354344a..8aa7ce7e00 100644 --- a/packages/server/modules/notifications/services/handlers/mentionedInComment.ts +++ b/packages/server/modules/notifications/services/handlers/mentionedInComment.ts @@ -23,7 +23,7 @@ import { NotificationHandler, MentionedInCommentMessage } from '@/modules/notifications/helpers/types' -import { getBaseUrl } from '@/modules/shared/helpers/envHelper' +import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper' import { MaybeFalsy, Nullable } from '@/modules/shared/helpers/typeHelper' import { Knex } from 'knex' @@ -151,7 +151,7 @@ function buildEmailTemplateParams( objectId, commitId }) - const url = new URL(commentRoute, getBaseUrl()).toString() + const url = new URL(commentRoute, getFrontendOrigin()).toString() return { mjml: buildEmailTemplateMjml(state), diff --git a/packages/server/modules/shared/helpers/envHelper.ts b/packages/server/modules/shared/helpers/envHelper.ts index 05a52ed448..c279a695af 100644 --- a/packages/server/modules/shared/helpers/envHelper.ts +++ b/packages/server/modules/shared/helpers/envHelper.ts @@ -167,15 +167,6 @@ export function getMailchimpNewsletterIds() { return { listId: process.env.MAILCHIMP_NEWSLETTER_LIST_ID } } -/** - * Get app base url / canonical url / origin - * TODO: Go over all getBaseUrl() usages and move them to getXOrigin() instead - * @deprecated Since the new FE both apps (Server & FE) have different base urls, so use `getFrontendOrigin()` or `getServerOrigin()` instead - */ -export function getBaseUrl() { - return getServerOrigin() -} - /** * Whether notification job consumption & handling should be disabled */ @@ -241,7 +232,7 @@ export function getPort() { * Check whether we're running an SSL server */ export function isSSLServer() { - return /^https:\/\//.test(getBaseUrl()) + return /^https:\/\//.test(getServerOrigin()) } function parseUrlVar(value: string, name: string) { diff --git a/packages/server/modules/workspaces/tests/helpers/creation.ts b/packages/server/modules/workspaces/tests/helpers/creation.ts index 5fdee90a57..368011dd5a 100644 --- a/packages/server/modules/workspaces/tests/helpers/creation.ts +++ b/packages/server/modules/workspaces/tests/helpers/creation.ts @@ -234,6 +234,10 @@ export const assignToWorkspace = async ( user: BasicTestUser, role?: WorkspaceRoles ) => { + if (!FF_WORKSPACES_MODULE_ENABLED) { + return // Just skip + } + const updateWorkspaceRole = updateWorkspaceRoleFactory({ getWorkspaceWithDomains: getWorkspaceWithDomainsFactory({ db }), findVerifiedEmailsByUserId: findVerifiedEmailsByUserIdFactory({ db }), @@ -253,6 +257,10 @@ export const unassignFromWorkspace = async ( workspace: BasicTestWorkspace, user: BasicTestUser ) => { + if (!FF_WORKSPACES_MODULE_ENABLED) { + return // Just skip + } + const deleteWorkspaceRole = deleteWorkspaceRoleFactory({ getWorkspaceRoles: getWorkspaceRolesFactory({ db }), deleteWorkspaceRole: dbDeleteWorkspaceRoleFactory({ db }), @@ -274,7 +282,11 @@ export const unassignFromWorkspaces = async ( export const assignToWorkspaces = async ( pairs: [BasicTestWorkspace, BasicTestUser, MaybeNullOrUndefined][] ) => { - await Promise.all(pairs.map((p) => assignToWorkspace(p[0], p[1], p[2] || undefined))) + // Serial execution is somehow faster with bigger batch sizes, assignToWorkspace + // may be quite heavy on the DB + for (const [workspace, user, role] of pairs) { + await assignToWorkspace(workspace, user, role || undefined) + } } export const createTestWorkspaces = async ( diff --git a/packages/server/modules/workspaces/tests/integration/subs.graph.spec.ts b/packages/server/modules/workspaces/tests/integration/subs.graph.spec.ts index 36eeaaceea..f3beae25ed 100644 --- a/packages/server/modules/workspaces/tests/integration/subs.graph.spec.ts +++ b/packages/server/modules/workspaces/tests/integration/subs.graph.spec.ts @@ -41,7 +41,7 @@ import { captureCreatedInvite } from '@/test/speckle-helpers/inviteHelper' import { getMainTestRegionKey, isMultiRegionTestMode, - waitForRegionUser + waitForRegionUsers } from '@/test/speckle-helpers/regions' import { faker } from '@faker-js/faker' import { expect } from 'chai' @@ -102,13 +102,7 @@ describe('Workspace GQL Subscriptions', () => { } before(async () => { - if (isMultiRegion) { - await Promise.all([ - waitForRegionUser({ userId: me.id }), - waitForRegionUser({ userId: otherGuy.id }) - ]) - } - + await waitForRegionUsers([me, otherGuy]) await createTestWorkspace(myMainWorkspace, me, { regionKey: isMultiRegion ? getMainTestRegionKey() : undefined }) diff --git a/packages/server/test/authHelper.ts b/packages/server/test/authHelper.ts index 3725630678..eb5994123b 100644 --- a/packages/server/test/authHelper.ts +++ b/packages/server/test/authHelper.ts @@ -33,8 +33,8 @@ import { } from '@/modules/serverinvites/repositories/serverInvites' import { finalizeInvitedServerRegistrationFactory } from '@/modules/serverinvites/services/processing' import { faker } from '@faker-js/faker' -import { ServerScope } from '@speckle/shared' -import { kebabCase, omit } from 'lodash' +import { ServerScope, wait } from '@speckle/shared' +import { isArray, isNumber, kebabCase, omit, times } from 'lodash' const getServerInfo = getServerInfoFactory({ db }) const findEmail = findEmailFactory({ db }) @@ -123,11 +123,58 @@ export async function createTestUser(userObj?: Partial) { return baseUser } +export type CreateTestUsersParams = { + /** + * Number of users to create. Either this or `users` must be set + */ + count?: number + /** + * The users to create. Either this or `count` must be set + */ + users?: BasicTestUser[] + /** + * Optional mapper to run on each user obj before insertion + */ + mapper?: (params: { user: BasicTestUser; idx: number }) => BasicTestUser + /** + * For pagination purposes it might be imperative that users are serially created to ensure different timestamps + * and avoid flaky pagination bugs + */ + serial?: boolean +} + /** * Create multiple users for tests and update them to include their ID */ -export async function createTestUsers(userObjs: BasicTestUser[]) { - await Promise.all(userObjs.map((o) => createTestUser(o))) +export async function createTestUsers( + usersOrParams: BasicTestUser[] | CreateTestUsersParams +) { + const params: CreateTestUsersParams = isArray(usersOrParams) + ? { users: usersOrParams } + : usersOrParams + if (!params.users && !isNumber(params.count)) { + throw new Error('Either count or users must be set') + } + + let finalUsers = params.users + ? params.users + : times(params.count || 1, () => initTestUser({})) + + const mapper = params.mapper + if (mapper) { + finalUsers = finalUsers.map((user, idx) => mapper({ user, idx })) + } + + if (params.serial) { + const results: BasicTestUser[] = [] + for (const finalUser of finalUsers) { + results.push(await createTestUser(finalUser)) + await wait(1) + } + return results + } else { + return await Promise.all(finalUsers.map((o) => createTestUser(o))) + } } /** diff --git a/packages/server/test/graphql/generated/graphql.ts b/packages/server/test/graphql/generated/graphql.ts index 2aea701028..ba4e0fe528 100644 --- a/packages/server/test/graphql/generated/graphql.ts +++ b/packages/server/test/graphql/generated/graphql.ts @@ -2559,8 +2559,11 @@ export type Query = { /** * Search for users and return limited metadata about them, if you have the server:user role. * The query looks for matches in name & email + * @deprecated Use users() instead. */ userSearch: UserSearchResultCollection; + /** Look up server users */ + users: UserSearchResultCollection; /** Validates the slug, to make sure it contains only valid characters and its not taken. */ validateWorkspaceSlug: Scalars['Boolean']['output']; workspace: Workspace; @@ -2702,6 +2705,11 @@ export type QueryUserSearchArgs = { }; +export type QueryUsersArgs = { + input: UsersRetrievalInput; +}; + + export type QueryValidateWorkspaceSlugArgs = { slug: Scalars['String']['input']; }; @@ -3874,6 +3882,18 @@ export type UserWorkspacesFilter = { search?: InputMaybe; }; +export type UsersRetrievalInput = { + cursor?: InputMaybe; + /** Only find users with directly matching emails */ + emailOnly?: InputMaybe; + /** Limit defaults to 10 */ + limit?: InputMaybe; + /** Only find users that are collaborators of the specified project */ + projectId?: InputMaybe; + /** The query looks for matches in user name & email */ + query: Scalars['String']['input']; +}; + export type Version = { __typename?: 'Version'; authorUser?: Maybe; @@ -4649,6 +4669,13 @@ export type OnBranchDeletedSubscriptionVariables = Exact<{ export type OnBranchDeletedSubscription = { __typename?: 'Subscription', branchDeleted?: Record | null }; +export type UsersRetrievalQueryVariables = Exact<{ + input: UsersRetrievalInput; +}>; + + +export type UsersRetrievalQuery = { __typename?: 'Query', users: { __typename?: 'UserSearchResultCollection', cursor?: string | null, items: Array<{ __typename?: 'LimitedUser', id: string, name: string }> } }; + export type BasicWorkspaceFragment = { __typename?: 'Workspace', id: string, name: string, slug: string, updatedAt: string, createdAt: string, role?: string | null }; export type BasicPendingWorkspaceCollaboratorFragment = { __typename?: 'PendingWorkspaceCollaborator', id: string, inviteId: string, workspaceId: string, workspaceName: string, title: string, role: string, token?: string | null, invitedBy: { __typename?: 'LimitedUser', id: string, name: string }, user?: { __typename?: 'LimitedUser', id: string, name: string } | null }; @@ -5469,6 +5496,7 @@ export const OnProjectModelsUpdatedDocument = {"kind":"Document","definitions":[ export const OnBranchCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"OnBranchCreated"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"streamId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"branchCreated"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"streamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"streamId"}}}]}]}}]} as unknown as DocumentNode; export const OnBranchUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"OnBranchUpdated"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"streamId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"branchId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"branchUpdated"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"streamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"streamId"}}},{"kind":"Argument","name":{"kind":"Name","value":"branchId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"branchId"}}}]}]}}]} as unknown as DocumentNode; export const OnBranchDeletedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"OnBranchDeleted"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"streamId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"branchDeleted"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"streamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"streamId"}}}]}]}}]} as unknown as DocumentNode; +export const UsersRetrievalDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UsersRetrieval"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UsersRetrievalInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"users"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]} as unknown as DocumentNode; export const CreateWorkspaceInviteDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateWorkspaceInvite"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"WorkspaceInviteCreateInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workspaceMutations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"invites"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"create"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}},{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BasicWorkspace"}},{"kind":"Field","name":{"kind":"Name","value":"invitedTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BasicPendingWorkspaceCollaborator"}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BasicWorkspace"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Workspace"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BasicPendingWorkspaceCollaborator"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PendingWorkspaceCollaborator"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"inviteId"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"invitedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"token"}}]}}]} as unknown as DocumentNode; export const BatchCreateWorkspaceInvitesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"BatchCreateWorkspaceInvites"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"WorkspaceInviteCreateInput"}}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workspaceMutations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"invites"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"batchCreate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}},{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BasicWorkspace"}},{"kind":"Field","name":{"kind":"Name","value":"invitedTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BasicPendingWorkspaceCollaborator"}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BasicWorkspace"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Workspace"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BasicPendingWorkspaceCollaborator"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PendingWorkspaceCollaborator"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"inviteId"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"invitedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"token"}}]}}]} as unknown as DocumentNode; export const GetWorkspaceWithTeamDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetWorkspaceWithTeam"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workspace"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BasicWorkspace"}},{"kind":"Field","name":{"kind":"Name","value":"invitedTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BasicPendingWorkspaceCollaborator"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BasicWorkspace"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Workspace"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"role"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BasicPendingWorkspaceCollaborator"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PendingWorkspaceCollaborator"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"inviteId"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"invitedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"token"}}]}}]} as unknown as DocumentNode; diff --git a/packages/server/test/hooks.ts b/packages/server/test/hooks.ts index 1e7f07ac65..ab4597e01e 100644 --- a/packages/server/test/hooks.ts +++ b/packages/server/test/hooks.ts @@ -77,6 +77,11 @@ export const getMainTestRegionKey = () => { return key } +export const getMainTestRegionKeyIfMultiRegion = () => { + const isMultiRegionMode = isMultiRegionTestMode() + return isMultiRegionMode ? getMainTestRegionKey() : undefined +} + export const getMainTestRegionClient = () => { const key = getMainTestRegionKey() const client = regionClients[key] diff --git a/packages/server/test/speckle-helpers/regions.ts b/packages/server/test/speckle-helpers/regions.ts index 065b6232da..c293d17f33 100644 --- a/packages/server/test/speckle-helpers/regions.ts +++ b/packages/server/test/speckle-helpers/regions.ts @@ -6,12 +6,14 @@ import { isTestEnv, shouldRunTestsInMultiregionMode } from '@/modules/shared/helpers/envHelper' +import { BasicTestUser } from '@/test/authHelper' import { getRegionKeys, getMainTestRegionClient, getMainTestRegionKey } from '@/test/hooks' import { wait } from '@speckle/shared' +import { isString } from 'lodash' /** * Delete all regions entries that are not part of the main multi region mode @@ -44,17 +46,24 @@ const waitForPredicate = async (params: { /** * Wait for user to exist in region db */ -export const waitForRegionUser = async (params: { userId: string }) => { +export const waitForRegionUser = async (userOrId: string | BasicTestUser) => { + if (!isMultiRegionTestMode()) return + + const userId = isString(userOrId) ? userOrId : userOrId.id const client = getMainTestRegionClient() const getUser = getUserFactory({ db: client }) await waitForPredicate({ predicate: async () => { - const user = await getUser(params.userId) + const user = await getUser(userId) return !!user }, - errMsg: `User ${params.userId} not found in region db` + errMsg: `User ${userId} not found in region db` }) } +export const waitForRegionUsers = async (userOrIds: Array) => { + await Promise.all(userOrIds.map((userOrId) => waitForRegionUser(userOrId))) +} + export { getMainTestRegionClient, getMainTestRegionKey } diff --git a/packages/server/test/speckle-helpers/streamHelper.ts b/packages/server/test/speckle-helpers/streamHelper.ts index 2e452629bd..5c24e049f5 100644 --- a/packages/server/test/speckle-helpers/streamHelper.ts +++ b/packages/server/test/speckle-helpers/streamHelper.ts @@ -1,6 +1,10 @@ import { db } from '@/db/knex' import { saveActivityFactory } from '@/modules/activitystream/repositories' -import { addStreamPermissionsRevokedActivityFactory } from '@/modules/activitystream/services/streamActivity' +import { + addStreamInviteAcceptedActivityFactory, + addStreamPermissionsAddedActivityFactory, + addStreamPermissionsRevokedActivityFactory +} from '@/modules/activitystream/services/streamActivity' import { StreamAcl } from '@/modules/core/dbSchema' import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter' import { StreamAclRecord, StreamRecord } from '@/modules/core/helpers/types' @@ -8,11 +12,14 @@ import { createBranchFactory } from '@/modules/core/repositories/branches' import { getServerInfoFactory } from '@/modules/core/repositories/server' import { createStreamFactory, + getStreamCollaboratorsFactory, getStreamFactory, + grantStreamPermissionsFactory, revokeStreamPermissionsFactory } from '@/modules/core/repositories/streams' import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' import { + addOrUpdateStreamCollaboratorFactory, isStreamCollaboratorFactory, removeStreamCollaboratorFactory, validateStreamAccessFactory @@ -38,7 +45,7 @@ import { createWorkspaceProjectFactory } from '@/modules/workspaces/services/pro import { BasicTestUser } from '@/test/authHelper' import { ProjectVisibility } from '@/test/graphql/generated/graphql' import { faker } from '@faker-js/faker' -import { ensureError } from '@speckle/shared' +import { ensureError, Roles, StreamRoles } from '@speckle/shared' import { omit } from 'lodash' const getServerInfo = getServerInfoFactory({ db }) @@ -88,6 +95,20 @@ const removeStreamCollaborator = removeStreamCollaboratorFactory({ }) }) +const addOrUpdateStreamCollaborator = addOrUpdateStreamCollaboratorFactory({ + validateStreamAccess, + getUser, + grantStreamPermissions: grantStreamPermissionsFactory({ db }), + addStreamInviteAcceptedActivity: addStreamInviteAcceptedActivityFactory({ + saveActivity, + publish + }), + addStreamPermissionsAddedActivity: addStreamPermissionsAddedActivityFactory({ + saveActivity, + publish + }) +}) + export type BasicTestStream = { name: string isPublic: boolean @@ -155,6 +176,68 @@ export async function leaveStream(streamObj: BasicTestStream, user: BasicTestUse }) } +export async function addToStream( + streamObj: BasicTestStream, + user: BasicTestUser, + role: StreamRoles, + options?: Partial<{ + owner: BasicTestUser + }> +) { + const { owner } = options || {} + let ownerId = owner?.id + if (!ownerId) { + const getStreamCollaborators = getStreamCollaboratorsFactory({ db }) + const collaborators = await getStreamCollaborators( + streamObj.id, + Roles.Stream.Owner, + { + limit: 1 + } + ) + ownerId = collaborators[0]?.id + } + if (!ownerId) { + throw new Error('Attempted to add a collaborator to a stream without an owner') + } + + await addOrUpdateStreamCollaborator(streamObj.id, user.id, role, ownerId, null) +} + +export async function addAllToStream( + streamObj: BasicTestStream, + users: BasicTestUser[] | { user: BasicTestUser; role: StreamRoles }[], + options?: Partial<{ + owner: BasicTestUser + }> +) { + const { owner } = options || {} + let ownerId = owner?.id + if (!ownerId) { + const getStreamCollaborators = getStreamCollaboratorsFactory({ db }) + const collaborators = await getStreamCollaborators( + streamObj.id, + Roles.Stream.Owner, + { + limit: 1 + } + ) + ownerId = collaborators[0]?.id + } + if (!ownerId) { + throw new Error('Attempted to add a collaborator to a stream without an owner') + } + + const usersWithRoles = users.map((u) => + 'user' in u ? u : { user: u, role: Roles.Stream.Contributor } + ) + await Promise.all( + usersWithRoles.map(({ user, role }) => + addOrUpdateStreamCollaborator(streamObj.id, user.id, role, ownerId!, null) + ) + ) +} + /** * Get the role user has for the specified stream */ diff --git a/packages/shared/src/core/helpers/batch.ts b/packages/shared/src/core/helpers/batch.ts index 26d0d96986..9abee7203b 100644 --- a/packages/shared/src/core/helpers/batch.ts +++ b/packages/shared/src/core/helpers/batch.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { range } from '#lodash' /** @@ -28,7 +29,7 @@ export async function batchAsyncOperations( /** * Optionally override the logger with a custom one */ - logger: (...args: unknown[]) => void + logger: (...args: any[]) => void /** * If set to true, the function won't collect all of the returns of each operation in an effort to reduce diff --git a/yarn.lock b/yarn.lock index 86ef2104ff..6b9a839592 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12297,13 +12297,6 @@ __metadata: languageName: node linkType: hard -"@linaria/core@npm:3.0.0-beta.13": - version: 3.0.0-beta.13 - resolution: "@linaria/core@npm:3.0.0-beta.13" - checksum: 10/9b4865187c26997769258206d7caf27c2093b68adf0424d39a5d72e1121e43b57c739ad91dda1bafcd428ab6c54b65ea79f61e880a1827f7b9251751878bddd4 - languageName: node - linkType: hard - "@mailchimp/mailchimp_marketing@npm:^3.0.80": version: 3.0.80 resolution: "@mailchimp/mailchimp_marketing@npm:3.0.80" @@ -14533,44 +14526,10 @@ __metadata: languageName: node linkType: hard -"@remirror/core-constants@npm:^2.0.0": - version: 2.0.0 - resolution: "@remirror/core-constants@npm:2.0.0" - dependencies: - "@babel/runtime": "npm:^7.13.10" - checksum: 10/8c5c2e42da66d9a9a8da91c1288d0be5038c56644e860c012203d00e9839cdd8e616b482b95a05dc7b9dcc9cd066923aab5458286e6f8b5aa688c4be73b7479b - languageName: node - linkType: hard - -"@remirror/core-helpers@npm:^2.0.1": - version: 2.0.1 - resolution: "@remirror/core-helpers@npm:2.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@linaria/core": "npm:3.0.0-beta.13" - "@remirror/core-constants": "npm:^2.0.0" - "@remirror/types": "npm:^1.0.0" - "@types/object.omit": "npm:^3.0.0" - "@types/object.pick": "npm:^1.3.1" - "@types/throttle-debounce": "npm:^2.1.0" - case-anything: "npm:^2.1.10" - dash-get: "npm:^1.0.2" - deepmerge: "npm:^4.2.2" - fast-deep-equal: "npm:^3.1.3" - make-error: "npm:^1.3.6" - object.omit: "npm:^3.0.0" - object.pick: "npm:^1.3.0" - throttle-debounce: "npm:^3.0.1" - checksum: 10/4737280aaa7e756f4b03a9fa9cff43a9fe52c1cee861a1652a3b18df2c8f16bd1dcb00a8e988ef9abc65d5fdfd3193f37b1bc4d6ead8d98d11e33777d06aa7da - languageName: node - linkType: hard - -"@remirror/types@npm:^1.0.0": - version: 1.0.0 - resolution: "@remirror/types@npm:1.0.0" - dependencies: - type-fest: "npm:^2.0.0" - checksum: 10/9514b67bbc576c9e80520b7644a105d3a627856d6b2fa6e2fa5b3204a7eb8426ba14d3fe7b9ea79fe7ec642ec429422f0f22007ef0a38fb67235b3c87168a751 +"@remirror/core-constants@npm:3.0.0": + version: 3.0.0 + resolution: "@remirror/core-constants@npm:3.0.0" + checksum: 10/de15b1df099a7646739e5fb6bb55195618a8ac4fa938db7c719e867eefd72ebc5a05865591788ade449613141619cc1002fb6c0f824de4468dfefa951fbf19a2 languageName: node linkType: hard @@ -16774,22 +16733,22 @@ __metadata: "@tailwindcss/line-clamp": "npm:^0.4.2" "@tailwindcss/typography": "npm:^0.5.12" "@testing-library/vue": "npm:^6.6.1" - "@tiptap/core": "npm:2.0.0-beta.220" - "@tiptap/extension-bold": "npm:2.0.0-beta.220" - "@tiptap/extension-document": "npm:2.0.0-beta.220" - "@tiptap/extension-hard-break": "npm:2.0.0-beta.220" - "@tiptap/extension-history": "npm:2.0.0-beta.220" - "@tiptap/extension-italic": "npm:2.0.0-beta.220" - "@tiptap/extension-link": "npm:2.0.0-beta.220" - "@tiptap/extension-mention": "npm:2.0.0-beta.220" - "@tiptap/extension-paragraph": "npm:2.0.0-beta.220" - "@tiptap/extension-placeholder": "npm:2.0.0-beta.220" - "@tiptap/extension-strike": "npm:2.0.0-beta.220" - "@tiptap/extension-text": "npm:2.0.0-beta.220" - "@tiptap/extension-underline": "npm:2.0.0-beta.220" - "@tiptap/pm": "npm:2.0.0-beta.220" - "@tiptap/suggestion": "npm:2.0.0-beta.220" - "@tiptap/vue-3": "npm:2.0.0-beta.220" + "@tiptap/core": "npm:2.10.3" + "@tiptap/extension-bold": "npm:2.10.3" + "@tiptap/extension-document": "npm:2.10.3" + "@tiptap/extension-hard-break": "npm:2.10.3" + "@tiptap/extension-history": "npm:2.10.3" + "@tiptap/extension-italic": "npm:2.10.3" + "@tiptap/extension-link": "npm:2.10.3" + "@tiptap/extension-mention": "npm:2.10.3" + "@tiptap/extension-paragraph": "npm:2.10.3" + "@tiptap/extension-placeholder": "npm:2.10.3" + "@tiptap/extension-strike": "npm:2.10.3" + "@tiptap/extension-text": "npm:2.10.3" + "@tiptap/extension-underline": "npm:2.10.3" + "@tiptap/pm": "npm:2.10.3" + "@tiptap/suggestion": "npm:2.10.3" + "@tiptap/vue-3": "npm:2.10.3" "@tryghost/content-api": "npm:^1.11.21" "@types/apollo-upload-client": "npm:^18.0.0" "@types/dompurify": "npm:^3.0.2" @@ -18975,12 +18934,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/core@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/core@npm:2.0.0-beta.220" +"@tiptap/core@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/core@npm:2.10.3" peerDependencies: - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/d18557536f8ddc3e9ff8d1a11ceda98648a40d1898aa5126d5b9df09f7f153b047bd954050984aab58119231960d655aab79cdbe8509bab8f7f6825ce85c20b6 + "@tiptap/pm": ^2.7.0 + checksum: 10/0a9f81046885b26180da293d9281cd4bbfb45d1e80539aaea279082fccb93b712e852aba1d2baebba777582acc1cf9e747e3b383715d44499a0c627fb8c40236 languageName: node linkType: hard @@ -19006,12 +18965,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-bold@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-bold@npm:2.0.0-beta.220" +"@tiptap/extension-bold@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-bold@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/a47884dcb2261383ced64a2be342bb7d10b950bfee546f1ac3bc23de69d2320159f5e5659cb61d0802baa0c5f1322223f0c45641c85aa9bd42c20de8e534d882 + "@tiptap/core": ^2.7.0 + checksum: 10/810b717293eba8a6473fb13be100329d010d71eb338d5bb00d72811122bd4b9f16f6238d346ff52e3ffc3038717692c06d0365f4c623d05ff25ad532c5ce482d languageName: node linkType: hard @@ -19024,19 +18983,6 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-bubble-menu@npm:^2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-bubble-menu@npm:2.0.0-beta.220" - dependencies: - lodash: "npm:^4.17.21" - tippy.js: "npm:^6.3.7" - peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/ccb17e5d6729c506fc62831fba540aeffe114ad3a50475d76b60bdbb6eeab1130388bc5a28263809fcb734ebea052e9e7ca3b3fad58baecc7003444fa1072e25 - languageName: node - linkType: hard - "@tiptap/extension-bubble-menu@npm:^2.0.0-beta.56": version: 2.0.0-beta.56 resolution: "@tiptap/extension-bubble-menu@npm:2.0.0-beta.56" @@ -19050,12 +18996,24 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-document@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-document@npm:2.0.0-beta.220" +"@tiptap/extension-bubble-menu@npm:^2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-bubble-menu@npm:2.10.3" + dependencies: + tippy.js: "npm:^6.3.7" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/fff651a6b45586fbad7ca0aea45b6d57f86263dd1d8839dabf55617b58f204ea8fcce6e9a6d9916b0e301b32d7aea9f1a7c10b4c167618b3a0c12b2f2bb5dfb6 + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + checksum: 10/c1c0d53277d7f91418a5b040744c34f75dcdae105c719637a02688cb19fc2aa515dcb2f21245762f4868de31a62d6c25b95c7d44284e6a2c9b1d21dbf7aea9a0 + languageName: node + linkType: hard + +"@tiptap/extension-document@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-document@npm:2.10.3" + peerDependencies: + "@tiptap/core": ^2.7.0 + checksum: 10/63d4a981981596ff97d825cf8e6c49c2af06b9cc87cb9817c4a7ba76894e71200c4f55bcdc1909dd3d12517e8f1473dcad04fc508865e846524bb269b66dae5c languageName: node linkType: hard @@ -19068,18 +19026,6 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-floating-menu@npm:^2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-floating-menu@npm:2.0.0-beta.220" - dependencies: - tippy.js: "npm:^6.3.7" - peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/d9d280a232e552fe820b5f5cbf6011e1c275c37dea492e2bb92100d09a4a4c904b8eab68a5981b5d7435ec3be09094d22df9b0dcad6047486072042903922e34 - languageName: node - linkType: hard - "@tiptap/extension-floating-menu@npm:^2.0.0-beta.51": version: 2.0.0-beta.51 resolution: "@tiptap/extension-floating-menu@npm:2.0.0-beta.51" @@ -19093,12 +19039,24 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-hard-break@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-hard-break@npm:2.0.0-beta.220" +"@tiptap/extension-floating-menu@npm:^2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-floating-menu@npm:2.10.3" + dependencies: + tippy.js: "npm:^6.3.7" + peerDependencies: + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + checksum: 10/120c4377e5a56a4389830f8bed0ded15eff3ba04e904e5a097c5cea6e11d96c54d9d9f7132c37e79f0ef037d41014af38636ade4eb25a560ffeb87d11f628eb4 + languageName: node + linkType: hard + +"@tiptap/extension-hard-break@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-hard-break@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/b80a7d25fbec3a8948a622796d3ed5a4f459dd50527a27406153aa40b64190bffd53f65aa87d9382197aabcecf077e890e8cf03e7e10788cdf5f83cdb73719dd + "@tiptap/core": ^2.7.0 + checksum: 10/f542cc89f27d063bae4ce13c0839d5ac72519434befc325367af4421191f77a33f7e599a6de5d5c18884ac6044d0155ed2edbf4c5378f26f188580257c3639a9 languageName: node linkType: hard @@ -19111,13 +19069,13 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-history@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-history@npm:2.0.0-beta.220" +"@tiptap/extension-history@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-history@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/f9628f84d7c08c71170c19b559f2d690a1bf056bb620c6aebd7c2d44e70ba2e19f2b21776379606db9bd4fbbc6ce7c60661175e36de8d1dcf3b213b5d986ac5d + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + checksum: 10/11b0be291144d59ccf3a8b3e86f443c5d16d0b5167294b8192fed1397e54ce1890695eff3129142d65b9f1462f6f4a4cde459b3dc2a70ca4291e71b2d8a136fa languageName: node linkType: hard @@ -19133,12 +19091,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-italic@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-italic@npm:2.0.0-beta.220" +"@tiptap/extension-italic@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-italic@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/21d72e7ec645367a058fbf032c4ab333831280cda97ff5da6f070bca6b0998c5a39b5b18392c9cef472f9fb0c1354440699bba7acd324a53ec46598914fe6f89 + "@tiptap/core": ^2.7.0 + checksum: 10/b0095308dcc9fbe29862be7ac21fb8f8a4edd5b403117368976af16704f9e452a2cc04eb22d3bb91298c5bc2a669b53a4d1e26fee333c5a20828017f2e2ac1ea languageName: node linkType: hard @@ -19151,15 +19109,15 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-link@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-link@npm:2.0.0-beta.220" +"@tiptap/extension-link@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-link@npm:2.10.3" dependencies: linkifyjs: "npm:^4.1.0" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/344094d5d586eb41b1eb3e001a1ff72328dd32982865634ab4e05a246ba92ec15fe2f92f92c8d99be08e1feb07516dbc2636cea5e68714d56eed3c20989b0930 + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + checksum: 10/7ac1359c1241901af5868f339761907ed6bb1fb46e36d2bd8fb79227271e19e3639538971260f8927825db9a1eea038e0ad41511279a9034bf8f56c9f1918487 languageName: node linkType: hard @@ -19176,14 +19134,14 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-mention@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-mention@npm:2.0.0-beta.220" +"@tiptap/extension-mention@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-mention@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - "@tiptap/suggestion": ^2.0.0-beta.209 - checksum: 10/f618ddffc9c2e3fc7d4a98f4e4cd5ef103c47fbcf63e06f3c69a07ab943a6f59d91f32adc610601d8c4a8a5dff4f2ee9ac08d8b2eab48d3d08ce6de23fdbba65 + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + "@tiptap/suggestion": ^2.7.0 + checksum: 10/77816b90158b7ddaa954d161e753131f0e2b9e1683817161876910a9df31f7cdb427c8b73962d8dd1793a23328f8f2869f6c3f927df88ceb6fe94d4612f1c9f7 languageName: node linkType: hard @@ -19200,12 +19158,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-paragraph@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-paragraph@npm:2.0.0-beta.220" +"@tiptap/extension-paragraph@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-paragraph@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/e0eb62b4f47877444e7bc3781d1a8187f83cf0a4d00ae2145f922a88097defc57663594d89e78995cb22d4d5087bfe83edad13a9181c2b2df392ffb2eaf1c6cb + "@tiptap/core": ^2.7.0 + checksum: 10/907fd6287d1f281368e55fea904ee3e5f363d33292ec037ef7649a2ec07456c32bb02d555b8b5412ac09d0e237cf99f919e8572635ee2aa5d35d9cfe7d717162 languageName: node linkType: hard @@ -19218,13 +19176,13 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-placeholder@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-placeholder@npm:2.0.0-beta.220" +"@tiptap/extension-placeholder@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-placeholder@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/d3674dad1f4f45678f27bb7c4b5a0fb48812ca9fadf009a77ac00a5df69953ba947e8de15f085530db531453d225c586414ce529742fc5ecb325b383efdaf541 + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + checksum: 10/aed0fa260069d4ef1bdd8b92581b0e3a83b7ff04fa1457c3ebcede68abfdd98c97288569b2b395b67bc60607cda7fdcba3fdbe432c7e439662ea7d3de732897b languageName: node linkType: hard @@ -19241,12 +19199,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-strike@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-strike@npm:2.0.0-beta.220" +"@tiptap/extension-strike@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-strike@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/d71b309c1b9e2364b31e97fef819553efb29312ed504ad56e23269deb43069990bd351621a9077059419d9987acaa26fc2eb7797180ab56e16d4d4e4da903c56 + "@tiptap/core": ^2.7.0 + checksum: 10/4830a5e3236051e4a75a056117bf91ef4a76a3a5cdc0806acf765ca949cbbbacb37a237b92a5156c3a0ad79086b1cebd729d49a39181fd9c1b8fd9eb37ce0e83 languageName: node linkType: hard @@ -19259,12 +19217,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-text@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-text@npm:2.0.0-beta.220" +"@tiptap/extension-text@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-text@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/8b28d70eb8141ce13247f719c025e62189745be7229659ff0e57d9b796b5d042fe396cb8b0fee4bcdad82054d0d707f0e0616f0c9c263e6a22777d0c67269ba3 + "@tiptap/core": ^2.7.0 + checksum: 10/b56ce656fc7467ba81541bf4c7214a410a97193a0faebf9ba4fe52c3e4444ab63de8408550ea776546722d7b0d7d2f5da0551227e267f73c708c2435596f7161 languageName: node linkType: hard @@ -19277,12 +19235,12 @@ __metadata: languageName: node linkType: hard -"@tiptap/extension-underline@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/extension-underline@npm:2.0.0-beta.220" +"@tiptap/extension-underline@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/extension-underline@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/57f7bad2902638ee11bfcc83b24964b74379d61c00da27b07bcc4818ed5406581c96b2291ae12edd9de98def903a74cdb294206158d2d9647fd327e60f93e97c + "@tiptap/core": ^2.7.0 + checksum: 10/ca5fb009f342162a1d2323cae577f2996c4a01e0f199b143074249b7912552ad7d0a97119aacce1f2664cb0cf91a3d1b9336fddc1e87d1a59f1abda9c95d3c9d languageName: node linkType: hard @@ -19295,41 +19253,39 @@ __metadata: languageName: node linkType: hard -"@tiptap/pm@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/pm@npm:2.0.0-beta.220" - dependencies: - prosemirror-changeset: "npm:^2.2.0" - prosemirror-collab: "npm:^1.3.0" - prosemirror-commands: "npm:^1.3.1" - prosemirror-dropcursor: "npm:^1.5.0" - prosemirror-gapcursor: "npm:^1.3.1" - prosemirror-history: "npm:^1.3.0" - prosemirror-inputrules: "npm:^1.2.0" - prosemirror-keymap: "npm:^1.2.0" - prosemirror-markdown: "npm:^1.10.1" - prosemirror-menu: "npm:^1.2.1" - prosemirror-model: "npm:^1.18.1" - prosemirror-schema-basic: "npm:^1.2.0" - prosemirror-schema-list: "npm:^1.2.2" - prosemirror-state: "npm:^1.4.1" - prosemirror-tables: "npm:^1.3.0" - prosemirror-trailing-node: "npm:^2.0.2" - prosemirror-transform: "npm:^1.7.0" - prosemirror-view: "npm:^1.28.2" - peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - checksum: 10/e5cce529d558ed4c6bab820446dae42a783fb8645560d75ada5114a722eb5819fc06d0038000830cf1e329906405acb7891b827d19d00b017e8b41afaa0a58d3 - languageName: node - linkType: hard - -"@tiptap/suggestion@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/suggestion@npm:2.0.0-beta.220" +"@tiptap/pm@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/pm@npm:2.10.3" + dependencies: + prosemirror-changeset: "npm:^2.2.1" + prosemirror-collab: "npm:^1.3.1" + prosemirror-commands: "npm:^1.6.2" + prosemirror-dropcursor: "npm:^1.8.1" + prosemirror-gapcursor: "npm:^1.3.2" + prosemirror-history: "npm:^1.4.1" + prosemirror-inputrules: "npm:^1.4.0" + prosemirror-keymap: "npm:^1.2.2" + prosemirror-markdown: "npm:^1.13.1" + prosemirror-menu: "npm:^1.2.4" + prosemirror-model: "npm:^1.23.0" + prosemirror-schema-basic: "npm:^1.2.3" + prosemirror-schema-list: "npm:^1.4.1" + prosemirror-state: "npm:^1.4.3" + prosemirror-tables: "npm:^1.6.1" + prosemirror-trailing-node: "npm:^3.0.0" + prosemirror-transform: "npm:^1.10.2" + prosemirror-view: "npm:^1.37.0" + checksum: 10/dd61ef7becf82a5a36fc404d58287f72a7076215c7331b4451c37f9968c0fc8772af2c7764ac3d08dfa9cd03d30ede450ec0d4d8a84924a13a1b7bd86288144d + languageName: node + linkType: hard + +"@tiptap/suggestion@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/suggestion@npm:2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 - checksum: 10/44df0e53440f50f75fc1b18facd53e905ec288e238f692839953da2a9dfe65ec46f3d24cd3596245b7fca4a39b7ce162677096a5e2d85e281fe2ce822acce231 + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 + checksum: 10/de08fa1388105e459a363a675b3331267ce19db742be28c435ab1ad87995c49286f5f9ee1de9361056271a932f34632bcbc036ae788f21f9cff590e6e37bac0a languageName: node linkType: hard @@ -19360,17 +19316,17 @@ __metadata: languageName: node linkType: hard -"@tiptap/vue-3@npm:2.0.0-beta.220": - version: 2.0.0-beta.220 - resolution: "@tiptap/vue-3@npm:2.0.0-beta.220" +"@tiptap/vue-3@npm:2.10.3": + version: 2.10.3 + resolution: "@tiptap/vue-3@npm:2.10.3" dependencies: - "@tiptap/extension-bubble-menu": "npm:^2.0.0-beta.220" - "@tiptap/extension-floating-menu": "npm:^2.0.0-beta.220" + "@tiptap/extension-bubble-menu": "npm:^2.10.3" + "@tiptap/extension-floating-menu": "npm:^2.10.3" peerDependencies: - "@tiptap/core": ^2.0.0-beta.209 - "@tiptap/pm": ^2.0.0-beta.209 + "@tiptap/core": ^2.7.0 + "@tiptap/pm": ^2.7.0 vue: ^3.0.0 - checksum: 10/acc86a1150681a64c02ce4a252a9d63e86a82d70b78c2eb37d1235ae9d939160ce96fb3da1f7af02c287e73ce64c8bf5d6c96147e3178a79a6f0dc653a2bf8f8 + checksum: 10/f2180b7f286a3f9bdefec1c8565d7d72997542d113f5a837c701ad8e16b59c2d9e1e85ac16a8e0420269fbdf130f7fa29521d1bbc24bd831462c60b9adece436 languageName: node linkType: hard @@ -20147,6 +20103,13 @@ __metadata: languageName: node linkType: hard +"@types/linkify-it@npm:^5": + version: 5.0.0 + resolution: "@types/linkify-it@npm:5.0.0" + checksum: 10/c3919044d4876f9d71d037e861745cd2485c95ac8c36a4fa67b132d4e60eb1d067e123cc7965c9cf5110eea351517d767f0d306af5e9147d6d0af87bc374ddcf + languageName: node + linkType: hard + "@types/lockfile@npm:^1.0.2": version: 1.0.2 resolution: "@types/lockfile@npm:1.0.2" @@ -20221,6 +20184,16 @@ __metadata: languageName: node linkType: hard +"@types/markdown-it@npm:^14.0.0": + version: 14.1.2 + resolution: "@types/markdown-it@npm:14.1.2" + dependencies: + "@types/linkify-it": "npm:^5" + "@types/mdurl": "npm:^2" + checksum: 10/ca2f239c8d59610b9f936fd40261a6ccf2fa1ae27a21816c031e5712542dcf9ee01e2fe29b31118df90716e11ade54e47d92a498e9b6488800e77ca8827255a2 + languageName: node + linkType: hard + "@types/marked@npm:^5.0.0": version: 5.0.2 resolution: "@types/marked@npm:5.0.2" @@ -20228,6 +20201,13 @@ __metadata: languageName: node linkType: hard +"@types/mdurl@npm:^2": + version: 2.0.0 + resolution: "@types/mdurl@npm:2.0.0" + checksum: 10/78746e96c655ceed63db06382da466fd52c7e9dc54d60b12973dfdd110cae06b9439c4b90e17bb8d4461109184b3ea9f3e9f96b3e4bf4aa9fe18b6ac35f283c8 + languageName: node + linkType: hard + "@types/mdx@npm:^2.0.0": version: 2.0.3 resolution: "@types/mdx@npm:2.0.3" @@ -20447,20 +20427,6 @@ __metadata: languageName: node linkType: hard -"@types/object.omit@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/object.omit@npm:3.0.0" - checksum: 10/bddcf21a89590b3129e3ae21007e70ccbc9b036a1479b78450546f2caf97223dfe13603c78a0af6a70a94afcd9d554bb7bb593f6362e04e3ca457991e0292397 - languageName: node - linkType: hard - -"@types/object.pick@npm:^1.3.1": - version: 1.3.2 - resolution: "@types/object.pick@npm:1.3.2" - checksum: 10/71053ec6849142e934a1f2232e004f103e26a7df4782a83e83d976c74f1804c3ac29ed96223a6eef7b08f36ee019d1675f0d752fd79c9f444a080646d438c87d - languageName: node - linkType: hard - "@types/orderedmap@npm:*": version: 1.0.0 resolution: "@types/orderedmap@npm:1.0.0" @@ -20881,13 +20847,6 @@ __metadata: languageName: node linkType: hard -"@types/throttle-debounce@npm:^2.1.0": - version: 2.1.0 - resolution: "@types/throttle-debounce@npm:2.1.0" - checksum: 10/678dbd8a3c158e49f057a2e8898ba3c29e06cda95f6ca393a7a7785298d48758dc62c5c49090ec0bdea572a6d51a60a9ba5c95e17de2ca24d57a28de63ca25c7 - languageName: node - linkType: hard - "@types/tough-cookie@npm:*": version: 4.0.5 resolution: "@types/tough-cookie@npm:4.0.5" @@ -26522,13 +26481,6 @@ __metadata: languageName: node linkType: hard -"case-anything@npm:^2.1.10": - version: 2.1.10 - resolution: "case-anything@npm:2.1.10" - checksum: 10/cb5e3be2c77af23682930dcd11b3b9324e4ad908b6329b1b556de01f0e4731fc5c930a7d25f07c2d335a11bac6ee4cfc1a067669822d6b846d4e91c3611fd2db - languageName: node - linkType: hard - "caseless@npm:~0.12.0": version: 0.12.0 resolution: "caseless@npm:0.12.0" @@ -28750,13 +28702,6 @@ __metadata: languageName: node linkType: hard -"dash-get@npm:^1.0.2": - version: 1.0.2 - resolution: "dash-get@npm:1.0.2" - checksum: 10/5aa0bc487f7c66ae25fc2ee1a8e85fbbd4da1b4616c7b386399813355b8464615ac73a239d3549ec299c23e06e1a0f30eb4fedc1e52e51ea2b9154ad6210deee - languageName: node - linkType: hard - "dashdash@npm:^1.12.0": version: 1.14.1 resolution: "dashdash@npm:1.14.1" @@ -30275,13 +30220,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:~3.0.1": - version: 3.0.1 - resolution: "entities@npm:3.0.1" - checksum: 10/3706e0292ea3f3679720b3d3b1ed6290b164aaeb11116691a922a3acea144503871e0de2170b47671c3b735549b8b7f4741d0d3c2987e8f985ccaa0dd3762eba - languageName: node - linkType: hard - "env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -35432,15 +35370,6 @@ __metadata: languageName: node linkType: hard -"is-extendable@npm:^1.0.0": - version: 1.0.1 - resolution: "is-extendable@npm:1.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - checksum: 10/db07bc1e9de6170de70eff7001943691f05b9d1547730b11be01c0ebfe67362912ba743cf4be6fd20a5e03b4180c685dad80b7c509fe717037e3eee30ad8e84f - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -37892,12 +37821,12 @@ __metadata: languageName: node linkType: hard -"linkify-it@npm:^4.0.1": - version: 4.0.1 - resolution: "linkify-it@npm:4.0.1" +"linkify-it@npm:^5.0.0": + version: 5.0.0 + resolution: "linkify-it@npm:5.0.0" dependencies: - uc.micro: "npm:^1.0.1" - checksum: 10/d0a786d2e3f02f46b6f4a9b466af9eb936fb68e86b7cd305933d5457b12fdc53a4d0e0b697b02dc2e7d84a51d2425d719598bb7b47af7e01911e492e07a97957 + uc.micro: "npm:^2.0.0" + checksum: 10/ef3b7609dda6ec0c0be8a7b879cea195f0d36387b0011660cd6711bba0ad82137f59b458b7e703ec74f11d88e7c1328e2ad9b855a8500c0ded67461a8c4519e6 languageName: node linkType: hard @@ -38828,7 +38757,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:^1.1.1, make-error@npm:^1.3.6": +"make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: 10/b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -38915,18 +38844,19 @@ __metadata: languageName: node linkType: hard -"markdown-it@npm:^13.0.1": - version: 13.0.1 - resolution: "markdown-it@npm:13.0.1" +"markdown-it@npm:^14.0.0": + version: 14.1.0 + resolution: "markdown-it@npm:14.1.0" dependencies: argparse: "npm:^2.0.1" - entities: "npm:~3.0.1" - linkify-it: "npm:^4.0.1" - mdurl: "npm:^1.0.1" - uc.micro: "npm:^1.0.5" + entities: "npm:^4.4.0" + linkify-it: "npm:^5.0.0" + mdurl: "npm:^2.0.0" + punycode.js: "npm:^2.3.1" + uc.micro: "npm:^2.1.0" bin: - markdown-it: bin/markdown-it.js - checksum: 10/ebe2cfd515c23d2d88692efac41e4070fcd2e932af15e5455e73e1a47f1f86298a4aacb2de3b5cc647a409bed5951739980c02dbf7d34f78e25554d8742751db + markdown-it: bin/markdown-it.mjs + checksum: 10/f34f921be178ed0607ba9e3e27c733642be445e9bb6b1dba88da7aafe8ba1bc5d2f1c3aa8f3fc33b49a902da4e4c08c2feadfafb290b8c7dda766208bb6483a9 languageName: node linkType: hard @@ -38998,10 +38928,10 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.1": - version: 1.0.1 - resolution: "mdurl@npm:1.0.1" - checksum: 10/ada367d01c9e81d07328101f187d5bd8641b71f33eab075df4caed935a24fa679e625f07108801d8250a5e4a99e5cd4be7679957a11424a3aa3e740d2bb2d5cb +"mdurl@npm:^2.0.0": + version: 2.0.0 + resolution: "mdurl@npm:2.0.0" + checksum: 10/1720349d4a53e401aa993241368e35c0ad13d816ad0b28388928c58ca9faa0cf755fa45f18ccbf64f4ce54a845a50ddce5c84e4016897b513096a68dac4b0158 languageName: node linkType: hard @@ -42085,24 +42015,6 @@ __metadata: languageName: node linkType: hard -"object.omit@npm:^3.0.0": - version: 3.0.0 - resolution: "object.omit@npm:3.0.0" - dependencies: - is-extendable: "npm:^1.0.0" - checksum: 10/1feb3a5891e3892451e34d3b460caae06f2a8a829854eced577cd30654a2ed37750e3d7f0d462e692b3b6623ad74777457c0ad32a9e622136b8171209d356890 - languageName: node - linkType: hard - -"object.pick@npm:^1.3.0": - version: 1.3.0 - resolution: "object.pick@npm:1.3.0" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10/92d7226a6b581d0d62694a5632b6a1594c81b3b5a4eb702a7662e0b012db532557067d6f773596c577f75322eba09cdca37ca01ea79b6b29e3e17365f15c615e - languageName: node - linkType: hard - "obuf@npm:^1.0.0, obuf@npm:^1.1.2": version: 1.1.2 resolution: "obuf@npm:1.1.2" @@ -45024,25 +44936,25 @@ __metadata: languageName: node linkType: hard -"prosemirror-changeset@npm:^2.2.0": - version: 2.2.0 - resolution: "prosemirror-changeset@npm:2.2.0" +"prosemirror-changeset@npm:^2.2.1": + version: 2.2.1 + resolution: "prosemirror-changeset@npm:2.2.1" dependencies: prosemirror-transform: "npm:^1.0.0" - checksum: 10/ebf5e391b3b872ebd7a4c548e11cc7f669e05d3d8729c672c97d6c71c471e462a7e800cbd38abaa72c7807fd037949fc6e7b367e0103d1ed12b2e13c3c66ddf6 + checksum: 10/39c70af95e2a9be8d414d546188656e5d6db4034e2640c887ff72c7ff8e638817ff061b5c08590e8ba8027b5b0c1954dc60b62d2d2a8e3a7b7d6a05453a283ad languageName: node linkType: hard -"prosemirror-collab@npm:^1.3.0": - version: 1.3.0 - resolution: "prosemirror-collab@npm:1.3.0" +"prosemirror-collab@npm:^1.3.1": + version: 1.3.1 + resolution: "prosemirror-collab@npm:1.3.1" dependencies: prosemirror-state: "npm:^1.0.0" - checksum: 10/6f9959e0007483f894d2de3cd03034df55c3a617aa62481cd349e163aab80cd0c8ac6e91f9a45d5b61744e7f3843e78c494c3a244cadf6429738b3aecbf8a401 + checksum: 10/6b1ccc52841fbb62a39ef0fb8da2d731381030609ea7a0ba7d533b1937d56fe4b91344e79c023e790bed5392efe9f917c41c8434e0a379dc1dc842ba83594e34 languageName: node linkType: hard -"prosemirror-commands@npm:^1.0.0, prosemirror-commands@npm:^1.3.1": +"prosemirror-commands@npm:^1.0.0": version: 1.5.1 resolution: "prosemirror-commands@npm:1.5.1" dependencies: @@ -45064,30 +44976,41 @@ __metadata: languageName: node linkType: hard -"prosemirror-dropcursor@npm:^1.5.0": - version: 1.7.1 - resolution: "prosemirror-dropcursor@npm:1.7.1" +"prosemirror-commands@npm:^1.6.2": + version: 1.6.2 + resolution: "prosemirror-commands@npm:1.6.2" + dependencies: + prosemirror-model: "npm:^1.0.0" + prosemirror-state: "npm:^1.0.0" + prosemirror-transform: "npm:^1.10.2" + checksum: 10/048422039a91dc1ba1a661698c110967a14744fb606ef958ca63f58e7efe4f64023ab63c4a5029ccef0159d0e2580224c158ce60a27323ea814989d6301dad16 + languageName: node + linkType: hard + +"prosemirror-dropcursor@npm:^1.8.1": + version: 1.8.1 + resolution: "prosemirror-dropcursor@npm:1.8.1" dependencies: prosemirror-state: "npm:^1.0.0" prosemirror-transform: "npm:^1.1.0" prosemirror-view: "npm:^1.1.0" - checksum: 10/873381e776b211a37cc31407cadd0ef20c0b66ea6ea4fc5027f14c7c5aadea3aded49a516d7b1afb3c978a195720663361156adf5f4756d023d77baa226d275b + checksum: 10/a2584dfbbeed3d7f703c1f7f174396ebf85f29e4f31a43e08cb9c7596d6d0b82f1bc73d0bbcd7c25e421d875ef0dc7f0c9918287fffa5267b6c65e89659444d0 languageName: node linkType: hard -"prosemirror-gapcursor@npm:^1.3.1": - version: 1.3.1 - resolution: "prosemirror-gapcursor@npm:1.3.1" +"prosemirror-gapcursor@npm:^1.3.2": + version: 1.3.2 + resolution: "prosemirror-gapcursor@npm:1.3.2" dependencies: prosemirror-keymap: "npm:^1.0.0" prosemirror-model: "npm:^1.0.0" prosemirror-state: "npm:^1.0.0" prosemirror-view: "npm:^1.0.0" - checksum: 10/658c0822bf10908626046ee38aba036030c5c03a6b3200440867135c5b77399e4902b48903128b7811e011ebe7aa6762126b9b58f04353d7e5eabcc95bcd1d3d + checksum: 10/8de9e9c0f7f69ae74a3189a86b3e8a2bd8dd5bd693c18efc5271ad4a4c6777092906c8ac7722ab5d1428de04b13404c676fddef54966ed3606b3040602eb1325 languageName: node linkType: hard -"prosemirror-history@npm:^1.0.0, prosemirror-history@npm:^1.2.0, prosemirror-history@npm:^1.3.0": +"prosemirror-history@npm:^1.0.0, prosemirror-history@npm:^1.2.0": version: 1.3.0 resolution: "prosemirror-history@npm:1.3.0" dependencies: @@ -45098,17 +45021,29 @@ __metadata: languageName: node linkType: hard -"prosemirror-inputrules@npm:^1.2.0": - version: 1.2.0 - resolution: "prosemirror-inputrules@npm:1.2.0" +"prosemirror-history@npm:^1.4.1": + version: 1.4.1 + resolution: "prosemirror-history@npm:1.4.1" + dependencies: + prosemirror-state: "npm:^1.2.2" + prosemirror-transform: "npm:^1.0.0" + prosemirror-view: "npm:^1.31.0" + rope-sequence: "npm:^1.3.0" + checksum: 10/7ac68fc8233dcd159bb15c2aaf542fd9aa0524b50523b24de6c8209b1f5eae9545f7fa82d584c93e68b1e910bcae5e07bee1085094aca4c565c607cf737c39b8 + languageName: node + linkType: hard + +"prosemirror-inputrules@npm:^1.4.0": + version: 1.4.0 + resolution: "prosemirror-inputrules@npm:1.4.0" dependencies: prosemirror-state: "npm:^1.0.0" prosemirror-transform: "npm:^1.0.0" - checksum: 10/dfd10074001440d3650d49332abf7fafd4402b0ccdcfcdfe9bb650ccf42e9fca4c5f436a8c097e0be7b22957871d198af124dfe314668990e42b810d0c5e27be + checksum: 10/04453d06a4bb3540e3df254e46bcafd4faaf73cd72f4486a804af598a084ee9cddb9fedd23a09c34c79ed98182b151461f447e4f5920bdd7465327975c773bca languageName: node linkType: hard -"prosemirror-keymap@npm:^1.0.0, prosemirror-keymap@npm:^1.1.2, prosemirror-keymap@npm:^1.2.0": +"prosemirror-keymap@npm:^1.0.0, prosemirror-keymap@npm:^1.1.2": version: 1.2.1 resolution: "prosemirror-keymap@npm:1.2.1" dependencies: @@ -45128,25 +45063,36 @@ __metadata: languageName: node linkType: hard -"prosemirror-markdown@npm:^1.10.1": - version: 1.10.1 - resolution: "prosemirror-markdown@npm:1.10.1" +"prosemirror-keymap@npm:^1.2.2": + version: 1.2.2 + resolution: "prosemirror-keymap@npm:1.2.2" dependencies: - markdown-it: "npm:^13.0.1" - prosemirror-model: "npm:^1.0.0" - checksum: 10/37b672cbb956d59737e492bf1f054278e9474932b5dd158bedc94e6e1f1492edb2d236f72f8a374c94edd517abcfd89cdfdf18694d88e05b66ae281260c3476b + prosemirror-state: "npm:^1.0.0" + w3c-keyname: "npm:^2.2.0" + checksum: 10/75a6db1a8f899918a25606fa5824ffe9dea9729b8fb4346854aa6f0e37a0f8bad40cc1b01eef1046ee442f76afc234c8eb2b1c50a03c8b6062f3cd348694b8be languageName: node linkType: hard -"prosemirror-menu@npm:^1.2.1": - version: 1.2.1 - resolution: "prosemirror-menu@npm:1.2.1" +"prosemirror-markdown@npm:^1.13.1": + version: 1.13.1 + resolution: "prosemirror-markdown@npm:1.13.1" + dependencies: + "@types/markdown-it": "npm:^14.0.0" + markdown-it: "npm:^14.0.0" + prosemirror-model: "npm:^1.20.0" + checksum: 10/91af650e17e92c1c911c8bbf7dd4c6d5ba56ee140b0fe493e4e4bab85de1121cece3736eeabb7f789ef2b40afd1f6abe870f908213ce1918fd590257a8932c6c + languageName: node + linkType: hard + +"prosemirror-menu@npm:^1.2.4": + version: 1.2.4 + resolution: "prosemirror-menu@npm:1.2.4" dependencies: crelt: "npm:^1.0.0" prosemirror-commands: "npm:^1.0.0" prosemirror-history: "npm:^1.0.0" prosemirror-state: "npm:^1.0.0" - checksum: 10/6c9c8058159636b53d97594575ab30ceea6e6b91f4d437a7953a84f7f22aee2f3df511be36bfcd3023fb3598d9c353916d4a5dae5adee3d3b14ab156b30e202b + checksum: 10/1148419fd115e86d43096d1e7574fd657547ac8875ee34ae9a2056b15f3bcc6ca104aaa305cde5ff72f19d4c4cfc9989909271d6cd317549d749a15aa4c2e2a1 languageName: node linkType: hard @@ -45159,7 +45105,7 @@ __metadata: languageName: node linkType: hard -"prosemirror-model@npm:^1.18.1, prosemirror-model@npm:^1.19.0, prosemirror-model@npm:^1.8.1": +"prosemirror-model@npm:^1.19.0, prosemirror-model@npm:^1.8.1": version: 1.19.0 resolution: "prosemirror-model@npm:1.19.0" dependencies: @@ -45168,12 +45114,21 @@ __metadata: languageName: node linkType: hard -"prosemirror-schema-basic@npm:^1.2.0": - version: 1.2.1 - resolution: "prosemirror-schema-basic@npm:1.2.1" +"prosemirror-model@npm:^1.20.0, prosemirror-model@npm:^1.21.0, prosemirror-model@npm:^1.23.0": + version: 1.24.0 + resolution: "prosemirror-model@npm:1.24.0" + dependencies: + orderedmap: "npm:^2.0.0" + checksum: 10/ce5e2e9b3aa5d5bfe5bc4090dd7113df34bd037546465305023bddd9d2ede4450f1cd38717fac286e2dda41d240d419a80916e73ec22a67226171e8e319dc5ba + languageName: node + linkType: hard + +"prosemirror-schema-basic@npm:^1.2.3": + version: 1.2.3 + resolution: "prosemirror-schema-basic@npm:1.2.3" dependencies: prosemirror-model: "npm:^1.19.0" - checksum: 10/1fd59c47c1e05d037cd030acde4b406f62d8d5f87bd6cf51c877307ab02d61a39871da53cadd07746cbb8ca4fe87c317710d00caa39bbac16774d96fe42213cc + checksum: 10/af129408a6625707ff001077565d609b1d6b4e9393e86cc628c58bc2d995f5144921f83b6123db4210b48cf26c7899dd38a5de9fdc0c288a2d40650c8e018092 languageName: node linkType: hard @@ -45188,18 +45143,18 @@ __metadata: languageName: node linkType: hard -"prosemirror-schema-list@npm:^1.2.2": - version: 1.2.2 - resolution: "prosemirror-schema-list@npm:1.2.2" +"prosemirror-schema-list@npm:^1.4.1": + version: 1.5.0 + resolution: "prosemirror-schema-list@npm:1.5.0" dependencies: prosemirror-model: "npm:^1.0.0" prosemirror-state: "npm:^1.0.0" - prosemirror-transform: "npm:^1.0.0" - checksum: 10/9957ffa98d384a348427ca20d762ec3c533ed53c56be1633fad8cbeb8acf35c362255bcfc4a587ae27828af9fa3199305227b9834f2f716b9216c232030ddb85 + prosemirror-transform: "npm:^1.7.3" + checksum: 10/754c7ba13e356783642597b59838bd5ea43fa74f43aede80181d38d3cbd2086d8ea86c50d172b8c2a1f5cc8b8c6e1b7386082265628db4f941d27495102d65bc languageName: node linkType: hard -"prosemirror-state@npm:^1.0.0, prosemirror-state@npm:^1.2.2, prosemirror-state@npm:^1.3.1, prosemirror-state@npm:^1.3.4, prosemirror-state@npm:^1.4.1": +"prosemirror-state@npm:^1.0.0, prosemirror-state@npm:^1.2.2, prosemirror-state@npm:^1.3.1, prosemirror-state@npm:^1.3.4": version: 1.4.2 resolution: "prosemirror-state@npm:1.4.2" dependencies: @@ -45210,32 +45165,41 @@ __metadata: languageName: node linkType: hard -"prosemirror-tables@npm:^1.3.0": - version: 1.3.2 - resolution: "prosemirror-tables@npm:1.3.2" +"prosemirror-state@npm:^1.4.3": + version: 1.4.3 + resolution: "prosemirror-state@npm:1.4.3" + dependencies: + prosemirror-model: "npm:^1.0.0" + prosemirror-transform: "npm:^1.0.0" + prosemirror-view: "npm:^1.27.0" + checksum: 10/57eb0cc7d7412b9d87430b5a9e489d60aed3a3eb9deffff4314b76ad6a5ae019618be658303796285877c9c535392b97b5a4d4d173485b0dd0403671ada9f2a1 + languageName: node + linkType: hard + +"prosemirror-tables@npm:^1.6.1": + version: 1.6.1 + resolution: "prosemirror-tables@npm:1.6.1" dependencies: prosemirror-keymap: "npm:^1.1.2" prosemirror-model: "npm:^1.8.1" prosemirror-state: "npm:^1.3.1" prosemirror-transform: "npm:^1.2.1" prosemirror-view: "npm:^1.13.3" - checksum: 10/df7b7aaf813fae62c5cf72b098c715cde1a380df41e7dd9f6c9341df00b7bb84326984d643ec6f8c292aa0a0d88a8078b5d804e4cb44d77649fe80369fbfc050 + checksum: 10/8ab343220594ba8e1d788d760c7234607b9ebc9d9fc44434828fb84ff990fac990ec6ce25708445e3203792d471b52b3dc1a73564863eef050fc805bc65abb22 languageName: node linkType: hard -"prosemirror-trailing-node@npm:^2.0.2": - version: 2.0.3 - resolution: "prosemirror-trailing-node@npm:2.0.3" +"prosemirror-trailing-node@npm:^3.0.0": + version: 3.0.0 + resolution: "prosemirror-trailing-node@npm:3.0.0" dependencies: - "@babel/runtime": "npm:^7.13.10" - "@remirror/core-constants": "npm:^2.0.0" - "@remirror/core-helpers": "npm:^2.0.1" + "@remirror/core-constants": "npm:3.0.0" escape-string-regexp: "npm:^4.0.0" peerDependencies: - prosemirror-model: ^1 - prosemirror-state: ^1 - prosemirror-view: ^1 - checksum: 10/122a8d4f7a57f40c0abd9b87aa9b6f17f58e5ed654adcc16528dbee16b25cacc13baafedc2e0411b3619ba93742345b19d61cd7adf1df4c3e623338f1a264e72 + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + checksum: 10/044b199b8001373c1bd4c1573876597840df89e66c1f02497a8bb4f2885ebe830faa9764e1269ed6c24bf2fde06ad5f40322afde648ae331d4663f531000adaa languageName: node linkType: hard @@ -45248,7 +45212,16 @@ __metadata: languageName: node linkType: hard -"prosemirror-transform@npm:^1.2.1, prosemirror-transform@npm:^1.7.0": +"prosemirror-transform@npm:^1.10.2, prosemirror-transform@npm:^1.7.3": + version: 1.10.2 + resolution: "prosemirror-transform@npm:1.10.2" + dependencies: + prosemirror-model: "npm:^1.21.0" + checksum: 10/be0feb6ec2a775cf00cfb251f7a261c919c8a4ba6d3217e21679631ee27a9f52757417a72301703e01b635513793019c9ad58752dd4a48929bf4a234dc094a53 + languageName: node + linkType: hard + +"prosemirror-transform@npm:^1.2.1": version: 1.7.1 resolution: "prosemirror-transform@npm:1.7.1" dependencies: @@ -45279,7 +45252,7 @@ __metadata: languageName: node linkType: hard -"prosemirror-view@npm:^1.27.0, prosemirror-view@npm:^1.28.2": +"prosemirror-view@npm:^1.27.0": version: 1.30.0 resolution: "prosemirror-view@npm:1.30.0" dependencies: @@ -45290,6 +45263,17 @@ __metadata: languageName: node linkType: hard +"prosemirror-view@npm:^1.31.0, prosemirror-view@npm:^1.37.0": + version: 1.37.0 + resolution: "prosemirror-view@npm:1.37.0" + dependencies: + prosemirror-model: "npm:^1.20.0" + prosemirror-state: "npm:^1.0.0" + prosemirror-transform: "npm:^1.1.0" + checksum: 10/6455646ae3c9093fb754bf6e65a722682065f66d432cebe81c9d1fd84c1e8ccf106abc78a3a0cb52c1c5b34c8a69fde169de6639ddcb9381c8036c5fac83262d + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -45631,6 +45615,13 @@ __metadata: languageName: node linkType: hard +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: 10/f0e946d1edf063f9e3d30a32ca86d8ff90ed13ca40dad9c75d37510a04473340cfc98db23a905cc1e517b1e9deb0f6021dce6f422ace235c60d3c9ac47c5a16a + languageName: node + linkType: hard + "punycode@npm:^1.3.2": version: 1.4.1 resolution: "punycode@npm:1.4.1" @@ -50844,7 +50835,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.0.0, type-fest@npm:^2.11.2, type-fest@npm:^2.12.2, type-fest@npm:^2.19.0, type-fest@npm:~2.19": +"type-fest@npm:^2.11.2, type-fest@npm:^2.12.2, type-fest@npm:^2.19.0, type-fest@npm:~2.19": version: 2.19.0 resolution: "type-fest@npm:2.19.0" checksum: 10/7bf9e8fdf34f92c8bb364c0af14ca875fac7e0183f2985498b77be129dc1b3b1ad0a6b3281580f19e48c6105c037fb966ad9934520c69c6434d17fd0af4eed78 @@ -50983,10 +50974,10 @@ __metadata: languageName: node linkType: hard -"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": - version: 1.0.6 - resolution: "uc.micro@npm:1.0.6" - checksum: 10/6898bb556319a38e9cf175e3628689347bd26fec15fc6b29fa38e0045af63075ff3fea4cf1fdba9db46c9f0cbf07f2348cd8844889dd31ebd288c29fe0d27e7a +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 10/37197358242eb9afe367502d4638ac8c5838b78792ab218eafe48287b0ed28aaca268ec0392cc5729f6c90266744de32c06ae938549aee041fc93b0f9672d6b2 languageName: node linkType: hard