Skip to content

Commit 8ebf68f

Browse files
committed
more changes
1 parent 505654a commit 8ebf68f

3 files changed

Lines changed: 74 additions & 5 deletions

File tree

apps/sim/lib/core/config/enterprise-entitlements.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
ENTERPRISE_FEATURE_LEGACY_DEFAULTS,
77
type EnterpriseFeature,
88
resolveEnterpriseEntitlement,
9+
resolveSandboxFeatureAvailability,
910
} from '@/lib/core/config/enterprise-entitlements'
1011

1112
describe('resolveEnterpriseEntitlement', () => {
@@ -114,3 +115,45 @@ describe('resolveEnterpriseEntitlement', () => {
114115
})
115116
})
116117
})
118+
119+
describe('resolveSandboxFeatureAvailability', () => {
120+
it.each([
121+
{
122+
name: 'hosted billing with a provider',
123+
billingEnabled: true,
124+
deploymentEntitled: false,
125+
remoteProviderEnabled: true,
126+
expected: true,
127+
},
128+
{
129+
name: 'hosted billing without a provider',
130+
billingEnabled: true,
131+
deploymentEntitled: false,
132+
remoteProviderEnabled: false,
133+
expected: false,
134+
},
135+
{
136+
name: 'billing-free Enterprise or feature entitlement with a provider',
137+
billingEnabled: false,
138+
deploymentEntitled: true,
139+
remoteProviderEnabled: true,
140+
expected: true,
141+
},
142+
{
143+
name: 'billing-free provider credentials without an entitlement',
144+
billingEnabled: false,
145+
deploymentEntitled: false,
146+
remoteProviderEnabled: true,
147+
expected: false,
148+
},
149+
{
150+
name: 'billing-free entitlement without a provider',
151+
billingEnabled: false,
152+
deploymentEntitled: true,
153+
remoteProviderEnabled: false,
154+
expected: false,
155+
},
156+
])('$name resolves to $expected', ({ expected, ...input }) => {
157+
expect(resolveSandboxFeatureAvailability(input)).toBe(expected)
158+
})
159+
})

apps/sim/lib/core/config/enterprise-entitlements.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,25 @@ export function resolveEnterpriseEntitlement({
101101
}: ResolveEnterpriseEntitlementParams): boolean {
102102
return explicit ?? (masterEnabled || legacyDefault)
103103
}
104+
105+
interface ResolveSandboxFeatureAvailabilityParams {
106+
/** Whether hosted subscription enforcement supplies the deployment entitlement. */
107+
billingEnabled: boolean
108+
/** Enterprise-master or Sandbox-specific deployment entitlement. */
109+
deploymentEntitled: boolean
110+
/** Server-verified provider readiness or its public browser projection. */
111+
remoteProviderEnabled: boolean
112+
}
113+
114+
/**
115+
* Combines Sandbox entitlement with runtime capability. Neither dimension may
116+
* substitute for the other: a plan cannot create a provider, and provider
117+
* credentials cannot grant a workspace feature by themselves.
118+
*/
119+
export function resolveSandboxFeatureAvailability({
120+
billingEnabled,
121+
deploymentEntitled,
122+
remoteProviderEnabled,
123+
}: ResolveSandboxFeatureAvailabilityParams): boolean {
124+
return remoteProviderEnabled && (billingEnabled || deploymentEntitled)
125+
}

apps/sim/lib/core/config/env-flags.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
ENTERPRISE_FEATURE_LEGACY_DEFAULTS,
1313
type EnterpriseFeature,
1414
resolveEnterpriseEntitlement,
15+
resolveSandboxFeatureAvailability,
1516
} from './enterprise-entitlements'
1617
import { env, envBoolean, getEnv, isFalsy, isTruthy } from './env'
1718
import { hasEnvCapabilityValue, inspectCapability, SANDBOX_CAPABILITY } from './env-capabilities'
@@ -441,11 +442,14 @@ export const isRemoteSandboxEnabled =
441442
* provider readiness into the browser; the server always verifies credentials
442443
* and the immutable Function base directly.
443444
*/
444-
export const isSandboxesEnabled =
445-
(isBillingEnabled || isSandboxDeploymentEntitled) &&
446-
(typeof window === 'undefined'
447-
? isRemoteSandboxEnabled
448-
: isTruthy(getEnv('NEXT_PUBLIC_SANDBOXES_ENABLED')))
445+
export const isSandboxesEnabled = resolveSandboxFeatureAvailability({
446+
billingEnabled: isBillingEnabled,
447+
deploymentEntitled: isSandboxDeploymentEntitled,
448+
remoteProviderEnabled:
449+
typeof window === 'undefined'
450+
? isRemoteSandboxEnabled
451+
: isTruthy(getEnv('NEXT_PUBLIC_SANDBOXES_ENABLED')),
452+
})
449453

450454
/**
451455
* Whether the selected provider can serve Mothership's own code image.

0 commit comments

Comments
 (0)