init commit for iPAL-kit plugin

This commit is contained in:
2026-07-28 00:21:22 +02:00
parent 5733a9c8bf
commit 24a1fe0d60
12 changed files with 443 additions and 202 deletions
+17 -11
View File
@@ -67,7 +67,6 @@ const route = await resolveRoute({
segments: ['artykuly', 'moj-post'],
page: 1, // z ?page=
content: contentConfig,
withEntries: false, // true → dociąga wpisy do archiwum (patrz niżej)
})
// route.type: 'home' | 'page' | 'archive' | 'entry' | (null gdy 404)
```
@@ -96,7 +95,7 @@ import { createContentHelpers } from 'ipal-kit'
import config from '@/payload.config'
import { contentConfig } from '@/content.config'
export const { getCachedPayload, getConfiguredLocales, getSettings, resolveRoute } =
export const { getCachedPayload, getConfiguredLocales, getSettings, resolveRoute, getEntries } =
createContentHelpers({ config, content: contentConfig })
```
@@ -105,23 +104,30 @@ fabryce i jest współdzielona — dlatego to fabryka, nie luźne funkcje. Bez t
`cache()` nie dedupikowałby między helperami, a Next woła generateMetadata i
komponent strony osobno.
`resolveRoute` z fabryki przyjmuje `(locale, segments, page, withEntries?)`.
`resolveRoute` z fabryki przyjmuje `(locale, segments, page)` — rozstrzyga
trasę. Pobranie wpisów to osobna funkcja `getEntries` (patrz niżej), bo
routing i pobieranie danych to dwie różne odpowiedzialności.
## withEntries — wpisy tylko gdy trzeba
## Routing i pobieranie — osobno
Archiwum potrzebuje listy wpisów; metadane nie. `withEntries` rozstrzyga:
Archiwum potrzebuje listy wpisów; metadane nie. Rozstrzyganie trasy i pobieranie
wpisów to dwie funkcje, składane jawnie tam, gdzie trzeba obu:
```ts
// generateMetadata — bez wpisów (nie płaci za zapytanie)
// generateMetadata — sama trasa (nie płaci za zapytanie o wpisy)
const route = await resolveRoute(locale, slug, page)
// komponent strony — z wpisami
const route = await resolveRoute(locale, slug, page, true)
// route.entries: { docs, page, totalPages, hasPrevPage, hasNextPage, ... }
// komponent strony — trasa, a potem wpisy, jeśli to archiwum
const route = await resolveRoute(locale, slug, page)
const entries = route?.type === 'archive'
? await getEntries(route.collection, locale, route.page, route.perPage)
: null
// entries: { docs, page, totalPages, hasPrevPage, hasNextPage, ... }
```
Metadane i strona wołają z różnymi argumentami, więc `cache()` traktuje je jako
osobne wywołania — i słusznie, bo metadane wpisów nie potrzebują.
`resolveRoute` zwraca `collection` i `perPage` — czyli CO i ILE pobrać — ale
pobierania nie robi. Dzięki temu zmiana sortowania czy filtrowania listingu nie
dotyka reguł routingu, a metadane nie pobierają wpisów, których i tak nie użyją.
## Listing