mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-25 22:38:56 +08:00
@@ -0,0 +1,57 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export enum FeatureType {
|
||||
Feature = 0,
|
||||
Quota = 1,
|
||||
}
|
||||
|
||||
// TODO(@forehalo): quota is a useless extra concept, merge it with feature
|
||||
export const UserPlanQuotaConfig = z.object({
|
||||
// quota name
|
||||
name: z.string(),
|
||||
// single blob limit
|
||||
blobLimit: z.number(),
|
||||
// total blob limit
|
||||
storageQuota: z.number(),
|
||||
// history period of validity
|
||||
historyPeriod: z.number(),
|
||||
// member limit
|
||||
memberLimit: z.number(),
|
||||
// copilot action limit 10
|
||||
copilotActionLimit: z.number(),
|
||||
});
|
||||
|
||||
export const WorkspaceQuotaConfig = UserPlanQuotaConfig.extend({
|
||||
// seat quota
|
||||
seatQuota: z.number(),
|
||||
}).omit({
|
||||
copilotActionLimit: true,
|
||||
});
|
||||
|
||||
function feature<T extends z.ZodRawShape>(configs: z.ZodObject<T>) {
|
||||
return z.object({
|
||||
type: z.literal(FeatureType.Feature),
|
||||
configs: configs,
|
||||
});
|
||||
}
|
||||
|
||||
function quota<T extends z.ZodRawShape>(configs: z.ZodObject<T>) {
|
||||
return z.object({
|
||||
type: z.literal(FeatureType.Quota),
|
||||
configs: configs,
|
||||
});
|
||||
}
|
||||
|
||||
export const Features = {
|
||||
copilot: feature(z.object({})),
|
||||
early_access: feature(z.object({ whitelist: z.array(z.string()) })),
|
||||
unlimited_workspace: feature(z.object({})),
|
||||
unlimited_copilot: feature(z.object({})),
|
||||
ai_early_access: feature(z.object({})),
|
||||
administrator: feature(z.object({})),
|
||||
free_plan_v1: quota(UserPlanQuotaConfig),
|
||||
pro_plan_v1: quota(UserPlanQuotaConfig),
|
||||
lifetime_pro_plan_v1: quota(UserPlanQuotaConfig),
|
||||
restricted_plan_v1: quota(UserPlanQuotaConfig),
|
||||
team_plan_v1: quota(WorkspaceQuotaConfig),
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
export * from './feature';
|
||||
Reference in New Issue
Block a user