@lovrozagar/flare 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/package.json +146 -0
- package/scripts/download-fonts.ts +136 -0
- package/scripts/populate-fonts.ts +721 -0
- package/src/await.ts +2 -0
- package/src/boundaries/index.ts +99 -0
- package/src/broadcast/channel.ts +65 -0
- package/src/broadcast/context.ts +12 -0
- package/src/broadcast/index.ts +75 -0
- package/src/broadcast/provider.tsx +7 -0
- package/src/build-location.ts +2 -0
- package/src/caches/index.ts +384 -0
- package/src/client/index.ts +75 -0
- package/src/client.tsx +2 -0
- package/src/codegen/index.ts +41 -0
- package/src/components/await.tsx +140 -0
- package/src/components/dev-error-overlay.tsx +154 -0
- package/src/components/direction-script.tsx +22 -0
- package/src/components/index.ts +150 -0
- package/src/components/locale-script.tsx +26 -0
- package/src/components/reset-css.tsx +14 -0
- package/src/components/ssr-context.tsx +37 -0
- package/src/components/theme-script.tsx +22 -0
- package/src/components/view-transition-css.tsx +21 -0
- package/src/config/index.ts +84 -0
- package/src/create-client-only-fn.ts +1 -0
- package/src/create-isomorphic-fn.ts +2 -0
- package/src/create-layout.ts +1 -0
- package/src/create-page.ts +1 -0
- package/src/create-path-segment.ts +1 -0
- package/src/create-query-client-getter.ts +2 -0
- package/src/create-root-layout.ts +1 -0
- package/src/create-router.ts +8 -0
- package/src/create-server-only-fn.ts +1 -0
- package/src/dedupe/index.ts +151 -0
- package/src/defer/index.ts +82 -0
- package/src/direction/index.tsx +163 -0
- package/src/direction.ts +3 -0
- package/src/duration/index.ts +18 -0
- package/src/env-fn/index.ts +101 -0
- package/src/env-fn.ts +2 -0
- package/src/errors/index.ts +166 -0
- package/src/fonts/abeezee.ts +50 -0
- package/src/fonts/abel.ts +26 -0
- package/src/fonts/abril-fatface.ts +34 -0
- package/src/fonts/acme.ts +26 -0
- package/src/fonts/advent-pro.ts +92 -0
- package/src/fonts/alegreya-sans.ts +228 -0
- package/src/fonts/alegreya.ts +228 -0
- package/src/fonts/alex-brush.ts +42 -0
- package/src/fonts/alfa-slab-one.ts +42 -0
- package/src/fonts/alice.ts +48 -0
- package/src/fonts/amatic-sc.ts +94 -0
- package/src/fonts/amiri.ts +114 -0
- package/src/fonts/antic-slab.ts +26 -0
- package/src/fonts/anton.ts +42 -0
- package/src/fonts/archivo-black.ts +34 -0
- package/src/fonts/archivo-narrow.ts +114 -0
- package/src/fonts/archivo.ts +66 -0
- package/src/fonts/arimo.ts +256 -0
- package/src/fonts/arvo.ts +50 -0
- package/src/fonts/asap.ts +66 -0
- package/src/fonts/assistant.ts +64 -0
- package/src/fonts/baloo-2.ts +82 -0
- package/src/fonts/barlow-condensed.ts +114 -0
- package/src/fonts/barlow-semi-condensed.ts +114 -0
- package/src/fonts/barlow.ts +114 -0
- package/src/fonts/be-vietnam-pro.ts +114 -0
- package/src/fonts/bebas-neue.ts +34 -0
- package/src/fonts/besley.ts +82 -0
- package/src/fonts/biorhyme.ts +50 -0
- package/src/fonts/bitter.ts +94 -0
- package/src/fonts/black-ops-one.ts +49 -0
- package/src/fonts/bree-serif.ts +34 -0
- package/src/fonts/bricolage-grotesque.ts +66 -0
- package/src/fonts/cabin.ts +114 -0
- package/src/fonts/cairo.ts +66 -0
- package/src/fonts/cardo.ts +193 -0
- package/src/fonts/catamaran.ts +41 -0
- package/src/fonts/caveat.ts +78 -0
- package/src/fonts/chakra-petch.ts +142 -0
- package/src/fonts/chivo.ts +66 -0
- package/src/fonts/cinzel.ts +50 -0
- package/src/fonts/comfortaa.ts +109 -0
- package/src/fonts/commissioner.ts +64 -0
- package/src/fonts/component.tsx +27 -0
- package/src/fonts/cormorant-garamond.ts +171 -0
- package/src/fonts/cormorant.ts +170 -0
- package/src/fonts/courgette.ts +34 -0
- package/src/fonts/courier-prime.ts +82 -0
- package/src/fonts/create-font.ts +47 -0
- package/src/fonts/create-registry-font.ts +40 -0
- package/src/fonts/crete-round.ts +50 -0
- package/src/fonts/crimson-text.ts +114 -0
- package/src/fonts/css.ts +86 -0
- package/src/fonts/dancing-script.ts +66 -0
- package/src/fonts/dm-mono.ts +50 -0
- package/src/fonts/dm-sans.ts +50 -0
- package/src/fonts/dm-serif-display.ts +50 -0
- package/src/fonts/domine.ts +50 -0
- package/src/fonts/dosis.ts +66 -0
- package/src/fonts/eb-garamond.ts +228 -0
- package/src/fonts/eczar.ts +94 -0
- package/src/fonts/encode-sans.ts +42 -0
- package/src/fonts/epilogue.ts +66 -0
- package/src/fonts/exo-2.ts +94 -0
- package/src/fonts/exo.ts +66 -0
- package/src/fonts/figtree.ts +82 -0
- package/src/fonts/fira-code.ts +121 -0
- package/src/fonts/fira-sans-condensed.ts +228 -0
- package/src/fonts/fira-sans.ts +228 -0
- package/src/fonts/fjalla-one.ts +49 -0
- package/src/fonts/font-urls.gen.json +1962 -0
- package/src/fonts/fraunces.ts +66 -0
- package/src/fonts/fredoka.ts +64 -0
- package/src/fonts/gelasio.ts +114 -0
- package/src/fonts/gloria-hallelujah.ts +34 -0
- package/src/fonts/gothic-a1.ts +124 -0
- package/src/fonts/great-vibes.ts +64 -0
- package/src/fonts/gudea.ts +66 -0
- package/src/fonts/heebo.ts +57 -0
- package/src/fonts/hind-siliguri.ts +66 -0
- package/src/fonts/hind.ts +66 -0
- package/src/fonts/ibm-plex-mono.ts +172 -0
- package/src/fonts/ibm-plex-sans-arabic.ts +80 -0
- package/src/fonts/ibm-plex-sans.ts +199 -0
- package/src/fonts/ibm-plex-serif.ts +171 -0
- package/src/fonts/inconsolata.ts +66 -0
- package/src/fonts/index.ts +4 -0
- package/src/fonts/indie-flower.ts +34 -0
- package/src/fonts/instrument-sans.ts +82 -0
- package/src/fonts/instrument-serif.ts +50 -0
- package/src/fonts/inter-display.ts +52 -0
- package/src/fonts/inter-tight.ts +124 -0
- package/src/fonts/inter.ts +123 -0
- package/src/fonts/jetbrains-mono.ts +199 -0
- package/src/fonts/josefin-sans.ts +114 -0
- package/src/fonts/josefin-slab.ts +50 -0
- package/src/fonts/jost.ts +64 -0
- package/src/fonts/kalam.ts +66 -0
- package/src/fonts/kanit.ts +142 -0
- package/src/fonts/karla.ts +82 -0
- package/src/fonts/khand.ts +66 -0
- package/src/fonts/lato.ts +82 -0
- package/src/fonts/league-spartan.ts +42 -0
- package/src/fonts/lexend-deca.ts +42 -0
- package/src/fonts/lexend.ts +42 -0
- package/src/fonts/libre-baskerville.ts +82 -0
- package/src/fonts/libre-franklin.ts +95 -0
- package/src/fonts/lilita-one.ts +34 -0
- package/src/fonts/lobster-two.ts +50 -0
- package/src/fonts/lobster.ts +56 -0
- package/src/fonts/lora.ts +235 -0
- package/src/fonts/m-plus-rounded-1c.ts +138 -0
- package/src/fonts/manrope.ts +109 -0
- package/src/fonts/maven-pro.ts +66 -0
- package/src/fonts/merriweather-sans.ts +142 -0
- package/src/fonts/merriweather.ts +171 -0
- package/src/fonts/montserrat-alternates.ts +171 -0
- package/src/fonts/montserrat.ts +94 -0
- package/src/fonts/mukta.ts +66 -0
- package/src/fonts/mulish.ts +170 -0
- package/src/fonts/nanum-gothic.ts +34 -0
- package/src/fonts/nanum-myeongjo.ts +34 -0
- package/src/fonts/neuton.ts +66 -0
- package/src/fonts/newsreader.ts +114 -0
- package/src/fonts/noticia-text.ts +114 -0
- package/src/fonts/noto-sans-arabic.ts +58 -0
- package/src/fonts/noto-sans-hk.ts +49 -0
- package/src/fonts/noto-sans-jp.ts +49 -0
- package/src/fonts/noto-sans-kr.ts +49 -0
- package/src/fonts/noto-sans-sc.ts +49 -0
- package/src/fonts/noto-sans-tc.ts +49 -0
- package/src/fonts/noto-sans.ts +140 -0
- package/src/fonts/noto-serif-jp.ts +80 -0
- package/src/fonts/noto-serif.ts +140 -0
- package/src/fonts/nunito-sans.ts +170 -0
- package/src/fonts/nunito.ts +170 -0
- package/src/fonts/old-standard-tt.ts +133 -0
- package/src/fonts/onest.ts +48 -0
- package/src/fonts/open-sans.ts +340 -0
- package/src/fonts/orbitron.ts +34 -0
- package/src/fonts/oswald.ts +94 -0
- package/src/fonts/outfit.ts +34 -0
- package/src/fonts/overpass.ts +94 -0
- package/src/fonts/oxygen.ts +50 -0
- package/src/fonts/pacifico.ts +56 -0
- package/src/fonts/passion-one.ts +50 -0
- package/src/fonts/pathway-gothic-one.ts +34 -0
- package/src/fonts/permanent-marker.ts +26 -0
- package/src/fonts/philosopher.ts +172 -0
- package/src/fonts/play.ts +109 -0
- package/src/fonts/playfair-display.ts +142 -0
- package/src/fonts/plus-jakarta-sans.ts +142 -0
- package/src/fonts/poppins.ts +114 -0
- package/src/fonts/prompt.ts +142 -0
- package/src/fonts/pt-sans-narrow.ts +78 -0
- package/src/fonts/pt-sans.ts +138 -0
- package/src/fonts/pt-serif.ts +138 -0
- package/src/fonts/public-sans.ts +66 -0
- package/src/fonts/questrial.ts +42 -0
- package/src/fonts/quicksand.ts +66 -0
- package/src/fonts/rajdhani.ts +66 -0
- package/src/fonts/raleway.ts +94 -0
- package/src/fonts/recursive.ts +80 -0
- package/src/fonts/red-hat-display.ts +82 -0
- package/src/fonts/red-rose.ts +66 -0
- package/src/fonts/registry.gen.ts +173 -0
- package/src/fonts/righteous.ts +34 -0
- package/src/fonts/roboto-condensed.ts +124 -0
- package/src/fonts/roboto-flex.ts +64 -0
- package/src/fonts/roboto-mono.ts +199 -0
- package/src/fonts/roboto-slab.ts +72 -0
- package/src/fonts/roboto.ts +156 -0
- package/src/fonts/rokkitt.ts +66 -0
- package/src/fonts/rubik.ts +199 -0
- package/src/fonts/sacramento.ts +34 -0
- package/src/fonts/saira.ts +66 -0
- package/src/fonts/sarabun.ts +142 -0
- package/src/fonts/satisfy.ts +26 -0
- package/src/fonts/sawarabi-mincho.ts +41 -0
- package/src/fonts/shadows-into-light.ts +34 -0
- package/src/fonts/signika-negative.ts +66 -0
- package/src/fonts/signika.ts +66 -0
- package/src/fonts/slabo-27px.ts +34 -0
- package/src/fonts/sora.ts +50 -0
- package/src/fonts/source-code-pro.ts +228 -0
- package/src/fonts/source-sans-3.ts +228 -0
- package/src/fonts/source-serif-4.ts +199 -0
- package/src/fonts/space-grotesk.ts +66 -0
- package/src/fonts/space-mono.ts +114 -0
- package/src/fonts/spectral.ts +170 -0
- package/src/fonts/tajawal.ts +50 -0
- package/src/fonts/teko.ts +66 -0
- package/src/fonts/tenor-sans.ts +41 -0
- package/src/fonts/tinos.ts +256 -0
- package/src/fonts/titillium-web.ts +82 -0
- package/src/fonts/types.ts +43 -0
- package/src/fonts/ubuntu-condensed.ts +63 -0
- package/src/fonts/ubuntu-mono.ts +195 -0
- package/src/fonts/ubuntu.ts +195 -0
- package/src/fonts/unbounded.ts +94 -0
- package/src/fonts/unicode-ranges.gen.ts +28 -0
- package/src/fonts/urbanist.ts +50 -0
- package/src/fonts/varela-round.ts +49 -0
- package/src/fonts/vollkorn.ts +199 -0
- package/src/fonts/work-sans.ts +66 -0
- package/src/fonts/yanone-kaffeesatz.ts +128 -0
- package/src/fonts/yantramanav.ts +66 -0
- package/src/fonts/yellowtail.ts +34 -0
- package/src/fonts/young-serif.ts +34 -0
- package/src/fonts/zen-kaku-gothic-new.ts +64 -0
- package/src/fonts/zilla-slab.ts +82 -0
- package/src/form/index.tsx +205 -0
- package/src/generators/index.ts +1589 -0
- package/src/head-client/index.ts +649 -0
- package/src/history/index.ts +210 -0
- package/src/hooks.ts +61 -0
- package/src/hydrate/index.tsx +381 -0
- package/src/hydration/index.ts +187 -0
- package/src/i18n/index.ts +250 -0
- package/src/i18n/jsx.tsx +42 -0
- package/src/i18n/message-format.ts +174 -0
- package/src/image/index.tsx +473 -0
- package/src/image.ts +12 -0
- package/src/intercept-outlet/index.tsx +18 -0
- package/src/intercept-outlet.ts +2 -0
- package/src/internal/index.ts +143 -0
- package/src/internal/once-idle.ts +24 -0
- package/src/internal.ts +12 -0
- package/src/lazy/index.tsx +205 -0
- package/src/link/index.tsx +367 -0
- package/src/loader-pipeline/index.ts +639 -0
- package/src/locale/index.tsx +137 -0
- package/src/locale.ts +3 -0
- package/src/logger.ts +22 -0
- package/src/middleware/builtins/api-proxy.ts +64 -0
- package/src/middleware/builtins/cdn-proxy.ts +58 -0
- package/src/middleware/builtins/i18n.ts +256 -0
- package/src/middleware/builtins/keepalive.ts +24 -0
- package/src/middleware/builtins/markdown-negotiation.ts +141 -0
- package/src/middleware/builtins/static-assets.ts +32 -0
- package/src/middleware/index.ts +223 -0
- package/src/module-graph/index.ts +181 -0
- package/src/mount/index.ts +146 -0
- package/src/navigate.ts +1 -0
- package/src/navigation/index.ts +1278 -0
- package/src/navigation/types.ts +59 -0
- package/src/navigation-progress/index.tsx +247 -0
- package/src/navigation-progress.ts +1 -0
- package/src/ndjson-client/index.ts +376 -0
- package/src/ndjson-server/index.ts +284 -0
- package/src/outlet/index.tsx +633 -0
- package/src/outlet/types.ts +243 -0
- package/src/plugins/css-transform.ts +70 -0
- package/src/plugins/dev-cdn-cache.ts +454 -0
- package/src/plugins/dev-dashboard/client.tsx +2603 -0
- package/src/plugins/dev-dashboard/match-route-tree.ts +159 -0
- package/src/plugins/dev-dashboard/plugin.ts +404 -0
- package/src/plugins/dev-prerender.ts +168 -0
- package/src/plugins/dev-server.ts +327 -0
- package/src/plugins/generate-watch.ts +32 -0
- package/src/plugins/image-plugin.ts +171 -0
- package/src/plugins/index.ts +445 -0
- package/src/plugins/options.ts +37 -0
- package/src/plugins/parse-utils.ts +59 -0
- package/src/plugins/prerender-plugin.ts +144 -0
- package/src/plugins/purge.ts +242 -0
- package/src/plugins/server-fn.ts +641 -0
- package/src/plugins/service-worker.ts +225 -0
- package/src/plugins/solid-jsx.d.ts +12 -0
- package/src/plugins/sx-ast/atomic.ts +166 -0
- package/src/plugins/sx-ast/evaluator.ts +235 -0
- package/src/plugins/sx-ast/index.ts +372 -0
- package/src/plugins/sx-ast/parser.ts +22 -0
- package/src/plugins/sx-ast/rewrite.ts +763 -0
- package/src/plugins/sx.d.ts +14 -0
- package/src/plugins/tw-compile.ts +240 -0
- package/src/plugins/types.ts +41 -0
- package/src/plugins/virtual.d.ts +110 -0
- package/src/plugins/virtual.ts +184 -0
- package/src/preload/index.ts +77 -0
- package/src/prerender/index.ts +431 -0
- package/src/query-client/index.tsx +168 -0
- package/src/registry/index.ts +88 -0
- package/src/reset-css.ts +1 -0
- package/src/revalidation/index.ts +84 -0
- package/src/rewrite/index.ts +83 -0
- package/src/route-builder/create-layout.ts +655 -0
- package/src/route-builder/create-page.ts +806 -0
- package/src/route-builder/create-path-segment.ts +34 -0
- package/src/route-builder/create-root-layout.ts +608 -0
- package/src/route-builder/index.ts +49 -0
- package/src/route-builder/register.ts +242 -0
- package/src/route-builder/types.ts +294 -0
- package/src/router-config/index.ts +91 -0
- package/src/router-primitives/index.ts +25 -0
- package/src/router-primitives/location.ts +29 -0
- package/src/router-primitives/match-id.ts +111 -0
- package/src/router-primitives/paths.ts +109 -0
- package/src/router-primitives/tree.ts +243 -0
- package/src/router-primitives/types.ts +74 -0
- package/src/router.ts +31 -0
- package/src/search-engine/bing.ts +32 -0
- package/src/search-engine/google-jwt.ts +95 -0
- package/src/search-engine/google.ts +139 -0
- package/src/search-engine/index-now.ts +64 -0
- package/src/search-engine/index.ts +12 -0
- package/src/security/index.ts +230 -0
- package/src/server/index.ts +286 -0
- package/src/server-context/browser.ts +113 -0
- package/src/server-context/index.ts +217 -0
- package/src/server-fn/index.ts +710 -0
- package/src/server-fn-query.ts +169 -0
- package/src/server-handler/etag.ts +51 -0
- package/src/server-handler/headers.ts +5 -0
- package/src/server-handler/index.ts +1664 -0
- package/src/server-handler/types.ts +24 -0
- package/src/server-handler/validate-static-params.ts +130 -0
- package/src/server.ts +2 -0
- package/src/service-worker/template.ts +153 -0
- package/src/service-worker-hook/index.ts +70 -0
- package/src/sitemap/index.ts +231 -0
- package/src/ssr/critical-css.ts +150 -0
- package/src/ssr/head-prefix.ts +65 -0
- package/src/ssr/head.ts +259 -0
- package/src/ssr/index.tsx +879 -0
- package/src/state-parser/index.ts +266 -0
- package/src/store/filesystem.ts +131 -0
- package/src/store/index.ts +29 -0
- package/src/styles/index.ts +1200 -0
- package/src/styles/sx-types.ts +11 -0
- package/src/testing/index.ts +251 -0
- package/src/testing.ts +2 -0
- package/src/theme/index.tsx +232 -0
- package/src/theme.ts +3 -0
- package/src/tracing/index.ts +4 -0
- package/src/tracing/noop.ts +13 -0
- package/src/tracing/otel.ts +37 -0
- package/src/tracing/timing.ts +34 -0
- package/src/tracing/types.ts +9 -0
- package/src/url/index.ts +140 -0
- package/src/use-router.ts +11 -0
- package/src/use-suspense-query.ts +2 -0
- package/src/validation/index.ts +57 -0
- package/src/view-transition-css.ts +1 -0
|
@@ -0,0 +1,806 @@
|
|
|
1
|
+
import type { FlareRouter } from "../outlet/types.ts";
|
|
2
|
+
import type { Location } from "../router-primitives/index.ts";
|
|
3
|
+
import type {
|
|
4
|
+
ExtractPathParams,
|
|
5
|
+
ParentAuthResolution,
|
|
6
|
+
ParentPreloaderContext,
|
|
7
|
+
ResolvedAuth,
|
|
8
|
+
ResolvedEnv,
|
|
9
|
+
ResolvedQueryClient,
|
|
10
|
+
ResolvedServerContext,
|
|
11
|
+
} from "./register.ts";
|
|
12
|
+
import {
|
|
13
|
+
type AuthenticateMode,
|
|
14
|
+
BUILDER_MARKER,
|
|
15
|
+
type CacheConfig,
|
|
16
|
+
type DeferFn,
|
|
17
|
+
type EffectsConfig,
|
|
18
|
+
type HeadConfig,
|
|
19
|
+
type HeadOptions,
|
|
20
|
+
type InputConfig,
|
|
21
|
+
type LoaderCause,
|
|
22
|
+
type ParamsValidator,
|
|
23
|
+
type ResponseHeaders,
|
|
24
|
+
type SearchParamsValidator,
|
|
25
|
+
type ServerThrowHelpers,
|
|
26
|
+
type ServerUrlHelpers,
|
|
27
|
+
} from "./types.ts";
|
|
28
|
+
|
|
29
|
+
/* ── callback context types ─────────────────────────────────────── */
|
|
30
|
+
|
|
31
|
+
export interface PageAuthorizeContext<TParams, TSearch, TAuth extends AuthenticateMode, TPreloaderContext>
|
|
32
|
+
extends ServerThrowHelpers, ServerUrlHelpers {
|
|
33
|
+
abortController: AbortController;
|
|
34
|
+
auth: ResolvedAuth<TAuth>;
|
|
35
|
+
env: ResolvedEnv;
|
|
36
|
+
locale: () => string;
|
|
37
|
+
location: Location<TParams, TSearch>;
|
|
38
|
+
preloaderContext: TPreloaderContext;
|
|
39
|
+
request: Request;
|
|
40
|
+
serverContext: ResolvedServerContext;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface PagePreloaderContext<TParams, TSearch, TAuth extends AuthenticateMode, TPreloaderContext>
|
|
44
|
+
extends ServerThrowHelpers, ServerUrlHelpers {
|
|
45
|
+
abortController: AbortController;
|
|
46
|
+
auth: ResolvedAuth<TAuth>;
|
|
47
|
+
env: ResolvedEnv;
|
|
48
|
+
locale: () => string;
|
|
49
|
+
location: Location<TParams, TSearch>;
|
|
50
|
+
preloaderContext: TPreloaderContext;
|
|
51
|
+
request: Request;
|
|
52
|
+
serverContext: ResolvedServerContext;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type PageLoaderContext<
|
|
56
|
+
TParams,
|
|
57
|
+
TSearch,
|
|
58
|
+
TAuth extends AuthenticateMode,
|
|
59
|
+
TPreloaderContext,
|
|
60
|
+
> = ServerThrowHelpers &
|
|
61
|
+
ServerUrlHelpers &
|
|
62
|
+
ResolvedQueryClient & {
|
|
63
|
+
abortController: AbortController;
|
|
64
|
+
auth: ResolvedAuth<TAuth>;
|
|
65
|
+
cause: LoaderCause;
|
|
66
|
+
defer: DeferFn;
|
|
67
|
+
deps: unknown[];
|
|
68
|
+
env: ResolvedEnv;
|
|
69
|
+
locale: () => string;
|
|
70
|
+
location: Location<TParams, TSearch>;
|
|
71
|
+
prefetch: boolean;
|
|
72
|
+
preloaderContext: TPreloaderContext;
|
|
73
|
+
request: Request;
|
|
74
|
+
serverContext: ResolvedServerContext;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export interface PageHeadContext<TParams, TSearch, TPreloaderContext, TLoaderData> extends ServerUrlHelpers {
|
|
78
|
+
cause: LoaderCause;
|
|
79
|
+
loaderData: TLoaderData;
|
|
80
|
+
location: Location<TParams, TSearch>;
|
|
81
|
+
parentHead: HeadConfig | undefined;
|
|
82
|
+
prefetch: boolean;
|
|
83
|
+
preloaderContext: TPreloaderContext;
|
|
84
|
+
serverContext: ResolvedServerContext;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface PageHeadersContext<TParams, TSearch, TPreloaderContext, TLoaderData> extends ServerUrlHelpers {
|
|
88
|
+
cause: LoaderCause;
|
|
89
|
+
env: ResolvedEnv;
|
|
90
|
+
loaderData: TLoaderData;
|
|
91
|
+
location: Location<TParams, TSearch>;
|
|
92
|
+
parentHeaders: ResponseHeaders | undefined;
|
|
93
|
+
prefetch: boolean;
|
|
94
|
+
preloaderContext: TPreloaderContext;
|
|
95
|
+
request: Request;
|
|
96
|
+
serverContext: ResolvedServerContext;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface PageRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData> {
|
|
100
|
+
loaderData: TLoaderData;
|
|
101
|
+
location: Location<TParams, TSearch>;
|
|
102
|
+
preloaderContext: TPreloaderContext;
|
|
103
|
+
router: FlareRouter;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface PageResponseContext<TParams = Record<string, string | undefined>> {
|
|
107
|
+
env: ResolvedEnv;
|
|
108
|
+
params: TParams;
|
|
109
|
+
request: Request;
|
|
110
|
+
url: URL;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface PageErrorRenderProps<TParams, TSearch> {
|
|
114
|
+
error: Error;
|
|
115
|
+
location: Location<TParams, TSearch>;
|
|
116
|
+
reset: () => void;
|
|
117
|
+
retry: () => void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface PageNotFoundRenderProps<TParams, TSearch> {
|
|
121
|
+
location: Location<TParams, TSearch>;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface PageUnauthenticatedRenderProps<TParams, TSearch> {
|
|
125
|
+
error: Error;
|
|
126
|
+
location: Location<TParams, TSearch>;
|
|
127
|
+
retry: () => void;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface PageUnauthorizedRenderProps<TParams, TSearch> {
|
|
131
|
+
error: Error;
|
|
132
|
+
location: Location<TParams, TSearch>;
|
|
133
|
+
retry: () => void;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* ── result types ───────────────────────────────────────────────── */
|
|
137
|
+
|
|
138
|
+
export interface PageResultRender<
|
|
139
|
+
TPath extends string,
|
|
140
|
+
TParams,
|
|
141
|
+
TSearch,
|
|
142
|
+
TAuth extends AuthenticateMode,
|
|
143
|
+
TPreloaderContext,
|
|
144
|
+
TLoaderData,
|
|
145
|
+
> {
|
|
146
|
+
_type: "render";
|
|
147
|
+
authenticate?: unknown[];
|
|
148
|
+
authenticateMode?: AuthenticateMode;
|
|
149
|
+
authorize?: (ctx: PageAuthorizeContext<TParams, TSearch, TAuth, TPreloaderContext>) => boolean | Promise<boolean>;
|
|
150
|
+
effectsConfig?: EffectsConfig<TParams, TSearch>;
|
|
151
|
+
errorRender?: (props: PageErrorRenderProps<TParams, TSearch>) => unknown;
|
|
152
|
+
head?: (ctx: PageHeadContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => HeadConfig;
|
|
153
|
+
headReplace?: boolean;
|
|
154
|
+
headers?: (ctx: PageHeadersContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => ResponseHeaders;
|
|
155
|
+
inputConfig?: InputConfig<TParams, TSearch>;
|
|
156
|
+
intercept?: InterceptConfig;
|
|
157
|
+
loader?: (ctx: PageLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<TLoaderData> | TLoaderData;
|
|
158
|
+
notFoundRender?: (props: PageNotFoundRenderProps<TParams, TSearch>) => unknown;
|
|
159
|
+
cache?: CacheConfig<TPath>;
|
|
160
|
+
preloader?: (ctx: PagePreloaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => unknown;
|
|
161
|
+
render: (props: PageRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData>) => unknown;
|
|
162
|
+
unauthenticatedRender?: (props: PageUnauthenticatedRenderProps<TParams, TSearch>) => unknown;
|
|
163
|
+
unauthorizedRender?: (props: PageUnauthorizedRenderProps<TParams, TSearch>) => unknown;
|
|
164
|
+
virtualPath: TPath;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface PageResultResponse<
|
|
168
|
+
TPath extends string,
|
|
169
|
+
TParams,
|
|
170
|
+
TSearch,
|
|
171
|
+
TAuth extends AuthenticateMode,
|
|
172
|
+
TPreloaderContext,
|
|
173
|
+
> {
|
|
174
|
+
_type: "response";
|
|
175
|
+
authenticate?: unknown[];
|
|
176
|
+
authenticateMode?: AuthenticateMode;
|
|
177
|
+
authorize?: (ctx: PageAuthorizeContext<TParams, TSearch, TAuth, TPreloaderContext>) => boolean | Promise<boolean>;
|
|
178
|
+
effectsConfig?: EffectsConfig<TParams, TSearch>;
|
|
179
|
+
inputConfig?: InputConfig<TParams, TSearch>;
|
|
180
|
+
cache?: CacheConfig<TPath>;
|
|
181
|
+
preloader?: (ctx: PagePreloaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => unknown;
|
|
182
|
+
response: (ctx: PageResponseContext<TParams>) => Response | Promise<Response>;
|
|
183
|
+
virtualPath: TPath;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* ── internal builder state ─────────────────────────────────────── */
|
|
187
|
+
|
|
188
|
+
export interface InterceptConfig {
|
|
189
|
+
from: string[];
|
|
190
|
+
render: string;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
interface BuilderStateInternal {
|
|
194
|
+
authenticate?: unknown[];
|
|
195
|
+
authenticateMode?: AuthenticateMode;
|
|
196
|
+
authorize?: unknown;
|
|
197
|
+
cache?: unknown;
|
|
198
|
+
effectsConfig?: unknown;
|
|
199
|
+
head?: unknown;
|
|
200
|
+
headReplace?: boolean;
|
|
201
|
+
headers?: unknown;
|
|
202
|
+
inputConfig?: unknown;
|
|
203
|
+
intercept?: InterceptConfig;
|
|
204
|
+
loader?: unknown;
|
|
205
|
+
preloader?: unknown;
|
|
206
|
+
virtualPath: string;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* ── progressive builder interfaces ─────────────────────────────── */
|
|
210
|
+
|
|
211
|
+
type PageResultCore<
|
|
212
|
+
TPath extends string,
|
|
213
|
+
TParams,
|
|
214
|
+
TSearch,
|
|
215
|
+
TAuth extends AuthenticateMode,
|
|
216
|
+
TPreloaderContext,
|
|
217
|
+
TLoaderData,
|
|
218
|
+
> = Omit<
|
|
219
|
+
PageResultRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>,
|
|
220
|
+
keyof PageBoundaryPropsMap<TParams, TSearch>
|
|
221
|
+
>;
|
|
222
|
+
|
|
223
|
+
/* after render: boundary methods (any order, each at most once) */
|
|
224
|
+
interface PageBoundaryPropsMap<TParams, TSearch> {
|
|
225
|
+
errorRender: PageErrorRenderProps<TParams, TSearch>;
|
|
226
|
+
notFoundRender: PageNotFoundRenderProps<TParams, TSearch>;
|
|
227
|
+
unauthenticatedRender: PageUnauthenticatedRenderProps<TParams, TSearch>;
|
|
228
|
+
unauthorizedRender: PageUnauthorizedRenderProps<TParams, TSearch>;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
type PageAfterRender<
|
|
232
|
+
TPath extends string,
|
|
233
|
+
TParams,
|
|
234
|
+
TSearch,
|
|
235
|
+
TAuth extends AuthenticateMode,
|
|
236
|
+
TPreloaderContext,
|
|
237
|
+
TLoaderData,
|
|
238
|
+
TSet extends keyof PageBoundaryPropsMap<TParams, TSearch> = never,
|
|
239
|
+
> = {
|
|
240
|
+
[K in Exclude<keyof PageBoundaryPropsMap<TParams, TSearch>, TSet>]: (
|
|
241
|
+
fn: (props: PageBoundaryPropsMap<TParams, TSearch>[K]) => unknown,
|
|
242
|
+
) => PageResultCore<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> &
|
|
243
|
+
PageAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData, TSet | K>;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/* L1: render only */
|
|
247
|
+
interface PageBuilderRenderOnly<
|
|
248
|
+
TPath extends string,
|
|
249
|
+
TParams,
|
|
250
|
+
TSearch,
|
|
251
|
+
TAuth extends AuthenticateMode,
|
|
252
|
+
TPreloaderContext,
|
|
253
|
+
TLoaderData,
|
|
254
|
+
> {
|
|
255
|
+
render(
|
|
256
|
+
fn: (props: PageRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData>) => unknown,
|
|
257
|
+
): PageResultCore<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> &
|
|
258
|
+
PageAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* L2: + headers */
|
|
262
|
+
interface PageBuilderWithHeaders<
|
|
263
|
+
TPath extends string,
|
|
264
|
+
TParams,
|
|
265
|
+
TSearch,
|
|
266
|
+
TAuth extends AuthenticateMode,
|
|
267
|
+
TPreloaderContext,
|
|
268
|
+
TLoaderData,
|
|
269
|
+
> extends PageBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
270
|
+
headers(
|
|
271
|
+
fn: (ctx: PageHeadersContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => ResponseHeaders,
|
|
272
|
+
): PageBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* L3: + head */
|
|
276
|
+
interface PageBuilderWithHead<
|
|
277
|
+
TPath extends string,
|
|
278
|
+
TParams,
|
|
279
|
+
TSearch,
|
|
280
|
+
TAuth extends AuthenticateMode,
|
|
281
|
+
TPreloaderContext,
|
|
282
|
+
TLoaderData,
|
|
283
|
+
> extends PageBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
284
|
+
head(
|
|
285
|
+
fn: (ctx: PageHeadContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => HeadConfig,
|
|
286
|
+
options?: HeadOptions,
|
|
287
|
+
): PageBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* L4: loader + response + head/headers/render with void loaderData */
|
|
291
|
+
interface PageBuilderWithLoader<
|
|
292
|
+
TPath extends string,
|
|
293
|
+
TParams,
|
|
294
|
+
TSearch,
|
|
295
|
+
TAuth extends AuthenticateMode,
|
|
296
|
+
TPreloaderContext,
|
|
297
|
+
> {
|
|
298
|
+
head(
|
|
299
|
+
fn: (ctx: PageHeadContext<TParams, TSearch, TPreloaderContext, void>) => HeadConfig,
|
|
300
|
+
options?: HeadOptions,
|
|
301
|
+
): PageBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
302
|
+
headers(
|
|
303
|
+
fn: (ctx: PageHeadersContext<TParams, TSearch, TPreloaderContext, void>) => ResponseHeaders,
|
|
304
|
+
): PageBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
305
|
+
loader<T>(
|
|
306
|
+
fn: (ctx: PageLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T,
|
|
307
|
+
): PageBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, Awaited<T>>;
|
|
308
|
+
render(
|
|
309
|
+
fn: (props: PageRenderProps<TParams, TSearch, TPreloaderContext, void>) => unknown,
|
|
310
|
+
): PageResultCore<TPath, TParams, TSearch, TAuth, TPreloaderContext, void> &
|
|
311
|
+
PageAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
312
|
+
response(
|
|
313
|
+
fn: (ctx: PageResponseContext<TParams>) => Response | Promise<Response>,
|
|
314
|
+
): PageResultResponse<TPath, TParams, TSearch, TAuth, TPreloaderContext>;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/* L4b: after preloader — loader path only (no response alternative) */
|
|
318
|
+
interface PageBuilderAfterPreloader<
|
|
319
|
+
TPath extends string,
|
|
320
|
+
TParams,
|
|
321
|
+
TSearch,
|
|
322
|
+
TAuth extends AuthenticateMode,
|
|
323
|
+
TPreloaderContext,
|
|
324
|
+
> {
|
|
325
|
+
head(
|
|
326
|
+
fn: (ctx: PageHeadContext<TParams, TSearch, TPreloaderContext, void>) => HeadConfig,
|
|
327
|
+
options?: HeadOptions,
|
|
328
|
+
): PageBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
329
|
+
headers(
|
|
330
|
+
fn: (ctx: PageHeadersContext<TParams, TSearch, TPreloaderContext, void>) => ResponseHeaders,
|
|
331
|
+
): PageBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
332
|
+
loader<T>(
|
|
333
|
+
fn: (ctx: PageLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T,
|
|
334
|
+
): PageBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, Awaited<T>>;
|
|
335
|
+
render(
|
|
336
|
+
fn: (props: PageRenderProps<TParams, TSearch, TPreloaderContext, void>) => unknown,
|
|
337
|
+
): PageResultCore<TPath, TParams, TSearch, TAuth, TPreloaderContext, void> &
|
|
338
|
+
PageAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* L5: + preloader */
|
|
342
|
+
interface PageBuilderWithPreloader<
|
|
343
|
+
TPath extends string,
|
|
344
|
+
TParams,
|
|
345
|
+
TSearch,
|
|
346
|
+
TAuth extends AuthenticateMode,
|
|
347
|
+
TPreloaderContext,
|
|
348
|
+
> extends PageBuilderWithLoader<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
349
|
+
preloader<T extends Record<string, unknown>>(
|
|
350
|
+
fn: (ctx: PagePreloaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T,
|
|
351
|
+
): PageBuilderAfterPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext & Awaited<T>>;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/* L6: + effects */
|
|
355
|
+
interface PageBuilderAfterAuthorize<
|
|
356
|
+
TPath extends string,
|
|
357
|
+
TParams,
|
|
358
|
+
TSearch,
|
|
359
|
+
TAuth extends AuthenticateMode,
|
|
360
|
+
TPreloaderContext,
|
|
361
|
+
> extends PageBuilderWithPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
362
|
+
effects(
|
|
363
|
+
config: EffectsConfig<TParams, TSearch>,
|
|
364
|
+
): PageBuilderWithPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext>;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/* L7: + authorize */
|
|
368
|
+
interface PageBuilderAfterAuthenticate<
|
|
369
|
+
TPath extends string,
|
|
370
|
+
TParams,
|
|
371
|
+
TSearch,
|
|
372
|
+
TAuth extends AuthenticateMode,
|
|
373
|
+
TPreloaderContext,
|
|
374
|
+
> extends PageBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
375
|
+
authorize(
|
|
376
|
+
fn: (ctx: PageAuthorizeContext<TParams, TSearch, TAuth, TPreloaderContext>) => boolean | Promise<boolean>,
|
|
377
|
+
): PageBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth, TPreloaderContext>;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/* L8: + authenticate */
|
|
381
|
+
interface PageBuilderAfterInput<
|
|
382
|
+
TPath extends string,
|
|
383
|
+
TParams,
|
|
384
|
+
TSearch,
|
|
385
|
+
TAuth extends AuthenticateMode,
|
|
386
|
+
TPreloaderContext,
|
|
387
|
+
> extends PageBuilderAfterAuthenticate<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
388
|
+
authenticate(...args: unknown[]): PageBuilderAfterAuthenticate<TPath, TParams, TSearch, true, TPreloaderContext>;
|
|
389
|
+
authenticateOptional(
|
|
390
|
+
...args: unknown[]
|
|
391
|
+
): PageBuilderAfterAuthenticate<TPath, TParams, TSearch, "optional", TPreloaderContext>;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/* L9: + input */
|
|
395
|
+
interface PageBuilderAfterCache<
|
|
396
|
+
TPath extends string,
|
|
397
|
+
TAuth extends AuthenticateMode,
|
|
398
|
+
TPreloaderContext,
|
|
399
|
+
> extends PageBuilderAfterInput<TPath, ExtractPathParams<TPath>, Record<string, string>, TAuth, TPreloaderContext> {
|
|
400
|
+
input<TNewParams = ExtractPathParams<TPath>, TNewSearch = Record<string, string>>(config: {
|
|
401
|
+
params?: ParamsValidator<TNewParams>;
|
|
402
|
+
searchParams?: SearchParamsValidator<TNewSearch>;
|
|
403
|
+
}): PageBuilderAfterInput<TPath, TNewParams, TNewSearch, TAuth, TPreloaderContext>;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/* L10a: after intercept — + cache only (no re-intercept) */
|
|
407
|
+
interface PageBuilderAfterIntercept<
|
|
408
|
+
TPath extends string,
|
|
409
|
+
TAuth extends AuthenticateMode = false,
|
|
410
|
+
TPreloaderContext = {},
|
|
411
|
+
> extends PageBuilderAfterCache<TPath, TAuth, TPreloaderContext> {
|
|
412
|
+
cache(config: CacheConfig<TPath>): PageBuilderAfterCache<TPath, TAuth, TPreloaderContext>;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/* L10b: initial — + cache + intercept */
|
|
416
|
+
export interface PageBuilderInitial<
|
|
417
|
+
TPath extends string,
|
|
418
|
+
TAuth extends AuthenticateMode = false,
|
|
419
|
+
TPreloaderContext = {},
|
|
420
|
+
> extends PageBuilderAfterIntercept<TPath, TAuth, TPreloaderContext> {
|
|
421
|
+
intercept(config: InterceptConfig): PageBuilderAfterIntercept<TPath, TAuth, TPreloaderContext>;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/* ── factory functions ──────────────────────────────────────────── */
|
|
425
|
+
|
|
426
|
+
type PageResult<
|
|
427
|
+
TPath extends string,
|
|
428
|
+
TParams,
|
|
429
|
+
TSearch,
|
|
430
|
+
TAuth extends AuthenticateMode,
|
|
431
|
+
TPreloaderContext,
|
|
432
|
+
TLoaderData,
|
|
433
|
+
TSet extends keyof PageBoundaryPropsMap<TParams, TSearch> = never,
|
|
434
|
+
> = PageResultCore<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> &
|
|
435
|
+
PageAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData, TSet>;
|
|
436
|
+
|
|
437
|
+
function boundarySlot<TProps>(
|
|
438
|
+
existing: ((props: TProps) => unknown) | undefined,
|
|
439
|
+
make: () => (fn: (props: TProps) => unknown) => unknown,
|
|
440
|
+
): unknown {
|
|
441
|
+
if (existing) return existing;
|
|
442
|
+
const builder = make();
|
|
443
|
+
Object.defineProperty(builder, BUILDER_MARKER, { value: true });
|
|
444
|
+
return builder;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function createResultWithBoundaries<
|
|
448
|
+
TPath extends string,
|
|
449
|
+
TParams,
|
|
450
|
+
TSearch,
|
|
451
|
+
TAuth extends AuthenticateMode,
|
|
452
|
+
TPreloaderContext,
|
|
453
|
+
TLoaderData,
|
|
454
|
+
TSet extends keyof PageBoundaryPropsMap<TParams, TSearch> = never,
|
|
455
|
+
>(
|
|
456
|
+
state: BuilderStateInternal,
|
|
457
|
+
renderFn: (props: PageRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData>) => unknown,
|
|
458
|
+
errorFn?: (props: PageErrorRenderProps<TParams, TSearch>) => unknown,
|
|
459
|
+
notFoundFn?: (props: PageNotFoundRenderProps<TParams, TSearch>) => unknown,
|
|
460
|
+
unauthenticatedFn?: (props: PageUnauthenticatedRenderProps<TParams, TSearch>) => unknown,
|
|
461
|
+
unauthorizedFn?: (props: PageUnauthorizedRenderProps<TParams, TSearch>) => unknown,
|
|
462
|
+
): PageResult<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData, TSet> {
|
|
463
|
+
return {
|
|
464
|
+
_type: "render" as const,
|
|
465
|
+
authenticate: state.authenticate,
|
|
466
|
+
authenticateMode: state.authenticateMode,
|
|
467
|
+
authorize: state.authorize,
|
|
468
|
+
cache: state.cache,
|
|
469
|
+
effectsConfig: state.effectsConfig,
|
|
470
|
+
errorRender: boundarySlot(
|
|
471
|
+
errorFn,
|
|
472
|
+
() => (fn) =>
|
|
473
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
474
|
+
state,
|
|
475
|
+
renderFn,
|
|
476
|
+
fn,
|
|
477
|
+
notFoundFn,
|
|
478
|
+
unauthenticatedFn,
|
|
479
|
+
unauthorizedFn,
|
|
480
|
+
),
|
|
481
|
+
),
|
|
482
|
+
head: state.head,
|
|
483
|
+
headReplace: state.headReplace,
|
|
484
|
+
headers: state.headers,
|
|
485
|
+
inputConfig: state.inputConfig,
|
|
486
|
+
intercept: state.intercept,
|
|
487
|
+
loader: state.loader,
|
|
488
|
+
notFoundRender: boundarySlot(
|
|
489
|
+
notFoundFn,
|
|
490
|
+
() => (fn) =>
|
|
491
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
492
|
+
state,
|
|
493
|
+
renderFn,
|
|
494
|
+
errorFn,
|
|
495
|
+
fn,
|
|
496
|
+
unauthenticatedFn,
|
|
497
|
+
unauthorizedFn,
|
|
498
|
+
),
|
|
499
|
+
),
|
|
500
|
+
preloader: state.preloader,
|
|
501
|
+
render: renderFn,
|
|
502
|
+
unauthenticatedRender: boundarySlot(
|
|
503
|
+
unauthenticatedFn,
|
|
504
|
+
() => (fn) =>
|
|
505
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
506
|
+
state,
|
|
507
|
+
renderFn,
|
|
508
|
+
errorFn,
|
|
509
|
+
notFoundFn,
|
|
510
|
+
fn,
|
|
511
|
+
unauthorizedFn,
|
|
512
|
+
),
|
|
513
|
+
),
|
|
514
|
+
unauthorizedRender: boundarySlot(
|
|
515
|
+
unauthorizedFn,
|
|
516
|
+
() => (fn) =>
|
|
517
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
518
|
+
state,
|
|
519
|
+
renderFn,
|
|
520
|
+
errorFn,
|
|
521
|
+
notFoundFn,
|
|
522
|
+
unauthenticatedFn,
|
|
523
|
+
fn,
|
|
524
|
+
),
|
|
525
|
+
),
|
|
526
|
+
virtualPath: state.virtualPath,
|
|
527
|
+
} as unknown as PageResult<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData, TSet>;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function createBuilderRenderOnly<
|
|
531
|
+
TPath extends string,
|
|
532
|
+
TParams,
|
|
533
|
+
TSearch,
|
|
534
|
+
TAuth extends AuthenticateMode,
|
|
535
|
+
TPreloaderContext,
|
|
536
|
+
TLoaderData,
|
|
537
|
+
>(state: BuilderStateInternal): PageBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
538
|
+
return {
|
|
539
|
+
render(fn) {
|
|
540
|
+
return createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(state, fn);
|
|
541
|
+
},
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
function createBuilderWithHeaders<
|
|
546
|
+
TPath extends string,
|
|
547
|
+
TParams,
|
|
548
|
+
TSearch,
|
|
549
|
+
TAuth extends AuthenticateMode,
|
|
550
|
+
TPreloaderContext,
|
|
551
|
+
TLoaderData,
|
|
552
|
+
>(state: BuilderStateInternal): PageBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
553
|
+
return {
|
|
554
|
+
...createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(state),
|
|
555
|
+
headers(fn) {
|
|
556
|
+
return createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>({
|
|
557
|
+
...state,
|
|
558
|
+
headers: fn,
|
|
559
|
+
});
|
|
560
|
+
},
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
function createBuilderWithHead<
|
|
565
|
+
TPath extends string,
|
|
566
|
+
TParams,
|
|
567
|
+
TSearch,
|
|
568
|
+
TAuth extends AuthenticateMode,
|
|
569
|
+
TPreloaderContext,
|
|
570
|
+
TLoaderData,
|
|
571
|
+
>(state: BuilderStateInternal): PageBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
572
|
+
return {
|
|
573
|
+
...createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(state),
|
|
574
|
+
head(fn, options) {
|
|
575
|
+
return createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>({
|
|
576
|
+
...state,
|
|
577
|
+
head: fn,
|
|
578
|
+
headReplace: options?.replace,
|
|
579
|
+
});
|
|
580
|
+
},
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
function createBuilderWithLoader<
|
|
585
|
+
TPath extends string,
|
|
586
|
+
TParams,
|
|
587
|
+
TSearch,
|
|
588
|
+
TAuth extends AuthenticateMode,
|
|
589
|
+
TPreloaderContext,
|
|
590
|
+
>(state: BuilderStateInternal): PageBuilderWithLoader<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
591
|
+
return {
|
|
592
|
+
head(fn, options) {
|
|
593
|
+
return createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>({
|
|
594
|
+
...state,
|
|
595
|
+
head: fn,
|
|
596
|
+
headReplace: options?.replace,
|
|
597
|
+
});
|
|
598
|
+
},
|
|
599
|
+
headers(fn) {
|
|
600
|
+
return createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>({
|
|
601
|
+
...state,
|
|
602
|
+
headers: fn,
|
|
603
|
+
});
|
|
604
|
+
},
|
|
605
|
+
loader<T>(fn: (ctx: PageLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T) {
|
|
606
|
+
return createBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, Awaited<T>>({
|
|
607
|
+
...state,
|
|
608
|
+
loader: fn,
|
|
609
|
+
});
|
|
610
|
+
},
|
|
611
|
+
render(fn) {
|
|
612
|
+
return createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>(state, fn);
|
|
613
|
+
},
|
|
614
|
+
response(fn) {
|
|
615
|
+
return {
|
|
616
|
+
_type: "response" as const,
|
|
617
|
+
authenticate: state.authenticate,
|
|
618
|
+
authenticateMode: state.authenticateMode,
|
|
619
|
+
authorize: state.authorize,
|
|
620
|
+
cache: state.cache,
|
|
621
|
+
effectsConfig: state.effectsConfig,
|
|
622
|
+
inputConfig: state.inputConfig,
|
|
623
|
+
preloader: state.preloader,
|
|
624
|
+
response: fn,
|
|
625
|
+
virtualPath: state.virtualPath as TPath,
|
|
626
|
+
} as PageResultResponse<TPath, TParams, TSearch, TAuth, TPreloaderContext>;
|
|
627
|
+
},
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
function createBuilderAfterPreloader<
|
|
632
|
+
TPath extends string,
|
|
633
|
+
TParams,
|
|
634
|
+
TSearch,
|
|
635
|
+
TAuth extends AuthenticateMode,
|
|
636
|
+
TPreloaderContext,
|
|
637
|
+
>(state: BuilderStateInternal): PageBuilderAfterPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
638
|
+
return {
|
|
639
|
+
head(fn, options) {
|
|
640
|
+
return createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>({
|
|
641
|
+
...state,
|
|
642
|
+
head: fn,
|
|
643
|
+
headReplace: options?.replace,
|
|
644
|
+
});
|
|
645
|
+
},
|
|
646
|
+
headers(fn) {
|
|
647
|
+
return createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>({
|
|
648
|
+
...state,
|
|
649
|
+
headers: fn,
|
|
650
|
+
});
|
|
651
|
+
},
|
|
652
|
+
loader<T>(fn: (ctx: PageLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T) {
|
|
653
|
+
return createBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, Awaited<T>>({
|
|
654
|
+
...state,
|
|
655
|
+
loader: fn,
|
|
656
|
+
});
|
|
657
|
+
},
|
|
658
|
+
render(fn) {
|
|
659
|
+
return createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>(state, fn);
|
|
660
|
+
},
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
function createBuilderWithPreloader<
|
|
665
|
+
TPath extends string,
|
|
666
|
+
TParams,
|
|
667
|
+
TSearch,
|
|
668
|
+
TAuth extends AuthenticateMode,
|
|
669
|
+
TPreloaderContext,
|
|
670
|
+
>(state: BuilderStateInternal): PageBuilderWithPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
671
|
+
return {
|
|
672
|
+
...createBuilderWithLoader<TPath, TParams, TSearch, TAuth, TPreloaderContext>(state),
|
|
673
|
+
preloader<T extends Record<string, unknown>>(
|
|
674
|
+
fn: (ctx: PagePreloaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T,
|
|
675
|
+
) {
|
|
676
|
+
return createBuilderAfterPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext & Awaited<T>>({
|
|
677
|
+
...state,
|
|
678
|
+
preloader: fn,
|
|
679
|
+
});
|
|
680
|
+
},
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function createBuilderAfterAuthorize<
|
|
685
|
+
TPath extends string,
|
|
686
|
+
TParams,
|
|
687
|
+
TSearch,
|
|
688
|
+
TAuth extends AuthenticateMode,
|
|
689
|
+
TPreloaderContext,
|
|
690
|
+
>(state: BuilderStateInternal): PageBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
691
|
+
return {
|
|
692
|
+
...createBuilderWithPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext>(state),
|
|
693
|
+
effects(config) {
|
|
694
|
+
return createBuilderWithPreloader<TPath, TParams, TSearch, TAuth, TPreloaderContext>({
|
|
695
|
+
...state,
|
|
696
|
+
effectsConfig: config,
|
|
697
|
+
});
|
|
698
|
+
},
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
function createBuilderAfterAuthenticate<
|
|
703
|
+
TPath extends string,
|
|
704
|
+
TParams,
|
|
705
|
+
TSearch,
|
|
706
|
+
TAuth extends AuthenticateMode,
|
|
707
|
+
TPreloaderContext,
|
|
708
|
+
>(state: BuilderStateInternal): PageBuilderAfterAuthenticate<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
709
|
+
return {
|
|
710
|
+
...createBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth, TPreloaderContext>(state),
|
|
711
|
+
authorize(fn) {
|
|
712
|
+
return createBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth, TPreloaderContext>({
|
|
713
|
+
...state,
|
|
714
|
+
authorize: fn,
|
|
715
|
+
});
|
|
716
|
+
},
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
function createBuilderAfterInput<
|
|
721
|
+
TPath extends string,
|
|
722
|
+
TParams,
|
|
723
|
+
TSearch,
|
|
724
|
+
TAuth extends AuthenticateMode,
|
|
725
|
+
TPreloaderContext,
|
|
726
|
+
>(state: BuilderStateInternal): PageBuilderAfterInput<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
727
|
+
return {
|
|
728
|
+
...createBuilderAfterAuthenticate<TPath, TParams, TSearch, TAuth, TPreloaderContext>(state),
|
|
729
|
+
authenticate(...args: unknown[]) {
|
|
730
|
+
return createBuilderAfterAuthenticate<TPath, TParams, TSearch, true, TPreloaderContext>({
|
|
731
|
+
...state,
|
|
732
|
+
authenticate: args,
|
|
733
|
+
authenticateMode: true,
|
|
734
|
+
});
|
|
735
|
+
},
|
|
736
|
+
authenticateOptional(...args: unknown[]) {
|
|
737
|
+
return createBuilderAfterAuthenticate<TPath, TParams, TSearch, "optional", TPreloaderContext>({
|
|
738
|
+
...state,
|
|
739
|
+
authenticate: args,
|
|
740
|
+
authenticateMode: "optional",
|
|
741
|
+
});
|
|
742
|
+
},
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
function createBuilderAfterCache<TPath extends string, TAuth extends AuthenticateMode, TPreloaderContext>(
|
|
747
|
+
state: BuilderStateInternal,
|
|
748
|
+
): PageBuilderAfterCache<TPath, TAuth, TPreloaderContext> {
|
|
749
|
+
return {
|
|
750
|
+
...createBuilderAfterInput<TPath, ExtractPathParams<TPath>, Record<string, string>, TAuth, TPreloaderContext>(
|
|
751
|
+
state,
|
|
752
|
+
),
|
|
753
|
+
input<TNewParams = ExtractPathParams<TPath>, TNewSearch = Record<string, string>>(config: {
|
|
754
|
+
params?: ParamsValidator<TNewParams>;
|
|
755
|
+
searchParams?: SearchParamsValidator<TNewSearch>;
|
|
756
|
+
}) {
|
|
757
|
+
return createBuilderAfterInput<TPath, TNewParams, TNewSearch, TAuth, TPreloaderContext>({
|
|
758
|
+
...state,
|
|
759
|
+
inputConfig: config,
|
|
760
|
+
});
|
|
761
|
+
},
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
function createBuilderAfterIntercept<TPath extends string, TAuth extends AuthenticateMode, TPreloaderContext>(
|
|
766
|
+
state: BuilderStateInternal,
|
|
767
|
+
): PageBuilderAfterIntercept<TPath, TAuth, TPreloaderContext> {
|
|
768
|
+
return {
|
|
769
|
+
...createBuilderAfterCache<TPath, TAuth, TPreloaderContext>(state),
|
|
770
|
+
cache(config) {
|
|
771
|
+
return createBuilderAfterCache<TPath, TAuth, TPreloaderContext>({
|
|
772
|
+
...state,
|
|
773
|
+
cache: config,
|
|
774
|
+
});
|
|
775
|
+
},
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
function createBuilderInitialFromState<TPath extends string, TAuth extends AuthenticateMode, TPreloaderContext>(
|
|
780
|
+
state: BuilderStateInternal,
|
|
781
|
+
): PageBuilderInitial<TPath, TAuth, TPreloaderContext> {
|
|
782
|
+
return {
|
|
783
|
+
...createBuilderAfterIntercept<TPath, TAuth, TPreloaderContext>(state),
|
|
784
|
+
intercept(config) {
|
|
785
|
+
return createBuilderAfterIntercept<TPath, TAuth, TPreloaderContext>({
|
|
786
|
+
...state,
|
|
787
|
+
intercept: config,
|
|
788
|
+
});
|
|
789
|
+
},
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
function createBuilderInitial<TPath extends string, TAuth extends AuthenticateMode, TPreloaderContext>(
|
|
794
|
+
virtualPath: TPath,
|
|
795
|
+
): PageBuilderInitial<TPath, TAuth, TPreloaderContext> {
|
|
796
|
+
const state: BuilderStateInternal = { virtualPath };
|
|
797
|
+
return createBuilderInitialFromState<TPath, TAuth, TPreloaderContext>(state);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
/* ── public API ─────────────────────────────────────────────────── */
|
|
801
|
+
|
|
802
|
+
export function createPage<TPath extends string>(
|
|
803
|
+
virtualPath: TPath,
|
|
804
|
+
): PageBuilderInitial<TPath, ParentAuthResolution<TPath>, ParentPreloaderContext<TPath>> {
|
|
805
|
+
return createBuilderInitial<TPath, ParentAuthResolution<TPath>, ParentPreloaderContext<TPath>>(virtualPath);
|
|
806
|
+
}
|