import { z } from "zod";
const toTuple = <T extends string>(xs: readonly T[]) => xs as unknown as [T, ...T[]];
/**
* Factory function to create language-feature schemas from a mapping
*/
function createLanguageFeatureSchemas<TMapping extends Record<string, readonly string[]>>(
mapping: TMapping
) {
type Language = Extract<keyof TMapping, string>;
type Feature = TMapping[keyof TMapping][number];
const languageSchema = z.enum(
toTuple(Object.keys(mapping) as unknown as readonly [Language, ...Language[]])
);
const allFeatures = Array.from(new Set(Object.values(mapping).flat())) as readonly Feature[];
const featureSchema = z.enum(toTuple(allFeatures));
const baseSchema = z.object({
language: languageSchema,
feature: featureSchema,
});
const refinedSchema = baseSchema.superRefine((val, ctx) => {
const language = val.language as string;
const feature = val.feature as string;
const allowed = mapping[language] as readonly string[];
if (allowed && !allowed.includes(feature)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["feature"],
message: `Feature "${feature}" is not available for language "${language}". Allowed: ${allowed.join(", ")}`,
});
}
});
return {
languageSchema,
featureSchema,
baseSchema,
refinedSchema,
mapping,
} as const;
}
export const sdkLanguageToFeatures = {
asyncio: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"files",
"message-actions",
"misc",
"mobile-push",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"c-core": [
"access-manager",
"channel-groups",
"configuration",
"encryption",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"c-sharp": [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
dart: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
freertos: [
"channel-groups",
"configuration",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
go: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
java: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
javascript: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
kotlin: [
"_memberships",
"_spaces",
"_users",
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
mbed: [
"channel-groups",
"configuration",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"objective-c": [
"access-manager",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
php: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"posix-c": [
"access-manager",
"channel-groups",
"configuration",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"posix-cpp": [
"access-manager",
"channel-groups",
"configuration",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
python: [
"_memberships",
"_spaces",
"_users",
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
ruby: [
"access-manager",
"access-manager-v2",
"channel-groups",
"configuration",
"encryption",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
rust: [
"access-manager",
"configuration",
"encryption",
"misc",
"presence",
"publish-and-subscribe",
],
swift: [
"access-manager",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
unity: [
"access-manager",
"channel-groups",
"configuration",
"encryption",
"files",
"message-actions",
"misc",
"mobile-push",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
unreal: [
"access-manager",
"channel-groups",
"configuration",
"encryption",
"message-actions",
"objects",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"windows-c": [
"access-manager",
"channel-groups",
"configuration",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
"windows-cpp": [
"access-manager",
"channel-groups",
"configuration",
"misc",
"presence",
"publish-and-subscribe",
"storage-and-playback",
],
} as const;
export const chatSdkLanguageToFeatures = {
javascript: [
"channels-create",
"channels-delete",
"channels-details",
"channels-invite",
"channels-join",
"channels-leave",
"channels-list",
"channels-membership",
"channels-references",
"channels-typing-indicator",
"channels-updates",
"channels-watch",
"connection-management",
"custom-events",
"error-logging",
"messages-delete",
"messages-details",
"messages-drafts",
"messages-drafts_v1",
"messages-files",
"messages-forward",
"messages-history",
"messages-links",
"messages-moderation",
"messages-pinned",
"messages-quotes",
"messages-reactions",
"messages-read-receipts",
"messages-restore",
"messages-send-receive",
"messages-threads",
"messages-unread",
"messages-updates",
"moderation",
"push-notifications",
"users-create",
"users-delete",
"users-details",
"users-list",
"users-mentions",
"users-moderation",
"users-moderation-user",
"users-permissions",
"users-presence",
"users-updates",
"utility-methods",
],
kotlin: [
"channels-create",
"channels-delete",
"channels-details",
"channels-invite",
"channels-join",
"channels-leave",
"channels-list",
"channels-membership",
"channels-references",
"channels-typing-indicator",
"channels-updates",
"channels-watch",
"connection-management",
"custom-events",
"error-logging",
"messages-delete",
"messages-details",
"messages-drafts",
"messages-files",
"messages-forward",
"messages-history",
"messages-links",
"messages-moderation",
"messages-pinned",
"messages-quotes",
"messages-reactions",
"messages-read-receipts",
"messages-restore",
"messages-send-receive",
"messages-threads",
"messages-unread",
"messages-updates",
"moderation",
"push-notifications",
"users-create",
"users-delete",
"users-details",
"users-list",
"users-mentions",
"users-moderation",
"users-moderation-user",
"users-permissions",
"users-presence",
"users-updates",
"utility-methods",
],
swift: [
"channels-create",
"channels-delete",
"channels-details",
"channels-invite",
"channels-join",
"channels-leave",
"channels-list",
"channels-membership",
"channels-references",
"channels-typing-indicator",
"channels-updates",
"channels-watch",
"custom-events",
"error-logging",
"messages-delete",
"messages-details",
"messages-drafts",
"messages-files",
"messages-forward",
"messages-history",
"messages-links",
"messages-moderation",
"messages-pinned",
"messages-quotes",
"messages-reactions",
"messages-read-receipts",
"messages-restore",
"messages-send-receive",
"messages-threads",
"messages-unread",
"messages-updates",
"push-notifications",
"users-create",
"users-delete",
"users-details",
"users-list",
"users-mentions",
"users-presence",
"users-updates",
],
unity: [
"channels-create",
"channels-delete",
"channels-details",
"channels-invite",
"channels-join",
"channels-leave",
"channels-list",
"channels-membership",
"channels-references",
"channels-typing-indicator",
"channels-updates",
"channels-watch",
"custom-events",
"error-logging",
"messages-delete",
"messages-details",
"messages-drafts",
"messages-forward",
"messages-history",
"messages-links",
"messages-moderation",
"messages-pinned",
"messages-quotes",
"messages-reactions",
"messages-read-receipts",
"messages-restore",
"messages-send-receive",
"messages-threads",
"messages-unread",
"messages-updates",
"moderation",
"users-create",
"users-delete",
"users-details",
"users-list",
"users-mentions",
"users-moderation",
"users-permissions",
"users-presence",
"users-updates",
],
unreal: [
"channels-create",
"channels-delete",
"channels-details",
"channels-invite",
"channels-join",
"channels-leave",
"channels-list",
"channels-membership",
"channels-references",
"channels-typing-indicator",
"channels-updates",
"channels-watch",
"connection-management",
"custom-events",
"error-logging",
"messages-delete",
"messages-details",
"messages-drafts",
"messages-forward",
"messages-history",
"messages-links",
"messages-moderation",
"messages-pinned",
"messages-quotes",
"messages-reactions",
"messages-read-receipts",
"messages-restore",
"messages-send-receive",
"messages-threads",
"messages-unread",
"messages-updates",
"moderation",
"users-create",
"users-delete",
"users-details",
"users-list",
"users-mentions",
"users-moderation",
"users-permissions",
"users-presence",
"users-updates",
],
};
const chatSdkSchemas = createLanguageFeatureSchemas(chatSdkLanguageToFeatures);
export const GetChatSdkDocumentationSchema = chatSdkSchemas.baseSchema;
export const GetChatSdkDocumentationSchemaRefined = chatSdkSchemas.refinedSchema;
const sdkSchemas = createLanguageFeatureSchemas(sdkLanguageToFeatures);
export const GetSdkDocumentationSchema = sdkSchemas.baseSchema;
export const GetSdkDocumentationSchemaRefined = sdkSchemas.refinedSchema;
export const howToSlugs = [
"7-chat-sdk-features-developers-will-love",
"add-friend-list-to-your-unity-game",
"add-language-translation-and-abusive-language-filtering-to-your-unreal-engine-game",
"add-moderation-and-translation-to-your-unity-game",
"add-moderation-to-your-live-events-app",
"add-presence-to-your-unity-game",
"add-presence-to-your-unreal-engine-game",
"add-pubnub-to-your-unity-game",
"add-real-time-chat-to-your-unity-game",
"add-real-time-chat-to-your-unreal-engine-game",
"add-scoreboard-and-leaderboard-to-your-unity-game",
"admin-portal-create-keys",
"admin-portal-enabling-files",
"admin-portal-enabling-objects",
"admin-portal-persistence",
"admin-portal-presence",
"admin-portal-push-notifications-android",
"admin-portal-push-notifications-apns",
"build-chat-app-using-html-css-vue-js",
"build-chat-for-virtual-events",
"build-collaborative-applications",
"call-access-manager-from-pubnub-functions",
"call-pubnub-from-alexa",
"chat-sdk-add-reactions-to-messages",
"chat-sdk-create-threads-and-quote-messges",
"chat-sdk-manage-user-channel-membership",
"chat-sdk-mention-users",
"create-a-real-time-delivery-application",
"create-game-alerts",
"cross-platform-chat-application",
"develop-an-iot-solution",
"develop-game-scoring-system",
"eanda-advanced-jsonpath-filter",
"explore-real-time-geolocation-solutions",
"implement-iot-predictive-maintenance",
"interactive-2d-chat",
"interactive-rpgs",
"make-the-most-of-pubnubs-dashboards",
"make-your-own-leaderboard",
"manage-users-and-channels-with-bizops-workspace",
"message-timestamps",
"monitor-and-moderate-conversations-with-bizops-workspace",
"push-notifications",
"real-time-streaming-application",
"real-time-user-counter",
"securely-moderate-chat-and-users",
"set-up-events-and-actions",
"set-up-illuminate-gaming",
"signing-and-verifying-onrequest-function-requests",
"skill-based-matchmaking-with-pubnub",
"smooth-driver-location",
"stream-events-from-pubnub-to-rabbitmq",
"summarize-missed-chat-messages-with-chatgpt",
"telemedicine-app-development",
"test-cases-for-chat-application",
"throttle-or-aggregate-messages",
"understand-your-pubnub-data-better-using-analyze-with-ai",
"upgrade-encryption-to-256-bit-key-length",
"use-app-context",
"use-the-ena-api",
] as const;
export const HowToSchema = z.object({
slug: z.enum(toTuple(howToSlugs)),
});
export const GetBestPracticesSchema = z.object({});