chore: move common workspace plan/feature config to @speckle/shared (#4064)

fix: gqlgen regenerated
This commit is contained in:
Kristaps Fabians Geikins
2025-02-27 11:18:30 +02:00
committed by GitHub
parent 735a14279e
commit ec092fb042
61 changed files with 2758 additions and 1510 deletions
+42
View File
@@ -44,6 +44,9 @@ workflows:
- test-objectsender:
filters: *filters-allow-all
- test-shared:
filters: *filters-allow-all
- test-preview-service:
filters: *filters-allow-all
@@ -184,6 +187,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -200,6 +204,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -224,6 +229,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -240,6 +246,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -256,6 +263,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -272,6 +280,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -294,6 +303,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -310,6 +320,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-server
- test-server-no-ff
- test-server-multiregion
@@ -357,6 +368,7 @@ workflows:
- test-frontend-2
- test-viewer
- test-objectsender
- test-shared
- test-preview-service
- publish-viewer-sandbox-cloudflare-pages:
@@ -727,6 +739,36 @@ jobs:
command: yarn test
working_directory: 'packages/preview-service'
test-shared:
docker: *docker-node-browsers-image
resource_class: medium+
steps:
- checkout
- restore_cache:
name: Restore Yarn Package Cache
keys:
- yarn-packages-server-{{ checksum "yarn.lock" }}
- run:
name: Install Dependencies
command: yarn
- save_cache:
name: Save Yarn Package Cache
key: yarn-packages-server-{{ checksum "yarn.lock" }}
paths:
- .yarn/cache
- .yarn/unplugged
- run:
name: Lint
command: yarn lint:ci
working_directory: 'packages/shared'
- run:
name: Run tests
command: yarn test:single-run
working_directory: 'packages/shared'
test-objectsender:
docker: *docker-node-browsers-image
resource_class: large
+3 -1
View File
@@ -63,6 +63,7 @@
"prettier": "^2.5.1",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.0.0",
"vitest": "^3.0.7",
"zx": "^8.1.2"
},
"resolutions": {
@@ -91,7 +92,8 @@
"typescript": "^5.7.3",
"typescript-eslint": "^8.20.0",
"wait-on": ">=7.2.0",
"vue-tsc@npm:2.2.2/@vue/language-core": "2.2.0"
"vue-tsc@npm:2.2.2/@vue/language-core": "2.2.0",
"vitest": "^3.0.7"
},
"config": {
"commitizen": {
+1
View File
@@ -23,6 +23,7 @@ const config: CodegenConfig = {
'./lib/common/generated/gql/': {
preset: 'client',
config: {
enumsAsConst: true,
useTypeImports: true,
fragmentMasking: false,
dedupeFragments: true,
@@ -22,13 +22,7 @@
<div class="flex flex-col sm:flex-row gap-2 sm:items-center truncate">
<div class="sm:truncate">
<div
v-if="
[
AutomateRunStatus.Initializing,
AutomateRunStatus.Running,
AutomateRunStatus.Pending
].includes(functionRun.status)
"
v-if="isStartingOrRunning"
class="text-body-2xs text-foreground-2 italic whitespace-normal sm:truncate"
>
Function is {{ functionRun.status.toLowerCase() }}.
@@ -141,4 +135,14 @@ const results = useAutomationFunctionRunResults({
const showAttachmentDialog = ref(false)
const attachments = computed(() => results.value?.values.blobIds || [])
const isStartingOrRunning = computed(() =>
(
[
AutomateRunStatus.Initializing,
AutomateRunStatus.Running,
AutomateRunStatus.Pending
] as string[]
).includes(props.functionRun.status)
)
</script>
@@ -156,11 +156,13 @@ const hasValidContextView = computed(() => {
})
const statusMessage = computed(() => {
const isFinished = ![
AutomateRunStatus.Initializing,
AutomateRunStatus.Running,
AutomateRunStatus.Pending
].includes(props.functionRun.status)
const isFinished = !(
[
AutomateRunStatus.Initializing,
AutomateRunStatus.Running,
AutomateRunStatus.Pending
] as string[]
).includes(props.functionRun.status)
return isFinished
? props.functionRun.statusMessage ?? 'No status message'
@@ -5,7 +5,7 @@
<div class="flex items-center gap-x-2">
<h4 class="text-body font-medium">
Workspace
<span class="capitalize">{{ plan.name }}</span>
<span class="capitalize">{{ plan }}</span>
</h4>
<CommonBadge v-if="badgeText" rounded>
{{ badgeText }}
@@ -15,8 +15,8 @@
<span class="font-medium">
£{{
yearlyIntervalSelected
? plan.cost.yearly[Roles.Workspace.Member]
: plan.cost.monthly[Roles.Workspace.Member]
? planPrices.yearly[Roles.Workspace.Member]
: planPrices.monthly[Roles.Workspace.Member]
}}
</span>
per seat/month
@@ -40,7 +40,7 @@
<div v-else>
<!-- Key to fix tippy reactivity -->
<div
:key="`tooltip-${yearlyIntervalSelected}-${plan.name}-${currentPlan?.name}`"
:key="`tooltip-${yearlyIntervalSelected}-${plan}-${currentPlan?.name}`"
v-tippy="buttonTooltip"
>
<FormButton
@@ -56,32 +56,35 @@
</div>
<ul class="flex flex-col gap-y-2 mt-4 pt-3 border-t border-outline-3">
<li
v-for="feature in features"
:key="feature.name"
v-for="(featureMetadata, feature) in WorkspacePlanFeaturesMetadata"
:key="feature"
class="flex items-center text-body-xs"
:class="{
'lg:hidden': !plan.features.includes(feature.name as PlanFeaturesList)
}"
'lg:hidden': !planFeatures.includes(feature)
}"
>
<IconCheck
v-if="plan.features.includes(feature.name as PlanFeaturesList)"
v-if="planFeatures.includes(feature)"
class="w-4 h-4 text-foreground mx-2"
/>
<XMarkIcon v-else class="w-4 h-4 mx-2 text-foreground-3" />
<span
v-tippy="
feature.description(
yearlyIntervalSelected
? plan.cost.yearly[Roles.Workspace.Guest]
: plan.cost.monthly[Roles.Workspace.Guest]
)
isFunction(featureMetadata.description)
? featureMetadata.description({
price: (yearlyIntervalSelected
? planPrices.yearly[Roles.Workspace.Guest]
: planPrices.monthly[Roles.Workspace.Guest]
).toString()
})
: featureMetadata.description
"
class="underline decoration-outline-5 decoration-dashed underline-offset-4 cursor-help"
:class="{
'text-foreground-2': !plan.features.includes(feature.name as PlanFeaturesList)
'text-foreground-2': !planFeatures.includes(feature)
}"
>
{{ feature.name }}
{{ featureMetadata.displayName }}
</span>
</li>
</ul>
@@ -89,7 +92,7 @@
<SettingsWorkspacesBillingUpgradeDialog
v-if="currentPlan?.name && workspaceId"
v-model:open="isUpgradeDialogOpen"
:plan="plan.name"
:plan="plan"
:billing-interval="
yearlyIntervalSelected ? BillingInterval.Yearly : BillingInterval.Monthly
"
@@ -99,28 +102,30 @@
</template>
<script setup lang="ts">
import type { PricingPlan } from '@/lib/billing/helpers/types'
import { Roles } from '@speckle/shared'
import {
type PaidWorkspacePlansOld,
type MaybeNullOrUndefined,
WorkspacePlans,
WorkspacePlanFeaturesMetadata
} from '@speckle/shared'
import { Roles, WorkspacePlanConfigs } from '@speckle/shared'
import {
type WorkspacePlan,
WorkspacePlanStatuses,
WorkspacePlans,
BillingInterval
} from '~/lib/common/generated/gql/graphql'
import type { MaybeNullOrUndefined } from '@speckle/shared'
import { startCase } from 'lodash'
import { pricingPlansConfig } from '~/lib/billing/helpers/constants'
import type { PlanFeaturesList } from '~/lib/billing/helpers/types'
import { startCase, isFunction } from 'lodash'
import { XMarkIcon } from '@heroicons/vue/24/outline'
import type { SetupContext } from 'vue'
import { WorkspaceOldPaidPlanPrices } from '~/lib/billing/helpers/constants'
const emit = defineEmits<{
(e: 'onYearlyIntervalSelected', value: boolean): void
(e: 'onPlanSelected', value: WorkspacePlans): void
(e: 'onPlanSelected', value: PaidWorkspacePlansOld): void
}>()
const props = defineProps<{
plan: PricingPlan
plan: PaidWorkspacePlansOld
yearlyIntervalSelected: boolean
badgeText?: string
// The following props are optional if the table is for informational purposes
@@ -132,10 +137,12 @@ const props = defineProps<{
const slots: SetupContext['slots'] = useSlots()
const features = ref(pricingPlansConfig.features)
const isUpgradeDialogOpen = ref(false)
const isYearlyIntervalSelected = ref(props.yearlyIntervalSelected)
const planPrices = computed(() => WorkspaceOldPaidPlanPrices[props.plan])
const planFeatures = computed(() => WorkspacePlanConfigs[props.plan].features)
const hasCta = computed(() => !!slots.cta)
const canUpgradeToPlan = computed(() => {
if (!props.currentPlan) return false
@@ -149,10 +156,13 @@ const canUpgradeToPlan = computed(() => {
[WorkspacePlans.StarterInvoiced]: [],
[WorkspacePlans.PlusInvoiced]: [],
[WorkspacePlans.BusinessInvoiced]: [],
[WorkspacePlans.Free]: []
// New
[WorkspacePlans.Free]: [],
[WorkspacePlans.Team]: [],
[WorkspacePlans.Pro]: []
}
return allowedUpgrades[props.currentPlan.name].includes(props.plan.name)
return allowedUpgrades[props.currentPlan.name].includes(props.plan)
})
const statusIsTrial = computed(
@@ -166,17 +176,17 @@ const isMatchingInterval = computed(
)
const isDowngrade = computed(() => {
return !canUpgradeToPlan.value && props.currentPlan?.name !== props.plan.name
return !canUpgradeToPlan.value && props.currentPlan?.name !== props.plan
})
const isCurrentPlan = computed(
() => isMatchingInterval.value && props.currentPlan?.name === props.plan.name
() => isMatchingInterval.value && props.currentPlan?.name === props.plan
)
const isAnnualToMonthly = computed(() => {
return (
!isMatchingInterval.value &&
props.currentPlan?.name === props.plan.name &&
props.currentPlan?.name === props.plan &&
!props.yearlyIntervalSelected
)
})
@@ -184,7 +194,7 @@ const isAnnualToMonthly = computed(() => {
const isMonthlyToAnnual = computed(() => {
return (
!isMatchingInterval.value &&
props.currentPlan?.name === props.plan.name &&
props.currentPlan?.name === props.plan &&
props.yearlyIntervalSelected
)
})
@@ -200,8 +210,7 @@ const isSelectable = computed(() => {
return true
// Allow selection if switching from monthly to yearly for the same plan
if (isMonthlyToAnnual.value && props.currentPlan?.name === props.plan.name)
return true
if (isMonthlyToAnnual.value && props.currentPlan?.name === props.plan) return true
// Disable if current plan and intervals match
if (isCurrentPlan.value) return false
@@ -227,7 +236,7 @@ const buttonColor = computed(() => {
statusIsTrial.value ||
props.currentPlan?.status === WorkspacePlanStatuses.Expired
) {
return props.plan.name === WorkspacePlans.Starter ? 'primary' : 'outline'
return props.plan === WorkspacePlans.Starter ? 'primary' : 'outline'
}
return 'outline'
})
@@ -239,7 +248,7 @@ const buttonText = computed(() => {
props.currentPlan?.status === WorkspacePlanStatuses.Expired ||
props.currentPlan?.status === WorkspacePlanStatuses.Canceled
) {
return `Subscribe to ${startCase(props.plan.name)}`
return `Subscribe to ${startCase(props.plan)}`
}
// Current plan case
if (isCurrentPlan.value) {
@@ -247,7 +256,7 @@ const buttonText = computed(() => {
}
// Billing interval and lower plan case
if (isDowngrade.value) {
return `Downgrade to ${props.plan.name}`
return `Downgrade to ${props.plan}`
}
// Billing interval change and current plan
if (isAnnualToMonthly.value) {
@@ -257,7 +266,7 @@ const buttonText = computed(() => {
return 'Change to annual plan'
}
// Upgrade case
return canUpgradeToPlan.value ? `Upgrade to ${startCase(props.plan.name)}` : ''
return canUpgradeToPlan.value ? `Upgrade to ${startCase(props.plan)}` : ''
})
const buttonTooltip = computed(() => {
@@ -293,7 +302,7 @@ const buttonTooltip = computed(() => {
})
const onCtaClick = () => {
emit('onPlanSelected', props.plan.name)
emit('onPlanSelected', props.plan)
}
watch(
@@ -1,8 +1,8 @@
<template>
<div class="flex flex-col lg:grid lg:grid-cols-3 gap-4 w-full">
<SettingsWorkspacesBillingPricingTablePlan
v-for="plan in plans"
:key="plan.name"
v-for="plan in oldPlans"
:key="plan"
:plan="plan"
:yearly-interval-selected="isYearlySelected"
v-bind="$props"
@@ -13,16 +13,14 @@
</template>
<script setup lang="ts">
import {
type WorkspacePlan,
BillingInterval,
type WorkspacePlans
} from '~/lib/common/generated/gql/graphql'
import { pricingPlansConfig } from '~/lib/billing/helpers/constants'
import type { MaybeNullOrUndefined } from '@speckle/shared'
import { type WorkspacePlan, BillingInterval } from '~/lib/common/generated/gql/graphql'
import { type MaybeNullOrUndefined, PaidWorkspacePlansOld } from '@speckle/shared'
const emit = defineEmits<{
(e: 'onPlanSelected', value: { name: WorkspacePlans; cycle: BillingInterval }): void
(
e: 'onPlanSelected',
value: { name: PaidWorkspacePlansOld; cycle: BillingInterval }
): void
}>()
const props = defineProps<{
@@ -32,14 +30,14 @@ const props = defineProps<{
activeBillingInterval?: BillingInterval
}>()
const plans = ref(pricingPlansConfig.plans)
const isYearlySelected = ref(false)
const oldPlans = computed(() => Object.values(PaidWorkspacePlansOld))
const onYearlyIntervalSelected = (newValue: boolean) => {
isYearlySelected.value = newValue
}
const onPlanSelected = (value: WorkspacePlans) => {
const onPlanSelected = (value: PaidWorkspacePlansOld) => {
emit('onPlanSelected', {
name: value,
cycle: isYearlySelected.value ? BillingInterval.Yearly : BillingInterval.Monthly
@@ -22,18 +22,18 @@
<script setup lang="ts">
import type { LayoutDialogButton } from '@speckle/ui-components'
import {
type WorkspacePlans,
BillingInterval,
type PaidWorkspacePlans
} from '~/lib/common/generated/gql/graphql'
import { useBillingActions } from '~/lib/billing/composables/actions'
import { startCase } from 'lodash'
import { pricingPlansConfig } from '~/lib/billing/helpers/constants'
import type { PaidWorkspacePlansOld } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { isPaidPlan } from '~/lib/billing/helpers/types'
import { WorkspaceOldPaidPlanPrices } from '~/lib/billing/helpers/constants'
const props = defineProps<{
plan: WorkspacePlans
plan: PaidWorkspacePlansOld
billingInterval: BillingInterval
workspaceId: string
}>()
@@ -43,9 +43,8 @@ const { upgradePlan } = useBillingActions()
const seatPrice = computed(() => {
if (isPaidPlan(props.plan)) {
const planConfig =
pricingPlansConfig.plans[props.plan as unknown as PaidWorkspacePlans]
return planConfig.cost[props.billingInterval][Roles.Workspace.Member]
const prices = WorkspaceOldPaidPlanPrices[props.plan]
return prices[props.billingInterval][Roles.Workspace.Member]
}
return 0
@@ -3,12 +3,12 @@
<div class="flex flex-col max-w-5xl w-full items-center">
<div class="grid lg:grid-cols-3 gap-y-2 gap-x-2 w-full">
<SettingsWorkspacesBillingPricingTablePlan
v-for="plan in plans"
:key="plan.name"
v-for="plan in oldPlans"
:key="plan"
:plan="plan"
:yearly-interval-selected="isYearlySelected"
:badge-text="
plan.name === WorkspacePlans.Starter && !isYearlySelected
plan === WorkspacePlans.Starter && !isYearlySelected
? '30-day free trial'
: undefined
"
@@ -16,14 +16,14 @@
>
<template #cta>
<FormButton
:color="plan.name === WorkspacePlans.Starter ? 'primary' : 'outline'"
:color="plan === WorkspacePlans.Starter ? 'primary' : 'outline'"
full-width
@click="onCtaClick(plan.name)"
@click="onCtaClick(plan)"
>
{{
plan.name === WorkspacePlans.Starter && !isYearlySelected
plan === WorkspacePlans.Starter && !isYearlySelected
? 'Start 30-day free trial'
: `Subscribe to ${startCase(plan.name)}`
: `Subscribe to ${startCase(plan)}`
}}
</FormButton>
</template>
@@ -45,16 +45,17 @@ import {
WorkspacePlans
} from '~/lib/common/generated/gql/graphql'
import { useWorkspacesWizard } from '~/lib/workspaces/composables/wizard'
import { pricingPlansConfig } from '~/lib/billing/helpers/constants'
import { useMixpanel } from '~/lib/core/composables/mp'
import { startCase } from 'lodash'
import { PaidWorkspacePlansOld } from '@speckle/shared'
const { goToNextStep, goToPreviousStep, state } = useWorkspacesWizard()
const mixpanel = useMixpanel()
const plans = ref(pricingPlansConfig.plans)
const isYearlySelected = ref(false)
const oldPlans = computed(() => Object.values(PaidWorkspacePlansOld))
const onCtaClick = (plan: WorkspacePlans) => {
state.value.plan = plan as unknown as PaidWorkspacePlans
state.value.billingInterval = isYearlySelected.value
@@ -62,12 +62,14 @@ export const useAutomationRunSummary = (params: {
?.functionRuns.filter(
(r): r is SetFullyRequired<typeof r, 'statusMessage'> =>
!!(
[
AutomateRunStatus.Failed,
AutomateRunStatus.Canceled,
AutomateRunStatus.Exception,
AutomateRunStatus.Timeout
].includes(r.status) && r.statusMessage?.length
(
[
AutomateRunStatus.Failed,
AutomateRunStatus.Canceled,
AutomateRunStatus.Exception,
AutomateRunStatus.Timeout
] as string[]
).includes(r.status) && r.statusMessage?.length
)
)
.map((r) => r.statusMessage) || []
@@ -141,9 +143,9 @@ export const useAutomationRunDetailsFns = () => {
const end =
run.status === AutomateRunStatus.Running
? now.value
: [AutomateRunStatus.Initializing, AutomateRunStatus.Pending].includes(
run.status
)
: (
[AutomateRunStatus.Initializing, AutomateRunStatus.Pending] as string[]
).includes(run.status)
? undefined
: run.updatedAt
if (!end) return undefined
@@ -1,114 +1,48 @@
import { WorkspacePlans, BillingInterval } from '~/lib/common/generated/gql/graphql'
import { Roles } from '@speckle/shared'
import { PlanFeaturesList, type PricingPlan } from '@/lib/billing/helpers/types'
import {
PaidWorkspacePlansOld,
Roles,
WorkspacePlanBillingIntervals,
type WorkspacePlanPriceStructure
} from '@speckle/shared'
const baseFeatures = [
PlanFeaturesList.Workspaces,
PlanFeaturesList.RoleManagement,
PlanFeaturesList.GuestUsers,
PlanFeaturesList.PrivateAutomateFunctions,
PlanFeaturesList.DomainSecurity
]
export const pricingPlansConfig: {
features: Record<
PlanFeaturesList,
{ name: string; description: (price?: number) => string }
>
plans: Record<
WorkspacePlans.Starter | WorkspacePlans.Plus | WorkspacePlans.Business,
PricingPlan
>
// TODO: Read these from API, especially for new plans
export const WorkspaceOldPaidPlanPrices: {
[plan in PaidWorkspacePlansOld]: WorkspacePlanPriceStructure
} = {
features: {
[PlanFeaturesList.Workspaces]: {
name: PlanFeaturesList.Workspaces,
description: () => `A shared space for your team and projects`
[PaidWorkspacePlansOld.Starter]: {
[WorkspacePlanBillingIntervals.Monthly]: {
[Roles.Workspace.Guest]: 15,
[Roles.Workspace.Member]: 15,
[Roles.Workspace.Admin]: 15
},
[PlanFeaturesList.RoleManagement]: {
name: PlanFeaturesList.RoleManagement,
description: () => `Control individual members' access and edit rights`
},
[PlanFeaturesList.GuestUsers]: {
name: PlanFeaturesList.GuestUsers,
description: (price?: number) =>
`Give guests access to specific projects in the workspace at £${price}/month/guest`
},
[PlanFeaturesList.PrivateAutomateFunctions]: {
name: PlanFeaturesList.PrivateAutomateFunctions,
description: () =>
`Create and manage private automation functions securely within your workspace`
},
[PlanFeaturesList.DomainSecurity]: {
name: PlanFeaturesList.DomainSecurity,
description: () => `Require workspace members to use a verified company email`
},
[PlanFeaturesList.SSO]: {
name: PlanFeaturesList.SSO,
description: () => `Require workspace members to log in with your SSO provider`
},
[PlanFeaturesList.CustomDataRegion]: {
name: PlanFeaturesList.CustomDataRegion,
description: () => `Store the workspace data in a custom region`
},
[PlanFeaturesList.PrioritySupport]: {
name: PlanFeaturesList.PrioritySupport,
description: () => `Personal and fast support`
[WorkspacePlanBillingIntervals.Yearly]: {
[Roles.Workspace.Guest]: 12,
[Roles.Workspace.Member]: 12,
[Roles.Workspace.Admin]: 12
}
},
plans: {
[WorkspacePlans.Starter]: {
name: WorkspacePlans.Starter,
features: [...baseFeatures],
cost: {
[BillingInterval.Monthly]: {
[Roles.Workspace.Guest]: 15,
[Roles.Workspace.Member]: 15,
[Roles.Workspace.Admin]: 15
},
[BillingInterval.Yearly]: {
[Roles.Workspace.Guest]: 12,
[Roles.Workspace.Member]: 12,
[Roles.Workspace.Admin]: 12
}
}
[PaidWorkspacePlansOld.Plus]: {
[WorkspacePlanBillingIntervals.Monthly]: {
[Roles.Workspace.Guest]: 15,
[Roles.Workspace.Member]: 50,
[Roles.Workspace.Admin]: 50
},
[WorkspacePlans.Plus]: {
name: WorkspacePlans.Plus,
features: [...baseFeatures, PlanFeaturesList.SSO],
cost: {
[BillingInterval.Monthly]: {
[Roles.Workspace.Guest]: 15,
[Roles.Workspace.Member]: 50,
[Roles.Workspace.Admin]: 50
},
[BillingInterval.Yearly]: {
[Roles.Workspace.Guest]: 12,
[Roles.Workspace.Member]: 40,
[Roles.Workspace.Admin]: 40
}
}
[WorkspacePlanBillingIntervals.Yearly]: {
[Roles.Workspace.Guest]: 12,
[Roles.Workspace.Member]: 40,
[Roles.Workspace.Admin]: 40
}
},
[PaidWorkspacePlansOld.Business]: {
[WorkspacePlanBillingIntervals.Monthly]: {
[Roles.Workspace.Guest]: 15,
[Roles.Workspace.Member]: 75,
[Roles.Workspace.Admin]: 75
},
[WorkspacePlans.Business]: {
name: WorkspacePlans.Business,
features: [
...baseFeatures,
PlanFeaturesList.SSO,
PlanFeaturesList.CustomDataRegion,
PlanFeaturesList.PrioritySupport
],
cost: {
[BillingInterval.Monthly]: {
[Roles.Workspace.Guest]: 15,
[Roles.Workspace.Member]: 75,
[Roles.Workspace.Admin]: 75
},
[BillingInterval.Yearly]: {
[Roles.Workspace.Guest]: 12,
[Roles.Workspace.Member]: 60,
[Roles.Workspace.Admin]: 60
}
}
[WorkspacePlanBillingIntervals.Yearly]: {
[Roles.Workspace.Guest]: 12,
[Roles.Workspace.Member]: 60,
[Roles.Workspace.Admin]: 60
}
}
}
@@ -1,31 +1,6 @@
import {
type BillingInterval,
type WorkspacePlans,
PaidWorkspacePlans
} from '~/lib/common/generated/gql/graphql'
import type { WorkspaceRoles } from '@speckle/shared'
export enum PlanFeaturesList {
Workspaces = 'Workspaces',
RoleManagement = 'Role management',
GuestUsers = 'Guest users',
PrivateAutomateFunctions = 'Private automate functions',
DomainSecurity = 'Domain security',
SSO = 'Single Sign-On (SSO)',
CustomDataRegion = 'Custom data residency',
PrioritySupport = 'Priority support'
}
export type PricingPlan = {
name: WorkspacePlans
features: PlanFeaturesList[]
cost: {
[I in BillingInterval]: Record<WorkspaceRoles, number>
}
}
import type { WorkspacePlans } from '@speckle/shared'
import { PaidWorkspacePlans } from '@speckle/shared'
// Check if the plan matches PaidWorkspacePlans
export const isPaidPlan = (plan?: WorkspacePlans): boolean =>
plan
? Object.values(PaidWorkspacePlans).includes(plan as unknown as PaidWorkspacePlans)
: false
plan ? (Object.values(PaidWorkspacePlans) as string[]).includes(plan) : false
@@ -13,7 +13,391 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
* Therefore it is highly recommended to use the babel or swc plugin for production.
* Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
*/
const documents = {
type Documents = {
"\n fragment AuthLoginWithEmailBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n email\n user {\n id\n }\n }\n": typeof types.AuthLoginWithEmailBlock_PendingWorkspaceCollaboratorFragmentDoc,
"\n query AuthRegisterPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n": typeof types.AuthRegisterPanelWorkspaceInviteDocument,
"\n fragment ServerTermsOfServicePrivacyPolicyFragment on ServerInfo {\n termsOfService\n }\n": typeof types.ServerTermsOfServicePrivacyPolicyFragmentFragmentDoc,
"\n fragment AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n workspaceName\n email\n user {\n id\n ...LimitedUserAvatar\n }\n }\n": typeof types.AuthWorkspaceInviteHeader_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment AuthSsoLogin_Workspace on LimitedWorkspace {\n id\n slug\n name\n logo\n }\n": typeof types.AuthSsoLogin_WorkspaceFragmentDoc,
"\n fragment AuthStategiesServerInfoFragment on ServerInfo {\n authStrategies {\n id\n name\n url\n }\n ...AuthThirdPartyLoginButtonOIDC_ServerInfo\n }\n": typeof types.AuthStategiesServerInfoFragmentFragmentDoc,
"\n fragment AuthThirdPartyLoginButtonOIDC_ServerInfo on ServerInfo {\n authStrategies {\n id\n name\n }\n }\n": typeof types.AuthThirdPartyLoginButtonOidc_ServerInfoFragmentDoc,
"\n fragment AutomateAutomationCreateDialog_AutomateFunction on AutomateFunction {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunction\n }\n": typeof types.AutomateAutomationCreateDialog_AutomateFunctionFragmentDoc,
"\n fragment AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunction on AutomateFunction {\n id\n releases(limit: 1) {\n items {\n id\n inputSchema\n }\n }\n }\n": typeof types.AutomateAutomationCreateDialogFunctionParametersStep_AutomateFunctionFragmentDoc,
"\n query AutomationCreateDialogFunctionsSearch(\n $workspaceId: String!\n $search: String\n $cursor: String = null\n ) {\n workspace(id: $workspaceId) {\n automateFunctions(limit: 20, filter: { search: $search }, cursor: $cursor) {\n cursor\n totalCount\n items {\n id\n ...AutomateAutomationCreateDialog_AutomateFunction\n }\n }\n }\n }\n": typeof types.AutomationCreateDialogFunctionsSearchDocument,
"\n fragment AutomationsFunctionsCard_AutomateFunction on AutomateFunction {\n id\n name\n isFeatured\n description\n logo\n repo {\n id\n url\n owner\n name\n }\n }\n": typeof types.AutomationsFunctionsCard_AutomateFunctionFragmentDoc,
"\n fragment AutomateFunctionCreateDialog_Workspace on Workspace {\n id\n name\n slug\n }\n": typeof types.AutomateFunctionCreateDialog_WorkspaceFragmentDoc,
"\n fragment AutomateFunctionEditDialog_Workspace on Workspace {\n id\n name\n }\n": typeof types.AutomateFunctionEditDialog_WorkspaceFragmentDoc,
"\n fragment AutomateFunctionCreateDialogDoneStep_AutomateFunction on AutomateFunction {\n id\n repo {\n id\n url\n owner\n name\n }\n ...AutomationsFunctionsCard_AutomateFunction\n }\n": typeof types.AutomateFunctionCreateDialogDoneStep_AutomateFunctionFragmentDoc,
"\n fragment AutomateFunctionCreateDialogTemplateStep_AutomateFunctionTemplate on AutomateFunctionTemplate {\n id\n title\n logo\n url\n }\n": typeof types.AutomateFunctionCreateDialogTemplateStep_AutomateFunctionTemplateFragmentDoc,
"\n fragment AutomateFunctionPageHeader_Function on AutomateFunction {\n id\n name\n logo\n repo {\n id\n url\n owner\n name\n }\n releases(limit: 1) {\n totalCount\n }\n workspaceIds\n }\n\n fragment AutomateFunctionPageHeader_Workspace on Workspace {\n id\n name\n slug\n }\n": typeof types.AutomateFunctionPageHeader_FunctionFragmentDoc,
"\n fragment AutomateFunctionPageInfo_AutomateFunction on AutomateFunction {\n id\n repo {\n id\n url\n owner\n name\n }\n description\n releases(limit: 1) {\n items {\n id\n inputSchema\n createdAt\n commitId\n ...AutomateFunctionPageParametersDialog_AutomateFunctionRelease\n }\n }\n }\n": typeof types.AutomateFunctionPageInfo_AutomateFunctionFragmentDoc,
"\n fragment AutomateFunctionPageParametersDialog_AutomateFunctionRelease on AutomateFunctionRelease {\n id\n inputSchema\n }\n": typeof types.AutomateFunctionPageParametersDialog_AutomateFunctionReleaseFragmentDoc,
"\n fragment AutomateFunctionsPageHeader_Query on Query {\n activeUser {\n id\n role\n automateInfo {\n hasAutomateGithubApp\n availableGithubOrgs\n }\n }\n serverInfo {\n automate {\n availableFunctionTemplates {\n ...AutomateFunctionCreateDialogTemplateStep_AutomateFunctionTemplate\n }\n }\n }\n }\n": typeof types.AutomateFunctionsPageHeader_QueryFragmentDoc,
"\n fragment AutomateFunctionsPageItems_Query on Query {\n automateFunctions(limit: 6, filter: { search: $search }, cursor: $cursor) {\n totalCount\n items {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateAutomationCreateDialog_AutomateFunction\n }\n cursor\n }\n }\n": typeof types.AutomateFunctionsPageItems_QueryFragmentDoc,
"\n fragment AutomateRunsTriggerStatus_TriggeredAutomationsStatus on TriggeredAutomationsStatus {\n id\n ...TriggeredAutomationsStatusSummary\n ...AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus\n }\n": typeof types.AutomateRunsTriggerStatus_TriggeredAutomationsStatusFragmentDoc,
"\n fragment AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus on TriggeredAutomationsStatus {\n id\n automationRuns {\n id\n ...AutomateRunsTriggerStatusDialogRunsRows_AutomateRun\n }\n }\n": typeof types.AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatusFragmentDoc,
"\n fragment AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRun on AutomateFunctionRun {\n id\n results\n status\n statusMessage\n contextView\n function {\n id\n logo\n name\n }\n createdAt\n updatedAt\n }\n": typeof types.AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRunFragmentDoc,
"\n fragment AutomateRunsTriggerStatusDialogRunsRows_AutomateRun on AutomateRun {\n id\n functionRuns {\n id\n ...AutomateRunsTriggerStatusDialogFunctionRun_AutomateFunctionRun\n }\n ...AutomationsStatusOrderedRuns_AutomationRun\n }\n": typeof types.AutomateRunsTriggerStatusDialogRunsRows_AutomateRunFragmentDoc,
"\n fragment AutomateViewerPanel_AutomateRun on AutomateRun {\n id\n functionRuns {\n id\n ...AutomateViewerPanelFunctionRunRow_AutomateFunctionRun\n }\n ...AutomationsStatusOrderedRuns_AutomationRun\n }\n": typeof types.AutomateViewerPanel_AutomateRunFragmentDoc,
"\n fragment AutomateViewerPanelFunctionRunRow_AutomateFunctionRun on AutomateFunctionRun {\n id\n results\n status\n statusMessage\n contextView\n function {\n id\n logo\n name\n }\n createdAt\n updatedAt\n }\n": typeof types.AutomateViewerPanelFunctionRunRow_AutomateFunctionRunFragmentDoc,
"\n fragment BillingAlert_Workspace on Workspace {\n id\n plan {\n name\n status\n createdAt\n }\n subscription {\n billingInterval\n currentBillingCycleEnd\n }\n }\n": typeof types.BillingAlert_WorkspaceFragmentDoc,
"\n fragment CommonModelSelectorModel on Model {\n id\n name\n }\n": typeof types.CommonModelSelectorModelFragmentDoc,
"\n fragment DashboardProjectCard_Project on Project {\n id\n name\n role\n updatedAt\n models {\n totalCount\n }\n team {\n user {\n ...LimitedUserAvatar\n }\n }\n workspace {\n id\n slug\n name\n logo\n }\n }\n": typeof types.DashboardProjectCard_ProjectFragmentDoc,
"\n fragment Sidebar_User on User {\n id\n automateFunctions {\n items {\n id\n name\n description\n logo\n }\n }\n }\n": typeof types.Sidebar_UserFragmentDoc,
"\n fragment FormSelectModels_Model on Model {\n id\n name\n }\n": typeof types.FormSelectModels_ModelFragmentDoc,
"\n fragment FormSelectProjects_Project on Project {\n id\n name\n }\n": typeof types.FormSelectProjects_ProjectFragmentDoc,
"\n fragment FormUsersSelectItem on LimitedUser {\n id\n name\n avatar\n }\n": typeof types.FormUsersSelectItemFragmentDoc,
"\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.HeaderNavShare_ProjectFragmentDoc,
"\n fragment InviteDialogWorkspace_Workspace on Workspace {\n id\n domainBasedMembershipProtectionEnabled\n domains {\n domain\n id\n }\n plan {\n status\n name\n }\n subscription {\n seats {\n guest\n plan\n }\n }\n }\n": typeof types.InviteDialogWorkspace_WorkspaceFragmentDoc,
"\n fragment InviteDialogProject_Project on Project {\n id\n name\n ...InviteDialogProjectWorkspaceMembers_Project\n workspace {\n id\n name\n defaultProjectRole\n role\n domainBasedMembershipProtectionEnabled\n domains {\n domain\n id\n }\n plan {\n status\n name\n }\n subscription {\n seats {\n guest\n plan\n }\n }\n }\n }\n": typeof types.InviteDialogProject_ProjectFragmentDoc,
"\n fragment InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaborator on WorkspaceCollaborator {\n role\n id\n user {\n id\n name\n bio\n company\n avatar\n verified\n role\n }\n }\n": typeof types.InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaboratorFragmentDoc,
"\n fragment InviteDialogProjectWorkspaceMembers_Project on Project {\n id\n ...ProjectPageTeamInternals_Project\n workspace {\n team {\n items {\n ...InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaborator\n }\n }\n }\n }\n": typeof types.InviteDialogProjectWorkspaceMembers_ProjectFragmentDoc,
"\n fragment ProjectModelPageHeaderProject on Project {\n id\n name\n model(id: $modelId) {\n id\n name\n description\n }\n workspace {\n id\n slug\n name\n }\n }\n": typeof types.ProjectModelPageHeaderProjectFragmentDoc,
"\n fragment ProjectModelPageVersionsPagination on Project {\n id\n visibility\n model(id: $modelId) {\n id\n versions(limit: 16, cursor: $versionsCursor) {\n cursor\n totalCount\n items {\n ...ProjectModelPageVersionsCardVersion\n }\n }\n }\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.ProjectModelPageVersionsPaginationFragmentDoc,
"\n fragment ProjectModelPageVersionsProject on Project {\n ...ProjectPageProjectHeader\n model(id: $modelId) {\n id\n name\n pendingImportedVersions {\n ...PendingFileUpload\n }\n }\n ...ProjectModelPageVersionsPagination\n ...ProjectsModelPageEmbed_Project\n workspace {\n id\n readOnly\n }\n }\n": typeof types.ProjectModelPageVersionsProjectFragmentDoc,
"\n fragment ProjectModelPageDialogDeleteVersion on Version {\n id\n message\n }\n": typeof types.ProjectModelPageDialogDeleteVersionFragmentDoc,
"\n fragment ProjectModelPageDialogEditMessageVersion on Version {\n id\n message\n }\n": typeof types.ProjectModelPageDialogEditMessageVersionFragmentDoc,
"\n fragment ProjectModelPageDialogMoveToVersion on Version {\n id\n message\n }\n": typeof types.ProjectModelPageDialogMoveToVersionFragmentDoc,
"\n fragment ProjectsModelPageEmbed_Project on Project {\n id\n ...ProjectsPageTeamDialogManagePermissions_Project\n }\n": typeof types.ProjectsModelPageEmbed_ProjectFragmentDoc,
"\n fragment ProjectModelPageVersionsCardVersion on Version {\n id\n message\n authorUser {\n ...LimitedUserAvatar\n }\n createdAt\n previewUrl\n sourceApplication\n commentThreadCount: commentThreads(limit: 0) {\n totalCount\n }\n ...ProjectModelPageDialogDeleteVersion\n ...ProjectModelPageDialogMoveToVersion\n automationsStatus {\n ...AutomateRunsTriggerStatus_TriggeredAutomationsStatus\n }\n }\n": typeof types.ProjectModelPageVersionsCardVersionFragmentDoc,
"\n fragment ProjectPageProjectHeader on Project {\n id\n role\n name\n description\n visibility\n allowPublicComments\n workspace {\n id\n slug\n name\n logo\n }\n }\n": typeof types.ProjectPageProjectHeaderFragmentDoc,
"\n fragment ProjectPageAutomationFunctionSettingsDialog_AutomationRevisionFunction on AutomationRevisionFunction {\n parameters\n release {\n id\n versionTag\n createdAt\n inputSchema\n function {\n id\n }\n }\n }\n": typeof types.ProjectPageAutomationFunctionSettingsDialog_AutomationRevisionFunctionFragmentDoc,
"\n fragment ProjectPageAutomationFunctionSettingsDialog_AutomationRevision on AutomationRevision {\n id\n triggerDefinitions {\n ... on VersionCreatedTriggerDefinition {\n type\n model {\n id\n ...CommonModelSelectorModel\n }\n }\n }\n }\n": typeof types.ProjectPageAutomationFunctionSettingsDialog_AutomationRevisionFragmentDoc,
"\n fragment ProjectPageAutomationFunctions_Automation on Automation {\n id\n currentRevision {\n id\n ...ProjectPageAutomationFunctionSettingsDialog_AutomationRevision\n functions {\n release {\n id\n inputSchema\n function {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n releases(limit: 1) {\n items {\n id\n }\n }\n }\n }\n ...ProjectPageAutomationFunctionSettingsDialog_AutomationRevisionFunction\n }\n }\n }\n": typeof types.ProjectPageAutomationFunctions_AutomationFragmentDoc,
"\n fragment ProjectPageAutomationHeader_Automation on Automation {\n id\n name\n enabled\n isTestAutomation\n currentRevision {\n id\n triggerDefinitions {\n ... on VersionCreatedTriggerDefinition {\n model {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n }\n }\n": typeof types.ProjectPageAutomationHeader_AutomationFragmentDoc,
"\n fragment ProjectPageAutomationHeader_Project on Project {\n id\n role\n workspaceId\n ...ProjectPageModelsCardProject\n }\n": typeof types.ProjectPageAutomationHeader_ProjectFragmentDoc,
"\n fragment ProjectPageAutomationModels_Project on Project {\n id\n ...ProjectPageModelsCardProject\n }\n": typeof 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": typeof types.ProjectPageAutomationRuns_AutomationFragmentDoc,
"\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": typeof types.ProjectPageAutomationsRow_AutomationFragmentDoc,
"\n fragment ProjectDiscussionsPageHeader_Project on Project {\n id\n name\n }\n": typeof types.ProjectDiscussionsPageHeader_ProjectFragmentDoc,
"\n fragment ProjectDiscussionsPageResults_Project on Project {\n id\n }\n": typeof types.ProjectDiscussionsPageResults_ProjectFragmentDoc,
"\n fragment ProjectPageModelsActions on Model {\n id\n name\n }\n": typeof types.ProjectPageModelsActionsFragmentDoc,
"\n fragment ProjectPageModelsActions_Project on Project {\n id\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.ProjectPageModelsActions_ProjectFragmentDoc,
"\n fragment ProjectPageModelsCardProject on Project {\n id\n role\n visibility\n ...ProjectPageModelsActions_Project\n workspace {\n id\n readOnly\n }\n }\n": typeof types.ProjectPageModelsCardProjectFragmentDoc,
"\n fragment ProjectModelsPageHeader_Project on Project {\n id\n name\n sourceApps\n role\n models {\n totalCount\n }\n team {\n id\n user {\n ...FormUsersSelectItem\n }\n }\n workspace {\n id\n readOnly\n }\n }\n": typeof types.ProjectModelsPageHeader_ProjectFragmentDoc,
"\n fragment ProjectModelsPageResults_Project on Project {\n ...ProjectPageLatestItemsModels\n }\n": typeof types.ProjectModelsPageResults_ProjectFragmentDoc,
"\n fragment ProjectPageModelsStructureItem_Project on Project {\n id\n workspace {\n id\n readOnly\n }\n ...ProjectPageModelsActions_Project\n }\n": typeof types.ProjectPageModelsStructureItem_ProjectFragmentDoc,
"\n fragment SingleLevelModelTreeItem on ModelsTreeItem {\n id\n name\n fullName\n model {\n ...ProjectPageLatestItemsModelItem\n }\n hasChildren\n updatedAt\n }\n": typeof types.SingleLevelModelTreeItemFragmentDoc,
"\n fragment ProjectPageModelsCardDeleteDialog on Model {\n id\n name\n }\n": typeof types.ProjectPageModelsCardDeleteDialogFragmentDoc,
"\n fragment ProjectPageModelsCardRenameDialog on Model {\n id\n name\n description\n }\n": typeof types.ProjectPageModelsCardRenameDialogFragmentDoc,
"\n query ProjectPageSettingsCollaborators($projectId: String!) {\n project(id: $projectId) {\n id\n ...ProjectPageTeamInternals_Project\n ...InviteDialogProject_Project\n workspaceId\n }\n }\n": typeof types.ProjectPageSettingsCollaboratorsDocument,
"\n query ProjectPageSettingsCollaboratorsWorkspace($workspaceId: String!) {\n workspace(id: $workspaceId) {\n ...ProjectPageTeamInternals_Workspace\n }\n }\n": typeof types.ProjectPageSettingsCollaboratorsWorkspaceDocument,
"\n query ProjectPageSettingsGeneral($projectId: String!) {\n project(id: $projectId) {\n id\n role\n ...ProjectPageSettingsGeneralBlockProjectInfo_Project\n ...ProjectPageSettingsGeneralBlockAccess_Project\n ...ProjectPageSettingsGeneralBlockDiscussions_Project\n ...ProjectPageSettingsGeneralBlockLeave_Project\n ...ProjectPageSettingsGeneralBlockDelete_Project\n ...ProjectPageTeamInternals_Project\n }\n }\n": typeof types.ProjectPageSettingsGeneralDocument,
"\n fragment ProjectPageSettingsGeneralBlockAccess_Project on Project {\n id\n visibility\n }\n": typeof types.ProjectPageSettingsGeneralBlockAccess_ProjectFragmentDoc,
"\n fragment ProjectPageSettingsGeneralBlockDelete_Project on Project {\n ...ProjectsDeleteDialog_Project\n }\n": typeof types.ProjectPageSettingsGeneralBlockDelete_ProjectFragmentDoc,
"\n fragment ProjectPageSettingsGeneralBlockDiscussions_Project on Project {\n id\n visibility\n allowPublicComments\n }\n": typeof types.ProjectPageSettingsGeneralBlockDiscussions_ProjectFragmentDoc,
"\n fragment ProjectPageSettingsGeneralBlockLeave_Project on Project {\n id\n name\n role\n team {\n role\n user {\n ...LimitedUserAvatar\n role\n }\n }\n workspace {\n id\n }\n }\n": typeof types.ProjectPageSettingsGeneralBlockLeave_ProjectFragmentDoc,
"\n fragment ProjectPageSettingsGeneralBlockProjectInfo_Project on Project {\n id\n role\n name\n description\n }\n": typeof types.ProjectPageSettingsGeneralBlockProjectInfo_ProjectFragmentDoc,
"\n fragment ProjectPageTeamDialog on Project {\n id\n name\n role\n allowPublicComments\n visibility\n team {\n id\n role\n user {\n ...LimitedUserAvatar\n role\n }\n }\n invitedTeam {\n id\n title\n inviteId\n role\n user {\n ...LimitedUserAvatar\n role\n }\n }\n ...ProjectsPageTeamDialogManagePermissions_Project\n }\n": typeof types.ProjectPageTeamDialogFragmentDoc,
"\n fragment ProjectsPageTeamDialogManagePermissions_Project on Project {\n id\n visibility\n role\n }\n": typeof types.ProjectsPageTeamDialogManagePermissions_ProjectFragmentDoc,
"\n fragment ProjectsAddDialog_Workspace on Workspace {\n id\n ...ProjectsWorkspaceSelect_Workspace\n }\n": typeof types.ProjectsAddDialog_WorkspaceFragmentDoc,
"\n fragment ProjectsAddDialog_User on User {\n workspaces {\n items {\n ...ProjectsAddDialog_Workspace\n }\n }\n }\n": typeof types.ProjectsAddDialog_UserFragmentDoc,
"\n fragment ProjectsDashboard_UserProjectCollection on UserProjectCollection {\n numberOfHidden\n }\n": typeof types.ProjectsDashboard_UserProjectCollectionFragmentDoc,
"\n fragment ProjectsDashboardFilledProject on ProjectCollection {\n items {\n ...ProjectDashboardItem\n }\n }\n": typeof types.ProjectsDashboardFilledProjectFragmentDoc,
"\n fragment ProjectsDashboardFilledUser on UserProjectCollection {\n items {\n ...ProjectDashboardItem\n }\n }\n": typeof types.ProjectsDashboardFilledUserFragmentDoc,
"\n fragment ProjectsDashboardHeaderProjects_User on User {\n projectInvites {\n ...ProjectsInviteBanner\n }\n }\n": typeof types.ProjectsDashboardHeaderProjects_UserFragmentDoc,
"\n fragment ProjectsDashboardHeaderWorkspaces_User on User {\n discoverableWorkspaces {\n ...WorkspaceInviteDiscoverableWorkspaceBanner_LimitedWorkspace\n }\n workspaceInvites {\n ...WorkspaceInviteBanner_PendingWorkspaceCollaborator\n }\n }\n": typeof types.ProjectsDashboardHeaderWorkspaces_UserFragmentDoc,
"\n fragment ProjectsDeleteDialog_Project on Project {\n id\n name\n role\n models(limit: 0) {\n totalCount\n }\n workspace {\n slug\n id\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": typeof types.ProjectsDeleteDialog_ProjectFragmentDoc,
"\n fragment ProjectsHiddenProjectWarning_User on User {\n id\n expiredSsoSessions {\n id\n slug\n name\n logo\n }\n }\n": typeof types.ProjectsHiddenProjectWarning_UserFragmentDoc,
"\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_WorkspaceFragmentDoc,
"\n fragment ProjectsMoveToWorkspaceDialog_User on User {\n workspaces {\n items {\n ...ProjectsMoveToWorkspaceDialog_Workspace\n }\n }\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_UserFragmentDoc,
"\n fragment ProjectsMoveToWorkspaceDialog_Project on Project {\n id\n name\n modelCount: models(limit: 0) {\n totalCount\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_ProjectFragmentDoc,
"\n query ProjectsMoveToWorkspaceDialog {\n activeUser {\n id\n ...ProjectsMoveToWorkspaceDialog_User\n }\n }\n": typeof types.ProjectsMoveToWorkspaceDialogDocument,
"\n fragment ProjectsWorkspaceSelect_Workspace on Workspace {\n id\n role\n name\n logo\n readOnly\n slug\n }\n": typeof types.ProjectsWorkspaceSelect_WorkspaceFragmentDoc,
"\n fragment ProjectsInviteBanner on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n": typeof types.ProjectsInviteBannerFragmentDoc,
"\n fragment SettingsDialog_Workspace on Workspace {\n ...SettingsMenu_Workspace\n id\n slug\n role\n name\n logo\n plan {\n status\n }\n creationState {\n completed\n }\n }\n": typeof types.SettingsDialog_WorkspaceFragmentDoc,
"\n fragment SettingsDialog_User on User {\n id\n workspaces {\n items {\n ...SettingsDialog_Workspace\n }\n }\n }\n": typeof types.SettingsDialog_UserFragmentDoc,
"\n fragment SettingsServerRegionsAddEditDialog_ServerRegionItem on ServerRegionItem {\n id\n name\n description\n key\n }\n": typeof types.SettingsServerRegionsAddEditDialog_ServerRegionItemFragmentDoc,
"\n fragment SettingsServerRegionsTable_ServerRegionItem on ServerRegionItem {\n id\n name\n key\n description\n }\n": typeof types.SettingsServerRegionsTable_ServerRegionItemFragmentDoc,
"\n fragment SettingsSharedDeleteUserDialog_Workspace on Workspace {\n id\n plan {\n status\n name\n }\n subscription {\n currentBillingCycleEnd\n seats {\n guest\n plan\n }\n }\n }\n": typeof types.SettingsSharedDeleteUserDialog_WorkspaceFragmentDoc,
"\n fragment SettingsSharedProjects_Project on Project {\n ...ProjectsDeleteDialog_Project\n id\n name\n visibility\n createdAt\n updatedAt\n models(limit: 0) {\n totalCount\n }\n versions(limit: 0) {\n totalCount\n }\n team {\n id\n user {\n name\n id\n avatar\n }\n }\n }\n": typeof types.SettingsSharedProjects_ProjectFragmentDoc,
"\n fragment SettingsUserProfileChangePassword_User on User {\n id\n email\n }\n": typeof types.SettingsUserProfileChangePassword_UserFragmentDoc,
"\n fragment SettingsUserProfileDeleteAccount_User on User {\n id\n email\n }\n": typeof types.SettingsUserProfileDeleteAccount_UserFragmentDoc,
"\n fragment SettingsUserProfileDetails_User on User {\n id\n name\n company\n ...UserProfileEditDialogAvatar_User\n }\n": typeof types.SettingsUserProfileDetails_UserFragmentDoc,
"\n fragment UserProfileEditDialogAvatar_User on User {\n id\n avatar\n ...ActiveUserAvatar\n }\n": typeof types.UserProfileEditDialogAvatar_UserFragmentDoc,
"\n fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace {\n id\n name\n }\n": typeof types.SettingsWorkspaceGeneralDeleteDialog_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesGeneralEditAvatar_Workspace on Workspace {\n id\n logo\n name\n }\n": typeof types.SettingsWorkspacesGeneralEditAvatar_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesGeneralEditSlugDialog_Workspace on Workspace {\n id\n name\n slug\n }\n": typeof types.SettingsWorkspacesGeneralEditSlugDialog_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersChangeRoleDialog_Workspace on Workspace {\n id\n plan {\n status\n name\n }\n subscription {\n currentBillingCycleEnd\n seats {\n guest\n plan\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersChangeRoleDialog_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersGuestsTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n role\n user {\n id\n avatar\n name\n company\n }\n projectRoles {\n role\n project {\n id\n name\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersGuestsTable_WorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersGuestsTable_Workspace on Workspace {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n ...SettingsSharedDeleteUserDialog_Workspace\n ...SettingsWorkspacesMembersChangeRoleDialog_Workspace\n team {\n items {\n id\n ...SettingsWorkspacesMembersGuestsTable_WorkspaceCollaborator\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersGuestsTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n": typeof types.SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_Workspace on Workspace {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n invitedTeam(filter: $invitesFilter) {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n": typeof types.SettingsWorkspacesMembersInvitesTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests(filter: $joinRequestsFilter) {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n user {\n id\n avatar\n name\n }\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersRequestsTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n role\n user {\n id\n avatar\n name\n company\n workspaceDomainPolicyCompliant\n }\n }\n": typeof types.SettingsWorkspacesMembersMembersTable_WorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersMembersTable_Workspace on Workspace {\n id\n name\n ...SettingsSharedDeleteUserDialog_Workspace\n ...SettingsWorkspacesMembersTableHeader_Workspace\n ...SettingsWorkspacesMembersChangeRoleDialog_Workspace\n team {\n items {\n id\n ...SettingsWorkspacesMembersMembersTable_WorkspaceCollaborator\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersMembersTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersTableHeader_Workspace on Workspace {\n id\n role\n ...InviteDialogWorkspace_Workspace\n }\n": typeof types.SettingsWorkspacesMembersTableHeader_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesRegionsSelect_ServerRegionItem on ServerRegionItem {\n id\n key\n name\n description\n }\n": typeof types.SettingsWorkspacesRegionsSelect_ServerRegionItemFragmentDoc,
"\n fragment SettingsWorkspacesSecurityDomainRemoveDialog_WorkspaceDomain on WorkspaceDomain {\n id\n domain\n }\n": typeof types.SettingsWorkspacesSecurityDomainRemoveDialog_WorkspaceDomainFragmentDoc,
"\n fragment SettingsWorkspacesSecurityDomainRemoveDialog_Workspace on Workspace {\n id\n domains {\n ...SettingsWorkspacesSecurityDomainRemoveDialog_WorkspaceDomain\n }\n }\n": typeof types.SettingsWorkspacesSecurityDomainRemoveDialog_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesSecuritySsoWrapper_Workspace on Workspace {\n id\n role\n slug\n sso {\n provider {\n id\n name\n clientId\n issuerUrl\n }\n }\n hasAccessToSSO: hasAccessToFeature(featureName: oidcSso)\n }\n": typeof types.SettingsWorkspacesSecuritySsoWrapper_WorkspaceFragmentDoc,
"\n fragment ModelPageProject on Project {\n id\n createdAt\n name\n visibility\n workspace {\n id\n slug\n name\n }\n }\n": typeof types.ModelPageProjectFragmentDoc,
"\n fragment ThreadCommentAttachment on Comment {\n text {\n attachments {\n id\n fileName\n fileType\n fileSize\n }\n }\n }\n": typeof types.ThreadCommentAttachmentFragmentDoc,
"\n fragment ViewerCommentsListItem on Comment {\n id\n rawText\n archived\n author {\n ...LimitedUserAvatar\n }\n createdAt\n viewedAt\n replies {\n totalCount\n cursor\n items {\n ...ViewerCommentsReplyItem\n }\n }\n replyAuthors(limit: 4) {\n totalCount\n items {\n ...FormUsersSelectItem\n }\n }\n resources {\n resourceId\n resourceType\n }\n }\n": typeof types.ViewerCommentsListItemFragmentDoc,
"\n fragment ViewerModelVersionCardItem on Version {\n id\n message\n referencedObject\n sourceApplication\n createdAt\n previewUrl\n authorUser {\n ...LimitedUserAvatar\n }\n }\n": typeof types.ViewerModelVersionCardItemFragmentDoc,
"\n fragment MoveProjectsDialog_Workspace on Workspace {\n id\n ...ProjectsMoveToWorkspaceDialog_Workspace\n projects {\n items {\n id\n modelCount: models(limit: 0) {\n totalCount\n }\n versions(limit: 0) {\n totalCount\n }\n }\n }\n }\n": typeof types.MoveProjectsDialog_WorkspaceFragmentDoc,
"\n fragment MoveProjectsDialog_User on User {\n projects {\n items {\n ...ProjectsMoveToWorkspaceDialog_Project\n role\n workspace {\n id\n }\n }\n }\n }\n": typeof types.MoveProjectsDialog_UserFragmentDoc,
"\n fragment WorkspaceProjectList_Workspace on Workspace {\n id\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...WorkspaceSecurity_Workspace\n ...BillingAlert_Workspace\n ...MoveProjectsDialog_Workspace\n ...InviteDialogWorkspace_Workspace\n projects {\n ...WorkspaceProjectList_ProjectCollection\n }\n creationState {\n completed\n state\n }\n readOnly\n }\n": typeof types.WorkspaceProjectList_WorkspaceFragmentDoc,
"\n fragment WorkspaceProjectList_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...ProjectDashboardItem\n }\n cursor\n }\n": typeof types.WorkspaceProjectList_ProjectCollectionFragmentDoc,
"\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n }\n": typeof types.WorkspaceHeader_WorkspaceFragmentDoc,
"\n fragment WorkspaceInviteBanner_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": typeof types.WorkspaceInviteBanner_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment WorkspaceInviteBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n workspaceId\n workspaceName\n token\n user {\n id\n name\n ...LimitedUserAvatar\n }\n title\n email\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": typeof types.WorkspaceInviteBlock_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment WorkspaceInviteDiscoverableWorkspaceBanner_LimitedWorkspace on LimitedWorkspace {\n id\n name\n slug\n description\n logo\n }\n": typeof types.WorkspaceInviteDiscoverableWorkspaceBanner_LimitedWorkspaceFragmentDoc,
"\n fragment WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest on WorkspaceJoinRequest {\n id\n user {\n id\n name\n }\n workspace {\n id\n }\n }\n": typeof types.WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequestFragmentDoc,
"\n fragment WorkspaceSidebarAbout_Workspace on Workspace {\n ...WorkspaceDashboardAbout_Workspace\n }\n": typeof types.WorkspaceSidebarAbout_WorkspaceFragmentDoc,
"\n fragment WorkspaceSidebarSecurity_Workspace on Workspace {\n ...WorkspaceSecurity_Workspace\n }\n": typeof types.WorkspaceSidebarSecurity_WorkspaceFragmentDoc,
"\n fragment WorkspaceSidebar_Workspace on Workspace {\n ...WorkspaceDashboardAbout_Workspace\n ...WorkspaceTeam_Workspace\n ...WorkspaceSecurity_Workspace\n slug\n plan {\n status\n }\n }\n": typeof types.WorkspaceSidebar_WorkspaceFragmentDoc,
"\n fragment WorkspaceWizard_Workspace on Workspace {\n creationState {\n completed\n state\n }\n name\n slug\n }\n": typeof types.WorkspaceWizard_WorkspaceFragmentDoc,
"\n fragment WorkspaceWizardStepRegion_ServerInfo on ServerInfo {\n multiRegion {\n regions {\n id\n ...SettingsWorkspacesRegionsSelect_ServerRegionItem\n }\n }\n }\n": typeof types.WorkspaceWizardStepRegion_ServerInfoFragmentDoc,
"\n query ActiveUserMainMetadata {\n activeUser {\n id\n email\n emails {\n id\n verified\n }\n company\n bio\n name\n role\n avatar\n isOnboardingFinished\n createdAt\n verified\n notificationPreferences\n versions(limit: 0) {\n totalCount\n }\n }\n }\n": typeof types.ActiveUserMainMetadataDocument,
"\n mutation CreateOnboardingProject {\n projectMutations {\n createForOnboarding {\n ...ProjectPageProject\n ...ProjectDashboardItem\n }\n }\n }\n ": typeof types.CreateOnboardingProjectDocument,
"\n mutation FinishOnboarding {\n activeUserMutations {\n finishOnboarding\n }\n }\n": typeof types.FinishOnboardingDocument,
"\n mutation RequestVerificationByEmail($email: String!) {\n requestVerificationByEmail(email: $email)\n }\n": typeof types.RequestVerificationByEmailDocument,
"\n query AuthLoginPanel {\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n": typeof types.AuthLoginPanelDocument,
"\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n }\n": typeof types.AuthRegisterPanelDocument,
"\n query AuthLoginPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n }\n": typeof types.AuthLoginPanelWorkspaceInviteDocument,
"\n query AuthorizableAppMetadata($id: String!) {\n app(id: $id) {\n id\n name\n description\n trustByDefault\n redirectUrl\n scopes {\n name\n description\n }\n author {\n name\n id\n avatar\n }\n }\n }\n": typeof types.AuthorizableAppMetadataDocument,
"\n fragment FunctionRunStatusForSummary on AutomateFunctionRun {\n id\n status\n }\n": typeof types.FunctionRunStatusForSummaryFragmentDoc,
"\n fragment TriggeredAutomationsStatusSummary on TriggeredAutomationsStatus {\n id\n automationRuns {\n id\n functionRuns {\n id\n ...FunctionRunStatusForSummary\n }\n }\n }\n": typeof types.TriggeredAutomationsStatusSummaryFragmentDoc,
"\n fragment AutomationRunDetails on AutomateRun {\n id\n status\n functionRuns {\n ...FunctionRunStatusForSummary\n statusMessage\n }\n trigger {\n ... on VersionCreatedTrigger {\n version {\n id\n }\n model {\n id\n }\n }\n }\n createdAt\n updatedAt\n }\n": typeof types.AutomationRunDetailsFragmentDoc,
"\n fragment AutomationsStatusOrderedRuns_AutomationRun on AutomateRun {\n id\n automation {\n id\n name\n }\n functionRuns {\n id\n updatedAt\n }\n }\n": typeof types.AutomationsStatusOrderedRuns_AutomationRunFragmentDoc,
"\n fragment SearchAutomateFunctionReleaseItem on AutomateFunctionRelease {\n id\n versionTag\n createdAt\n inputSchema\n }\n": typeof types.SearchAutomateFunctionReleaseItemFragmentDoc,
"\n mutation CreateAutomateFunction($input: CreateAutomateFunctionInput!) {\n automateMutations {\n createFunction(input: $input) {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateFunctionCreateDialogDoneStep_AutomateFunction\n }\n }\n }\n": typeof types.CreateAutomateFunctionDocument,
"\n mutation UpdateAutomateFunction($input: UpdateAutomateFunctionInput!) {\n automateMutations {\n updateFunction(input: $input) {\n id\n ...AutomateFunctionPage_AutomateFunction\n }\n }\n }\n": typeof types.UpdateAutomateFunctionDocument,
"\n query SearchAutomateFunctionReleases(\n $functionId: ID!\n $cursor: String\n $limit: Int\n $filter: AutomateFunctionReleasesFilter\n ) {\n automateFunction(id: $functionId) {\n id\n releases(cursor: $cursor, limit: $limit, filter: $filter) {\n cursor\n totalCount\n items {\n ...SearchAutomateFunctionReleaseItem\n }\n }\n }\n }\n": typeof types.SearchAutomateFunctionReleasesDocument,
"\n query FunctionAccessCheck($id: ID!) {\n automateFunction(id: $id) {\n id\n }\n }\n": typeof types.FunctionAccessCheckDocument,
"\n query ProjectAutomationCreationPublicKeys(\n $projectId: String!\n $automationId: String!\n ) {\n project(id: $projectId) {\n id\n automation(id: $automationId) {\n id\n creationPublicKeys\n }\n }\n }\n": typeof types.ProjectAutomationCreationPublicKeysDocument,
"\n query AutomateFunctionsPagePagination($search: String, $cursor: String) {\n ...AutomateFunctionsPageItems_Query\n }\n": typeof types.AutomateFunctionsPagePaginationDocument,
"\n query ActiveUserFunctions {\n activeUser {\n automateFunctions(limit: 2) {\n items {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n }\n }\n }\n }\n": typeof types.ActiveUserFunctionsDocument,
"\n fragment BillingActions_Workspace on Workspace {\n id\n name\n invitedTeam(filter: $invitesFilter) {\n id\n }\n plan {\n name\n status\n }\n subscription {\n billingInterval\n }\n team {\n totalCount\n }\n defaultRegion {\n name\n }\n }\n": typeof types.BillingActions_WorkspaceFragmentDoc,
"\n mutation BillingCreateCheckoutSession($input: CheckoutSessionInput!) {\n workspaceMutations {\n billing {\n createCheckoutSession(input: $input) {\n url\n id\n }\n }\n }\n }\n": typeof types.BillingCreateCheckoutSessionDocument,
"\n mutation BillingUpgradePlan($input: UpgradePlanInput!) {\n workspaceMutations {\n billing {\n upgradePlan(input: $input)\n }\n }\n }\n": typeof types.BillingUpgradePlanDocument,
"\n mutation AdminUpdateWorkspacePlan($input: AdminUpdateWorkspacePlanInput!) {\n admin {\n updateWorkspacePlan(input: $input)\n }\n }\n": typeof types.AdminUpdateWorkspacePlanDocument,
"\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 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": typeof types.UserSearchDocument,
"\n query ServerInfoBlobSizeLimit {\n serverInfo {\n configuration {\n blobSizeLimitBytes\n }\n }\n }\n": typeof types.ServerInfoBlobSizeLimitDocument,
"\n query ServerInfoAllScopes {\n serverInfo {\n scopes {\n name\n description\n }\n }\n }\n": typeof types.ServerInfoAllScopesDocument,
"\n query ProjectModelsSelectorValues($projectId: String!, $cursor: String) {\n project(id: $projectId) {\n id\n models(limit: 100, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...CommonModelSelectorModel\n }\n }\n }\n }\n": typeof types.ProjectModelsSelectorValuesDocument,
"\n query MainServerInfoData {\n serverInfo {\n adminContact\n canonicalUrl\n company\n description\n guestModeEnabled\n inviteOnly\n name\n termsOfService\n version\n automateUrl\n }\n }\n": typeof types.MainServerInfoDataDocument,
"\n mutation DashboardRequestToJoinWorkspace($input: WorkspaceRequestToJoinInput!) {\n workspaceMutations {\n requestToJoin(input: $input)\n }\n }\n": typeof types.DashboardRequestToJoinWorkspaceDocument,
"\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n": typeof types.DashboardProjectsPageQueryDocument,
"\n query DashboardProjectsPageWorkspaceQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n": typeof types.DashboardProjectsPageWorkspaceQueryDocument,
"\n mutation DeleteAccessToken($token: String!) {\n apiTokenRevoke(token: $token)\n }\n": typeof types.DeleteAccessTokenDocument,
"\n mutation CreateAccessToken($token: ApiTokenCreateInput!) {\n apiTokenCreate(token: $token)\n }\n": typeof types.CreateAccessTokenDocument,
"\n mutation DeleteApplication($appId: String!) {\n appDelete(appId: $appId)\n }\n": typeof types.DeleteApplicationDocument,
"\n mutation CreateApplication($app: AppCreateInput!) {\n appCreate(app: $app)\n }\n": typeof types.CreateApplicationDocument,
"\n mutation EditApplication($app: AppUpdateInput!) {\n appUpdate(app: $app)\n }\n": typeof types.EditApplicationDocument,
"\n mutation RevokeAppAccess($appId: String!) {\n appRevokeAccess(appId: $appId)\n }\n": typeof types.RevokeAppAccessDocument,
"\n query DeveloperSettingsAccessTokens {\n activeUser {\n id\n apiTokens {\n id\n name\n lastUsed\n lastChars\n createdAt\n scopes\n }\n }\n }\n": typeof types.DeveloperSettingsAccessTokensDocument,
"\n query DeveloperSettingsApplications {\n activeUser {\n createdApps {\n id\n secret\n name\n description\n redirectUrl\n scopes {\n name\n description\n }\n }\n id\n }\n }\n": typeof types.DeveloperSettingsApplicationsDocument,
"\n query DeveloperSettingsAuthorizedApps {\n activeUser {\n id\n authorizedApps {\n id\n description\n name\n author {\n id\n name\n avatar\n }\n }\n }\n }\n": typeof types.DeveloperSettingsAuthorizedAppsDocument,
"\n query SearchProjects(\n $search: String\n $onlyWithRoles: [String!] = null\n $workspaceId: ID\n ) {\n activeUser {\n projects(\n limit: 10\n filter: {\n search: $search\n onlyWithRoles: $onlyWithRoles\n workspaceId: $workspaceId\n }\n ) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n": typeof types.SearchProjectsDocument,
"\n query SearchProjectModels($search: String, $projectId: String!) {\n project(id: $projectId) {\n id\n models(limit: 10, filter: { search: $search }) {\n totalCount\n items {\n ...FormSelectModels_Model\n }\n }\n }\n }\n": typeof types.SearchProjectModelsDocument,
"\n query ActiveUserGendoLimits {\n activeUser {\n id\n gendoAICredits {\n used\n limit\n resetDate\n }\n }\n }\n": typeof types.ActiveUserGendoLimitsDocument,
"\n mutation requestGendoAIRender($input: GendoAIRenderInput!) {\n versionMutations {\n requestGendoAIRender(input: $input)\n }\n }\n": typeof types.RequestGendoAiRenderDocument,
"\n query GendoAIRender(\n $gendoAiRenderId: String!\n $versionId: String!\n $projectId: String!\n ) {\n project(id: $projectId) {\n id\n version(id: $versionId) {\n id\n gendoAIRender(id: $gendoAiRenderId) {\n id\n projectId\n modelId\n versionId\n createdAt\n updatedAt\n gendoGenerationId\n status\n prompt\n camera\n responseImage\n user {\n name\n avatar\n id\n }\n }\n }\n }\n }\n": typeof types.GendoAiRenderDocument,
"\n query GendoAIRenders($versionId: String!, $projectId: String!) {\n project(id: $projectId) {\n id\n version(id: $versionId) {\n id\n gendoAIRenders {\n totalCount\n items {\n id\n createdAt\n updatedAt\n status\n gendoGenerationId\n prompt\n camera\n }\n }\n }\n }\n }\n": typeof types.GendoAiRendersDocument,
"\n subscription ProjectVersionGendoAIRenderCreated($id: String!, $versionId: String!) {\n projectVersionGendoAIRenderCreated(id: $id, versionId: $versionId) {\n id\n createdAt\n updatedAt\n status\n gendoGenerationId\n prompt\n camera\n }\n }\n": typeof types.ProjectVersionGendoAiRenderCreatedDocument,
"\n subscription ProjectVersionGendoAIRenderUpdated($id: String!, $versionId: String!) {\n projectVersionGendoAIRenderUpdated(id: $id, versionId: $versionId) {\n id\n projectId\n modelId\n versionId\n createdAt\n updatedAt\n gendoGenerationId\n status\n prompt\n camera\n responseImage\n }\n }\n": typeof types.ProjectVersionGendoAiRenderUpdatedDocument,
"\n query InviteUserSearch($input: UsersRetrievalInput!) {\n users(input: $input) {\n items {\n id\n name\n avatar\n }\n }\n }\n": typeof types.InviteUserSearchDocument,
"\n mutation CreateNewRegion($input: CreateServerRegionInput!) {\n serverInfoMutations {\n multiRegion {\n create(input: $input) {\n id\n ...SettingsServerRegionsAddEditDialog_ServerRegionItem\n ...SettingsServerRegionsTable_ServerRegionItem\n }\n }\n }\n }\n": typeof types.CreateNewRegionDocument,
"\n mutation UpdateRegion($input: UpdateServerRegionInput!) {\n serverInfoMutations {\n multiRegion {\n update(input: $input) {\n id\n ...SettingsServerRegionsAddEditDialog_ServerRegionItem\n ...SettingsServerRegionsTable_ServerRegionItem\n }\n }\n }\n }\n": typeof types.UpdateRegionDocument,
"\n query PagesOnboardingDiscoverableWorkspaces_ActiveUser {\n activeUser {\n id\n ...PagesOnboarding_DiscoverableWorkspaces\n }\n }\n": typeof types.PagesOnboardingDiscoverableWorkspaces_ActiveUserDocument,
"\n fragment ProjectPageTeamInternals_Project on Project {\n id\n role\n invitedTeam {\n id\n title\n role\n inviteId\n user {\n role\n ...LimitedUserAvatar\n }\n }\n team {\n role\n user {\n id\n role\n ...LimitedUserAvatar\n }\n }\n }\n": typeof types.ProjectPageTeamInternals_ProjectFragmentDoc,
"\n fragment ProjectPageTeamInternals_Workspace on Workspace {\n id\n team {\n items {\n id\n role\n user {\n id\n }\n }\n }\n }\n": typeof types.ProjectPageTeamInternals_WorkspaceFragmentDoc,
"\n fragment ProjectDashboardItemNoModels on Project {\n id\n name\n createdAt\n updatedAt\n role\n team {\n id\n user {\n id\n name\n avatar\n }\n }\n ...ProjectPageModelsCardProject\n }\n": typeof types.ProjectDashboardItemNoModelsFragmentDoc,
"\n fragment ProjectDashboardItem on Project {\n id\n ...ProjectDashboardItemNoModels\n models(limit: 4) {\n totalCount\n items {\n ...ProjectPageLatestItemsModelItem\n }\n }\n workspace {\n id\n slug\n name\n logo\n readOnly\n }\n pendingImportedModels(limit: 4) {\n ...PendingFileUpload\n }\n }\n": typeof types.ProjectDashboardItemFragmentDoc,
"\n fragment PendingFileUpload on FileUpload {\n id\n projectId\n modelName\n convertedStatus\n convertedMessage\n uploadDate\n convertedLastUpdate\n fileType\n fileName\n }\n": typeof types.PendingFileUploadFragmentDoc,
"\n fragment ProjectPageLatestItemsModelItem on Model {\n id\n name\n displayName\n versionCount: versions(limit: 0) {\n totalCount\n }\n commentThreadCount: commentThreads(limit: 0) {\n totalCount\n }\n pendingImportedVersions(limit: 1) {\n ...PendingFileUpload\n }\n previewUrl\n createdAt\n updatedAt\n ...ProjectPageModelsCardRenameDialog\n ...ProjectPageModelsCardDeleteDialog\n ...ProjectPageModelsActions\n automationsStatus {\n ...AutomateRunsTriggerStatus_TriggeredAutomationsStatus\n }\n }\n": typeof types.ProjectPageLatestItemsModelItemFragmentDoc,
"\n fragment ProjectUpdatableMetadata on Project {\n id\n name\n description\n visibility\n allowPublicComments\n }\n": typeof types.ProjectUpdatableMetadataFragmentDoc,
"\n fragment ProjectPageLatestItemsModels on Project {\n id\n role\n visibility\n workspace {\n id\n readOnly\n }\n modelCount: models(limit: 0) {\n totalCount\n }\n ...ProjectPageModelsStructureItem_Project\n }\n": typeof types.ProjectPageLatestItemsModelsFragmentDoc,
"\n fragment ProjectPageLatestItemsComments on Project {\n id\n commentThreadCount: commentThreads(limit: 0) {\n totalCount\n }\n }\n": typeof types.ProjectPageLatestItemsCommentsFragmentDoc,
"\n fragment ProjectPageLatestItemsCommentItem on Comment {\n id\n author {\n ...FormUsersSelectItem\n }\n screenshot\n rawText\n createdAt\n updatedAt\n archived\n repliesCount: replies(limit: 0) {\n totalCount\n }\n replyAuthors(limit: 4) {\n totalCount\n items {\n ...FormUsersSelectItem\n }\n }\n }\n": typeof types.ProjectPageLatestItemsCommentItemFragmentDoc,
"\n mutation CreateModel($input: CreateModelInput!) {\n modelMutations {\n create(input: $input) {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n": typeof types.CreateModelDocument,
"\n mutation CreateProject($input: ProjectCreateInput) {\n projectMutations {\n create(input: $input) {\n ...ProjectPageProject\n ...ProjectDashboardItem\n }\n }\n }\n": typeof types.CreateProjectDocument,
"\n mutation CreateWorkspaceProject($input: WorkspaceProjectCreateInput!) {\n workspaceMutations {\n projects {\n create(input: $input) {\n ...ProjectPageProject\n ...ProjectDashboardItem\n }\n }\n }\n }\n": typeof types.CreateWorkspaceProjectDocument,
"\n mutation UpdateModel($input: UpdateModelInput!) {\n modelMutations {\n update(input: $input) {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n": typeof types.UpdateModelDocument,
"\n mutation DeleteModel($input: DeleteModelInput!) {\n modelMutations {\n delete(input: $input)\n }\n }\n": typeof types.DeleteModelDocument,
"\n mutation UpdateProjectRole($input: ProjectUpdateRoleInput!) {\n projectMutations {\n updateRole(input: $input) {\n id\n team {\n id\n role\n user {\n ...LimitedUserAvatar\n }\n }\n }\n }\n }\n": typeof types.UpdateProjectRoleDocument,
"\n mutation UpdateWorkspaceProjectRole($input: ProjectUpdateRoleInput!) {\n workspaceMutations {\n projects {\n updateRole(input: $input) {\n id\n team {\n id\n role\n }\n }\n }\n }\n }\n": typeof types.UpdateWorkspaceProjectRoleDocument,
"\n mutation InviteProjectUser($projectId: ID!, $input: [ProjectInviteCreateInput!]!) {\n projectMutations {\n invites {\n batchCreate(projectId: $projectId, input: $input) {\n ...ProjectPageTeamDialog\n }\n }\n }\n }\n": typeof types.InviteProjectUserDocument,
"\n mutation InviteWorkspaceProjectUser(\n $projectId: ID!\n $inputs: [WorkspaceProjectInviteCreateInput!]!\n ) {\n projectMutations {\n invites {\n createForWorkspace(projectId: $projectId, inputs: $inputs) {\n ...ProjectPageTeamDialog\n }\n }\n }\n }\n": typeof types.InviteWorkspaceProjectUserDocument,
"\n mutation CancelProjectInvite($projectId: ID!, $inviteId: String!) {\n projectMutations {\n invites {\n cancel(projectId: $projectId, inviteId: $inviteId) {\n ...ProjectPageTeamDialog\n }\n }\n }\n }\n": typeof types.CancelProjectInviteDocument,
"\n mutation UpdateProjectMetadata($update: ProjectUpdateInput!) {\n projectMutations {\n update(update: $update) {\n id\n ...ProjectUpdatableMetadata\n }\n }\n }\n": typeof types.UpdateProjectMetadataDocument,
"\n mutation DeleteProject($id: String!) {\n projectMutations {\n delete(id: $id)\n }\n }\n": typeof types.DeleteProjectDocument,
"\n mutation UseProjectInvite($input: ProjectInviteUseInput!) {\n projectMutations {\n invites {\n use(input: $input)\n }\n }\n }\n": typeof types.UseProjectInviteDocument,
"\n mutation LeaveProject($projectId: String!) {\n projectMutations {\n leave(id: $projectId)\n }\n }\n": typeof types.LeaveProjectDocument,
"\n mutation DeleteVersions($input: DeleteVersionsInput!) {\n versionMutations {\n delete(input: $input)\n }\n }\n": typeof types.DeleteVersionsDocument,
"\n mutation MoveVersions($input: MoveVersionsInput!) {\n versionMutations {\n moveToModel(input: $input) {\n id\n }\n }\n }\n": typeof types.MoveVersionsDocument,
"\n mutation UpdateVersion($input: UpdateVersionInput!) {\n versionMutations {\n update(input: $input) {\n id\n message\n }\n }\n }\n": typeof types.UpdateVersionDocument,
"\n mutation deleteWebhook($webhook: WebhookDeleteInput!) {\n webhookDelete(webhook: $webhook)\n }\n": typeof types.DeleteWebhookDocument,
"\n mutation createWebhook($webhook: WebhookCreateInput!) {\n webhookCreate(webhook: $webhook)\n }\n": typeof types.CreateWebhookDocument,
"\n mutation updateWebhook($webhook: WebhookUpdateInput!) {\n webhookUpdate(webhook: $webhook)\n }\n": typeof types.UpdateWebhookDocument,
"\n mutation CreateAutomation($projectId: ID!, $input: ProjectAutomationCreateInput!) {\n projectMutations {\n automationMutations(projectId: $projectId) {\n create(input: $input) {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n }\n }\n }\n": typeof types.CreateAutomationDocument,
"\n mutation UpdateAutomation($projectId: ID!, $input: ProjectAutomationUpdateInput!) {\n projectMutations {\n automationMutations(projectId: $projectId) {\n update(input: $input) {\n id\n name\n enabled\n }\n }\n }\n }\n": typeof types.UpdateAutomationDocument,
"\n mutation CreateAutomationRevision(\n $projectId: ID!\n $input: ProjectAutomationRevisionCreateInput!\n ) {\n projectMutations {\n automationMutations(projectId: $projectId) {\n createRevision(input: $input) {\n id\n }\n }\n }\n }\n": typeof types.CreateAutomationRevisionDocument,
"\n mutation TriggerAutomation($projectId: ID!, $automationId: ID!) {\n projectMutations {\n automationMutations(projectId: $projectId) {\n trigger(automationId: $automationId)\n }\n }\n }\n": typeof types.TriggerAutomationDocument,
"\n mutation CreateTestAutomation(\n $projectId: ID!\n $input: ProjectTestAutomationCreateInput!\n ) {\n projectMutations {\n automationMutations(projectId: $projectId) {\n createTestAutomation(input: $input) {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n }\n }\n }\n": typeof types.CreateTestAutomationDocument,
"\n mutation MoveProjectToWorkspace($workspaceId: String!, $projectId: String!) {\n workspaceMutations {\n projects {\n moveToWorkspace(workspaceId: $workspaceId, projectId: $projectId) {\n id\n workspace {\n id\n projects {\n items {\n id\n }\n }\n ...ProjectsMoveToWorkspaceDialog_Workspace\n ...MoveProjectsDialog_Workspace\n }\n }\n }\n }\n }\n": typeof types.MoveProjectToWorkspaceDocument,
"\n query ProjectAccessCheck($id: String!) {\n project(id: $id) {\n id\n visibility\n workspace {\n id\n slug\n }\n }\n }\n": typeof types.ProjectAccessCheckDocument,
"\n query ProjectRoleCheck($id: String!) {\n project(id: $id) {\n id\n role\n }\n }\n": typeof types.ProjectRoleCheckDocument,
"\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n ...ProjectsDashboard_UserProjectCollection\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsHiddenProjectWarning_User\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n": typeof types.ProjectsDashboardQueryDocument,
"\n query ProjectsDashboardWorkspaceQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n": typeof types.ProjectsDashboardWorkspaceQueryDocument,
"\n query ProjectPageQuery($id: String!, $token: String) {\n project(id: $id) {\n ...ProjectPageProject\n }\n projectInvite(projectId: $id, token: $token) {\n ...ProjectsInviteBanner\n }\n }\n": typeof types.ProjectPageQueryDocument,
"\n query ProjectLatestModels($projectId: String!, $filter: ProjectModelsFilter) {\n project(id: $projectId) {\n id\n models(cursor: null, limit: 16, filter: $filter) {\n totalCount\n cursor\n items {\n ...ProjectPageLatestItemsModelItem\n }\n }\n pendingImportedModels {\n ...PendingFileUpload\n }\n }\n }\n": typeof types.ProjectLatestModelsDocument,
"\n query ProjectLatestModelsPagination(\n $projectId: String!\n $filter: ProjectModelsFilter\n $cursor: String = null\n ) {\n project(id: $projectId) {\n id\n models(cursor: $cursor, limit: 16, filter: $filter) {\n totalCount\n cursor\n items {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n }\n": typeof types.ProjectLatestModelsPaginationDocument,
"\n query ProjectModelsTreeTopLevel(\n $projectId: String!\n $filter: ProjectModelsTreeFilter\n ) {\n project(id: $projectId) {\n id\n modelsTree(cursor: null, limit: 8, filter: $filter) {\n totalCount\n cursor\n items {\n ...SingleLevelModelTreeItem\n }\n }\n pendingImportedModels {\n ...PendingFileUpload\n }\n }\n }\n": typeof types.ProjectModelsTreeTopLevelDocument,
"\n query ProjectModelsTreeTopLevelPagination(\n $projectId: String!\n $filter: ProjectModelsTreeFilter\n $cursor: String = null\n ) {\n project(id: $projectId) {\n id\n modelsTree(cursor: $cursor, limit: 8, filter: $filter) {\n totalCount\n cursor\n items {\n ...SingleLevelModelTreeItem\n }\n }\n }\n }\n": typeof types.ProjectModelsTreeTopLevelPaginationDocument,
"\n query ProjectModelChildrenTree($projectId: String!, $parentName: String!) {\n project(id: $projectId) {\n id\n modelChildrenTree(fullName: $parentName) {\n ...SingleLevelModelTreeItem\n }\n }\n }\n": typeof types.ProjectModelChildrenTreeDocument,
"\n query ProjectLatestCommentThreads(\n $projectId: String!\n $cursor: String = null\n $filter: ProjectCommentsFilter = null\n ) {\n project(id: $projectId) {\n id\n commentThreads(cursor: $cursor, limit: 8, filter: $filter) {\n totalCount\n cursor\n items {\n ...ProjectPageLatestItemsCommentItem\n }\n }\n }\n }\n": typeof types.ProjectLatestCommentThreadsDocument,
"\n query ProjectInvite($projectId: String!, $token: String) {\n projectInvite(projectId: $projectId, token: $token) {\n ...ProjectsInviteBanner\n }\n }\n": typeof types.ProjectInviteDocument,
"\n query ProjectModelCheck($projectId: String!, $modelId: String!) {\n project(id: $projectId) {\n visibility\n model(id: $modelId) {\n id\n }\n }\n }\n": typeof types.ProjectModelCheckDocument,
"\n query ProjectModelPage(\n $projectId: String!\n $modelId: String!\n $versionsCursor: String\n ) {\n project(id: $projectId) {\n id\n ...ProjectModelPageHeaderProject\n ...ProjectModelPageVersionsProject\n }\n }\n": typeof types.ProjectModelPageDocument,
"\n query ProjectModelVersions(\n $projectId: String!\n $modelId: String!\n $versionsCursor: String\n ) {\n project(id: $projectId) {\n id\n ...ProjectModelPageVersionsPagination\n }\n }\n": typeof types.ProjectModelVersionsDocument,
"\n query ProjectModelsPage($projectId: String!) {\n project(id: $projectId) {\n id\n ...ProjectModelsPageHeader_Project\n ...ProjectModelsPageResults_Project\n }\n }\n": typeof types.ProjectModelsPageDocument,
"\n query ProjectDiscussionsPage($projectId: String!) {\n project(id: $projectId) {\n id\n ...ProjectDiscussionsPageHeader_Project\n ...ProjectDiscussionsPageResults_Project\n }\n }\n": typeof 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 automateFunctions(limit: 0) {\n totalCount\n }\n ...AutomateFunctionCreateDialog_Workspace\n }\n ...FormSelectProjects_Project\n }\n ...AutomateFunctionsPageHeader_Query\n }\n": typeof 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": typeof 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": typeof 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": typeof types.ProjectAutomationPagePaginatedRunsDocument,
"\n query ProjectAutomationAccessCheck($projectId: String!) {\n project(id: $projectId) {\n id\n automations(limit: 0) {\n totalCount\n }\n }\n }\n": typeof types.ProjectAutomationAccessCheckDocument,
"\n query ProjectWebhooks($projectId: String!) {\n project(id: $projectId) {\n id\n name\n webhooks {\n items {\n streamId\n triggers\n enabled\n url\n id\n description\n history(limit: 5) {\n items {\n status\n statusInfo\n }\n }\n }\n totalCount\n }\n }\n }\n": typeof types.ProjectWebhooksDocument,
"\n query ProjectBlobInfo($blobId: String!, $projectId: String!) {\n project(id: $projectId) {\n id\n blob(id: $blobId) {\n id\n fileName\n fileType\n fileSize\n createdAt\n }\n }\n }\n": typeof types.ProjectBlobInfoDocument,
"\n query ProjectWorkspaceSelect {\n activeUser {\n id\n ...ProjectsAddDialog_User\n }\n }\n": typeof types.ProjectWorkspaceSelectDocument,
"\n subscription OnProjectUpdated($id: String!) {\n projectUpdated(id: $id) {\n id\n type\n project {\n ...ProjectPageProject\n ...ProjectDashboardItemNoModels\n }\n }\n }\n": typeof types.OnProjectUpdatedDocument,
"\n subscription OnProjectModelsUpdate($id: String!) {\n projectModelsUpdated(id: $id) {\n id\n type\n model {\n id\n versions(limit: 1) {\n items {\n id\n referencedObject\n }\n }\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n": typeof types.OnProjectModelsUpdateDocument,
"\n subscription OnProjectVersionsUpdate($id: String!) {\n projectVersionsUpdated(id: $id) {\n id\n modelId\n type\n version {\n id\n ...ViewerModelVersionCardItem\n ...ProjectModelPageVersionsCardVersion\n model {\n id\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n }\n": typeof types.OnProjectVersionsUpdateDocument,
"\n subscription OnProjectVersionsPreviewGenerated($id: String!) {\n projectVersionsPreviewGenerated(id: $id) {\n projectId\n objectId\n versionId\n }\n }\n": typeof types.OnProjectVersionsPreviewGeneratedDocument,
"\n subscription OnProjectPendingModelsUpdated($id: String!) {\n projectPendingModelsUpdated(id: $id) {\n id\n type\n model {\n ...PendingFileUpload\n model {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n }\n": typeof types.OnProjectPendingModelsUpdatedDocument,
"\n subscription OnProjectPendingVersionsUpdated($id: String!) {\n projectPendingVersionsUpdated(id: $id) {\n id\n type\n version {\n ...PendingFileUpload\n model {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n }\n": typeof types.OnProjectPendingVersionsUpdatedDocument,
"\n subscription OnProjectTriggeredAutomationsStatusUpdated($id: String!) {\n projectTriggeredAutomationsStatusUpdated(projectId: $id) {\n type\n version {\n id\n automationsStatus {\n automationRuns {\n ...AutomateViewerPanel_AutomateRun\n }\n ...TriggeredAutomationsStatusSummary\n ...AutomateRunsTriggerStatusDialog_TriggeredAutomationsStatus\n }\n }\n model {\n id\n }\n run {\n id\n automationId\n ...AutomationRunDetails\n }\n }\n }\n": typeof types.OnProjectTriggeredAutomationsStatusUpdatedDocument,
"\n subscription OnProjectAutomationsUpdated($id: String!) {\n projectAutomationsUpdated(projectId: $id) {\n type\n automationId\n automation {\n id\n ...ProjectPageAutomationPage_Automation\n ...ProjectPageAutomationsRow_Automation\n }\n }\n }\n": typeof types.OnProjectAutomationsUpdatedDocument,
"\n mutation ServerInfoUpdate($info: ServerInfoUpdateInput!) {\n serverInfoUpdate(info: $info)\n }\n": typeof types.ServerInfoUpdateDocument,
"\n mutation AdminPanelDeleteUser($userConfirmation: UserDeleteInput!) {\n adminDeleteUser(userConfirmation: $userConfirmation)\n }\n": typeof types.AdminPanelDeleteUserDocument,
"\n mutation AdminPanelDeleteProject($ids: [String!]!) {\n projectMutations {\n batchDelete(ids: $ids)\n }\n }\n": typeof types.AdminPanelDeleteProjectDocument,
"\n mutation AdminPanelResendInvite($inviteId: String!) {\n inviteResend(inviteId: $inviteId)\n }\n": typeof types.AdminPanelResendInviteDocument,
"\n mutation AdminPanelDeleteInvite($inviteId: String!) {\n inviteDelete(inviteId: $inviteId)\n }\n": typeof types.AdminPanelDeleteInviteDocument,
"\n mutation AdminChangeUseRole($userRoleInput: UserRoleInput!) {\n userRoleChange(userRoleInput: $userRoleInput)\n }\n": typeof types.AdminChangeUseRoleDocument,
"\n query ServerManagementDataPage {\n admin {\n userList {\n totalCount\n }\n projectList {\n totalCount\n }\n inviteList {\n totalCount\n }\n }\n serverInfo {\n name\n version\n }\n }\n": typeof types.ServerManagementDataPageDocument,
"\n query ServerSettingsDialogData {\n serverInfo {\n name\n description\n adminContact\n company\n termsOfService\n inviteOnly\n guestModeEnabled\n }\n }\n": typeof types.ServerSettingsDialogDataDocument,
"\n query AdminPanelUsersList($limit: Int!, $cursor: String, $query: String) {\n admin {\n userList(limit: $limit, cursor: $cursor, query: $query) {\n totalCount\n cursor\n items {\n id\n email\n avatar\n name\n role\n verified\n company\n }\n }\n }\n }\n": typeof types.AdminPanelUsersListDocument,
"\n query AdminPanelProjectsList(\n $query: String\n $orderBy: String\n $limit: Int!\n $visibility: String\n $cursor: String\n ) {\n admin {\n projectList(\n query: $query\n orderBy: $orderBy\n limit: $limit\n visibility: $visibility\n cursor: $cursor\n ) {\n cursor\n ...SettingsServerProjects_ProjectCollection\n }\n }\n }\n": typeof types.AdminPanelProjectsListDocument,
"\n query AdminPanelInvitesList($limit: Int!, $cursor: String, $query: String) {\n admin {\n inviteList(limit: $limit, cursor: $cursor, query: $query) {\n cursor\n items {\n email\n id\n invitedBy {\n id\n name\n }\n }\n totalCount\n }\n }\n }\n": typeof types.AdminPanelInvitesListDocument,
"\n query UsersCount {\n admin {\n userList {\n totalCount\n }\n }\n }\n": typeof types.UsersCountDocument,
"\n query InvitesCount {\n admin {\n inviteList {\n totalCount\n }\n }\n }\n": typeof types.InvitesCountDocument,
"\n mutation InviteServerUser($input: [ServerInviteCreateInput!]!) {\n serverInviteBatchCreate(input: $input)\n }\n": typeof types.InviteServerUserDocument,
"\n fragment AddDomainWorkspace on Workspace {\n slug\n }\n ": typeof types.AddDomainWorkspaceFragmentDoc,
"\n fragment SettingsMenu_Workspace on Workspace {\n id\n sso {\n provider {\n id\n }\n session {\n validUntil\n }\n }\n }\n": typeof types.SettingsMenu_WorkspaceFragmentDoc,
"\n mutation SettingsUpdateWorkspace($input: WorkspaceUpdateInput!) {\n workspaceMutations {\n update(input: $input) {\n ...SettingsWorkspacesGeneral_Workspace\n }\n }\n }\n": typeof types.SettingsUpdateWorkspaceDocument,
"\n mutation SettingsCreateUserEmail($input: CreateUserEmailInput!) {\n activeUserMutations {\n emailMutations {\n create(input: $input) {\n id\n emails {\n ...EmailFields\n }\n }\n }\n }\n }\n": typeof types.SettingsCreateUserEmailDocument,
"\n mutation SettingsDeleteUserEmail($input: DeleteUserEmailInput!) {\n activeUserMutations {\n emailMutations {\n delete(input: $input) {\n id\n emails {\n ...EmailFields\n }\n }\n }\n }\n }\n": typeof types.SettingsDeleteUserEmailDocument,
"\n mutation SettingsSetPrimaryUserEmail($input: SetPrimaryUserEmailInput!) {\n activeUserMutations {\n emailMutations {\n setPrimary(input: $input) {\n id\n emails {\n ...EmailFields\n }\n }\n }\n }\n }\n": typeof types.SettingsSetPrimaryUserEmailDocument,
"\n mutation SettingsNewEmailVerification($input: EmailVerificationRequestInput!) {\n activeUserMutations {\n emailMutations {\n requestNewEmailVerification(input: $input)\n }\n }\n }\n": typeof types.SettingsNewEmailVerificationDocument,
"\n mutation SettingsUpdateWorkspaceSecurity($input: WorkspaceUpdateInput!) {\n workspaceMutations {\n update(input: $input) {\n id\n domainBasedMembershipProtectionEnabled\n discoverabilityEnabled\n }\n }\n }\n": typeof types.SettingsUpdateWorkspaceSecurityDocument,
"\n mutation SettingsDeleteWorkspace($workspaceId: String!) {\n workspaceMutations {\n delete(workspaceId: $workspaceId)\n }\n }\n": typeof types.SettingsDeleteWorkspaceDocument,
"\n mutation SettingsResendWorkspaceInvite($input: WorkspaceInviteResendInput!) {\n workspaceMutations {\n invites {\n resend(input: $input)\n }\n }\n }\n": typeof types.SettingsResendWorkspaceInviteDocument,
"\n mutation SettingsCancelWorkspaceInvite($workspaceId: String!, $inviteId: String!) {\n workspaceMutations {\n invites {\n cancel(workspaceId: $workspaceId, inviteId: $inviteId) {\n id\n }\n }\n }\n }\n": typeof types.SettingsCancelWorkspaceInviteDocument,
"\n mutation AddWorkspaceDomain($input: AddDomainToWorkspaceInput!) {\n workspaceMutations {\n addDomain(input: $input) {\n ...SettingsWorkspacesSecurity_Workspace\n }\n }\n }\n": typeof types.AddWorkspaceDomainDocument,
"\n mutation DeleteWorkspaceDomain($input: WorkspaceDomainDeleteInput!) {\n workspaceMutations {\n deleteDomain(input: $input) {\n ...SettingsWorkspacesSecurityDomainRemoveDialog_Workspace\n }\n }\n }\n": typeof types.DeleteWorkspaceDomainDocument,
"\n mutation SettingsLeaveWorkspace($leaveId: ID!) {\n workspaceMutations {\n leave(id: $leaveId)\n }\n }\n": typeof types.SettingsLeaveWorkspaceDocument,
"\n mutation SettingsBillingCancelCheckoutSession($input: CancelCheckoutSessionInput!) {\n workspaceMutations {\n billing {\n cancelCheckoutSession(input: $input)\n }\n }\n }\n": typeof types.SettingsBillingCancelCheckoutSessionDocument,
"\n query SettingsSidebar {\n activeUser {\n ...SettingsDialog_User\n }\n }\n": typeof types.SettingsSidebarDocument,
"\n query SettingsSidebarAutomateFunctions {\n activeUser {\n ...Sidebar_User\n }\n }\n": typeof types.SettingsSidebarAutomateFunctionsDocument,
"\n query SettingsWorkspaceGeneral($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesGeneral_Workspace\n }\n }\n": typeof types.SettingsWorkspaceGeneralDocument,
"\n query SettingsWorkspaceBilling($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesBilling_Workspace\n }\n }\n": typeof types.SettingsWorkspaceBillingDocument,
"\n query SettingsWorkspaceBillingCustomerPortal($workspaceId: String!) {\n workspace(id: $workspaceId) {\n customerPortalUrl\n }\n }\n": typeof types.SettingsWorkspaceBillingCustomerPortalDocument,
"\n query SettingsWorkspaceRegions($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesRegions_Workspace\n }\n serverInfo {\n ...SettingsWorkspacesRegions_ServerInfo\n }\n }\n": typeof types.SettingsWorkspaceRegionsDocument,
"\n query SettingsWorkspacesMembers(\n $slug: String!\n $invitesFilter: PendingWorkspaceCollaboratorsFilter\n $joinRequestsFilter: AdminWorkspaceJoinRequestFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembers_Workspace\n ...SettingsWorkspacesMembersMembersTable_Workspace\n ...SettingsWorkspacesMembersGuestsTable_Workspace\n ...SettingsWorkspacesMembersInvitesTable_Workspace\n ...SettingsWorkspacesMembersRequestsTable_Workspace\n }\n }\n": typeof types.SettingsWorkspacesMembersDocument,
"\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n team(filter: $filter) {\n items {\n id\n ...SettingsWorkspacesMembersMembersTable_WorkspaceCollaborator\n }\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersSearchDocument,
"\n query SettingsWorkspacesJoinRequestsSearch(\n $slug: String!\n $joinRequestsFilter: AdminWorkspaceJoinRequestFilter\n ) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesMembersRequestsTable_Workspace\n }\n }\n": typeof types.SettingsWorkspacesJoinRequestsSearchDocument,
"\n query SettingsWorkspacesInvitesSearch(\n $slug: String!\n $invitesFilter: PendingWorkspaceCollaboratorsFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersInvitesTable_Workspace\n }\n }\n": typeof types.SettingsWorkspacesInvitesSearchDocument,
"\n query SettingsWorkspacesProjects(\n $slug: String!\n $limit: Int!\n $cursor: String\n $filter: WorkspaceProjectsFilter\n ) {\n workspaceBySlug(slug: $slug) {\n id\n slug\n readOnly\n projects(limit: $limit, cursor: $cursor, filter: $filter) {\n cursor\n ...SettingsWorkspacesProjects_ProjectCollection\n }\n }\n }\n": typeof types.SettingsWorkspacesProjectsDocument,
"\n query SettingsWorkspaceSecurity($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesSecurity_Workspace\n }\n activeUser {\n ...SettingsWorkspacesSecurity_User\n }\n }\n": typeof types.SettingsWorkspaceSecurityDocument,
"\n fragment AppAuthorAvatar on AppAuthor {\n id\n name\n avatar\n }\n": typeof types.AppAuthorAvatarFragmentDoc,
"\n fragment LimitedUserAvatar on LimitedUser {\n id\n name\n avatar\n }\n": typeof types.LimitedUserAvatarFragmentDoc,
"\n fragment ActiveUserAvatar on User {\n id\n name\n avatar\n }\n": typeof types.ActiveUserAvatarFragmentDoc,
"\n subscription OnUserProjectsUpdate {\n userProjectsUpdated {\n type\n id\n project {\n ...ProjectDashboardItem\n }\n }\n }\n ": typeof types.OnUserProjectsUpdateDocument,
"\n mutation UpdateUser($input: UserUpdateInput!) {\n activeUserMutations {\n update(user: $input) {\n id\n name\n bio\n company\n avatar\n }\n }\n }\n": typeof types.UpdateUserDocument,
"\n mutation UpdateNotificationPreferences($input: JSONObject!) {\n userNotificationPreferencesUpdate(preferences: $input)\n }\n": typeof types.UpdateNotificationPreferencesDocument,
"\n mutation DeleteAccount($input: UserDeleteInput!) {\n userDelete(userConfirmation: $input)\n }\n": typeof types.DeleteAccountDocument,
"\n mutation verifyEmail($input: VerifyUserEmailInput!) {\n activeUserMutations {\n emailMutations {\n verify(input: $input)\n }\n }\n }\n": typeof types.VerifyEmailDocument,
"\n fragment EmailFields on UserEmail {\n id\n email\n verified\n primary\n userId\n }\n": typeof types.EmailFieldsFragmentDoc,
"\n query UserEmails {\n activeUser {\n id\n emails {\n ...EmailFields\n }\n hasPendingVerification\n }\n }\n": typeof types.UserEmailsDocument,
"\n fragment ViewerCommentBubblesData on Comment {\n id\n viewedAt\n viewerState\n }\n": typeof types.ViewerCommentBubblesDataFragmentDoc,
"\n fragment ViewerCommentThread on Comment {\n ...ViewerCommentsListItem\n ...ViewerCommentBubblesData\n ...ViewerCommentsReplyItem\n }\n": typeof types.ViewerCommentThreadFragmentDoc,
"\n fragment ViewerCommentsReplyItem on Comment {\n id\n archived\n rawText\n text {\n doc\n }\n author {\n ...LimitedUserAvatar\n }\n createdAt\n ...ThreadCommentAttachment\n }\n": typeof types.ViewerCommentsReplyItemFragmentDoc,
"\n mutation BroadcastViewerUserActivity(\n $projectId: String!\n $resourceIdString: String!\n $message: ViewerUserActivityMessageInput!\n ) {\n broadcastViewerUserActivity(\n projectId: $projectId\n resourceIdString: $resourceIdString\n message: $message\n )\n }\n": typeof types.BroadcastViewerUserActivityDocument,
"\n mutation MarkCommentViewed($input: MarkCommentViewedInput!) {\n commentMutations {\n markViewed(input: $input)\n }\n }\n": typeof types.MarkCommentViewedDocument,
"\n mutation CreateCommentThread($input: CreateCommentInput!) {\n commentMutations {\n create(input: $input) {\n ...ViewerCommentThread\n }\n }\n }\n": typeof types.CreateCommentThreadDocument,
"\n mutation CreateCommentReply($input: CreateCommentReplyInput!) {\n commentMutations {\n reply(input: $input) {\n ...ViewerCommentsReplyItem\n }\n }\n }\n": typeof types.CreateCommentReplyDocument,
"\n mutation ArchiveComment($input: ArchiveCommentInput!) {\n commentMutations {\n archive(input: $input)\n }\n }\n": typeof types.ArchiveCommentDocument,
"\n query ProjectViewerResources($projectId: String!, $resourceUrlString: String!) {\n project(id: $projectId) {\n id\n viewerResources(resourceIdString: $resourceUrlString) {\n identifier\n items {\n modelId\n versionId\n objectId\n }\n }\n }\n }\n": typeof types.ProjectViewerResourcesDocument,
"\n query ViewerLoadedResources(\n $projectId: String!\n $modelIds: [String!]!\n $versionIds: [String!]\n ) {\n project(id: $projectId) {\n id\n role\n allowPublicComments\n models(filter: { ids: $modelIds }) {\n totalCount\n items {\n id\n name\n updatedAt\n loadedVersion: versions(\n filter: { priorityIds: $versionIds, priorityIdsOnly: true }\n ) {\n items {\n ...ViewerModelVersionCardItem\n automationsStatus {\n id\n automationRuns {\n ...AutomateViewerPanel_AutomateRun\n }\n }\n }\n }\n versions(limit: 5) {\n totalCount\n cursor\n items {\n ...ViewerModelVersionCardItem\n }\n }\n }\n }\n ...ProjectPageLatestItemsModels\n ...ModelPageProject\n ...HeaderNavShare_Project\n }\n }\n": typeof types.ViewerLoadedResourcesDocument,
"\n query ViewerModelVersions(\n $projectId: String!\n $modelId: String!\n $versionsCursor: String\n ) {\n project(id: $projectId) {\n id\n role\n model(id: $modelId) {\n id\n versions(cursor: $versionsCursor, limit: 5) {\n totalCount\n cursor\n items {\n ...ViewerModelVersionCardItem\n }\n }\n }\n }\n }\n": typeof types.ViewerModelVersionsDocument,
"\n query ViewerDiffVersions(\n $projectId: String!\n $modelId: String!\n $versionAId: String!\n $versionBId: String!\n ) {\n project(id: $projectId) {\n id\n model(id: $modelId) {\n id\n versionA: version(id: $versionAId) {\n ...ViewerModelVersionCardItem\n }\n versionB: version(id: $versionBId) {\n ...ViewerModelVersionCardItem\n }\n }\n }\n }\n": typeof types.ViewerDiffVersionsDocument,
"\n query ViewerLoadedThreads(\n $projectId: String!\n $filter: ProjectCommentsFilter!\n $cursor: String\n $limit: Int\n ) {\n project(id: $projectId) {\n id\n commentThreads(filter: $filter, cursor: $cursor, limit: $limit) {\n totalCount\n totalArchivedCount\n items {\n ...ViewerCommentThread\n ...LinkableComment\n }\n }\n }\n }\n": typeof types.ViewerLoadedThreadsDocument,
"\n query ViewerRawProjectObject($projectId: String!, $objectId: String!) {\n project(id: $projectId) {\n id\n object(id: $objectId) {\n id\n data\n }\n }\n }\n": typeof types.ViewerRawProjectObjectDocument,
"\n subscription OnViewerUserActivityBroadcasted(\n $target: ViewerUpdateTrackingTarget!\n $sessionId: String!\n ) {\n viewerUserActivityBroadcasted(target: $target, sessionId: $sessionId) {\n userName\n userId\n user {\n ...LimitedUserAvatar\n }\n state\n status\n sessionId\n }\n }\n": typeof types.OnViewerUserActivityBroadcastedDocument,
"\n subscription OnViewerCommentsUpdated($target: ViewerUpdateTrackingTarget!) {\n projectCommentsUpdated(target: $target) {\n id\n type\n comment {\n id\n parent {\n id\n }\n ...ViewerCommentThread\n }\n }\n }\n": typeof types.OnViewerCommentsUpdatedDocument,
"\n fragment LinkableComment on Comment {\n id\n viewerResources {\n modelId\n versionId\n objectId\n }\n }\n": typeof types.LinkableCommentFragmentDoc,
"\n fragment UseWorkspaceInviteManager_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n token\n workspaceId\n workspaceSlug\n user {\n id\n }\n }\n": typeof types.UseWorkspaceInviteManager_PendingWorkspaceCollaboratorFragmentDoc,
"\n subscription OnWorkspaceProjectsUpdate($slug: String!) {\n workspaceProjectsUpdated(workspaceId: null, workspaceSlug: $slug) {\n projectId\n workspaceId\n type\n project {\n ...ProjectDashboardItem\n }\n }\n }\n ": typeof types.OnWorkspaceProjectsUpdateDocument,
"\n fragment WorkspaceHasCustomDataResidency_Workspace on Workspace {\n id\n defaultRegion {\n id\n name\n }\n }\n": typeof types.WorkspaceHasCustomDataResidency_WorkspaceFragmentDoc,
"\n query CheckProjectWorkspaceDataResidency($projectId: String!) {\n project(id: $projectId) {\n id\n workspace {\n ...WorkspaceHasCustomDataResidency_Workspace\n }\n }\n }\n": typeof types.CheckProjectWorkspaceDataResidencyDocument,
"\n fragment WorkspaceSsoStatus_Workspace on Workspace {\n id\n sso {\n provider {\n id\n name\n clientId\n issuerUrl\n }\n session {\n validUntil\n }\n }\n }\n ": typeof types.WorkspaceSsoStatus_WorkspaceFragmentDoc,
"\n fragment WorkspaceSsoStatus_User on User {\n expiredSsoSessions {\n id\n slug\n }\n }\n ": typeof types.WorkspaceSsoStatus_UserFragmentDoc,
"\n fragment WorkspaceBase_Workspace on Workspace {\n id\n name\n slug\n role\n description\n logo\n plan {\n status\n createdAt\n }\n }\n": typeof types.WorkspaceBase_WorkspaceFragmentDoc,
"\n fragment WorkspaceDashboardAbout_Workspace on Workspace {\n id\n name\n description\n }\n": typeof types.WorkspaceDashboardAbout_WorkspaceFragmentDoc,
"\n fragment WorkspaceInvitedTeam_Workspace on Workspace {\n id\n invitedTeam(filter: $invitesFilter) {\n id\n role\n email\n }\n }\n": typeof types.WorkspaceInvitedTeam_WorkspaceFragmentDoc,
"\n fragment WorkspaceTeam_Workspace on Workspace {\n id\n slug\n team {\n totalCount\n items {\n id\n user {\n id\n name\n ...LimitedUserAvatar\n }\n }\n }\n adminWorkspacesJoinRequests {\n totalCount\n items {\n status\n id\n }\n }\n ...WorkspaceInvitedTeam_Workspace\n }\n": typeof types.WorkspaceTeam_WorkspaceFragmentDoc,
"\n fragment WorkspaceSecurity_Workspace on Workspace {\n id\n slug\n domains {\n id\n domain\n }\n }\n": typeof types.WorkspaceSecurity_WorkspaceFragmentDoc,
"\n mutation UpdateRole($input: WorkspaceRoleUpdateInput!) {\n workspaceMutations {\n updateRole(input: $input) {\n team {\n items {\n id\n role\n }\n }\n }\n }\n }\n": typeof types.UpdateRoleDocument,
"\n mutation InviteToWorkspace(\n $workspaceId: String!\n $input: [WorkspaceInviteCreateInput!]!\n ) {\n workspaceMutations {\n invites {\n batchCreate(workspaceId: $workspaceId, input: $input) {\n id\n invitedTeam {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n }\n }\n }\n": typeof types.InviteToWorkspaceDocument,
"\n mutation CreateWorkspace($input: WorkspaceCreateInput!) {\n workspaceMutations {\n create(input: $input) {\n id\n ...SettingsDialog_Workspace\n }\n }\n }\n": typeof types.CreateWorkspaceDocument,
"\n mutation ProcessWorkspaceInvite($input: WorkspaceInviteUseInput!) {\n workspaceMutations {\n invites {\n use(input: $input)\n }\n }\n }\n": typeof types.ProcessWorkspaceInviteDocument,
"\n mutation SetDefaultWorkspaceRegion($workspaceId: String!, $regionKey: String!) {\n workspaceMutations {\n setDefaultRegion(workspaceId: $workspaceId, regionKey: $regionKey) {\n id\n defaultRegion {\n id\n ...SettingsWorkspacesRegionsSelect_ServerRegionItem\n }\n }\n }\n }\n": typeof types.SetDefaultWorkspaceRegionDocument,
"\n mutation DeleteWorkspaceSsoProvider($workspaceId: String!) {\n workspaceMutations {\n deleteSsoProvider(workspaceId: $workspaceId)\n }\n }\n": typeof types.DeleteWorkspaceSsoProviderDocument,
"\n mutation SetWorkspaceCreationState($input: WorkspaceCreationStateInput!) {\n workspaceMutations {\n updateCreationState(input: $input)\n }\n }\n": typeof types.SetWorkspaceCreationStateDocument,
"\n mutation WorkspaceUpdateDomainProtectionMutation($input: WorkspaceUpdateInput!) {\n workspaceMutations {\n update(input: $input) {\n id\n domainBasedMembershipProtectionEnabled\n }\n }\n }\n": typeof types.WorkspaceUpdateDomainProtectionMutationDocument,
"\n mutation WorkspaceUpdateDiscoverabilityMutation($input: WorkspaceUpdateInput!) {\n workspaceMutations {\n update(input: $input) {\n id\n discoverabilityEnabled\n }\n }\n }\n": typeof types.WorkspaceUpdateDiscoverabilityMutationDocument,
"\n mutation ApproveWorkspaceJoinRequest($input: ApproveWorkspaceJoinRequestInput!) {\n workspaceJoinRequestMutations {\n approve(input: $input)\n }\n }\n": typeof types.ApproveWorkspaceJoinRequestDocument,
"\n mutation DenyWorkspaceJoinRequest($input: DenyWorkspaceJoinRequestInput!) {\n workspaceJoinRequestMutations {\n deny(input: $input)\n }\n }\n": typeof types.DenyWorkspaceJoinRequestDocument,
"\n query WorkspaceAccessCheck($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n }\n }\n": typeof types.WorkspaceAccessCheckDocument,
"\n query WorkspacePageQuery(\n $workspaceSlug: String!\n $invitesFilter: PendingWorkspaceCollaboratorsFilter\n $token: String\n ) {\n workspaceBySlug(slug: $workspaceSlug) {\n ...WorkspaceProjectList_Workspace\n }\n workspaceInvite(\n workspaceId: $workspaceSlug\n token: $token\n options: { useSlug: true }\n ) {\n id\n ...WorkspaceInviteBanner_PendingWorkspaceCollaborator\n ...WorkspaceInviteBlock_PendingWorkspaceCollaborator\n }\n }\n": typeof types.WorkspacePageQueryDocument,
"\n query WorkspaceProjectsQuery(\n $workspaceSlug: String!\n $filter: WorkspaceProjectsFilter\n $cursor: String\n ) {\n workspaceBySlug(slug: $workspaceSlug) {\n id\n projects(filter: $filter, cursor: $cursor, limit: 10) {\n ...WorkspaceProjectList_ProjectCollection\n }\n }\n }\n": typeof types.WorkspaceProjectsQueryDocument,
"\n query WorkspaceFunctionsQuery($workspaceSlug: String!) {\n ...AutomateFunctionsPageHeader_Query\n workspaceBySlug(slug: $workspaceSlug) {\n id\n name\n automateFunctions {\n items {\n id\n ...AutomationsFunctionsCard_AutomateFunction\n ...AutomateAutomationCreateDialog_AutomateFunction\n }\n }\n }\n }\n": typeof types.WorkspaceFunctionsQueryDocument,
"\n query WorkspaceInvite(\n $workspaceId: String\n $token: String\n $options: WorkspaceInviteLookupOptions\n ) {\n workspaceInvite(workspaceId: $workspaceId, token: $token, options: $options) {\n ...WorkspaceInviteBanner_PendingWorkspaceCollaborator\n ...WorkspaceInviteBlock_PendingWorkspaceCollaborator\n }\n }\n": typeof types.WorkspaceInviteDocument,
"\n query MoveProjectsDialog {\n activeUser {\n ...MoveProjectsDialog_User\n }\n }\n": typeof types.MoveProjectsDialogDocument,
"\n query ValidateWorkspaceSlug($slug: String!) {\n validateWorkspaceSlug(slug: $slug)\n }\n": typeof types.ValidateWorkspaceSlugDocument,
"\n query WorkspaceSsoByEmail($email: String!) {\n workspaceSsoByEmail(email: $email) {\n ...AuthSsoLogin_Workspace\n }\n }\n": typeof types.WorkspaceSsoByEmailDocument,
"\n query WorkspaceSsoCheck($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...WorkspaceSsoStatus_Workspace\n }\n activeUser {\n ...WorkspaceSsoStatus_User\n }\n }\n": typeof types.WorkspaceSsoCheckDocument,
"\n query WorkspaceWizard($workspaceId: String!) {\n workspace(id: $workspaceId) {\n id\n ...WorkspaceWizard_Workspace\n }\n }\n": typeof types.WorkspaceWizardDocument,
"\n query WorkspaceWizardRegion {\n serverInfo {\n ...WorkspaceWizardStepRegion_ServerInfo\n }\n }\n": typeof types.WorkspaceWizardRegionDocument,
"\n subscription onWorkspaceUpdated(\n $workspaceId: String\n $workspaceSlug: String\n $invitesFilter: PendingWorkspaceCollaboratorsFilter\n ) {\n workspaceUpdated(workspaceId: $workspaceId, workspaceSlug: $workspaceSlug) {\n id\n workspace {\n id\n ...WorkspaceProjectList_Workspace\n }\n }\n }\n": typeof types.OnWorkspaceUpdatedDocument,
"\n query LegacyBranchRedirectMetadata($streamId: String!, $branchName: String!) {\n project(id: $streamId) {\n modelByName(name: $branchName) {\n id\n }\n }\n }\n": typeof types.LegacyBranchRedirectMetadataDocument,
"\n query LegacyViewerCommitRedirectMetadata($streamId: String!, $commitId: String!) {\n project(id: $streamId) {\n version(id: $commitId) {\n id\n model {\n id\n }\n }\n }\n }\n": typeof types.LegacyViewerCommitRedirectMetadataDocument,
"\n query LegacyViewerStreamRedirectMetadata($streamId: String!) {\n project(id: $streamId) {\n id\n versions(limit: 1) {\n totalCount\n items {\n id\n model {\n id\n }\n }\n }\n }\n }\n": typeof types.LegacyViewerStreamRedirectMetadataDocument,
"\n query AutoAcceptableWorkspaceInvite(\n $token: String!\n $workspaceId: String!\n $options: WorkspaceInviteLookupOptions\n ) {\n workspaceInvite(token: $token, workspaceId: $workspaceId, options: $options) {\n id\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n }\n": typeof types.AutoAcceptableWorkspaceInviteDocument,
"\n query ResolveCommentLink($commentId: String!, $projectId: String!) {\n project(id: $projectId) {\n comment(id: $commentId) {\n id\n ...LinkableComment\n }\n }\n }\n": typeof types.ResolveCommentLinkDocument,
"\n fragment AutomateFunctionPage_AutomateFunction on AutomateFunction {\n id\n name\n description\n logo\n supportedSourceApps\n tags\n ...AutomateFunctionPageHeader_Function\n ...AutomateFunctionPageInfo_AutomateFunction\n ...AutomateAutomationCreateDialog_AutomateFunction\n creator {\n id\n }\n }\n": typeof types.AutomateFunctionPage_AutomateFunctionFragmentDoc,
"\n query AutomateFunctionPage($functionId: ID!) {\n automateFunction(id: $functionId) {\n ...AutomateFunctionPage_AutomateFunction\n }\n activeUser {\n workspaces {\n items {\n ...AutomateFunctionCreateDialog_Workspace\n ...AutomateFunctionEditDialog_Workspace\n }\n }\n }\n }\n": typeof types.AutomateFunctionPageDocument,
"\n query AutomateFunctionPageWorkspace($workspaceId: String!) {\n workspace(id: $workspaceId) {\n id\n ...AutomateFunctionPageHeader_Workspace\n }\n }\n": typeof types.AutomateFunctionPageWorkspaceDocument,
"\n fragment PagesOnboarding_DiscoverableWorkspaces on User {\n discoverableWorkspaces {\n id\n name\n logo\n description\n slug\n }\n }\n": typeof types.PagesOnboarding_DiscoverableWorkspacesFragmentDoc,
"\n fragment ProjectPageProject on Project {\n id\n createdAt\n modelCount: models(limit: 0) {\n totalCount\n }\n commentThreadCount: commentThreads(limit: 0) {\n totalCount\n }\n workspace {\n id\n }\n ...ProjectPageTeamInternals_Project\n ...ProjectPageProjectHeader\n ...ProjectPageTeamDialog\n ...ProjectsMoveToWorkspaceDialog_Project\n }\n": typeof types.ProjectPageProjectFragmentDoc,
"\n fragment ProjectPageAutomationPage_Automation on Automation {\n id\n ...ProjectPageAutomationHeader_Automation\n ...ProjectPageAutomationFunctions_Automation\n ...ProjectPageAutomationRuns_Automation\n }\n": typeof types.ProjectPageAutomationPage_AutomationFragmentDoc,
"\n fragment ProjectPageAutomationPage_Project on Project {\n id\n workspaceId\n ...ProjectPageAutomationHeader_Project\n }\n": typeof types.ProjectPageAutomationPage_ProjectFragmentDoc,
"\n fragment ProjectPageSettingsTab_Project on Project {\n id\n role\n }\n": typeof types.ProjectPageSettingsTab_ProjectFragmentDoc,
"\n fragment SettingsServerProjects_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...SettingsSharedProjects_Project\n }\n }\n": typeof types.SettingsServerProjects_ProjectCollectionFragmentDoc,
"\n query SettingsServerRegions {\n serverInfo {\n multiRegion {\n regions {\n id\n ...SettingsServerRegionsTable_ServerRegionItem\n }\n availableKeys\n }\n }\n }\n": typeof types.SettingsServerRegionsDocument,
"\n fragment SettingsWorkspacesBilling_Workspace on Workspace {\n ...BillingAlert_Workspace\n id\n role\n plan {\n name\n status\n createdAt\n paymentMethod\n }\n subscription {\n billingInterval\n currentBillingCycleEnd\n seats {\n guest\n plan\n }\n }\n team {\n items {\n id\n role\n }\n }\n }\n": typeof types.SettingsWorkspacesBilling_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesGeneral_Workspace on Workspace {\n ...SettingsWorkspacesGeneralEditAvatar_Workspace\n ...SettingsWorkspaceGeneralDeleteDialog_Workspace\n ...SettingsWorkspacesGeneralEditSlugDialog_Workspace\n id\n name\n slug\n description\n logo\n role\n defaultProjectRole\n plan {\n status\n name\n }\n }\n": typeof types.SettingsWorkspacesGeneral_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n team {\n items {\n id\n }\n }\n invitedTeam(filter: $invitesFilter) {\n user {\n id\n }\n }\n adminWorkspacesJoinRequests(filter: $joinRequestsFilter) {\n totalCount\n }\n }\n": typeof types.SettingsWorkspacesMembers_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesProjects_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...SettingsSharedProjects_Project\n }\n }\n": typeof types.SettingsWorkspacesProjects_ProjectCollectionFragmentDoc,
"\n fragment SettingsWorkspacesRegions_Workspace on Workspace {\n id\n role\n defaultRegion {\n id\n ...SettingsWorkspacesRegionsSelect_ServerRegionItem\n }\n hasAccessToMultiRegion: hasAccessToFeature(\n featureName: workspaceDataRegionSpecificity\n )\n hasProjects: projects(limit: 0) {\n totalCount\n }\n }\n": typeof types.SettingsWorkspacesRegions_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesRegions_ServerInfo on ServerInfo {\n multiRegion {\n regions {\n id\n ...SettingsWorkspacesRegionsSelect_ServerRegionItem\n }\n }\n }\n": typeof types.SettingsWorkspacesRegions_ServerInfoFragmentDoc,
"\n fragment SettingsWorkspacesSecurity_Workspace on Workspace {\n id\n slug\n domains {\n id\n domain\n ...SettingsWorkspacesSecurityDomainRemoveDialog_WorkspaceDomain\n }\n ...SettingsWorkspacesSecuritySsoWrapper_Workspace\n domainBasedMembershipProtectionEnabled\n discoverabilityEnabled\n }\n\n fragment SettingsWorkspacesSecurity_User on User {\n id\n emails {\n id\n email\n verified\n }\n }\n": typeof types.SettingsWorkspacesSecurity_WorkspaceFragmentDoc,
};
const documents: Documents = {
"\n fragment AuthLoginWithEmailBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n email\n user {\n id\n }\n }\n": types.AuthLoginWithEmailBlock_PendingWorkspaceCollaboratorFragmentDoc,
"\n query AuthRegisterPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n": types.AuthRegisterPanelWorkspaceInviteDocument,
"\n fragment ServerTermsOfServicePrivacyPolicyFragment on ServerInfo {\n termsOfService\n }\n": types.ServerTermsOfServicePrivacyPolicyFragmentFragmentDoc,
@@ -331,12 +331,13 @@ export type AutomateFunctionTemplate = {
url: Scalars['String']['output'];
};
export enum AutomateFunctionTemplateLanguage {
DotNet = 'DOT_NET',
Python = 'PYTHON',
Typescript = 'TYPESCRIPT'
}
export const AutomateFunctionTemplateLanguage = {
DotNet: 'DOT_NET',
Python: 'PYTHON',
Typescript: 'TYPESCRIPT'
} as const;
export type AutomateFunctionTemplateLanguage = typeof AutomateFunctionTemplateLanguage[keyof typeof AutomateFunctionTemplateLanguage];
export type AutomateFunctionToken = {
__typename?: 'AutomateFunctionToken';
functionId: Scalars['String']['output'];
@@ -390,21 +391,23 @@ export type AutomateRunCollection = {
totalCount: Scalars['Int']['output'];
};
export enum AutomateRunStatus {
Canceled = 'CANCELED',
Exception = 'EXCEPTION',
Failed = 'FAILED',
Initializing = 'INITIALIZING',
Pending = 'PENDING',
Running = 'RUNNING',
Succeeded = 'SUCCEEDED',
Timeout = 'TIMEOUT'
}
export const AutomateRunStatus = {
Canceled: 'CANCELED',
Exception: 'EXCEPTION',
Failed: 'FAILED',
Initializing: 'INITIALIZING',
Pending: 'PENDING',
Running: 'RUNNING',
Succeeded: 'SUCCEEDED',
Timeout: 'TIMEOUT'
} as const;
export enum AutomateRunTriggerType {
VersionCreated = 'VERSION_CREATED'
}
export type AutomateRunStatus = typeof AutomateRunStatus[keyof typeof AutomateRunStatus];
export const AutomateRunTriggerType = {
VersionCreated: 'VERSION_CREATED'
} as const;
export type AutomateRunTriggerType = typeof AutomateRunTriggerType[keyof typeof AutomateRunTriggerType];
export type Automation = {
__typename?: 'Automation';
createdAt: Scalars['DateTime']['output'];
@@ -465,11 +468,12 @@ export type BasicGitRepositoryMetadata = {
url: Scalars['String']['output'];
};
export enum BillingInterval {
Monthly = 'monthly',
Yearly = 'yearly'
}
export const BillingInterval = {
Monthly: 'monthly',
Yearly: 'yearly'
} as const;
export type BillingInterval = typeof BillingInterval[keyof typeof BillingInterval];
export type BlobMetadata = {
__typename?: 'BlobMetadata';
createdAt: Scalars['DateTime']['output'];
@@ -928,11 +932,12 @@ export type DenyWorkspaceJoinRequestInput = {
workspaceId: Scalars['String']['input'];
};
export enum DiscoverableStreamsSortType {
CreatedDate = 'CREATED_DATE',
FavoritesCount = 'FAVORITES_COUNT'
}
export const DiscoverableStreamsSortType = {
CreatedDate: 'CREATED_DATE',
FavoritesCount: 'FAVORITES_COUNT'
} as const;
export type DiscoverableStreamsSortType = typeof DiscoverableStreamsSortType[keyof typeof DiscoverableStreamsSortType];
export type DiscoverableStreamsSortingInput = {
direction: SortDirection;
type: DiscoverableStreamsSortType;
@@ -1848,12 +1853,13 @@ export type ObjectCreateInput = {
streamId: Scalars['String']['input'];
};
export enum PaidWorkspacePlans {
Business = 'business',
Plus = 'plus',
Starter = 'starter'
}
export const PaidWorkspacePlans = {
Business: 'business',
Plus: 'plus',
Starter: 'starter'
} as const;
export type PaidWorkspacePlans = typeof PaidWorkspacePlans[keyof typeof PaidWorkspacePlans];
export type PasswordStrengthCheckFeedback = {
__typename?: 'PasswordStrengthCheckFeedback';
suggestions: Array<Scalars['String']['output']>;
@@ -2181,12 +2187,13 @@ export type ProjectAutomationsUpdatedMessage = {
type: ProjectAutomationsUpdatedMessageType;
};
export enum ProjectAutomationsUpdatedMessageType {
Created = 'CREATED',
CreatedRevision = 'CREATED_REVISION',
Updated = 'UPDATED'
}
export const ProjectAutomationsUpdatedMessageType = {
Created: 'CREATED',
CreatedRevision: 'CREATED_REVISION',
Updated: 'UPDATED'
} as const;
export type ProjectAutomationsUpdatedMessageType = typeof ProjectAutomationsUpdatedMessageType[keyof typeof ProjectAutomationsUpdatedMessageType];
export type ProjectCollaborator = {
__typename?: 'ProjectCollaborator';
id: Scalars['ID']['output'];
@@ -2233,12 +2240,13 @@ export type ProjectCommentsUpdatedMessage = {
type: ProjectCommentsUpdatedMessageType;
};
export enum ProjectCommentsUpdatedMessageType {
Archived = 'ARCHIVED',
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectCommentsUpdatedMessageType = {
Archived: 'ARCHIVED',
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectCommentsUpdatedMessageType = typeof ProjectCommentsUpdatedMessageType[keyof typeof ProjectCommentsUpdatedMessageType];
/** Any values left null will be ignored */
export type ProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
@@ -2254,11 +2262,12 @@ export type ProjectFileImportUpdatedMessage = {
upload: FileUpload;
};
export enum ProjectFileImportUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectFileImportUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectFileImportUpdatedMessageType = typeof ProjectFileImportUpdatedMessageType[keyof typeof ProjectFileImportUpdatedMessageType];
export type ProjectInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -2355,12 +2364,13 @@ export type ProjectModelsUpdatedMessage = {
type: ProjectModelsUpdatedMessageType;
};
export enum ProjectModelsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectModelsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectModelsUpdatedMessageType = typeof ProjectModelsUpdatedMessageType[keyof typeof ProjectModelsUpdatedMessageType];
export type ProjectMutations = {
__typename?: 'ProjectMutations';
/** Access request related mutations */
@@ -2430,11 +2440,12 @@ export type ProjectPendingModelsUpdatedMessage = {
type: ProjectPendingModelsUpdatedMessageType;
};
export enum ProjectPendingModelsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingModelsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingModelsUpdatedMessageType = typeof ProjectPendingModelsUpdatedMessageType[keyof typeof ProjectPendingModelsUpdatedMessageType];
export type ProjectPendingVersionsUpdatedMessage = {
__typename?: 'ProjectPendingVersionsUpdatedMessage';
/** Upload ID */
@@ -2443,11 +2454,12 @@ export type ProjectPendingVersionsUpdatedMessage = {
version: FileUpload;
};
export enum ProjectPendingVersionsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingVersionsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingVersionsUpdatedMessageType = typeof ProjectPendingVersionsUpdatedMessageType[keyof typeof ProjectPendingVersionsUpdatedMessageType];
export type ProjectRole = {
__typename?: 'ProjectRole';
project: Project;
@@ -2469,11 +2481,12 @@ export type ProjectTriggeredAutomationsStatusUpdatedMessage = {
version: Version;
};
export enum ProjectTriggeredAutomationsStatusUpdatedMessageType {
RunCreated = 'RUN_CREATED',
RunUpdated = 'RUN_UPDATED'
}
export const ProjectTriggeredAutomationsStatusUpdatedMessageType = {
RunCreated: 'RUN_CREATED',
RunUpdated: 'RUN_UPDATED'
} as const;
export type ProjectTriggeredAutomationsStatusUpdatedMessageType = typeof ProjectTriggeredAutomationsStatusUpdatedMessageType[keyof typeof ProjectTriggeredAutomationsStatusUpdatedMessageType];
/** Any values left null will be ignored, so only set the properties that you want updated */
export type ProjectUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
@@ -2500,11 +2513,12 @@ export type ProjectUpdatedMessage = {
type: ProjectUpdatedMessageType;
};
export enum ProjectUpdatedMessageType {
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectUpdatedMessageType = {
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectUpdatedMessageType = typeof ProjectUpdatedMessageType[keyof typeof ProjectUpdatedMessageType];
export type ProjectVersionsPreviewGeneratedMessage = {
__typename?: 'ProjectVersionsPreviewGeneratedMessage';
objectId: Scalars['String']['output'];
@@ -2523,18 +2537,20 @@ export type ProjectVersionsUpdatedMessage = {
version?: Maybe<Version>;
};
export enum ProjectVersionsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectVersionsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export enum ProjectVisibility {
Private = 'PRIVATE',
Public = 'PUBLIC',
Unlisted = 'UNLISTED'
}
export type ProjectVersionsUpdatedMessageType = typeof ProjectVersionsUpdatedMessageType[keyof typeof ProjectVersionsUpdatedMessageType];
export const ProjectVisibility = {
Private: 'PRIVATE',
Public: 'PUBLIC',
Unlisted: 'UNLISTED'
} as const;
export type ProjectVisibility = typeof ProjectVisibility[keyof typeof ProjectVisibility];
export type Query = {
__typename?: 'Query';
/** Stare into the void. */
@@ -2658,7 +2674,6 @@ export type Query = {
* Either token or workspaceId must be specified, or both
*/
workspaceInvite?: Maybe<PendingWorkspaceCollaborator>;
workspacePricingPlans: Scalars['JSONObject']['output'];
/** Find workspaces a given user email can use SSO to sign with */
workspaceSsoByEmail: Array<LimitedWorkspace>;
};
@@ -2845,13 +2860,14 @@ export type ResourceIdentifierInput = {
resourceType: ResourceType;
};
export enum ResourceType {
Comment = 'comment',
Commit = 'commit',
Object = 'object',
Stream = 'stream'
}
export const ResourceType = {
Comment: 'comment',
Commit: 'commit',
Object: 'object',
Stream: 'stream'
} as const;
export type ResourceType = typeof ResourceType[keyof typeof ResourceType];
export type Role = {
__typename?: 'Role';
description: Scalars['String']['output'];
@@ -3015,13 +3031,14 @@ export type ServerRegionMutationsUpdateArgs = {
input: UpdateServerRegionInput;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
ServerGuest = 'SERVER_GUEST',
ServerUser = 'SERVER_USER'
}
export const ServerRole = {
ServerAdmin: 'SERVER_ADMIN',
ServerArchivedUser: 'SERVER_ARCHIVED_USER',
ServerGuest: 'SERVER_GUEST',
ServerUser: 'SERVER_USER'
} as const;
export type ServerRole = typeof ServerRole[keyof typeof ServerRole];
export type ServerRoleItem = {
__typename?: 'ServerRoleItem';
id: Scalars['String']['output'];
@@ -3060,11 +3077,12 @@ export type ServerWorkspacesInfo = {
workspacesEnabled: Scalars['Boolean']['output'];
};
export enum SessionPaymentStatus {
Paid = 'paid',
Unpaid = 'unpaid'
}
export const SessionPaymentStatus = {
Paid: 'paid',
Unpaid: 'unpaid'
} as const;
export type SessionPaymentStatus = typeof SessionPaymentStatus[keyof typeof SessionPaymentStatus];
export type SetPrimaryUserEmailInput = {
id: Scalars['ID']['input'];
};
@@ -3084,11 +3102,12 @@ export type SmartTextEditorValue = {
version: Scalars['String']['output'];
};
export enum SortDirection {
Asc = 'ASC',
Desc = 'DESC'
}
export const SortDirection = {
Asc: 'ASC',
Desc: 'DESC'
} as const;
export type SortDirection = typeof SortDirection[keyof typeof SortDirection];
export type Stream = {
__typename?: 'Stream';
/**
@@ -3283,12 +3302,13 @@ export type StreamRevokePermissionInput = {
userId: Scalars['String']['input'];
};
export enum StreamRole {
StreamContributor = 'STREAM_CONTRIBUTOR',
StreamOwner = 'STREAM_OWNER',
StreamReviewer = 'STREAM_REVIEWER'
}
export const StreamRole = {
StreamContributor: 'STREAM_CONTRIBUTOR',
StreamOwner: 'STREAM_OWNER',
StreamReviewer: 'STREAM_REVIEWER'
} as const;
export type StreamRole = typeof StreamRole[keyof typeof StreamRole];
export type StreamUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
description?: InputMaybe<Scalars['String']['input']>;
@@ -3604,11 +3624,12 @@ export type TokenResourceIdentifierInput = {
type: TokenResourceIdentifierType;
};
export enum TokenResourceIdentifierType {
Project = 'project',
Workspace = 'workspace'
}
export const TokenResourceIdentifierType = {
Project: 'project',
Workspace: 'workspace'
} as const;
export type TokenResourceIdentifierType = typeof TokenResourceIdentifierType[keyof typeof TokenResourceIdentifierType];
export type TriggeredAutomationsStatus = {
__typename?: 'TriggeredAutomationsStatus';
automationRuns: Array<AutomateRun>;
@@ -3953,11 +3974,12 @@ export type UserProjectsUpdatedMessage = {
type: UserProjectsUpdatedMessageType;
};
export enum UserProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const UserProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type UserProjectsUpdatedMessageType = typeof UserProjectsUpdatedMessageType[keyof typeof UserProjectsUpdatedMessageType];
export type UserRoleInput = {
id: Scalars['String']['input'];
role: Scalars['String']['input'];
@@ -4147,11 +4169,12 @@ export type ViewerUserActivityMessageInput = {
userName: Scalars['String']['input'];
};
export enum ViewerUserActivityStatus {
Disconnected = 'DISCONNECTED',
Viewing = 'VIEWING'
}
export const ViewerUserActivityStatus = {
Disconnected: 'DISCONNECTED',
Viewing: 'VIEWING'
} as const;
export type ViewerUserActivityStatus = typeof ViewerUserActivityStatus[keyof typeof ViewerUserActivityStatus];
export type Webhook = {
__typename?: 'Webhook';
description?: Maybe<Scalars['String']['output']>;
@@ -4379,12 +4402,13 @@ export type WorkspaceDomainDeleteInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceFeatureName {
DomainBasedSecurityPolicies = 'domainBasedSecurityPolicies',
OidcSso = 'oidcSso',
WorkspaceDataRegionSpecificity = 'workspaceDataRegionSpecificity'
}
export const WorkspaceFeatureName = {
DomainBasedSecurityPolicies: 'domainBasedSecurityPolicies',
OidcSso: 'oidcSso',
WorkspaceDataRegionSpecificity: 'workspaceDataRegionSpecificity'
} as const;
export type WorkspaceFeatureName = typeof WorkspaceFeatureName[keyof typeof WorkspaceFeatureName];
export type WorkspaceInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -4489,12 +4513,13 @@ export type WorkspaceJoinRequestMutationsDenyArgs = {
input: DenyWorkspaceJoinRequestInput;
};
export enum WorkspaceJoinRequestStatus {
Approved = 'approved',
Denied = 'denied',
Pending = 'pending'
}
export const WorkspaceJoinRequestStatus = {
Approved: 'approved',
Denied: 'denied',
Pending: 'pending'
} as const;
export type WorkspaceJoinRequestStatus = typeof WorkspaceJoinRequestStatus[keyof typeof WorkspaceJoinRequestStatus];
export type WorkspaceMutations = {
__typename?: 'WorkspaceMutations';
addDomain: Workspace;
@@ -4583,12 +4608,13 @@ export type WorkspaceMutationsUpdateRoleArgs = {
input: WorkspaceRoleUpdateInput;
};
export enum WorkspacePaymentMethod {
Billing = 'billing',
Invoice = 'invoice',
Unpaid = 'unpaid'
}
export const WorkspacePaymentMethod = {
Billing: 'billing',
Invoice: 'invoice',
Unpaid: 'unpaid'
} as const;
export type WorkspacePaymentMethod = typeof WorkspacePaymentMethod[keyof typeof WorkspacePaymentMethod];
export type WorkspacePlan = {
__typename?: 'WorkspacePlan';
createdAt: Scalars['DateTime']['output'];
@@ -4597,27 +4623,31 @@ export type WorkspacePlan = {
status: WorkspacePlanStatuses;
};
export enum WorkspacePlanStatuses {
CancelationScheduled = 'cancelationScheduled',
Canceled = 'canceled',
Expired = 'expired',
PaymentFailed = 'paymentFailed',
Trial = 'trial',
Valid = 'valid'
}
export const WorkspacePlanStatuses = {
CancelationScheduled: 'cancelationScheduled',
Canceled: 'canceled',
Expired: 'expired',
PaymentFailed: 'paymentFailed',
Trial: 'trial',
Valid: 'valid'
} as const;
export enum WorkspacePlans {
Academia = 'academia',
Business = 'business',
BusinessInvoiced = 'businessInvoiced',
Free = 'free',
Plus = 'plus',
PlusInvoiced = 'plusInvoiced',
Starter = 'starter',
StarterInvoiced = 'starterInvoiced',
Unlimited = 'unlimited'
}
export type WorkspacePlanStatuses = typeof WorkspacePlanStatuses[keyof typeof WorkspacePlanStatuses];
export const WorkspacePlans = {
Academia: 'academia',
Business: 'business',
BusinessInvoiced: 'businessInvoiced',
Free: 'free',
Plus: 'plus',
PlusInvoiced: 'plusInvoiced',
Pro: 'pro',
Starter: 'starter',
StarterInvoiced: 'starterInvoiced',
Team: 'team',
Unlimited: 'unlimited'
} as const;
export type WorkspacePlans = typeof WorkspacePlans[keyof typeof WorkspacePlans];
export type WorkspaceProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
name?: InputMaybe<Scalars['String']['input']>;
@@ -4689,21 +4719,23 @@ export type WorkspaceProjectsUpdatedMessage = {
workspaceId: Scalars['String']['output'];
};
export enum WorkspaceProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const WorkspaceProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type WorkspaceProjectsUpdatedMessageType = typeof WorkspaceProjectsUpdatedMessageType[keyof typeof WorkspaceProjectsUpdatedMessageType];
export type WorkspaceRequestToJoinInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceRole {
Admin = 'ADMIN',
Guest = 'GUEST',
Member = 'MEMBER'
}
export const WorkspaceRole = {
Admin: 'ADMIN',
Guest: 'GUEST',
Member: 'MEMBER'
} as const;
export type WorkspaceRole = typeof WorkspaceRole[keyof typeof WorkspaceRole];
export type WorkspaceRoleDeleteInput = {
userId: Scalars['String']['input'];
workspaceId: Scalars['String']['input'];
@@ -7888,7 +7920,6 @@ export type QueryFieldArgs = {
workspace: QueryWorkspaceArgs,
workspaceBySlug: QueryWorkspaceBySlugArgs,
workspaceInvite: QueryWorkspaceInviteArgs,
workspacePricingPlans: {},
workspaceSsoByEmail: QueryWorkspaceSsoByEmailArgs,
}
export type ResourceIdentifierFieldArgs = {
@@ -85,10 +85,12 @@ export function useProjectVersionUpdateTracking(
const event = res.data.projectVersionsUpdated
const version = event.version
if (
[
ProjectVersionsUpdatedMessageType.Created,
ProjectVersionsUpdatedMessageType.Updated
].includes(event.type) &&
(
[
ProjectVersionsUpdatedMessageType.Created,
ProjectVersionsUpdatedMessageType.Updated
] as string[]
).includes(event.type) &&
version
) {
// Added new model w/ versions OR updated model that now has versions (it might not have had them previously)
@@ -1,6 +1,4 @@
import type { AvailableRoles } from '@speckle/shared'
import { isObjectLike, has } from 'lodash'
import type { WorkspacePlans } from '~/lib/common/generated/gql/graphql'
type BaseSettingsMenuItem = {
title: string
@@ -17,22 +15,3 @@ export type WorkspaceSettingsMenuItem = BaseSettingsMenuItem & {
name: string
route: (slug: string) => string
}
export type WorkspacePricingPlans = {
workspacePricingPlans: {
workspacePlanInformation: {
[key: string]: {
name: WorkspacePlans
}
}
}
}
export function isWorkspacePricingPlans(
pricingPlans: unknown
): pricingPlans is WorkspacePricingPlans {
return (
isObjectLike(pricingPlans) &&
has(pricingPlans, 'workspacePricingPlans.workspacePlanInformation')
)
}
+4 -4
View File
@@ -89,11 +89,11 @@
"@babel/preset-typescript": "^7.18.6",
"@datadog/datadog-ci": "^2.37.0",
"@eslint/config-inspector": "^0.4.10",
"@graphql-codegen/cli": "^5.0.3",
"@graphql-codegen/client-preset": "^4.5.0",
"@graphql-codegen/cli": "^5.0.5",
"@graphql-codegen/client-preset": "^4.6.4",
"@graphql-codegen/plugin-helpers": "^5.1.0",
"@graphql-codegen/typescript": "^4.1.1",
"@graphql-codegen/visitor-plugin-common": "5.5.0",
"@graphql-codegen/typescript": "^4.1.5",
"@graphql-codegen/visitor-plugin-common": "^5.7.1",
"@nuxt/devtools": "^1.7.0",
"@nuxt/eslint": "^1.1.0",
"@nuxt/image": "^1.8.1",
@@ -217,13 +217,14 @@ import {
type PaidWorkspacePlans
} from '~/lib/common/generated/gql/graphql'
import { useBillingActions } from '~/lib/billing/composables/actions'
import { pricingPlansConfig } from '~/lib/billing/helpers/constants'
import type { PaidWorkspacePlansOld } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { InformationCircleIcon } from '@heroicons/vue/24/outline'
import { isPaidPlan } from '@/lib/billing/helpers/types'
import { useMixpanel } from '~/lib/core/composables/mp'
import { guideBillingUrl } from '~/lib/common/helpers/route'
import { adminUpdateWorkspacePlanMutation } from '~/lib/billing/graphql/mutations'
import { WorkspaceOldPaidPlanPrices } from '~/lib/billing/helpers/constants'
graphql(`
fragment SettingsWorkspacesBilling_Workspace on Workspace {
@@ -280,15 +281,15 @@ const { billingPortalRedirect, redirectToCheckout } = useBillingActions()
const mixpanel = useMixpanel()
const { mutate: mutateWorkspacePlan } = useMutation(adminUpdateWorkspacePlanMutation)
const seatPrices = ref({
[WorkspacePlans.Starter]: pricingPlansConfig.plans[WorkspacePlans.Starter].cost,
[WorkspacePlans.Plus]: pricingPlansConfig.plans[WorkspacePlans.Plus].cost,
[WorkspacePlans.Business]: pricingPlansConfig.plans[WorkspacePlans.Business].cost
})
const selectedPlanName = ref<WorkspacePlans>()
const selectedPlanName = ref<PaidWorkspacePlansOld>()
const selectedPlanCycle = ref<BillingInterval>()
const isUpgradeDialogOpen = ref(false)
const seatPrices = computed(() => ({
[WorkspacePlans.Starter]: WorkspaceOldPaidPlanPrices[WorkspacePlans.Starter],
[WorkspacePlans.Plus]: WorkspaceOldPaidPlanPrices[WorkspacePlans.Plus],
[WorkspacePlans.Business]: WorkspaceOldPaidPlanPrices[WorkspacePlans.Business]
}))
const workspace = computed(() => workspaceResult.value?.workspaceBySlug)
const currentPlan = computed(() => workspace.value?.plan)
const subscription = computed(() => workspace.value?.subscription)
@@ -422,7 +423,10 @@ const showStatusBadge = computed(() => {
)
})
const onPlanSelected = (plan: { name: WorkspacePlans; cycle: BillingInterval }) => {
const onPlanSelected = (plan: {
name: PaidWorkspacePlansOld
cycle: BillingInterval
}) => {
const { name, cycle } = plan
if (!isPaidPlan(name) || !workspace.value?.id) return
@@ -244,11 +244,13 @@ const canDeleteWorkspace = computed(
!needsSsoLogin.value &&
(!isBillingIntegrationEnabled ||
!(
[
WorkspacePlanStatuses.Valid,
WorkspacePlanStatuses.PaymentFailed,
WorkspacePlanStatuses.CancelationScheduled
].includes(
(
[
WorkspacePlanStatuses.Valid,
WorkspacePlanStatuses.PaymentFailed,
WorkspacePlanStatuses.CancelationScheduled
] as string[]
).includes(
workspaceResult.value?.workspaceBySlug?.plan?.status as WorkspacePlanStatuses
) && isPaidPlan(workspaceResult.value?.workspaceBySlug?.plan?.name)
))
+1 -3
View File
@@ -22,9 +22,7 @@
"imports": {
"#lodash": {
"require": "lodash",
"import": "lodash-es",
"node": "lodash",
"default": "lodash-es"
"import": "lodash-es"
}
},
"homepage": "https://speckle.systems",
+6 -8
View File
@@ -42,7 +42,7 @@
"@types/lodash-es": "^4.17.12",
"@typescript-eslint/eslint-plugin": "^7.12.0",
"@typescript-eslint/parser": "^7.12.0",
"@vitest/coverage-v8": "^1.6.0",
"@vitest/coverage-v8": "^3.0.7",
"eslint": "^9.4.0",
"eslint-config-prettier": "^9.1.0",
"prettier": "^3.3.2",
@@ -54,21 +54,19 @@
"exports": {
".": {
"import": {
"default": "./dist/objectsender.js",
"types": "./dist/index.d.ts"
"types": "./dist/index.d.ts",
"default": "./dist/objectsender.js"
},
"require": {
"default": "./dist/objectsender.cjs",
"types": "./dist/index.d.ts"
"types": "./dist/index.d.ts",
"default": "./dist/objectsender.cjs"
}
}
},
"imports": {
"#lodash": {
"require": "lodash",
"import": "lodash-es",
"node": "lodash",
"default": "lodash-es"
"import": "lodash-es"
}
}
}
+1 -3
View File
@@ -1,3 +1 @@
{
"vitest.disableWorkspaceWarning": true
}
{}
@@ -1,7 +1,3 @@
extend type Query {
workspacePricingPlans: JSONObject!
}
extend type WorkspaceMutations {
billing: WorkspaceBillingMutations! @hasScope(scope: "workspace:billing")
}
@@ -66,6 +62,8 @@ enum WorkspacePlans {
starterInvoiced
plusInvoiced
businessInvoiced
team
pro
}
enum WorkspacePlanStatuses {
+4
View File
@@ -8,6 +8,7 @@ generates:
- 'typescript'
- 'typescript-resolvers'
config:
enumsAsConst: true
contextType: '@/modules/shared/helpers/typeHelper#GraphQLContext'
mappers:
Stream: '@/modules/core/helpers/graphTypes#StreamGraphQLReturn'
@@ -89,6 +90,7 @@ generates:
documents:
- 'modules/cross-server-sync/**/*.{js,ts}'
config:
enumsAsConst: true
scalars:
JSONObject: Record<string, unknown>
DateTime: string
@@ -101,10 +103,12 @@ generates:
- 'test/graphql/*.{js,ts}'
- 'modules/**/tests/helpers/graphql.ts'
config:
enumsAsConst: true
scalars:
JSONObject: Record<string, unknown>
DateTime: string
config:
enumsAsConst: true
scalars:
JSONObject: Record<string, unknown>
DateTime: Date
@@ -3,11 +3,8 @@ import { cliLogger } from '@/logging/logging'
import { getWorkspaceBySlugOrIdFactory } from '@/modules/workspaces/repositories/workspaces'
import { db } from '@/db/knex'
import { upsertPaidWorkspacePlanFactory } from '@/modules/gatekeeper/repositories/billing'
import {
PaidWorkspacePlans,
PaidWorkspacePlanStatuses
} from '@/modules/gatekeeperCore/domain/billing'
import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace'
import { PaidWorkspacePlans, PaidWorkspacePlanStatuses } from '@speckle/shared'
const command: CommandModule<
unknown,
@@ -6,12 +6,14 @@ export type ResourceIdentifier = {
resourceType: ResourceType
}
export enum ResourceType {
Comment = 'comment',
Commit = 'commit',
Object = 'object',
Stream = 'stream'
}
export const ResourceType = {
Comment: 'comment',
Commit: 'commit',
Object: 'object',
Stream: 'stream'
} as const
export type ResourceType = (typeof ResourceType)[keyof typeof ResourceType]
export type ExtendedComment = CommentRecord & {
/**
@@ -1,4 +1,3 @@
import { ProjectVisibility } from '@/modules/core/domain/projects/operations'
import { Project } from '@/modules/core/domain/streams/types'
import {
ProjectCreateInput,
@@ -7,7 +6,6 @@ import {
StreamUpdateInput
} from '@/modules/core/graph/generated/graphql'
import { StreamRoles } from '@speckle/shared'
import { OverrideProperties } from 'type-fest'
export const projectEventsNamespace = 'projects' as const
@@ -24,23 +22,13 @@ export type ProjectEventsPayloads = {
[ProjectEvents.Created]: {
project: Project
ownerId: string
input:
| StreamCreateInput
| OverrideProperties<
ProjectCreateInput,
{ visibility: ProjectCreateInput['visibility'] | ProjectVisibility }
>
input: StreamCreateInput | ProjectCreateInput
}
[ProjectEvents.Updated]: {
updaterId: string
oldProject: Project
newProject: Project
update:
| OverrideProperties<
ProjectUpdateInput,
{ visibility: ProjectUpdateInput['visibility'] | ProjectVisibility }
>
| StreamUpdateInput
update: ProjectUpdateInput | StreamUpdateInput
}
[ProjectEvents.Deleted]: {
deleterId: string
@@ -348,12 +348,13 @@ export type AutomateFunctionTemplate = {
url: Scalars['String']['output'];
};
export enum AutomateFunctionTemplateLanguage {
DotNet = 'DOT_NET',
Python = 'PYTHON',
Typescript = 'TYPESCRIPT'
}
export const AutomateFunctionTemplateLanguage = {
DotNet: 'DOT_NET',
Python: 'PYTHON',
Typescript: 'TYPESCRIPT'
} as const;
export type AutomateFunctionTemplateLanguage = typeof AutomateFunctionTemplateLanguage[keyof typeof AutomateFunctionTemplateLanguage];
export type AutomateFunctionToken = {
__typename?: 'AutomateFunctionToken';
functionId: Scalars['String']['output'];
@@ -407,21 +408,23 @@ export type AutomateRunCollection = {
totalCount: Scalars['Int']['output'];
};
export enum AutomateRunStatus {
Canceled = 'CANCELED',
Exception = 'EXCEPTION',
Failed = 'FAILED',
Initializing = 'INITIALIZING',
Pending = 'PENDING',
Running = 'RUNNING',
Succeeded = 'SUCCEEDED',
Timeout = 'TIMEOUT'
}
export const AutomateRunStatus = {
Canceled: 'CANCELED',
Exception: 'EXCEPTION',
Failed: 'FAILED',
Initializing: 'INITIALIZING',
Pending: 'PENDING',
Running: 'RUNNING',
Succeeded: 'SUCCEEDED',
Timeout: 'TIMEOUT'
} as const;
export enum AutomateRunTriggerType {
VersionCreated = 'VERSION_CREATED'
}
export type AutomateRunStatus = typeof AutomateRunStatus[keyof typeof AutomateRunStatus];
export const AutomateRunTriggerType = {
VersionCreated: 'VERSION_CREATED'
} as const;
export type AutomateRunTriggerType = typeof AutomateRunTriggerType[keyof typeof AutomateRunTriggerType];
export type Automation = {
__typename?: 'Automation';
createdAt: Scalars['DateTime']['output'];
@@ -482,11 +485,12 @@ export type BasicGitRepositoryMetadata = {
url: Scalars['String']['output'];
};
export enum BillingInterval {
Monthly = 'monthly',
Yearly = 'yearly'
}
export const BillingInterval = {
Monthly: 'monthly',
Yearly: 'yearly'
} as const;
export type BillingInterval = typeof BillingInterval[keyof typeof BillingInterval];
export type BlobMetadata = {
__typename?: 'BlobMetadata';
createdAt: Scalars['DateTime']['output'];
@@ -950,11 +954,12 @@ export type DenyWorkspaceJoinRequestInput = {
workspaceId: Scalars['String']['input'];
};
export enum DiscoverableStreamsSortType {
CreatedDate = 'CREATED_DATE',
FavoritesCount = 'FAVORITES_COUNT'
}
export const DiscoverableStreamsSortType = {
CreatedDate: 'CREATED_DATE',
FavoritesCount: 'FAVORITES_COUNT'
} as const;
export type DiscoverableStreamsSortType = typeof DiscoverableStreamsSortType[keyof typeof DiscoverableStreamsSortType];
export type DiscoverableStreamsSortingInput = {
direction: SortDirection;
type: DiscoverableStreamsSortType;
@@ -1870,12 +1875,13 @@ export type ObjectCreateInput = {
streamId: Scalars['String']['input'];
};
export enum PaidWorkspacePlans {
Business = 'business',
Plus = 'plus',
Starter = 'starter'
}
export const PaidWorkspacePlans = {
Business: 'business',
Plus: 'plus',
Starter: 'starter'
} as const;
export type PaidWorkspacePlans = typeof PaidWorkspacePlans[keyof typeof PaidWorkspacePlans];
export type PasswordStrengthCheckFeedback = {
__typename?: 'PasswordStrengthCheckFeedback';
suggestions: Array<Scalars['String']['output']>;
@@ -2203,12 +2209,13 @@ export type ProjectAutomationsUpdatedMessage = {
type: ProjectAutomationsUpdatedMessageType;
};
export enum ProjectAutomationsUpdatedMessageType {
Created = 'CREATED',
CreatedRevision = 'CREATED_REVISION',
Updated = 'UPDATED'
}
export const ProjectAutomationsUpdatedMessageType = {
Created: 'CREATED',
CreatedRevision: 'CREATED_REVISION',
Updated: 'UPDATED'
} as const;
export type ProjectAutomationsUpdatedMessageType = typeof ProjectAutomationsUpdatedMessageType[keyof typeof ProjectAutomationsUpdatedMessageType];
export type ProjectCollaborator = {
__typename?: 'ProjectCollaborator';
id: Scalars['ID']['output'];
@@ -2255,12 +2262,13 @@ export type ProjectCommentsUpdatedMessage = {
type: ProjectCommentsUpdatedMessageType;
};
export enum ProjectCommentsUpdatedMessageType {
Archived = 'ARCHIVED',
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectCommentsUpdatedMessageType = {
Archived: 'ARCHIVED',
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectCommentsUpdatedMessageType = typeof ProjectCommentsUpdatedMessageType[keyof typeof ProjectCommentsUpdatedMessageType];
/** Any values left null will be ignored */
export type ProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
@@ -2276,11 +2284,12 @@ export type ProjectFileImportUpdatedMessage = {
upload: FileUpload;
};
export enum ProjectFileImportUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectFileImportUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectFileImportUpdatedMessageType = typeof ProjectFileImportUpdatedMessageType[keyof typeof ProjectFileImportUpdatedMessageType];
export type ProjectInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -2377,12 +2386,13 @@ export type ProjectModelsUpdatedMessage = {
type: ProjectModelsUpdatedMessageType;
};
export enum ProjectModelsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectModelsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectModelsUpdatedMessageType = typeof ProjectModelsUpdatedMessageType[keyof typeof ProjectModelsUpdatedMessageType];
export type ProjectMutations = {
__typename?: 'ProjectMutations';
/** Access request related mutations */
@@ -2452,11 +2462,12 @@ export type ProjectPendingModelsUpdatedMessage = {
type: ProjectPendingModelsUpdatedMessageType;
};
export enum ProjectPendingModelsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingModelsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingModelsUpdatedMessageType = typeof ProjectPendingModelsUpdatedMessageType[keyof typeof ProjectPendingModelsUpdatedMessageType];
export type ProjectPendingVersionsUpdatedMessage = {
__typename?: 'ProjectPendingVersionsUpdatedMessage';
/** Upload ID */
@@ -2465,11 +2476,12 @@ export type ProjectPendingVersionsUpdatedMessage = {
version: FileUpload;
};
export enum ProjectPendingVersionsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingVersionsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingVersionsUpdatedMessageType = typeof ProjectPendingVersionsUpdatedMessageType[keyof typeof ProjectPendingVersionsUpdatedMessageType];
export type ProjectRole = {
__typename?: 'ProjectRole';
project: Project;
@@ -2491,11 +2503,12 @@ export type ProjectTriggeredAutomationsStatusUpdatedMessage = {
version: Version;
};
export enum ProjectTriggeredAutomationsStatusUpdatedMessageType {
RunCreated = 'RUN_CREATED',
RunUpdated = 'RUN_UPDATED'
}
export const ProjectTriggeredAutomationsStatusUpdatedMessageType = {
RunCreated: 'RUN_CREATED',
RunUpdated: 'RUN_UPDATED'
} as const;
export type ProjectTriggeredAutomationsStatusUpdatedMessageType = typeof ProjectTriggeredAutomationsStatusUpdatedMessageType[keyof typeof ProjectTriggeredAutomationsStatusUpdatedMessageType];
/** Any values left null will be ignored, so only set the properties that you want updated */
export type ProjectUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
@@ -2522,11 +2535,12 @@ export type ProjectUpdatedMessage = {
type: ProjectUpdatedMessageType;
};
export enum ProjectUpdatedMessageType {
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectUpdatedMessageType = {
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectUpdatedMessageType = typeof ProjectUpdatedMessageType[keyof typeof ProjectUpdatedMessageType];
export type ProjectVersionsPreviewGeneratedMessage = {
__typename?: 'ProjectVersionsPreviewGeneratedMessage';
objectId: Scalars['String']['output'];
@@ -2545,18 +2559,20 @@ export type ProjectVersionsUpdatedMessage = {
version?: Maybe<Version>;
};
export enum ProjectVersionsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectVersionsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export enum ProjectVisibility {
Private = 'PRIVATE',
Public = 'PUBLIC',
Unlisted = 'UNLISTED'
}
export type ProjectVersionsUpdatedMessageType = typeof ProjectVersionsUpdatedMessageType[keyof typeof ProjectVersionsUpdatedMessageType];
export const ProjectVisibility = {
Private: 'PRIVATE',
Public: 'PUBLIC',
Unlisted: 'UNLISTED'
} as const;
export type ProjectVisibility = typeof ProjectVisibility[keyof typeof ProjectVisibility];
export type Query = {
__typename?: 'Query';
/** Stare into the void. */
@@ -2680,7 +2696,6 @@ export type Query = {
* Either token or workspaceId must be specified, or both
*/
workspaceInvite?: Maybe<PendingWorkspaceCollaborator>;
workspacePricingPlans: Scalars['JSONObject']['output'];
/** Find workspaces a given user email can use SSO to sign with */
workspaceSsoByEmail: Array<LimitedWorkspace>;
};
@@ -2867,13 +2882,14 @@ export type ResourceIdentifierInput = {
resourceType: ResourceType;
};
export enum ResourceType {
Comment = 'comment',
Commit = 'commit',
Object = 'object',
Stream = 'stream'
}
export const ResourceType = {
Comment: 'comment',
Commit: 'commit',
Object: 'object',
Stream: 'stream'
} as const;
export type ResourceType = typeof ResourceType[keyof typeof ResourceType];
export type Role = {
__typename?: 'Role';
description: Scalars['String']['output'];
@@ -3037,13 +3053,14 @@ export type ServerRegionMutationsUpdateArgs = {
input: UpdateServerRegionInput;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
ServerGuest = 'SERVER_GUEST',
ServerUser = 'SERVER_USER'
}
export const ServerRole = {
ServerAdmin: 'SERVER_ADMIN',
ServerArchivedUser: 'SERVER_ARCHIVED_USER',
ServerGuest: 'SERVER_GUEST',
ServerUser: 'SERVER_USER'
} as const;
export type ServerRole = typeof ServerRole[keyof typeof ServerRole];
export type ServerRoleItem = {
__typename?: 'ServerRoleItem';
id: Scalars['String']['output'];
@@ -3082,11 +3099,12 @@ export type ServerWorkspacesInfo = {
workspacesEnabled: Scalars['Boolean']['output'];
};
export enum SessionPaymentStatus {
Paid = 'paid',
Unpaid = 'unpaid'
}
export const SessionPaymentStatus = {
Paid: 'paid',
Unpaid: 'unpaid'
} as const;
export type SessionPaymentStatus = typeof SessionPaymentStatus[keyof typeof SessionPaymentStatus];
export type SetPrimaryUserEmailInput = {
id: Scalars['ID']['input'];
};
@@ -3106,11 +3124,12 @@ export type SmartTextEditorValue = {
version: Scalars['String']['output'];
};
export enum SortDirection {
Asc = 'ASC',
Desc = 'DESC'
}
export const SortDirection = {
Asc: 'ASC',
Desc: 'DESC'
} as const;
export type SortDirection = typeof SortDirection[keyof typeof SortDirection];
export type Stream = {
__typename?: 'Stream';
/**
@@ -3305,12 +3324,13 @@ export type StreamRevokePermissionInput = {
userId: Scalars['String']['input'];
};
export enum StreamRole {
StreamContributor = 'STREAM_CONTRIBUTOR',
StreamOwner = 'STREAM_OWNER',
StreamReviewer = 'STREAM_REVIEWER'
}
export const StreamRole = {
StreamContributor: 'STREAM_CONTRIBUTOR',
StreamOwner: 'STREAM_OWNER',
StreamReviewer: 'STREAM_REVIEWER'
} as const;
export type StreamRole = typeof StreamRole[keyof typeof StreamRole];
export type StreamUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
description?: InputMaybe<Scalars['String']['input']>;
@@ -3626,11 +3646,12 @@ export type TokenResourceIdentifierInput = {
type: TokenResourceIdentifierType;
};
export enum TokenResourceIdentifierType {
Project = 'project',
Workspace = 'workspace'
}
export const TokenResourceIdentifierType = {
Project: 'project',
Workspace: 'workspace'
} as const;
export type TokenResourceIdentifierType = typeof TokenResourceIdentifierType[keyof typeof TokenResourceIdentifierType];
export type TriggeredAutomationsStatus = {
__typename?: 'TriggeredAutomationsStatus';
automationRuns: Array<AutomateRun>;
@@ -3975,11 +3996,12 @@ export type UserProjectsUpdatedMessage = {
type: UserProjectsUpdatedMessageType;
};
export enum UserProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const UserProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type UserProjectsUpdatedMessageType = typeof UserProjectsUpdatedMessageType[keyof typeof UserProjectsUpdatedMessageType];
export type UserRoleInput = {
id: Scalars['String']['input'];
role: Scalars['String']['input'];
@@ -4169,11 +4191,12 @@ export type ViewerUserActivityMessageInput = {
userName: Scalars['String']['input'];
};
export enum ViewerUserActivityStatus {
Disconnected = 'DISCONNECTED',
Viewing = 'VIEWING'
}
export const ViewerUserActivityStatus = {
Disconnected: 'DISCONNECTED',
Viewing: 'VIEWING'
} as const;
export type ViewerUserActivityStatus = typeof ViewerUserActivityStatus[keyof typeof ViewerUserActivityStatus];
export type Webhook = {
__typename?: 'Webhook';
description?: Maybe<Scalars['String']['output']>;
@@ -4401,12 +4424,13 @@ export type WorkspaceDomainDeleteInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceFeatureName {
DomainBasedSecurityPolicies = 'domainBasedSecurityPolicies',
OidcSso = 'oidcSso',
WorkspaceDataRegionSpecificity = 'workspaceDataRegionSpecificity'
}
export const WorkspaceFeatureName = {
DomainBasedSecurityPolicies: 'domainBasedSecurityPolicies',
OidcSso: 'oidcSso',
WorkspaceDataRegionSpecificity: 'workspaceDataRegionSpecificity'
} as const;
export type WorkspaceFeatureName = typeof WorkspaceFeatureName[keyof typeof WorkspaceFeatureName];
export type WorkspaceInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -4511,12 +4535,13 @@ export type WorkspaceJoinRequestMutationsDenyArgs = {
input: DenyWorkspaceJoinRequestInput;
};
export enum WorkspaceJoinRequestStatus {
Approved = 'approved',
Denied = 'denied',
Pending = 'pending'
}
export const WorkspaceJoinRequestStatus = {
Approved: 'approved',
Denied: 'denied',
Pending: 'pending'
} as const;
export type WorkspaceJoinRequestStatus = typeof WorkspaceJoinRequestStatus[keyof typeof WorkspaceJoinRequestStatus];
export type WorkspaceMutations = {
__typename?: 'WorkspaceMutations';
addDomain: Workspace;
@@ -4605,12 +4630,13 @@ export type WorkspaceMutationsUpdateRoleArgs = {
input: WorkspaceRoleUpdateInput;
};
export enum WorkspacePaymentMethod {
Billing = 'billing',
Invoice = 'invoice',
Unpaid = 'unpaid'
}
export const WorkspacePaymentMethod = {
Billing: 'billing',
Invoice: 'invoice',
Unpaid: 'unpaid'
} as const;
export type WorkspacePaymentMethod = typeof WorkspacePaymentMethod[keyof typeof WorkspacePaymentMethod];
export type WorkspacePlan = {
__typename?: 'WorkspacePlan';
createdAt: Scalars['DateTime']['output'];
@@ -4619,27 +4645,31 @@ export type WorkspacePlan = {
status: WorkspacePlanStatuses;
};
export enum WorkspacePlanStatuses {
CancelationScheduled = 'cancelationScheduled',
Canceled = 'canceled',
Expired = 'expired',
PaymentFailed = 'paymentFailed',
Trial = 'trial',
Valid = 'valid'
}
export const WorkspacePlanStatuses = {
CancelationScheduled: 'cancelationScheduled',
Canceled: 'canceled',
Expired: 'expired',
PaymentFailed: 'paymentFailed',
Trial: 'trial',
Valid: 'valid'
} as const;
export enum WorkspacePlans {
Academia = 'academia',
Business = 'business',
BusinessInvoiced = 'businessInvoiced',
Free = 'free',
Plus = 'plus',
PlusInvoiced = 'plusInvoiced',
Starter = 'starter',
StarterInvoiced = 'starterInvoiced',
Unlimited = 'unlimited'
}
export type WorkspacePlanStatuses = typeof WorkspacePlanStatuses[keyof typeof WorkspacePlanStatuses];
export const WorkspacePlans = {
Academia: 'academia',
Business: 'business',
BusinessInvoiced: 'businessInvoiced',
Free: 'free',
Plus: 'plus',
PlusInvoiced: 'plusInvoiced',
Pro: 'pro',
Starter: 'starter',
StarterInvoiced: 'starterInvoiced',
Team: 'team',
Unlimited: 'unlimited'
} as const;
export type WorkspacePlans = typeof WorkspacePlans[keyof typeof WorkspacePlans];
export type WorkspaceProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
name?: InputMaybe<Scalars['String']['input']>;
@@ -4711,21 +4741,23 @@ export type WorkspaceProjectsUpdatedMessage = {
workspaceId: Scalars['String']['output'];
};
export enum WorkspaceProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const WorkspaceProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type WorkspaceProjectsUpdatedMessageType = typeof WorkspaceProjectsUpdatedMessageType[keyof typeof WorkspaceProjectsUpdatedMessageType];
export type WorkspaceRequestToJoinInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceRole {
Admin = 'ADMIN',
Guest = 'GUEST',
Member = 'MEMBER'
}
export const WorkspaceRole = {
Admin: 'ADMIN',
Guest: 'GUEST',
Member: 'MEMBER'
} as const;
export type WorkspaceRole = typeof WorkspaceRole[keyof typeof WorkspaceRole];
export type WorkspaceRoleDeleteInput = {
userId: Scalars['String']['input'];
workspaceId: Scalars['String']['input'];
@@ -6422,7 +6454,6 @@ export type QueryResolvers<ContextType = GraphQLContext, ParentType extends Reso
workspace?: Resolver<ResolversTypes['Workspace'], ParentType, ContextType, RequireFields<QueryWorkspaceArgs, 'id'>>;
workspaceBySlug?: Resolver<ResolversTypes['Workspace'], ParentType, ContextType, RequireFields<QueryWorkspaceBySlugArgs, 'slug'>>;
workspaceInvite?: Resolver<Maybe<ResolversTypes['PendingWorkspaceCollaborator']>, ParentType, ContextType, Partial<QueryWorkspaceInviteArgs>>;
workspacePricingPlans?: Resolver<ResolversTypes['JSONObject'], ParentType, ContextType>;
workspaceSsoByEmail?: Resolver<Array<ResolversTypes['LimitedWorkspace']>, ParentType, ContextType, RequireFields<QueryWorkspaceSsoByEmailArgs, 'email'>>;
};
@@ -329,12 +329,13 @@ export type AutomateFunctionTemplate = {
url: Scalars['String']['output'];
};
export enum AutomateFunctionTemplateLanguage {
DotNet = 'DOT_NET',
Python = 'PYTHON',
Typescript = 'TYPESCRIPT'
}
export const AutomateFunctionTemplateLanguage = {
DotNet: 'DOT_NET',
Python: 'PYTHON',
Typescript: 'TYPESCRIPT'
} as const;
export type AutomateFunctionTemplateLanguage = typeof AutomateFunctionTemplateLanguage[keyof typeof AutomateFunctionTemplateLanguage];
export type AutomateFunctionToken = {
__typename?: 'AutomateFunctionToken';
functionId: Scalars['String']['output'];
@@ -388,21 +389,23 @@ export type AutomateRunCollection = {
totalCount: Scalars['Int']['output'];
};
export enum AutomateRunStatus {
Canceled = 'CANCELED',
Exception = 'EXCEPTION',
Failed = 'FAILED',
Initializing = 'INITIALIZING',
Pending = 'PENDING',
Running = 'RUNNING',
Succeeded = 'SUCCEEDED',
Timeout = 'TIMEOUT'
}
export const AutomateRunStatus = {
Canceled: 'CANCELED',
Exception: 'EXCEPTION',
Failed: 'FAILED',
Initializing: 'INITIALIZING',
Pending: 'PENDING',
Running: 'RUNNING',
Succeeded: 'SUCCEEDED',
Timeout: 'TIMEOUT'
} as const;
export enum AutomateRunTriggerType {
VersionCreated = 'VERSION_CREATED'
}
export type AutomateRunStatus = typeof AutomateRunStatus[keyof typeof AutomateRunStatus];
export const AutomateRunTriggerType = {
VersionCreated: 'VERSION_CREATED'
} as const;
export type AutomateRunTriggerType = typeof AutomateRunTriggerType[keyof typeof AutomateRunTriggerType];
export type Automation = {
__typename?: 'Automation';
createdAt: Scalars['DateTime']['output'];
@@ -463,11 +466,12 @@ export type BasicGitRepositoryMetadata = {
url: Scalars['String']['output'];
};
export enum BillingInterval {
Monthly = 'monthly',
Yearly = 'yearly'
}
export const BillingInterval = {
Monthly: 'monthly',
Yearly: 'yearly'
} as const;
export type BillingInterval = typeof BillingInterval[keyof typeof BillingInterval];
export type BlobMetadata = {
__typename?: 'BlobMetadata';
createdAt: Scalars['DateTime']['output'];
@@ -931,11 +935,12 @@ export type DenyWorkspaceJoinRequestInput = {
workspaceId: Scalars['String']['input'];
};
export enum DiscoverableStreamsSortType {
CreatedDate = 'CREATED_DATE',
FavoritesCount = 'FAVORITES_COUNT'
}
export const DiscoverableStreamsSortType = {
CreatedDate: 'CREATED_DATE',
FavoritesCount: 'FAVORITES_COUNT'
} as const;
export type DiscoverableStreamsSortType = typeof DiscoverableStreamsSortType[keyof typeof DiscoverableStreamsSortType];
export type DiscoverableStreamsSortingInput = {
direction: SortDirection;
type: DiscoverableStreamsSortType;
@@ -1851,12 +1856,13 @@ export type ObjectCreateInput = {
streamId: Scalars['String']['input'];
};
export enum PaidWorkspacePlans {
Business = 'business',
Plus = 'plus',
Starter = 'starter'
}
export const PaidWorkspacePlans = {
Business: 'business',
Plus: 'plus',
Starter: 'starter'
} as const;
export type PaidWorkspacePlans = typeof PaidWorkspacePlans[keyof typeof PaidWorkspacePlans];
export type PasswordStrengthCheckFeedback = {
__typename?: 'PasswordStrengthCheckFeedback';
suggestions: Array<Scalars['String']['output']>;
@@ -2184,12 +2190,13 @@ export type ProjectAutomationsUpdatedMessage = {
type: ProjectAutomationsUpdatedMessageType;
};
export enum ProjectAutomationsUpdatedMessageType {
Created = 'CREATED',
CreatedRevision = 'CREATED_REVISION',
Updated = 'UPDATED'
}
export const ProjectAutomationsUpdatedMessageType = {
Created: 'CREATED',
CreatedRevision: 'CREATED_REVISION',
Updated: 'UPDATED'
} as const;
export type ProjectAutomationsUpdatedMessageType = typeof ProjectAutomationsUpdatedMessageType[keyof typeof ProjectAutomationsUpdatedMessageType];
export type ProjectCollaborator = {
__typename?: 'ProjectCollaborator';
id: Scalars['ID']['output'];
@@ -2236,12 +2243,13 @@ export type ProjectCommentsUpdatedMessage = {
type: ProjectCommentsUpdatedMessageType;
};
export enum ProjectCommentsUpdatedMessageType {
Archived = 'ARCHIVED',
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectCommentsUpdatedMessageType = {
Archived: 'ARCHIVED',
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectCommentsUpdatedMessageType = typeof ProjectCommentsUpdatedMessageType[keyof typeof ProjectCommentsUpdatedMessageType];
/** Any values left null will be ignored */
export type ProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
@@ -2257,11 +2265,12 @@ export type ProjectFileImportUpdatedMessage = {
upload: FileUpload;
};
export enum ProjectFileImportUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectFileImportUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectFileImportUpdatedMessageType = typeof ProjectFileImportUpdatedMessageType[keyof typeof ProjectFileImportUpdatedMessageType];
export type ProjectInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -2358,12 +2367,13 @@ export type ProjectModelsUpdatedMessage = {
type: ProjectModelsUpdatedMessageType;
};
export enum ProjectModelsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectModelsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectModelsUpdatedMessageType = typeof ProjectModelsUpdatedMessageType[keyof typeof ProjectModelsUpdatedMessageType];
export type ProjectMutations = {
__typename?: 'ProjectMutations';
/** Access request related mutations */
@@ -2433,11 +2443,12 @@ export type ProjectPendingModelsUpdatedMessage = {
type: ProjectPendingModelsUpdatedMessageType;
};
export enum ProjectPendingModelsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingModelsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingModelsUpdatedMessageType = typeof ProjectPendingModelsUpdatedMessageType[keyof typeof ProjectPendingModelsUpdatedMessageType];
export type ProjectPendingVersionsUpdatedMessage = {
__typename?: 'ProjectPendingVersionsUpdatedMessage';
/** Upload ID */
@@ -2446,11 +2457,12 @@ export type ProjectPendingVersionsUpdatedMessage = {
version: FileUpload;
};
export enum ProjectPendingVersionsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingVersionsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingVersionsUpdatedMessageType = typeof ProjectPendingVersionsUpdatedMessageType[keyof typeof ProjectPendingVersionsUpdatedMessageType];
export type ProjectRole = {
__typename?: 'ProjectRole';
project: Project;
@@ -2472,11 +2484,12 @@ export type ProjectTriggeredAutomationsStatusUpdatedMessage = {
version: Version;
};
export enum ProjectTriggeredAutomationsStatusUpdatedMessageType {
RunCreated = 'RUN_CREATED',
RunUpdated = 'RUN_UPDATED'
}
export const ProjectTriggeredAutomationsStatusUpdatedMessageType = {
RunCreated: 'RUN_CREATED',
RunUpdated: 'RUN_UPDATED'
} as const;
export type ProjectTriggeredAutomationsStatusUpdatedMessageType = typeof ProjectTriggeredAutomationsStatusUpdatedMessageType[keyof typeof ProjectTriggeredAutomationsStatusUpdatedMessageType];
/** Any values left null will be ignored, so only set the properties that you want updated */
export type ProjectUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
@@ -2503,11 +2516,12 @@ export type ProjectUpdatedMessage = {
type: ProjectUpdatedMessageType;
};
export enum ProjectUpdatedMessageType {
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectUpdatedMessageType = {
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectUpdatedMessageType = typeof ProjectUpdatedMessageType[keyof typeof ProjectUpdatedMessageType];
export type ProjectVersionsPreviewGeneratedMessage = {
__typename?: 'ProjectVersionsPreviewGeneratedMessage';
objectId: Scalars['String']['output'];
@@ -2526,18 +2540,20 @@ export type ProjectVersionsUpdatedMessage = {
version?: Maybe<Version>;
};
export enum ProjectVersionsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectVersionsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export enum ProjectVisibility {
Private = 'PRIVATE',
Public = 'PUBLIC',
Unlisted = 'UNLISTED'
}
export type ProjectVersionsUpdatedMessageType = typeof ProjectVersionsUpdatedMessageType[keyof typeof ProjectVersionsUpdatedMessageType];
export const ProjectVisibility = {
Private: 'PRIVATE',
Public: 'PUBLIC',
Unlisted: 'UNLISTED'
} as const;
export type ProjectVisibility = typeof ProjectVisibility[keyof typeof ProjectVisibility];
export type Query = {
__typename?: 'Query';
/** Stare into the void. */
@@ -2661,7 +2677,6 @@ export type Query = {
* Either token or workspaceId must be specified, or both
*/
workspaceInvite?: Maybe<PendingWorkspaceCollaborator>;
workspacePricingPlans: Scalars['JSONObject']['output'];
/** Find workspaces a given user email can use SSO to sign with */
workspaceSsoByEmail: Array<LimitedWorkspace>;
};
@@ -2848,13 +2863,14 @@ export type ResourceIdentifierInput = {
resourceType: ResourceType;
};
export enum ResourceType {
Comment = 'comment',
Commit = 'commit',
Object = 'object',
Stream = 'stream'
}
export const ResourceType = {
Comment: 'comment',
Commit: 'commit',
Object: 'object',
Stream: 'stream'
} as const;
export type ResourceType = typeof ResourceType[keyof typeof ResourceType];
export type Role = {
__typename?: 'Role';
description: Scalars['String']['output'];
@@ -3018,13 +3034,14 @@ export type ServerRegionMutationsUpdateArgs = {
input: UpdateServerRegionInput;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
ServerGuest = 'SERVER_GUEST',
ServerUser = 'SERVER_USER'
}
export const ServerRole = {
ServerAdmin: 'SERVER_ADMIN',
ServerArchivedUser: 'SERVER_ARCHIVED_USER',
ServerGuest: 'SERVER_GUEST',
ServerUser: 'SERVER_USER'
} as const;
export type ServerRole = typeof ServerRole[keyof typeof ServerRole];
export type ServerRoleItem = {
__typename?: 'ServerRoleItem';
id: Scalars['String']['output'];
@@ -3063,11 +3080,12 @@ export type ServerWorkspacesInfo = {
workspacesEnabled: Scalars['Boolean']['output'];
};
export enum SessionPaymentStatus {
Paid = 'paid',
Unpaid = 'unpaid'
}
export const SessionPaymentStatus = {
Paid: 'paid',
Unpaid: 'unpaid'
} as const;
export type SessionPaymentStatus = typeof SessionPaymentStatus[keyof typeof SessionPaymentStatus];
export type SetPrimaryUserEmailInput = {
id: Scalars['ID']['input'];
};
@@ -3087,11 +3105,12 @@ export type SmartTextEditorValue = {
version: Scalars['String']['output'];
};
export enum SortDirection {
Asc = 'ASC',
Desc = 'DESC'
}
export const SortDirection = {
Asc: 'ASC',
Desc: 'DESC'
} as const;
export type SortDirection = typeof SortDirection[keyof typeof SortDirection];
export type Stream = {
__typename?: 'Stream';
/**
@@ -3286,12 +3305,13 @@ export type StreamRevokePermissionInput = {
userId: Scalars['String']['input'];
};
export enum StreamRole {
StreamContributor = 'STREAM_CONTRIBUTOR',
StreamOwner = 'STREAM_OWNER',
StreamReviewer = 'STREAM_REVIEWER'
}
export const StreamRole = {
StreamContributor: 'STREAM_CONTRIBUTOR',
StreamOwner: 'STREAM_OWNER',
StreamReviewer: 'STREAM_REVIEWER'
} as const;
export type StreamRole = typeof StreamRole[keyof typeof StreamRole];
export type StreamUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
description?: InputMaybe<Scalars['String']['input']>;
@@ -3607,11 +3627,12 @@ export type TokenResourceIdentifierInput = {
type: TokenResourceIdentifierType;
};
export enum TokenResourceIdentifierType {
Project = 'project',
Workspace = 'workspace'
}
export const TokenResourceIdentifierType = {
Project: 'project',
Workspace: 'workspace'
} as const;
export type TokenResourceIdentifierType = typeof TokenResourceIdentifierType[keyof typeof TokenResourceIdentifierType];
export type TriggeredAutomationsStatus = {
__typename?: 'TriggeredAutomationsStatus';
automationRuns: Array<AutomateRun>;
@@ -3956,11 +3977,12 @@ export type UserProjectsUpdatedMessage = {
type: UserProjectsUpdatedMessageType;
};
export enum UserProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const UserProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type UserProjectsUpdatedMessageType = typeof UserProjectsUpdatedMessageType[keyof typeof UserProjectsUpdatedMessageType];
export type UserRoleInput = {
id: Scalars['String']['input'];
role: Scalars['String']['input'];
@@ -4150,11 +4172,12 @@ export type ViewerUserActivityMessageInput = {
userName: Scalars['String']['input'];
};
export enum ViewerUserActivityStatus {
Disconnected = 'DISCONNECTED',
Viewing = 'VIEWING'
}
export const ViewerUserActivityStatus = {
Disconnected: 'DISCONNECTED',
Viewing: 'VIEWING'
} as const;
export type ViewerUserActivityStatus = typeof ViewerUserActivityStatus[keyof typeof ViewerUserActivityStatus];
export type Webhook = {
__typename?: 'Webhook';
description?: Maybe<Scalars['String']['output']>;
@@ -4382,12 +4405,13 @@ export type WorkspaceDomainDeleteInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceFeatureName {
DomainBasedSecurityPolicies = 'domainBasedSecurityPolicies',
OidcSso = 'oidcSso',
WorkspaceDataRegionSpecificity = 'workspaceDataRegionSpecificity'
}
export const WorkspaceFeatureName = {
DomainBasedSecurityPolicies: 'domainBasedSecurityPolicies',
OidcSso: 'oidcSso',
WorkspaceDataRegionSpecificity: 'workspaceDataRegionSpecificity'
} as const;
export type WorkspaceFeatureName = typeof WorkspaceFeatureName[keyof typeof WorkspaceFeatureName];
export type WorkspaceInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -4492,12 +4516,13 @@ export type WorkspaceJoinRequestMutationsDenyArgs = {
input: DenyWorkspaceJoinRequestInput;
};
export enum WorkspaceJoinRequestStatus {
Approved = 'approved',
Denied = 'denied',
Pending = 'pending'
}
export const WorkspaceJoinRequestStatus = {
Approved: 'approved',
Denied: 'denied',
Pending: 'pending'
} as const;
export type WorkspaceJoinRequestStatus = typeof WorkspaceJoinRequestStatus[keyof typeof WorkspaceJoinRequestStatus];
export type WorkspaceMutations = {
__typename?: 'WorkspaceMutations';
addDomain: Workspace;
@@ -4586,12 +4611,13 @@ export type WorkspaceMutationsUpdateRoleArgs = {
input: WorkspaceRoleUpdateInput;
};
export enum WorkspacePaymentMethod {
Billing = 'billing',
Invoice = 'invoice',
Unpaid = 'unpaid'
}
export const WorkspacePaymentMethod = {
Billing: 'billing',
Invoice: 'invoice',
Unpaid: 'unpaid'
} as const;
export type WorkspacePaymentMethod = typeof WorkspacePaymentMethod[keyof typeof WorkspacePaymentMethod];
export type WorkspacePlan = {
__typename?: 'WorkspacePlan';
createdAt: Scalars['DateTime']['output'];
@@ -4600,27 +4626,31 @@ export type WorkspacePlan = {
status: WorkspacePlanStatuses;
};
export enum WorkspacePlanStatuses {
CancelationScheduled = 'cancelationScheduled',
Canceled = 'canceled',
Expired = 'expired',
PaymentFailed = 'paymentFailed',
Trial = 'trial',
Valid = 'valid'
}
export const WorkspacePlanStatuses = {
CancelationScheduled: 'cancelationScheduled',
Canceled: 'canceled',
Expired: 'expired',
PaymentFailed: 'paymentFailed',
Trial: 'trial',
Valid: 'valid'
} as const;
export enum WorkspacePlans {
Academia = 'academia',
Business = 'business',
BusinessInvoiced = 'businessInvoiced',
Free = 'free',
Plus = 'plus',
PlusInvoiced = 'plusInvoiced',
Starter = 'starter',
StarterInvoiced = 'starterInvoiced',
Unlimited = 'unlimited'
}
export type WorkspacePlanStatuses = typeof WorkspacePlanStatuses[keyof typeof WorkspacePlanStatuses];
export const WorkspacePlans = {
Academia: 'academia',
Business: 'business',
BusinessInvoiced: 'businessInvoiced',
Free: 'free',
Plus: 'plus',
PlusInvoiced: 'plusInvoiced',
Pro: 'pro',
Starter: 'starter',
StarterInvoiced: 'starterInvoiced',
Team: 'team',
Unlimited: 'unlimited'
} as const;
export type WorkspacePlans = typeof WorkspacePlans[keyof typeof WorkspacePlans];
export type WorkspaceProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
name?: InputMaybe<Scalars['String']['input']>;
@@ -4692,21 +4722,23 @@ export type WorkspaceProjectsUpdatedMessage = {
workspaceId: Scalars['String']['output'];
};
export enum WorkspaceProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const WorkspaceProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type WorkspaceProjectsUpdatedMessageType = typeof WorkspaceProjectsUpdatedMessageType[keyof typeof WorkspaceProjectsUpdatedMessageType];
export type WorkspaceRequestToJoinInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceRole {
Admin = 'ADMIN',
Guest = 'GUEST',
Member = 'MEMBER'
}
export const WorkspaceRole = {
Admin: 'ADMIN',
Guest: 'GUEST',
Member: 'MEMBER'
} as const;
export type WorkspaceRole = typeof WorkspaceRole[keyof typeof WorkspaceRole];
export type WorkspaceRoleDeleteInput = {
userId: Scalars['String']['input'];
workspaceId: Scalars['String']['input'];
@@ -6,20 +6,17 @@ import {
SubscriptionData
} from '@/modules/gatekeeper/domain/billing'
import { isNewPlanType } from '@/modules/gatekeeper/helpers/plans'
import {
paidWorkspacePlansNewSchema,
WorkspacePlanBillingIntervals,
WorkspacePricingPlans
} from '@/modules/gatekeeperCore/domain/billing'
import { WorkspacePricingProducts } from '@/modules/gatekeeperCore/domain/billing'
import {
EnvironmentResourceError,
LogicError,
NotImplementedError
} from '@/modules/shared/errors'
import { WorkspacePlanBillingIntervals } from '@speckle/shared'
import { Stripe } from 'stripe'
type GetWorkspacePlanPrice = (args: {
workspacePlan: WorkspacePricingPlans
workspacePlan: WorkspacePricingProducts
billingInterval: WorkspacePlanBillingIntervals
}) => string
@@ -1,12 +1,11 @@
import {
PaidWorkspacePlan,
PaidWorkspacePlans,
TrialWorkspacePlan,
UnpaidWorkspacePlan,
WorkspacePlan,
WorkspacePlanBillingIntervals,
WorkspacePricingPlans
WorkspacePricingProducts
} from '@/modules/gatekeeperCore/domain/billing'
import { PaidWorkspacePlans, WorkspacePlanBillingIntervals } from '@speckle/shared'
import { OverrideProperties } from 'type-fest'
import { z } from 'zod'
@@ -150,12 +149,12 @@ export type GetSubscriptionData = (args: {
}) => Promise<SubscriptionData>
export type GetWorkspacePlanPrice = (args: {
workspacePlan: WorkspacePricingPlans
workspacePlan: WorkspacePricingProducts
billingInterval: WorkspacePlanBillingIntervals
}) => string
export type GetWorkspacePlanProductId = (args: {
workspacePlan: WorkspacePricingPlans
workspacePlan: WorkspacePricingProducts
}) => string
export type SubscriptionDataInput = OverrideProperties<
@@ -1,14 +1,14 @@
import { WorkspaceFeatureName } from '@/modules/gatekeeper/domain/workspacePricing'
import {
PlanStatuses,
WorkspacePlan,
WorkspacePlans
} from '@/modules/gatekeeperCore/domain/billing'
import { WorkspacePlan } from '@/modules/gatekeeperCore/domain/billing'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import {
WorkspacePlanFeatures,
WorkspacePlans,
WorkspacePlanStatuses
} from '@speckle/shared'
export type CanWorkspaceAccessFeature = (args: {
workspaceId: string
workspaceFeature: WorkspaceFeatureName
workspaceFeature: WorkspacePlanFeatures
}) => Promise<boolean>
export type WorkspaceFeatureAccessFunction = (args: {
@@ -23,7 +23,7 @@ export type GetWorkspacesByPlanDaysTillExpiry = (args: {
daysTillExpiry: number
planValidFor: number
plan: WorkspacePlans
status: PlanStatuses
status: WorkspacePlanStatuses
}) => Promise<Workspace[]>
export type GetWorkspacePlanByProjectId = ({
projectId
@@ -1,193 +0,0 @@
import {
PaidWorkspacePlans,
UnpaidWorkspacePlans,
WorkspacePlans
} from '@/modules/gatekeeperCore/domain/billing'
import type { MaybeNullOrUndefined } from '@speckle/shared'
export type WorkspaceFeatureName =
| 'workspace'
| 'domainBasedSecurityPolicies'
| 'oidcSso'
| 'workspaceDataRegionSpecificity'
type FeatureDetails = {
displayName: string
description?: string
}
const features: Record<WorkspaceFeatureName, FeatureDetails> = {
workspace: {
displayName: 'Workspace'
},
domainBasedSecurityPolicies: {
description: 'Email domain based security policies',
displayName: 'Domain security policies'
},
oidcSso: {
displayName: 'Login / signup to the workspace with an OIDC provider'
},
workspaceDataRegionSpecificity: {
displayName: 'Specify the geolocation, where the workspace project data is stored'
}
} as const
type WorkspaceFeatures = Record<keyof typeof features, boolean>
type WorkspaceInfoDetails = {
name: MaybeNullOrUndefined<WorkspacePlans>
description: MaybeNullOrUndefined<string>
}
type WorkspaceInfo = Record<keyof WorkspaceInfoDetails, MaybeNullOrUndefined<string>>
type Limits = 'uploadSize' | 'automateMinutes'
type LimitDetails = {
displayName: string
measurementUnit: string | null
}
const limits: Record<Limits, LimitDetails> = {
automateMinutes: {
displayName: 'Automate minutes',
measurementUnit: 'minutes'
},
uploadSize: {
displayName: 'Upload size limit',
measurementUnit: 'MB'
}
}
export const workspacePricingPlanInformation = { features, limits }
type WorkspaceLimits = Record<keyof typeof limits, number | null>
type WorkspacePlanFeaturesAndLimits = WorkspaceInfo &
WorkspaceFeatures &
WorkspaceLimits
const baseFeatures = {
domainBasedSecurityPolicies: true,
workspace: true
}
// new
const free: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'free',
description: 'For individuals, small teams and basic usage',
oidcSso: false,
workspaceDataRegionSpecificity: false,
automateMinutes: 300,
uploadSize: 100
}
const team: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'team',
description: 'For small teams and advanced usage',
oidcSso: false,
workspaceDataRegionSpecificity: false,
// TODO: What should be the real numbers here for the new plans (free/team/pro?
automateMinutes: 300,
uploadSize: 100
}
const pro: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'pro',
description: 'For larger teams and advanced usage',
// TODO: The following 2 will become conditional based on purchased addons
oidcSso: true,
workspaceDataRegionSpecificity: true,
automateMinutes: 900,
uploadSize: 100
}
// old
const starter: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'starter',
description: 'The team plan',
oidcSso: false,
workspaceDataRegionSpecificity: false,
automateMinutes: 300,
uploadSize: 100
}
const plus: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'plus',
description: 'The pro plan',
oidcSso: true,
workspaceDataRegionSpecificity: false,
automateMinutes: 900,
uploadSize: 100
}
const business: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'business',
description: 'The business plan',
oidcSso: true,
workspaceDataRegionSpecificity: true,
automateMinutes: 900,
uploadSize: 100
}
// custom
const unlimited: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'unlimited',
description: 'The unlimited plan',
oidcSso: true,
workspaceDataRegionSpecificity: true,
automateMinutes: null,
uploadSize: 100
}
const academia: WorkspacePlanFeaturesAndLimits = {
...baseFeatures,
name: 'academia',
description: 'The academia plan',
oidcSso: true,
workspaceDataRegionSpecificity: true,
automateMinutes: 900,
uploadSize: 100
}
const paidWorkspacePlanFeatures: Record<
PaidWorkspacePlans,
WorkspacePlanFeaturesAndLimits
> = {
// old
starter,
plus,
business,
// new
team,
pro
}
export const unpaidWorkspacePlanFeatures: Record<
UnpaidWorkspacePlans,
WorkspacePlanFeaturesAndLimits
> = {
free,
academia,
unlimited,
starterInvoiced: starter,
plusInvoiced: plus,
businessInvoiced: business
}
export const workspacePlanFeatures: Record<
WorkspacePlans,
WorkspacePlanFeaturesAndLimits
> = { ...paidWorkspacePlanFeatures, ...unpaidWorkspacePlanFeatures }
export const pricingTable = {
workspacePricingPlanInformation,
workspacePlanInformation: paidWorkspacePlanFeatures
}
@@ -1,6 +1,5 @@
import { getFeatureFlags, getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import { Resolvers } from '@/modules/core/graph/generated/graphql'
import { pricingTable } from '@/modules/gatekeeper/domain/workspacePricing'
import { authorizeResolver } from '@/modules/shared'
import { Roles, throwUncoveredError } from '@speckle/shared'
import {
@@ -44,11 +43,6 @@ const getWorkspacePlan = getWorkspacePlanFactory({ db })
export = FF_GATEKEEPER_MODULE_ENABLED
? ({
Query: {
workspacePricingPlans: async () => {
return pricingTable
}
},
Workspace: {
plan: async (parent) => {
const workspacePlan = await getWorkspacePlanFactory({ db })({
@@ -1,12 +1,17 @@
import {
paidWorkspacePlansNewSchema,
paidWorkspacePlansOldSchema
} from '@/modules/gatekeeperCore/domain/billing'
PaidWorkspacePlansNew,
PaidWorkspacePlansOld,
WorkspacePlans
} from '@speckle/shared'
export const isNewPlanType = (plan: string): boolean => {
return paidWorkspacePlansNewSchema.safeParse(plan).success || plan === 'free'
export const isNewPaidPlanType = (plan: WorkspacePlans): boolean => {
return (Object.values(PaidWorkspacePlansNew) as string[]).includes(plan)
}
export const isOldPlanType = (plan: string): boolean => {
return paidWorkspacePlansOldSchema.safeParse(plan).success
export const isNewPlanType = (plan: WorkspacePlans): boolean => {
return isNewPaidPlanType(plan) || plan === WorkspacePlans.Free
}
export const isOldPaidPlanType = (plan: WorkspacePlans): boolean => {
return (Object.values(PaidWorkspacePlansOld) as string[]).includes(plan)
}
@@ -16,13 +16,14 @@ import {
WorkspaceAlreadyPaidError,
WorkspaceCheckoutSessionInProgressError
} from '@/modules/gatekeeper/errors/billing'
import {
PaidWorkspacePlans,
WorkspacePlanBillingIntervals
} from '@/modules/gatekeeperCore/domain/billing'
import { EventBusEmit } from '@/modules/shared/services/eventBus'
import { CountWorkspaceRoleWithOptionalProjectRole } from '@/modules/workspaces/domain/operations'
import { Roles, throwUncoveredError } from '@speckle/shared'
import {
PaidWorkspacePlans,
Roles,
throwUncoveredError,
WorkspacePlanBillingIntervals
} from '@speckle/shared'
export const startCheckoutSessionFactory =
({
@@ -3,8 +3,7 @@ import {
CanWorkspaceAccessFeature,
WorkspaceFeatureAccessFunction
} from '@/modules/gatekeeper/domain/operations'
import { workspacePlanFeatures } from '@/modules/gatekeeper/domain/workspacePricing'
import { throwUncoveredError } from '@speckle/shared'
import { throwUncoveredError, WorkspacePlanConfigs } from '@speckle/shared'
export const canWorkspaceAccessFeatureFactory =
({
@@ -27,7 +26,8 @@ export const canWorkspaceAccessFeatureFactory =
default:
throwUncoveredError(workspacePlan)
}
return workspacePlanFeatures[workspacePlan.name][workspaceFeature]
return WorkspacePlanConfigs[workspacePlan.name].features.includes(workspaceFeature)
}
export const canWorkspaceUseOidcSsoFactory =
@@ -20,19 +20,19 @@ import {
WorkspacePlanNotFoundError,
WorkspaceSubscriptionNotFoundError
} from '@/modules/gatekeeper/errors/billing'
import { isNewPlanType, isOldPlanType } from '@/modules/gatekeeper/helpers/plans'
import {
PaidWorkspacePlans,
paidWorkspacePlansNewSchema,
paidWorkspacePlansOldSchema,
PaidWorkspacePlanStatuses,
WorkspacePlanBillingIntervals,
WorkspacePricingPlans
} from '@/modules/gatekeeperCore/domain/billing'
import { isNewPlanType, isOldPaidPlanType } from '@/modules/gatekeeper/helpers/plans'
import { WorkspacePricingProducts } from '@/modules/gatekeeperCore/domain/billing'
import { LogicError, NotImplementedError } from '@/modules/shared/errors'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { CountWorkspaceRoleWithOptionalProjectRole } from '@/modules/workspaces/domain/operations'
import { throwUncoveredError, WorkspaceRoles, xor } from '@speckle/shared'
import {
PaidWorkspacePlans,
PaidWorkspacePlanStatuses,
throwUncoveredError,
WorkspacePlanBillingIntervals,
WorkspaceRoles,
xor
} from '@speckle/shared'
import { cloneDeep, isEqual, sum } from 'lodash'
const { FF_WORKSPACES_NEW_PLANS_ENABLED } = getFeatureFlags()
@@ -213,7 +213,7 @@ const mutateSubscriptionDataWithNewValidSeatNumbers = ({
subscriptionData
}: {
seatCount: number
workspacePlan: WorkspacePricingPlans
workspacePlan: WorkspacePricingProducts
getWorkspacePlanProductId: GetWorkspacePlanProductId
subscriptionData: SubscriptionDataInput
}): void => {
@@ -451,7 +451,7 @@ export const upgradeWorkspaceSubscriptionFactory =
throw new NotImplementedError()
}
const planCheckers = [isNewPlanType, isOldPlanType]
const planCheckers = [isNewPlanType, isOldPaidPlanType]
for (const isSpecificPlanType of planCheckers) {
const oldPlanFitsSchema = isSpecificPlanType(workspacePlan.name)
const newPlanFitsSchema = isSpecificPlanType(targetPlan)
+3 -5
View File
@@ -2,11 +2,9 @@ import {
GetWorkspacePlanPrice,
GetWorkspacePlanProductId
} from '@/modules/gatekeeper/domain/billing'
import {
WorkspacePlanBillingIntervals,
WorkspacePricingPlans
} from '@/modules/gatekeeperCore/domain/billing'
import { WorkspacePricingProducts } from '@/modules/gatekeeperCore/domain/billing'
import { getStringFromEnv, getStripeApiKey } from '@/modules/shared/helpers/envHelper'
import { WorkspacePlanBillingIntervals } from '@speckle/shared'
import { Stripe } from 'stripe'
let stripeClient: Stripe | undefined = undefined
@@ -17,7 +15,7 @@ export const getStripeClient = () => {
}
export const workspacePlanPrices = (): Record<
WorkspacePricingPlans,
WorkspacePricingProducts,
Record<WorkspacePlanBillingIntervals, string> & { productId: string }
> => ({
// old
@@ -16,11 +16,8 @@ import {
WorkspaceSubscription
} from '@/modules/gatekeeper/domain/billing'
import { omit } from 'lodash'
import {
PaidWorkspacePlan,
PaidWorkspacePlans,
WorkspacePlanBillingIntervals
} from '@/modules/gatekeeperCore/domain/billing'
import { PaidWorkspacePlan } from '@/modules/gatekeeperCore/domain/billing'
import { PaidWorkspacePlans, WorkspacePlanBillingIntervals } from '@speckle/shared'
describe('checkout @gatekeeper', () => {
describe('startCheckoutSessionFactory creates a function, that', () => {
@@ -21,14 +21,11 @@ import {
createTestSubscriptionData,
createTestWorkspaceSubscription
} from '@/modules/gatekeeper/tests/helpers'
import {
PaidWorkspacePlans,
WorkspacePlan
} from '@/modules/gatekeeperCore/domain/billing'
import { WorkspacePlan } from '@/modules/gatekeeperCore/domain/billing'
import { NotImplementedError } from '@/modules/shared/errors'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { expectToThrow, itEach } from '@/test/assertionHelper'
import { throwUncoveredError } from '@speckle/shared'
import { PaidWorkspacePlans, throwUncoveredError } from '@speckle/shared'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
import { omit } from 'lodash'
@@ -1,68 +1,16 @@
import { z } from 'zod'
import {
PaidWorkspacePlans,
PaidWorkspacePlanStatuses,
TrialEnabledPaidWorkspacePlans,
TrialWorkspacePlanStatuses,
UnpaidWorkspacePlans,
UnpaidWorkspacePlanStatuses
} from '@speckle/shared'
const trialWorkspacePlans = z.literal('starter')
type TrialWorkspacePlans = z.infer<typeof trialWorkspacePlans>
export const paidWorkspacePlansOldSchema = z.union([
trialWorkspacePlans,
// pro
z.literal('plus'),
z.literal('business')
])
export const paidWorkspacePlansNewSchema = z.union([
z.literal('team'),
z.literal('pro')
])
const paidWorkspacePlansSchema = z.union([
paidWorkspacePlansOldSchema,
paidWorkspacePlansNewSchema
])
export type PaidWorkspacePlans = z.infer<typeof paidWorkspacePlansSchema>
const unpaidWorkspacePlans = z.union([
z.literal('free'),
z.literal('unlimited'),
z.literal('academia'),
z.literal('starterInvoiced'),
z.literal('plusInvoiced'),
z.literal('businessInvoiced')
])
export type UnpaidWorkspacePlans = z.infer<typeof unpaidWorkspacePlans>
const workspacePlansSchema = z.union([paidWorkspacePlansSchema, unpaidWorkspacePlans])
// this includes the plans your workspace can be on
export type WorkspacePlans = z.infer<typeof workspacePlansSchema>
// this includes the pricing plans (Stripe products) a customer can sub to
export type WorkspacePricingPlans = PaidWorkspacePlans | 'guest'
const workspacePlanBillingIntervalsSchema = z.union([
z.literal('monthly'),
z.literal('yearly')
])
export type WorkspacePlanBillingIntervals = z.infer<
typeof workspacePlanBillingIntervalsSchema
>
type UnpaidWorkspacePlanStatuses = 'valid'
export type PaidWorkspacePlanStatuses =
| UnpaidWorkspacePlanStatuses
// | 'paymentNeeded' // unsure if this is needed
| 'paymentFailed'
| 'cancelationScheduled'
| 'canceled'
export type TrialWorkspacePlanStatuses = 'trial' | 'expired'
export type PlanStatuses =
| PaidWorkspacePlanStatuses
| TrialWorkspacePlanStatuses
| UnpaidWorkspacePlanStatuses
/**
* This includes the pricing plans (Stripe products) a customer can sub to
*/
export type WorkspacePricingProducts = PaidWorkspacePlans | 'guest'
type BaseWorkspacePlan = {
workspaceId: string
@@ -75,7 +23,7 @@ export type PaidWorkspacePlan = BaseWorkspacePlan & {
}
export type TrialWorkspacePlan = BaseWorkspacePlan & {
name: TrialWorkspacePlans
name: TrialEnabledPaidWorkspacePlans
status: TrialWorkspacePlanStatuses
}
+189 -157
View File
@@ -330,12 +330,13 @@ export type AutomateFunctionTemplate = {
url: Scalars['String']['output'];
};
export enum AutomateFunctionTemplateLanguage {
DotNet = 'DOT_NET',
Python = 'PYTHON',
Typescript = 'TYPESCRIPT'
}
export const AutomateFunctionTemplateLanguage = {
DotNet: 'DOT_NET',
Python: 'PYTHON',
Typescript: 'TYPESCRIPT'
} as const;
export type AutomateFunctionTemplateLanguage = typeof AutomateFunctionTemplateLanguage[keyof typeof AutomateFunctionTemplateLanguage];
export type AutomateFunctionToken = {
__typename?: 'AutomateFunctionToken';
functionId: Scalars['String']['output'];
@@ -389,21 +390,23 @@ export type AutomateRunCollection = {
totalCount: Scalars['Int']['output'];
};
export enum AutomateRunStatus {
Canceled = 'CANCELED',
Exception = 'EXCEPTION',
Failed = 'FAILED',
Initializing = 'INITIALIZING',
Pending = 'PENDING',
Running = 'RUNNING',
Succeeded = 'SUCCEEDED',
Timeout = 'TIMEOUT'
}
export const AutomateRunStatus = {
Canceled: 'CANCELED',
Exception: 'EXCEPTION',
Failed: 'FAILED',
Initializing: 'INITIALIZING',
Pending: 'PENDING',
Running: 'RUNNING',
Succeeded: 'SUCCEEDED',
Timeout: 'TIMEOUT'
} as const;
export enum AutomateRunTriggerType {
VersionCreated = 'VERSION_CREATED'
}
export type AutomateRunStatus = typeof AutomateRunStatus[keyof typeof AutomateRunStatus];
export const AutomateRunTriggerType = {
VersionCreated: 'VERSION_CREATED'
} as const;
export type AutomateRunTriggerType = typeof AutomateRunTriggerType[keyof typeof AutomateRunTriggerType];
export type Automation = {
__typename?: 'Automation';
createdAt: Scalars['DateTime']['output'];
@@ -464,11 +467,12 @@ export type BasicGitRepositoryMetadata = {
url: Scalars['String']['output'];
};
export enum BillingInterval {
Monthly = 'monthly',
Yearly = 'yearly'
}
export const BillingInterval = {
Monthly: 'monthly',
Yearly: 'yearly'
} as const;
export type BillingInterval = typeof BillingInterval[keyof typeof BillingInterval];
export type BlobMetadata = {
__typename?: 'BlobMetadata';
createdAt: Scalars['DateTime']['output'];
@@ -932,11 +936,12 @@ export type DenyWorkspaceJoinRequestInput = {
workspaceId: Scalars['String']['input'];
};
export enum DiscoverableStreamsSortType {
CreatedDate = 'CREATED_DATE',
FavoritesCount = 'FAVORITES_COUNT'
}
export const DiscoverableStreamsSortType = {
CreatedDate: 'CREATED_DATE',
FavoritesCount: 'FAVORITES_COUNT'
} as const;
export type DiscoverableStreamsSortType = typeof DiscoverableStreamsSortType[keyof typeof DiscoverableStreamsSortType];
export type DiscoverableStreamsSortingInput = {
direction: SortDirection;
type: DiscoverableStreamsSortType;
@@ -1852,12 +1857,13 @@ export type ObjectCreateInput = {
streamId: Scalars['String']['input'];
};
export enum PaidWorkspacePlans {
Business = 'business',
Plus = 'plus',
Starter = 'starter'
}
export const PaidWorkspacePlans = {
Business: 'business',
Plus: 'plus',
Starter: 'starter'
} as const;
export type PaidWorkspacePlans = typeof PaidWorkspacePlans[keyof typeof PaidWorkspacePlans];
export type PasswordStrengthCheckFeedback = {
__typename?: 'PasswordStrengthCheckFeedback';
suggestions: Array<Scalars['String']['output']>;
@@ -2185,12 +2191,13 @@ export type ProjectAutomationsUpdatedMessage = {
type: ProjectAutomationsUpdatedMessageType;
};
export enum ProjectAutomationsUpdatedMessageType {
Created = 'CREATED',
CreatedRevision = 'CREATED_REVISION',
Updated = 'UPDATED'
}
export const ProjectAutomationsUpdatedMessageType = {
Created: 'CREATED',
CreatedRevision: 'CREATED_REVISION',
Updated: 'UPDATED'
} as const;
export type ProjectAutomationsUpdatedMessageType = typeof ProjectAutomationsUpdatedMessageType[keyof typeof ProjectAutomationsUpdatedMessageType];
export type ProjectCollaborator = {
__typename?: 'ProjectCollaborator';
id: Scalars['ID']['output'];
@@ -2237,12 +2244,13 @@ export type ProjectCommentsUpdatedMessage = {
type: ProjectCommentsUpdatedMessageType;
};
export enum ProjectCommentsUpdatedMessageType {
Archived = 'ARCHIVED',
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectCommentsUpdatedMessageType = {
Archived: 'ARCHIVED',
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectCommentsUpdatedMessageType = typeof ProjectCommentsUpdatedMessageType[keyof typeof ProjectCommentsUpdatedMessageType];
/** Any values left null will be ignored */
export type ProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
@@ -2258,11 +2266,12 @@ export type ProjectFileImportUpdatedMessage = {
upload: FileUpload;
};
export enum ProjectFileImportUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectFileImportUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectFileImportUpdatedMessageType = typeof ProjectFileImportUpdatedMessageType[keyof typeof ProjectFileImportUpdatedMessageType];
export type ProjectInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -2359,12 +2368,13 @@ export type ProjectModelsUpdatedMessage = {
type: ProjectModelsUpdatedMessageType;
};
export enum ProjectModelsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectModelsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectModelsUpdatedMessageType = typeof ProjectModelsUpdatedMessageType[keyof typeof ProjectModelsUpdatedMessageType];
export type ProjectMutations = {
__typename?: 'ProjectMutations';
/** Access request related mutations */
@@ -2434,11 +2444,12 @@ export type ProjectPendingModelsUpdatedMessage = {
type: ProjectPendingModelsUpdatedMessageType;
};
export enum ProjectPendingModelsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingModelsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingModelsUpdatedMessageType = typeof ProjectPendingModelsUpdatedMessageType[keyof typeof ProjectPendingModelsUpdatedMessageType];
export type ProjectPendingVersionsUpdatedMessage = {
__typename?: 'ProjectPendingVersionsUpdatedMessage';
/** Upload ID */
@@ -2447,11 +2458,12 @@ export type ProjectPendingVersionsUpdatedMessage = {
version: FileUpload;
};
export enum ProjectPendingVersionsUpdatedMessageType {
Created = 'CREATED',
Updated = 'UPDATED'
}
export const ProjectPendingVersionsUpdatedMessageType = {
Created: 'CREATED',
Updated: 'UPDATED'
} as const;
export type ProjectPendingVersionsUpdatedMessageType = typeof ProjectPendingVersionsUpdatedMessageType[keyof typeof ProjectPendingVersionsUpdatedMessageType];
export type ProjectRole = {
__typename?: 'ProjectRole';
project: Project;
@@ -2473,11 +2485,12 @@ export type ProjectTriggeredAutomationsStatusUpdatedMessage = {
version: Version;
};
export enum ProjectTriggeredAutomationsStatusUpdatedMessageType {
RunCreated = 'RUN_CREATED',
RunUpdated = 'RUN_UPDATED'
}
export const ProjectTriggeredAutomationsStatusUpdatedMessageType = {
RunCreated: 'RUN_CREATED',
RunUpdated: 'RUN_UPDATED'
} as const;
export type ProjectTriggeredAutomationsStatusUpdatedMessageType = typeof ProjectTriggeredAutomationsStatusUpdatedMessageType[keyof typeof ProjectTriggeredAutomationsStatusUpdatedMessageType];
/** Any values left null will be ignored, so only set the properties that you want updated */
export type ProjectUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
@@ -2504,11 +2517,12 @@ export type ProjectUpdatedMessage = {
type: ProjectUpdatedMessageType;
};
export enum ProjectUpdatedMessageType {
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectUpdatedMessageType = {
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export type ProjectUpdatedMessageType = typeof ProjectUpdatedMessageType[keyof typeof ProjectUpdatedMessageType];
export type ProjectVersionsPreviewGeneratedMessage = {
__typename?: 'ProjectVersionsPreviewGeneratedMessage';
objectId: Scalars['String']['output'];
@@ -2527,18 +2541,20 @@ export type ProjectVersionsUpdatedMessage = {
version?: Maybe<Version>;
};
export enum ProjectVersionsUpdatedMessageType {
Created = 'CREATED',
Deleted = 'DELETED',
Updated = 'UPDATED'
}
export const ProjectVersionsUpdatedMessageType = {
Created: 'CREATED',
Deleted: 'DELETED',
Updated: 'UPDATED'
} as const;
export enum ProjectVisibility {
Private = 'PRIVATE',
Public = 'PUBLIC',
Unlisted = 'UNLISTED'
}
export type ProjectVersionsUpdatedMessageType = typeof ProjectVersionsUpdatedMessageType[keyof typeof ProjectVersionsUpdatedMessageType];
export const ProjectVisibility = {
Private: 'PRIVATE',
Public: 'PUBLIC',
Unlisted: 'UNLISTED'
} as const;
export type ProjectVisibility = typeof ProjectVisibility[keyof typeof ProjectVisibility];
export type Query = {
__typename?: 'Query';
/** Stare into the void. */
@@ -2662,7 +2678,6 @@ export type Query = {
* Either token or workspaceId must be specified, or both
*/
workspaceInvite?: Maybe<PendingWorkspaceCollaborator>;
workspacePricingPlans: Scalars['JSONObject']['output'];
/** Find workspaces a given user email can use SSO to sign with */
workspaceSsoByEmail: Array<LimitedWorkspace>;
};
@@ -2849,13 +2864,14 @@ export type ResourceIdentifierInput = {
resourceType: ResourceType;
};
export enum ResourceType {
Comment = 'comment',
Commit = 'commit',
Object = 'object',
Stream = 'stream'
}
export const ResourceType = {
Comment: 'comment',
Commit: 'commit',
Object: 'object',
Stream: 'stream'
} as const;
export type ResourceType = typeof ResourceType[keyof typeof ResourceType];
export type Role = {
__typename?: 'Role';
description: Scalars['String']['output'];
@@ -3019,13 +3035,14 @@ export type ServerRegionMutationsUpdateArgs = {
input: UpdateServerRegionInput;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
ServerGuest = 'SERVER_GUEST',
ServerUser = 'SERVER_USER'
}
export const ServerRole = {
ServerAdmin: 'SERVER_ADMIN',
ServerArchivedUser: 'SERVER_ARCHIVED_USER',
ServerGuest: 'SERVER_GUEST',
ServerUser: 'SERVER_USER'
} as const;
export type ServerRole = typeof ServerRole[keyof typeof ServerRole];
export type ServerRoleItem = {
__typename?: 'ServerRoleItem';
id: Scalars['String']['output'];
@@ -3064,11 +3081,12 @@ export type ServerWorkspacesInfo = {
workspacesEnabled: Scalars['Boolean']['output'];
};
export enum SessionPaymentStatus {
Paid = 'paid',
Unpaid = 'unpaid'
}
export const SessionPaymentStatus = {
Paid: 'paid',
Unpaid: 'unpaid'
} as const;
export type SessionPaymentStatus = typeof SessionPaymentStatus[keyof typeof SessionPaymentStatus];
export type SetPrimaryUserEmailInput = {
id: Scalars['ID']['input'];
};
@@ -3088,11 +3106,12 @@ export type SmartTextEditorValue = {
version: Scalars['String']['output'];
};
export enum SortDirection {
Asc = 'ASC',
Desc = 'DESC'
}
export const SortDirection = {
Asc: 'ASC',
Desc: 'DESC'
} as const;
export type SortDirection = typeof SortDirection[keyof typeof SortDirection];
export type Stream = {
__typename?: 'Stream';
/**
@@ -3287,12 +3306,13 @@ export type StreamRevokePermissionInput = {
userId: Scalars['String']['input'];
};
export enum StreamRole {
StreamContributor = 'STREAM_CONTRIBUTOR',
StreamOwner = 'STREAM_OWNER',
StreamReviewer = 'STREAM_REVIEWER'
}
export const StreamRole = {
StreamContributor: 'STREAM_CONTRIBUTOR',
StreamOwner: 'STREAM_OWNER',
StreamReviewer: 'STREAM_REVIEWER'
} as const;
export type StreamRole = typeof StreamRole[keyof typeof StreamRole];
export type StreamUpdateInput = {
allowPublicComments?: InputMaybe<Scalars['Boolean']['input']>;
description?: InputMaybe<Scalars['String']['input']>;
@@ -3608,11 +3628,12 @@ export type TokenResourceIdentifierInput = {
type: TokenResourceIdentifierType;
};
export enum TokenResourceIdentifierType {
Project = 'project',
Workspace = 'workspace'
}
export const TokenResourceIdentifierType = {
Project: 'project',
Workspace: 'workspace'
} as const;
export type TokenResourceIdentifierType = typeof TokenResourceIdentifierType[keyof typeof TokenResourceIdentifierType];
export type TriggeredAutomationsStatus = {
__typename?: 'TriggeredAutomationsStatus';
automationRuns: Array<AutomateRun>;
@@ -3957,11 +3978,12 @@ export type UserProjectsUpdatedMessage = {
type: UserProjectsUpdatedMessageType;
};
export enum UserProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const UserProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type UserProjectsUpdatedMessageType = typeof UserProjectsUpdatedMessageType[keyof typeof UserProjectsUpdatedMessageType];
export type UserRoleInput = {
id: Scalars['String']['input'];
role: Scalars['String']['input'];
@@ -4151,11 +4173,12 @@ export type ViewerUserActivityMessageInput = {
userName: Scalars['String']['input'];
};
export enum ViewerUserActivityStatus {
Disconnected = 'DISCONNECTED',
Viewing = 'VIEWING'
}
export const ViewerUserActivityStatus = {
Disconnected: 'DISCONNECTED',
Viewing: 'VIEWING'
} as const;
export type ViewerUserActivityStatus = typeof ViewerUserActivityStatus[keyof typeof ViewerUserActivityStatus];
export type Webhook = {
__typename?: 'Webhook';
description?: Maybe<Scalars['String']['output']>;
@@ -4383,12 +4406,13 @@ export type WorkspaceDomainDeleteInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceFeatureName {
DomainBasedSecurityPolicies = 'domainBasedSecurityPolicies',
OidcSso = 'oidcSso',
WorkspaceDataRegionSpecificity = 'workspaceDataRegionSpecificity'
}
export const WorkspaceFeatureName = {
DomainBasedSecurityPolicies: 'domainBasedSecurityPolicies',
OidcSso: 'oidcSso',
WorkspaceDataRegionSpecificity: 'workspaceDataRegionSpecificity'
} as const;
export type WorkspaceFeatureName = typeof WorkspaceFeatureName[keyof typeof WorkspaceFeatureName];
export type WorkspaceInviteCreateInput = {
/** Either this or userId must be filled */
email?: InputMaybe<Scalars['String']['input']>;
@@ -4493,12 +4517,13 @@ export type WorkspaceJoinRequestMutationsDenyArgs = {
input: DenyWorkspaceJoinRequestInput;
};
export enum WorkspaceJoinRequestStatus {
Approved = 'approved',
Denied = 'denied',
Pending = 'pending'
}
export const WorkspaceJoinRequestStatus = {
Approved: 'approved',
Denied: 'denied',
Pending: 'pending'
} as const;
export type WorkspaceJoinRequestStatus = typeof WorkspaceJoinRequestStatus[keyof typeof WorkspaceJoinRequestStatus];
export type WorkspaceMutations = {
__typename?: 'WorkspaceMutations';
addDomain: Workspace;
@@ -4587,12 +4612,13 @@ export type WorkspaceMutationsUpdateRoleArgs = {
input: WorkspaceRoleUpdateInput;
};
export enum WorkspacePaymentMethod {
Billing = 'billing',
Invoice = 'invoice',
Unpaid = 'unpaid'
}
export const WorkspacePaymentMethod = {
Billing: 'billing',
Invoice: 'invoice',
Unpaid: 'unpaid'
} as const;
export type WorkspacePaymentMethod = typeof WorkspacePaymentMethod[keyof typeof WorkspacePaymentMethod];
export type WorkspacePlan = {
__typename?: 'WorkspacePlan';
createdAt: Scalars['DateTime']['output'];
@@ -4601,27 +4627,31 @@ export type WorkspacePlan = {
status: WorkspacePlanStatuses;
};
export enum WorkspacePlanStatuses {
CancelationScheduled = 'cancelationScheduled',
Canceled = 'canceled',
Expired = 'expired',
PaymentFailed = 'paymentFailed',
Trial = 'trial',
Valid = 'valid'
}
export const WorkspacePlanStatuses = {
CancelationScheduled: 'cancelationScheduled',
Canceled: 'canceled',
Expired: 'expired',
PaymentFailed: 'paymentFailed',
Trial: 'trial',
Valid: 'valid'
} as const;
export enum WorkspacePlans {
Academia = 'academia',
Business = 'business',
BusinessInvoiced = 'businessInvoiced',
Free = 'free',
Plus = 'plus',
PlusInvoiced = 'plusInvoiced',
Starter = 'starter',
StarterInvoiced = 'starterInvoiced',
Unlimited = 'unlimited'
}
export type WorkspacePlanStatuses = typeof WorkspacePlanStatuses[keyof typeof WorkspacePlanStatuses];
export const WorkspacePlans = {
Academia: 'academia',
Business: 'business',
BusinessInvoiced: 'businessInvoiced',
Free: 'free',
Plus: 'plus',
PlusInvoiced: 'plusInvoiced',
Pro: 'pro',
Starter: 'starter',
StarterInvoiced: 'starterInvoiced',
Team: 'team',
Unlimited: 'unlimited'
} as const;
export type WorkspacePlans = typeof WorkspacePlans[keyof typeof WorkspacePlans];
export type WorkspaceProjectCreateInput = {
description?: InputMaybe<Scalars['String']['input']>;
name?: InputMaybe<Scalars['String']['input']>;
@@ -4693,21 +4723,23 @@ export type WorkspaceProjectsUpdatedMessage = {
workspaceId: Scalars['String']['output'];
};
export enum WorkspaceProjectsUpdatedMessageType {
Added = 'ADDED',
Removed = 'REMOVED'
}
export const WorkspaceProjectsUpdatedMessageType = {
Added: 'ADDED',
Removed: 'REMOVED'
} as const;
export type WorkspaceProjectsUpdatedMessageType = typeof WorkspaceProjectsUpdatedMessageType[keyof typeof WorkspaceProjectsUpdatedMessageType];
export type WorkspaceRequestToJoinInput = {
workspaceId: Scalars['ID']['input'];
};
export enum WorkspaceRole {
Admin = 'ADMIN',
Guest = 'GUEST',
Member = 'MEMBER'
}
export const WorkspaceRole = {
Admin: 'ADMIN',
Guest: 'GUEST',
Member: 'MEMBER'
} as const;
export type WorkspaceRole = typeof WorkspaceRole[keyof typeof WorkspaceRole];
export type WorkspaceRoleDeleteInput = {
userId: Scalars['String']['input'];
workspaceId: Scalars['String']['input'];
+1
View File
@@ -6,6 +6,7 @@
"../src/**/*.tsx"
],
"exclude": [
"../**/*.spec.ts",
"../src/**/*.mts"
],
"compilerOptions": {
+3 -1
View File
@@ -5,7 +5,9 @@
"../src/**/*.mts",
"../src/**/*.tsx"
],
"exclude": [],
"exclude": [
"../**/*.spec.ts"
],
"compilerOptions": {
"outDir": "../.tshy-build/esm"
}
+3
View File
@@ -0,0 +1,3 @@
{
"vitest.vitestPackagePath": "../../node_modules/vitest/package.json"
}
+3 -1
View File
@@ -22,7 +22,9 @@ const configs = [
languageOptions: {
parserOptions: {
tsconfigRootDir: getESMDirname(import.meta.url),
project: './tsconfig.json'
projectService: {
allowDefaultProject: ['*.ts']
}
}
},
rules: {
+9 -5
View File
@@ -18,7 +18,9 @@
"lint:eslint": "eslint .",
"lint:tsc": "tsc --noEmit",
"lint": "yarn lint:eslint && yarn lint:tsc",
"lint:ci": "yarn lint:tsc"
"lint:ci": "yarn lint:tsc",
"test": "vitest",
"test:single-run": "vitest run"
},
"sideEffects": false,
"engines": {
@@ -63,6 +65,7 @@
"tshy": "^1.14.0",
"typescript": "^4.5.4",
"ua-parser-js": "^1.0.38",
"vitest": "^3.0.7",
"znv": "^0.4.0",
"zod": "^3.22.4"
},
@@ -75,14 +78,15 @@
"./observability": "./src/observability/index.ts",
"./dist/*": "./dist/*",
".": "./src/index.ts"
}
},
"exclude": [
"**/*.spec.ts"
]
},
"imports": {
"#lodash": {
"require": "lodash",
"import": "lodash-es",
"node": "lodash",
"default": "lodash-es"
"import": "lodash-es"
}
},
"exports": {
@@ -0,0 +1,11 @@
import { describe, expect, test } from 'vitest'
import { xor } from './utility.js'
describe('xor', () => {
test('returns true if only one of the arguments is truthy', () => {
expect(xor(true, false)).toBe(true)
expect(xor(false, true)).toBe(true)
expect(xor(true, true)).toBe(false)
expect(xor(false, false)).toBe(false)
})
})
@@ -0,0 +1,10 @@
import { describe, expect, test } from 'vitest'
import md5 from './md5.js'
describe('md5', () => {
test('returns a valid md5 hash', () => {
expect(md5('hello')).toBe('5d41402abc4b2a76b9719d911017c592')
expect(md5('world')).toBe('7d793037a0760186574b0282f2f435e7')
expect(md5('')).toBe('d41d8cd98f00b204e9800998ecf8427e')
})
})
@@ -0,0 +1,186 @@
import { WorkspaceRoles } from '../../core/constants.js'
import {
PaidWorkspacePlans,
UnpaidWorkspacePlans,
WorkspacePlanBillingIntervals,
WorkspacePlans
} from './plans.js'
type StringTemplate<Data extends object> = (data: Data) => string
/**
* WORKSPACE FEATURES
*/
export const WorkspacePlanFeatures = <const>{
// Core features pretty much available to everyone
Workspace: 'workspace',
RoleManagement: 'roleManagement',
GuestUsers: 'guestUsers',
PrivateAutomateFunctions: 'privateAutomateFunctions',
// Optional/plan specific
DomainSecurity: 'domainBasedSecurityPolicies',
PrioritySupport: 'prioritySupport',
SSO: 'oidcSso',
CustomDataRegion: 'workspaceDataRegionSpecificity'
}
export type WorkspacePlanFeatures =
(typeof WorkspacePlanFeatures)[keyof typeof WorkspacePlanFeatures]
export const WorkspacePlanFeaturesMetadata = (<const>{
// Old
[WorkspacePlanFeatures.Workspace]: {
displayName: 'Workspace',
description: 'A shared space for your team and projects'
},
[WorkspacePlanFeatures.RoleManagement]: {
displayName: 'Role management',
description: "Control individual members' access and edit rights"
},
[WorkspacePlanFeatures.GuestUsers]: {
displayName: 'Guest users',
description: (params: { price: number | string }) =>
`Give guests access to specific projects in the workspace at £${params.price}/month/guest`
},
[WorkspacePlanFeatures.PrivateAutomateFunctions]: {
displayName: 'Private automate functions',
description:
'Create and manage private automation functions securely within your workspace'
},
[WorkspacePlanFeatures.DomainSecurity]: {
displayName: 'Domain security',
description: 'Require workspace members to use a verified company email'
},
[WorkspacePlanFeatures.SSO]: {
displayName: 'Single Sign-On (SSO)',
description: 'Require workspace members to log in with your SSO provider'
},
[WorkspacePlanFeatures.CustomDataRegion]: {
displayName: 'Custom data residency',
description: 'Store the workspace data in a custom region'
},
[WorkspacePlanFeatures.PrioritySupport]: {
displayName: 'Priority support',
description: 'Personal and fast support'
}
}) satisfies Record<
WorkspacePlanFeatures,
{
displayName: string
// eslint-disable-next-line @typescript-eslint/no-explicit-any
description: string | StringTemplate<any>
}
>
/**
* PLAN CONFIG - PRICES & FEATURES
*/
export type WorkspacePlanPriceStructure = {
[interval in WorkspacePlanBillingIntervals]: {
[role in WorkspaceRoles]: number
}
}
export type WorkspacePlanConfig<Plan extends WorkspacePlans = WorkspacePlans> = {
plan: Plan
features: readonly WorkspacePlanFeatures[]
}
const baseFeatures = [
WorkspacePlanFeatures.Workspace,
WorkspacePlanFeatures.RoleManagement,
WorkspacePlanFeatures.GuestUsers,
WorkspacePlanFeatures.PrivateAutomateFunctions
] as const
export const WorkspacePaidPlanConfigs: {
[plan in PaidWorkspacePlans]: WorkspacePlanConfig<plan>
} = {
// Old
[PaidWorkspacePlans.Starter]: {
plan: PaidWorkspacePlans.Starter,
features: [...baseFeatures, WorkspacePlanFeatures.DomainSecurity]
},
[PaidWorkspacePlans.Plus]: {
plan: PaidWorkspacePlans.Plus,
features: [
...baseFeatures,
WorkspacePlanFeatures.DomainSecurity,
WorkspacePlanFeatures.SSO
]
},
[PaidWorkspacePlans.Business]: {
plan: PaidWorkspacePlans.Business,
features: [
...baseFeatures,
WorkspacePlanFeatures.DomainSecurity,
WorkspacePlanFeatures.SSO,
WorkspacePlanFeatures.CustomDataRegion,
WorkspacePlanFeatures.PrioritySupport
]
},
[PaidWorkspacePlans.Team]: {
plan: PaidWorkspacePlans.Team,
features: baseFeatures
},
[PaidWorkspacePlans.Pro]: {
plan: PaidWorkspacePlans.Pro,
features: [
...baseFeatures,
WorkspacePlanFeatures.DomainSecurity,
WorkspacePlanFeatures.SSO,
WorkspacePlanFeatures.CustomDataRegion,
WorkspacePlanFeatures.PrioritySupport
]
}
}
export const WorkspaceUnpaidPlanConfigs: {
[plan in UnpaidWorkspacePlans]: WorkspacePlanConfig<plan>
} = {
// Old
[UnpaidWorkspacePlans.Unlimited]: {
plan: UnpaidWorkspacePlans.Unlimited,
features: [
...baseFeatures,
WorkspacePlanFeatures.DomainSecurity,
WorkspacePlanFeatures.SSO,
WorkspacePlanFeatures.CustomDataRegion,
WorkspacePlanFeatures.PrioritySupport
]
},
[UnpaidWorkspacePlans.Academia]: {
plan: UnpaidWorkspacePlans.Academia,
features: [
...baseFeatures,
WorkspacePlanFeatures.DomainSecurity,
WorkspacePlanFeatures.SSO,
WorkspacePlanFeatures.CustomDataRegion,
WorkspacePlanFeatures.PrioritySupport
]
},
[UnpaidWorkspacePlans.StarterInvoiced]: {
...WorkspacePaidPlanConfigs.starter,
plan: UnpaidWorkspacePlans.StarterInvoiced
},
[UnpaidWorkspacePlans.PlusInvoiced]: {
...WorkspacePaidPlanConfigs.plus,
plan: UnpaidWorkspacePlans.PlusInvoiced
},
[UnpaidWorkspacePlans.BusinessInvoiced]: {
...WorkspacePaidPlanConfigs.business,
plan: UnpaidWorkspacePlans.BusinessInvoiced
},
// New
[UnpaidWorkspacePlans.Free]: {
plan: UnpaidWorkspacePlans.Free,
features: baseFeatures
}
}
export const WorkspacePlanConfigs = {
...WorkspacePaidPlanConfigs,
...WorkspaceUnpaidPlanConfigs
}
@@ -0,0 +1,106 @@
/**
* PLANS
*/
export const TrialEnabledPaidWorkspacePlans = <const>{
Starter: 'starter'
}
export type TrialEnabledPaidWorkspacePlans =
(typeof TrialEnabledPaidWorkspacePlans)[keyof typeof TrialEnabledPaidWorkspacePlans]
export const PaidWorkspacePlansOld = <const>{
...TrialEnabledPaidWorkspacePlans,
Plus: 'plus',
Business: 'business'
}
export type PaidWorkspacePlansOld =
(typeof PaidWorkspacePlansOld)[keyof typeof PaidWorkspacePlansOld]
export const PaidWorkspacePlansNew = <const>{
Team: 'team',
Pro: 'pro'
}
export type PaidWorkspacePlansNew =
(typeof PaidWorkspacePlansNew)[keyof typeof PaidWorkspacePlansNew]
export const PaidWorkspacePlans = <const>{
...PaidWorkspacePlansOld,
...PaidWorkspacePlansNew
}
export type PaidWorkspacePlans =
(typeof PaidWorkspacePlans)[keyof typeof PaidWorkspacePlans]
export const UnpaidWorkspacePlans = <const>{
// Old
Unlimited: 'unlimited',
Academia: 'academia',
StarterInvoiced: 'starterInvoiced',
PlusInvoiced: 'plusInvoiced',
BusinessInvoiced: 'businessInvoiced',
// New
Free: 'free'
}
export type UnpaidWorkspacePlans =
(typeof UnpaidWorkspacePlans)[keyof typeof UnpaidWorkspacePlans]
export const WorkspacePlans = <const>{
...PaidWorkspacePlans,
...UnpaidWorkspacePlans
}
export type WorkspacePlans = (typeof WorkspacePlans)[keyof typeof WorkspacePlans]
/**
* BILLING INTERVALS
*/
export const WorkspacePlanBillingIntervals = <const>{
Monthly: 'monthly',
Yearly: 'yearly'
}
export type WorkspacePlanBillingIntervals =
(typeof WorkspacePlanBillingIntervals)[keyof typeof WorkspacePlanBillingIntervals]
/**
* PLAN STATUSES
*/
export const UnpaidWorkspacePlanStatuses = <const>{
Valid: 'valid'
}
export type UnpaidWorkspacePlanStatuses =
(typeof UnpaidWorkspacePlanStatuses)[keyof typeof UnpaidWorkspacePlanStatuses]
export const PaidWorkspacePlanStatuses = <const>{
...UnpaidWorkspacePlanStatuses,
PaymentFailed: 'paymentFailed',
CancelationScheduled: 'cancelationScheduled',
Canceled: 'canceled'
}
export type PaidWorkspacePlanStatuses =
(typeof PaidWorkspacePlanStatuses)[keyof typeof PaidWorkspacePlanStatuses]
export const TrialWorkspacePlanStatuses = <const>{
Trial: 'trial',
Expired: 'expired'
}
export type TrialWorkspacePlanStatuses =
(typeof TrialWorkspacePlanStatuses)[keyof typeof TrialWorkspacePlanStatuses]
export const WorkspacePlanStatuses = <const>{
...PaidWorkspacePlanStatuses,
...TrialWorkspacePlanStatuses,
...UnpaidWorkspacePlanStatuses
}
export type WorkspacePlanStatuses =
(typeof WorkspacePlanStatuses)[keyof typeof WorkspacePlanStatuses]
+2
View File
@@ -1 +1,3 @@
export * from './errors/index.js'
export * from './helpers/plans.js'
export * from './helpers/features.js'
+1 -1
View File
@@ -31,7 +31,7 @@
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
"types": [] /* Specify type package names to be included without being referenced in a source file. */,
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "resolveJsonModule": true, /* Enable importing .json files */
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
+3
View File
@@ -0,0 +1,3 @@
import { defineConfig } from 'vitest/config'
export default defineConfig({})
+1 -3
View File
@@ -1,3 +1 @@
{
"vitest.disableWorkspaceWarning": true
}
{}
+1 -3
View File
@@ -26,9 +26,7 @@
"imports": {
"#lodash": {
"require": "lodash",
"import": "lodash-es",
"node": "lodash",
"default": "lodash-es"
"import": "lodash-es"
}
},
"exports": {
+1 -3
View File
@@ -1,3 +1 @@
{
"vitest.disableWorkspaceWarning": true
}
{}
+3
View File
@@ -0,0 +1,3 @@
import { defineConfig } from 'vitest/config'
export default defineConfig({})
+1
View File
@@ -0,0 +1 @@
export default ['packages/*/vitest.config.{js,ts,mjs}']
+960 -232
View File
File diff suppressed because it is too large Load Diff