P1-0: V8 heap cap (HOMARR_MAX_OLD_SPACE_SIZE, default 512MB)
P1-1: Module graph cuts
- Dynamic integration imports (55 static → lazy loaders)
- Conditional DB driver loading (only configured driver loaded)
- Replace jsdom with linkedom for SVG sanitization
- Delete eager widget barrel (55 import * as → 0)
- Extract createRetryableLoader to @homarr/common
P1-2: Enable cacheComponents + restructure root layout
- Suspense boundaries around session-dependent providers
- ColorSchemeScript replaces server-side cookie reads
- Board/manage/auth layouts wrapped in Suspense
P1-3: Cache read paths
- Cache tag registry + invalidation helpers
- Cache invalidation wired into all mutation routers
- Translation deep-merge memoized per locale
P1-4: Prerendered shells + loading.tsx files
P1-5: Shared integration data cache (60s TTL, stale-while-revalidate)
P1-6: Redis-backed Next.js cache handler (@homarr/next-cache-handler)
P1-7: Redis optional (memory channel fallback), TTL on pubSub:last:*,
Redis clients consolidated from 6 to 2
49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
import type { WidgetKind } from "@homarr/definitions";
|
|
|
|
import type { Database } from "..";
|
|
import { inArray } from "..";
|
|
import type { inferSupportedIntegrations } from "../../widgets/src/import";
|
|
import { items } from "../schema";
|
|
|
|
export const getItemsWithIntegrationsAsync = async <TKind extends WidgetKind>(
|
|
db: Database,
|
|
{ kinds }: { kinds: TKind[] },
|
|
) => {
|
|
const itemsForIntegration = await db.query.items.findMany({
|
|
where: inArray(items.kind, kinds),
|
|
with: {
|
|
integrations: {
|
|
with: {
|
|
integration: {
|
|
with: {
|
|
app: true,
|
|
secrets: {
|
|
columns: {
|
|
kind: true,
|
|
value: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
return itemsForIntegration.map((item) => ({
|
|
...item,
|
|
kind: item.kind as TKind,
|
|
integrations: item.integrations.map(({ integration, integrationId }) => {
|
|
const integrationWithSecrets = {
|
|
...integration,
|
|
kind: integration.kind as inferSupportedIntegrations<TKind>,
|
|
};
|
|
|
|
return {
|
|
integration: integrationWithSecrets,
|
|
integrationId,
|
|
};
|
|
}),
|
|
}));
|
|
};
|