mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-13 21:01:21 +08:00
Some checks failed
all-good: Did all the other checks pass? / all-good (push) Has been cancelled
Ensure Prisma migrations are in sync with the schema / check_prisma_migrations (22.x) (push) Has been cancelled
DB migration compat / Check if migrations changed (push) Has been cancelled
Docker Server Build and Push / Docker Build and Push Server (push) Has been cancelled
Docker Server Build and Run / docker (push) Has been cancelled
Runs E2E API Tests (Local Emulator) / E2E Tests (Local Emulator, Node ${{ matrix.node-version }}) (22.x) (push) Has been cancelled
Runs E2E API Tests / E2E Tests (Node ${{ matrix.node-version }}, Freestyle ${{ matrix.freestyle-mode }}) (mock, 22.x) (push) Has been cancelled
Runs E2E API Tests / E2E Tests (Node ${{ matrix.node-version }}, Freestyle ${{ matrix.freestyle-mode }}) (prod, 22.x) (push) Has been cancelled
Runs E2E API Tests with custom port prefix / build (22.x) (push) Has been cancelled
Runs E2E Fallback Tests / E2E Fallback Tests (Node ${{ matrix.node-version }}) (22.x) (push) Has been cancelled
Lint & build / lint_and_build (24) (push) Has been cancelled
TOC Generator / TOC Generator (push) Has been cancelled
DB migration compat / Back-compat — Current branch migrations with ${{ needs.check-migrations-changed.outputs.base_branch }} branch code (push) Has been cancelled
DB migration compat / Forward-compat — Current branch code with ${{ needs.check-migrations-changed.outputs.base_branch }} branch migrations (push) Has been cancelled
DB migration compat / No migration changes (skipped) (push) Has been cancelled
65 lines
2.1 KiB
TypeScript
65 lines
2.1 KiB
TypeScript
"use client";
|
|
|
|
import { ALL_APPS_FRONTEND, hasNavigationItems, isSubApp } from "@/lib/apps-frontend";
|
|
import { ALL_APPS, type AppId } from "@hexclave/shared/dist/apps/apps-config";
|
|
|
|
type InstalledAppConfig = {
|
|
enabled?: boolean,
|
|
} | undefined;
|
|
|
|
export type InstalledAppsMap = Record<string, InstalledAppConfig>;
|
|
|
|
/**
|
|
* Get all available app IDs, filtering out alpha apps in production
|
|
*/
|
|
export function getAllAvailableAppIds(): AppId[] {
|
|
let apps = Object.keys(ALL_APPS) as AppId[];
|
|
|
|
// Filter out alpha apps in production
|
|
if (process.env.NODE_ENV !== "development") {
|
|
apps = apps.filter(appId => ALL_APPS[appId].stage !== "alpha");
|
|
}
|
|
|
|
return apps;
|
|
}
|
|
|
|
/**
|
|
* Determines whether an app is enabled.
|
|
* - Regular apps are enabled via their own config entry.
|
|
* - Sub-apps are enabled when their parent app is enabled.
|
|
*/
|
|
export function isAppEnabled(installedApps: InstalledAppsMap, appId: AppId): boolean {
|
|
const appFrontend = ALL_APPS_FRONTEND[appId];
|
|
if (isSubApp(appFrontend)) {
|
|
return installedApps[appFrontend.parentAppId]?.enabled ?? false;
|
|
}
|
|
return installedApps[appId]?.enabled ?? false;
|
|
}
|
|
|
|
/**
|
|
* Get all enabled app IDs using centralized enabled/sub-app logic.
|
|
*
|
|
* Unlike `getAllAvailableAppIds`, this intentionally includes alpha-stage apps
|
|
* that are explicitly enabled. The alpha filter only gates *discovery*
|
|
* (app store listing, onboarding wizard), not functionality.
|
|
*/
|
|
export function getEnabledAppIds(installedApps: InstalledAppsMap): AppId[] {
|
|
return (Object.keys(ALL_APPS) as AppId[]).filter((appId) => isAppEnabled(installedApps, appId));
|
|
}
|
|
|
|
/**
|
|
* Get enabled apps that expose sidebar/cmdk navigation items.
|
|
*/
|
|
export function getEnabledNavigableAppIds(installedApps: InstalledAppsMap): AppId[] {
|
|
return getEnabledAppIds(installedApps).filter((appId) => hasNavigationItems(ALL_APPS_FRONTEND[appId]));
|
|
}
|
|
|
|
/**
|
|
* Get uninstalled app IDs (available but not installed)
|
|
*/
|
|
export function getUninstalledAppIds(installedApps: AppId[]): AppId[] {
|
|
const installedSet = new Set(installedApps);
|
|
return getAllAvailableAppIds().filter(appId => !installedSet.has(appId));
|
|
}
|
|
|