diff --git a/bun.lock b/bun.lock index 66b362415cf..d3bc7e84fac 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,7 @@ "": { "name": "appwrite-website", "dependencies": { - "@appwrite.io/specs": "github:appwrite/specs#9f7af415c733583dc4b32b090df0c89986407cbd", + "@appwrite.io/specs": "github:appwrite/specs#ad50888d2aaac4b027a8a733ddcef4543e90dea1", "@sentry/sveltekit": "^10.28.0", "@statsig/js-client": "^3.33.0", "@statsig/session-replay": "^3.33.0", @@ -130,7 +130,7 @@ "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.26.0", "", {}, "sha512-abLQdT0zlDkEEwvgU1ymFq0ztxuRerwx7t1oeUGFgXlm9gXrxt6nce2f5GRqg9Rb7hM3F3nyc1ds8zRRWHQOyw=="], - "@appwrite.io/specs": ["@appwrite.io/specs@github:appwrite/specs#9f7af41", {}, "appwrite-specs-9f7af41", "sha512-Hgz0Xzw8forEivWtM+30u+ysV1TnBH7DwsKXrjv6LJQqxjetgr6Qxanf7lwwjvW2DEdm6R/w96CWqh/IEj2zrw=="], + "@appwrite.io/specs": ["@appwrite.io/specs@github:appwrite/specs#ad50888", {}, "appwrite-specs-ad50888", "sha512-1IN0c0aO/bKCDMu86WoXvOeLXU1FHjSNS/XELl58N00SGCfQXB8iERU2grRt+mytu1LuWAtGhBak4gQWapxeiQ=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "7.27.1", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], diff --git a/package.json b/package.json index 5c840338aef..747a399b43b 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@statsig/session-replay": "^3.33.0", "@statsig/statsig-node-core": "^0.19.3", "@statsig/web-analytics": "^3.33.0", - "@appwrite.io/specs": "github:appwrite/specs#9f7af415c733583dc4b32b090df0c89986407cbd", + "@appwrite.io/specs": "github:appwrite/specs#ad50888d2aaac4b027a8a733ddcef4543e90dea1", "h3": "^1.15.4", "sharp": "^0.34.5" }, diff --git a/src/lib/server/model-markdown.ts b/src/lib/server/model-markdown.ts index 53c2be9fb7a..734c63c95bc 100644 --- a/src/lib/server/model-markdown.ts +++ b/src/lib/server/model-markdown.ts @@ -1,3 +1,4 @@ +import { resolveVersion } from '$lib/utils/references'; import { getApi, getSchema, @@ -16,7 +17,7 @@ export async function generateModelMarkdown( modelName: string ): Promise { try { - const version = versionParam === 'cloud' ? '1.8.x' : versionParam; + const version = resolveVersion(versionParam); const api = await getApi(version, 'console-web'); const schema = getSchema(modelName, api); diff --git a/src/lib/server/service-markdown.ts b/src/lib/server/service-markdown.ts index 0c1838768d9..ec2747f601c 100644 --- a/src/lib/server/service-markdown.ts +++ b/src/lib/server/service-markdown.ts @@ -1,3 +1,4 @@ +import { resolveVersion } from '$lib/utils/references'; import { getService } from '../../routes/docs/references/[version]/[platform]/[service]/specs'; import type { SDKMethod } from '../../routes/docs/references/[version]/[platform]/[service]/specs'; @@ -10,7 +11,7 @@ export async function generateServiceMarkdown( serviceName: string ): Promise { try { - const version = versionParam === 'cloud' ? '1.8.x' : versionParam; + const version = resolveVersion(versionParam); const serviceData = await getService(version, platform, serviceName); const { service, methods } = serviceData; diff --git a/src/lib/utils/references.ts b/src/lib/utils/references.ts index bc2dda57f84..59b2dfb2d75 100644 --- a/src/lib/utils/references.ts +++ b/src/lib/utils/references.ts @@ -25,22 +25,39 @@ export const versions: Readonly>> = allVersions.fil export const latestVersion = allVersions[0]; +/** + * Resolves the public `cloud` alias to the newest versioned spec. Every + * consumer of spec data (service pages, model pages, markdown generators) + * must resolve through here so `cloud` always means the same version. + */ +export function resolveVersion(version: string): string { + return version === 'cloud' ? latestVersion : version; +} + export const Service = { Account: 'account', + Activities: 'activities', + Advisor: 'advisor', + Apps: 'apps', Avatars: 'avatars', + Backups: 'backups', Databases: 'databases', TablesDB: 'tablesDB', Functions: 'functions', Messaging: 'messaging', Health: 'health', Locale: 'locale', + OAuth2: 'oauth2', + Organization: 'organization', Presences: 'presences', + Proxy: 'proxy', Storage: 'storage', Teams: 'teams', Users: 'users', Sites: 'sites', Tokens: 'tokens', - Project: 'project' + Project: 'project', + Webhooks: 'webhooks' } as const; export type ServiceType = typeof Service; @@ -71,7 +88,6 @@ export const Platform = { ServerRest: 'server-rest' } as const; -type PlatformType = typeof Platform; export type Platform = (typeof Platform)[keyof typeof Platform]; export const VALID_PLATFORMS = new Set(Object.values(Platform)); @@ -156,20 +172,28 @@ export const platformMap: Record = { export const serviceMap: Record = { [Service.Account]: 'Account', + [Service.Activities]: 'Activities', + [Service.Advisor]: 'Advisor', + [Service.Apps]: 'Apps', [Service.Avatars]: 'Avatars', + [Service.Backups]: 'Backups', [Service.Databases]: 'Databases', [Service.TablesDB]: 'TablesDB', [Service.Functions]: 'Functions', [Service.Messaging]: 'Messaging', [Service.Health]: 'Health', [Service.Locale]: 'Locale', + [Service.OAuth2]: 'OAuth2', + [Service.Organization]: 'Organization', [Service.Presences]: 'Presences', + [Service.Proxy]: 'Proxy', [Service.Storage]: 'Storage', [Service.Teams]: 'Teams', [Service.Users]: 'Users', [Service.Sites]: 'Sites', [Service.Tokens]: 'Tokens', - [Service.Project]: 'Project' + [Service.Project]: 'Project', + [Service.Webhooks]: 'Webhooks' }; export const preferredVersion = writable( diff --git a/src/routes/docs/references/[version]/[platform]/[service]/(components)/RateLimits.svelte b/src/routes/docs/references/[version]/[platform]/[service]/(components)/RateLimits.svelte index b21f6135974..b6df2314bed 100644 --- a/src/routes/docs/references/[version]/[platform]/[service]/(components)/RateLimits.svelte +++ b/src/routes/docs/references/[version]/[platform]/[service]/(components)/RateLimits.svelte @@ -84,7 +84,7 @@ {#if hasMultipleKeys(rateKeys)} - {#each rateKeys as key, i} + {#each rateKeys as key (key)} {Math.floor(rateTime / 60)} minutes { - return ['cloud', ...(versions as string[])].flatMap((version) => { - return platforms.flatMap((platform) => { - return services.map((service) => { - return { service, version, platform }; - }); - }); - }); +export const entries: EntryGenerator = async () => { + const combos: Array<{ service: string; version: string; platform: string }> = []; + for (const version of ['cloud', ...(versions as string[])]) { + const resolved = resolveVersion(version); + for (const platform of getAvailablePlatforms(resolved)) { + const documented = getAvailableServices(await getApi(resolved, platform)); + for (const service of services) { + if (documented.has(service)) { + combos.push({ service, version, platform }); + } + } + } + } + return combos; }; export const load: PageServerLoad = async ({ params }) => { const { platform, service } = params; - const version = params.version === 'cloud' ? latestVersion : params.version; + const version = resolveVersion(params.version); if (!versions.includes(version)) error(404, 'Invalid version'); if (!platforms.includes(platform as Platform)) error(404, 'Invalid platform'); if (!services.includes(service as ServiceValue)) error(404, 'Invalid service'); - return getService(version, platform, service); + return { + ...(await getService(version, platform, service)), + platforms: getAvailablePlatforms(version) + }; }; diff --git a/src/routes/docs/references/[version]/[platform]/[service]/+page.svelte b/src/routes/docs/references/[version]/[platform]/[service]/+page.svelte index 79970555114..b4b7a6461bd 100644 --- a/src/routes/docs/references/[version]/[platform]/[service]/+page.svelte +++ b/src/routes/docs/references/[version]/[platform]/[service]/+page.svelte @@ -192,6 +192,11 @@ let platformBindingForSelect = $derived(page.params.platform as Platform); let platform = $derived(/**$preferredPlatform ?? */ page.params.platform as Platform); + // Platforms whose SDK exists for the current version, keeping the current + // one listed even when it was discontinued so the select stays coherent. + let availablePlatforms = $derived( + data.platforms.includes(platform) ? data.platforms : [platform, ...data.platforms] + ); let platformType = $derived(platform.startsWith('client-') ? 'CLIENT' : 'SERVER'); let serviceName = $derived(serviceMap[data.service?.name]); let title = $derived(serviceName + API_REFERENCE_TITLE_SUFFIX); @@ -233,14 +238,14 @@ value={platformBindingForSelect} on:change={selectPlatform} options={[ - ...Object.values(Platform) + ...availablePlatforms .filter((p) => p.startsWith('client-')) .map((p) => ({ value: p, label: platformMap[p], group: 'Client' })), - ...Object.values(Platform) + ...availablePlatforms .filter((p) => p.startsWith('server-')) .map((p) => ({ value: p, @@ -298,7 +303,7 @@ {/if} - {#each Object.entries(groupMethodsByGroup(data.methods)) as [group, methods]} + {#each Object.values(groupMethodsByGroup(data.methods)) as methods, groupIndex (groupIndex)} {#each sortMethods(methods) as method (method.id)}
@@ -339,14 +344,16 @@ process withLineNumbers={false} /> -
- -
+ {#if method.demo !== null} +
+ +
+ {/if}
@@ -387,7 +394,7 @@