@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,34 @@
|
|
|
1
|
+
import type { CacheConfig } from "./types.ts";
|
|
2
|
+
import { BUILDER_MARKER } from "./types.ts";
|
|
3
|
+
|
|
4
|
+
export interface PathSegmentResult<TPath extends string> {
|
|
5
|
+
_type: "layout";
|
|
6
|
+
cache?: CacheConfig<TPath>;
|
|
7
|
+
render: (props: { children: unknown }) => unknown;
|
|
8
|
+
virtualPath: TPath;
|
|
9
|
+
[BUILDER_MARKER]: true;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface PathSegmentBuilderInitial<TPath extends string> {
|
|
13
|
+
_type: "layout";
|
|
14
|
+
cache(config: CacheConfig<TPath>): PathSegmentResult<TPath>;
|
|
15
|
+
render: (props: { children: unknown }) => unknown;
|
|
16
|
+
virtualPath: TPath;
|
|
17
|
+
[BUILDER_MARKER]: true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function createPathSegment<TPath extends string>(virtualPath: TPath): PathSegmentBuilderInitial<TPath> {
|
|
21
|
+
const transparentRender = (props: { children: unknown }) => props.children;
|
|
22
|
+
const base: PathSegmentResult<TPath> = {
|
|
23
|
+
_type: "layout",
|
|
24
|
+
render: transparentRender,
|
|
25
|
+
virtualPath,
|
|
26
|
+
[BUILDER_MARKER]: true,
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
...base,
|
|
30
|
+
cache(config) {
|
|
31
|
+
return { ...base, cache: config };
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
import type { JSX } from "solid-js";
|
|
2
|
+
import type { FlareRouter } from "../outlet/types.ts";
|
|
3
|
+
import type { Location } from "../router-primitives/index.ts";
|
|
4
|
+
import type { ResolvedAuth, ResolvedEnv, ResolvedQueryClient, ResolvedServerContext } from "./register.ts";
|
|
5
|
+
import {
|
|
6
|
+
type AuthenticateMode,
|
|
7
|
+
BUILDER_MARKER,
|
|
8
|
+
type CacheConfig,
|
|
9
|
+
type DeferFn,
|
|
10
|
+
type EffectsConfig,
|
|
11
|
+
type HeadConfig,
|
|
12
|
+
type HeadOptions,
|
|
13
|
+
type InputConfig,
|
|
14
|
+
type LoaderCause,
|
|
15
|
+
type ParamsValidator,
|
|
16
|
+
type ResponseHeaders,
|
|
17
|
+
type SearchParamsValidator,
|
|
18
|
+
type ServerThrowHelpers,
|
|
19
|
+
type ServerUrlHelpers,
|
|
20
|
+
} from "./types.ts";
|
|
21
|
+
|
|
22
|
+
/* ── callback context types (root-specific) ─────────────────────── */
|
|
23
|
+
|
|
24
|
+
/* no preloaderContext — root has no parent */
|
|
25
|
+
export interface RootAuthorizeContext<TParams, TSearch, TAuth extends AuthenticateMode>
|
|
26
|
+
extends ServerThrowHelpers, ServerUrlHelpers {
|
|
27
|
+
abortController: AbortController;
|
|
28
|
+
auth: ResolvedAuth<TAuth>;
|
|
29
|
+
env: ResolvedEnv;
|
|
30
|
+
locale: () => string;
|
|
31
|
+
location: Location<TParams, TSearch>;
|
|
32
|
+
request: Request;
|
|
33
|
+
serverContext: ResolvedServerContext;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* no preloaderContext — root has no parent */
|
|
37
|
+
export interface RootPreloaderContext<TParams, TSearch, TAuth extends AuthenticateMode>
|
|
38
|
+
extends ServerThrowHelpers, ServerUrlHelpers {
|
|
39
|
+
abortController: AbortController;
|
|
40
|
+
auth: ResolvedAuth<TAuth>;
|
|
41
|
+
env: ResolvedEnv;
|
|
42
|
+
locale: () => string;
|
|
43
|
+
location: Location<TParams, TSearch>;
|
|
44
|
+
request: Request;
|
|
45
|
+
serverContext: ResolvedServerContext;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* root loader DOES get preloaderContext (from root's own preloader) */
|
|
49
|
+
export type RootLoaderContext<
|
|
50
|
+
TParams,
|
|
51
|
+
TSearch,
|
|
52
|
+
TAuth extends AuthenticateMode,
|
|
53
|
+
TPreloaderContext,
|
|
54
|
+
> = ServerThrowHelpers &
|
|
55
|
+
ServerUrlHelpers &
|
|
56
|
+
ResolvedQueryClient & {
|
|
57
|
+
abortController: AbortController;
|
|
58
|
+
auth: ResolvedAuth<TAuth>;
|
|
59
|
+
cause: LoaderCause;
|
|
60
|
+
defer: DeferFn;
|
|
61
|
+
deps: unknown[];
|
|
62
|
+
env: ResolvedEnv;
|
|
63
|
+
locale: () => string;
|
|
64
|
+
location: Location<TParams, TSearch>;
|
|
65
|
+
prefetch: boolean;
|
|
66
|
+
preloaderContext: TPreloaderContext;
|
|
67
|
+
request: Request;
|
|
68
|
+
serverContext: ResolvedServerContext;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/* no parentHead — root IS the base */
|
|
72
|
+
export interface RootHeadContext<TParams, TSearch, TPreloaderContext, TLoaderData> extends ServerUrlHelpers {
|
|
73
|
+
cause: LoaderCause;
|
|
74
|
+
loaderData: TLoaderData;
|
|
75
|
+
location: Location<TParams, TSearch>;
|
|
76
|
+
prefetch: boolean;
|
|
77
|
+
preloaderContext: TPreloaderContext;
|
|
78
|
+
serverContext: ResolvedServerContext;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* no parentHeaders — root IS the base */
|
|
82
|
+
export interface RootHeadersContext<TParams, TSearch, TPreloaderContext, TLoaderData> extends ServerUrlHelpers {
|
|
83
|
+
cause: LoaderCause;
|
|
84
|
+
env: ResolvedEnv;
|
|
85
|
+
loaderData: TLoaderData;
|
|
86
|
+
location: Location<TParams, TSearch>;
|
|
87
|
+
prefetch: boolean;
|
|
88
|
+
preloaderContext: TPreloaderContext;
|
|
89
|
+
request: Request;
|
|
90
|
+
serverContext: ResolvedServerContext;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface RootRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData> {
|
|
94
|
+
children: JSX.Element;
|
|
95
|
+
loaderData: TLoaderData;
|
|
96
|
+
location: Location<TParams, TSearch>;
|
|
97
|
+
preloaderContext: TPreloaderContext;
|
|
98
|
+
router: FlareRouter;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface RootErrorRenderProps<TParams, TSearch> {
|
|
102
|
+
error: Error;
|
|
103
|
+
location: Location<TParams, TSearch>;
|
|
104
|
+
reset: () => void;
|
|
105
|
+
retry: () => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface RootNotFoundRenderProps<TParams, TSearch> {
|
|
109
|
+
location: Location<TParams, TSearch>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface RootUnauthenticatedRenderProps<TParams, TSearch> {
|
|
113
|
+
error: Error;
|
|
114
|
+
location: Location<TParams, TSearch>;
|
|
115
|
+
retry: () => void;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface RootUnauthorizedRenderProps<TParams, TSearch> {
|
|
119
|
+
error: Error;
|
|
120
|
+
location: Location<TParams, TSearch>;
|
|
121
|
+
retry: () => void;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* ── result type ────────────────────────────────────────────────── */
|
|
125
|
+
|
|
126
|
+
export interface RootLayoutResult<
|
|
127
|
+
TPath extends string,
|
|
128
|
+
TParams,
|
|
129
|
+
TSearch,
|
|
130
|
+
TAuth extends AuthenticateMode,
|
|
131
|
+
TPreloaderContext,
|
|
132
|
+
TLoaderData,
|
|
133
|
+
> {
|
|
134
|
+
_type: "root-layout";
|
|
135
|
+
authenticate?: unknown[];
|
|
136
|
+
authenticateMode?: AuthenticateMode;
|
|
137
|
+
authorize?: (ctx: RootAuthorizeContext<TParams, TSearch, TAuth>) => boolean | Promise<boolean>;
|
|
138
|
+
effectsConfig?: EffectsConfig<TParams, TSearch>;
|
|
139
|
+
errorRender?: (props: RootErrorRenderProps<TParams, TSearch>) => unknown;
|
|
140
|
+
head?: (ctx: RootHeadContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => HeadConfig;
|
|
141
|
+
headReplace?: boolean;
|
|
142
|
+
headers?: (ctx: RootHeadersContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => ResponseHeaders;
|
|
143
|
+
inputConfig?: InputConfig<TParams, TSearch>;
|
|
144
|
+
loader?: (ctx: RootLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<TLoaderData> | TLoaderData;
|
|
145
|
+
notFoundRender?: (props: RootNotFoundRenderProps<TParams, TSearch>) => unknown;
|
|
146
|
+
cache?: CacheConfig<TPath>;
|
|
147
|
+
preloader?: (ctx: RootPreloaderContext<TParams, TSearch, TAuth>) => unknown;
|
|
148
|
+
render: (props: RootRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData>) => unknown;
|
|
149
|
+
unauthenticatedRender?: (props: RootUnauthenticatedRenderProps<TParams, TSearch>) => unknown;
|
|
150
|
+
unauthorizedRender?: (props: RootUnauthorizedRenderProps<TParams, TSearch>) => unknown;
|
|
151
|
+
virtualPath: TPath;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* ── internal builder state ─────────────────────────────────────── */
|
|
155
|
+
|
|
156
|
+
interface BuilderStateInternal {
|
|
157
|
+
authenticate?: unknown[];
|
|
158
|
+
authenticateMode?: AuthenticateMode;
|
|
159
|
+
authorize?: unknown;
|
|
160
|
+
cache?: unknown;
|
|
161
|
+
effectsConfig?: unknown;
|
|
162
|
+
head?: unknown;
|
|
163
|
+
headReplace?: boolean;
|
|
164
|
+
headers?: unknown;
|
|
165
|
+
inputConfig?: unknown;
|
|
166
|
+
loader?: unknown;
|
|
167
|
+
preloader?: unknown;
|
|
168
|
+
virtualPath: string;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* ── progressive builder interfaces ─────────────────────────────── */
|
|
172
|
+
|
|
173
|
+
/* after render: boundary methods (any order, each at most once) */
|
|
174
|
+
interface RootBoundaryPropsMap<TParams, TSearch> {
|
|
175
|
+
errorRender: RootErrorRenderProps<TParams, TSearch>;
|
|
176
|
+
notFoundRender: RootNotFoundRenderProps<TParams, TSearch>;
|
|
177
|
+
unauthenticatedRender: RootUnauthenticatedRenderProps<TParams, TSearch>;
|
|
178
|
+
unauthorizedRender: RootUnauthorizedRenderProps<TParams, TSearch>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
type RootAfterRender<
|
|
182
|
+
TPath extends string,
|
|
183
|
+
TParams,
|
|
184
|
+
TSearch,
|
|
185
|
+
TAuth extends AuthenticateMode,
|
|
186
|
+
TPreloaderContext,
|
|
187
|
+
TLoaderData,
|
|
188
|
+
TSet extends keyof RootBoundaryPropsMap<TParams, TSearch> = never,
|
|
189
|
+
> = {
|
|
190
|
+
[K in Exclude<keyof RootBoundaryPropsMap<TParams, TSearch>, TSet>]: (
|
|
191
|
+
fn: (props: RootBoundaryPropsMap<TParams, TSearch>[K]) => unknown,
|
|
192
|
+
) => RootLayoutResult<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> &
|
|
193
|
+
RootAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData, TSet | K>;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/* L1: render only */
|
|
197
|
+
interface RootBuilderRenderOnly<
|
|
198
|
+
TPath extends string,
|
|
199
|
+
TParams,
|
|
200
|
+
TSearch,
|
|
201
|
+
TAuth extends AuthenticateMode,
|
|
202
|
+
TPreloaderContext,
|
|
203
|
+
TLoaderData,
|
|
204
|
+
> {
|
|
205
|
+
render(
|
|
206
|
+
fn: (props: RootRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData>) => unknown,
|
|
207
|
+
): RootLayoutResult<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> &
|
|
208
|
+
RootAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* L2: + headers */
|
|
212
|
+
interface RootBuilderWithHeaders<
|
|
213
|
+
TPath extends string,
|
|
214
|
+
TParams,
|
|
215
|
+
TSearch,
|
|
216
|
+
TAuth extends AuthenticateMode,
|
|
217
|
+
TPreloaderContext,
|
|
218
|
+
TLoaderData,
|
|
219
|
+
> extends RootBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
220
|
+
headers(
|
|
221
|
+
fn: (ctx: RootHeadersContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => ResponseHeaders,
|
|
222
|
+
): RootBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* L3: + head */
|
|
226
|
+
interface RootBuilderWithHead<
|
|
227
|
+
TPath extends string,
|
|
228
|
+
TParams,
|
|
229
|
+
TSearch,
|
|
230
|
+
TAuth extends AuthenticateMode,
|
|
231
|
+
TPreloaderContext,
|
|
232
|
+
TLoaderData,
|
|
233
|
+
> extends RootBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
234
|
+
head(
|
|
235
|
+
fn: (ctx: RootHeadContext<TParams, TSearch, TPreloaderContext, TLoaderData>) => HeadConfig,
|
|
236
|
+
options?: HeadOptions,
|
|
237
|
+
): RootBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* L4: loader + head/headers/render with void */
|
|
241
|
+
interface RootBuilderWithLoader<
|
|
242
|
+
TPath extends string,
|
|
243
|
+
TParams,
|
|
244
|
+
TSearch,
|
|
245
|
+
TAuth extends AuthenticateMode,
|
|
246
|
+
TPreloaderContext,
|
|
247
|
+
> {
|
|
248
|
+
head(
|
|
249
|
+
fn: (ctx: RootHeadContext<TParams, TSearch, TPreloaderContext, void>) => HeadConfig,
|
|
250
|
+
options?: HeadOptions,
|
|
251
|
+
): RootBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
252
|
+
headers(
|
|
253
|
+
fn: (ctx: RootHeadersContext<TParams, TSearch, TPreloaderContext, void>) => ResponseHeaders,
|
|
254
|
+
): RootBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
255
|
+
loader<T>(
|
|
256
|
+
fn: (ctx: RootLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T,
|
|
257
|
+
): RootBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, Awaited<T>>;
|
|
258
|
+
render(
|
|
259
|
+
fn: (props: RootRenderProps<TParams, TSearch, TPreloaderContext, void>) => unknown,
|
|
260
|
+
): RootLayoutResult<TPath, TParams, TSearch, TAuth, TPreloaderContext, void> &
|
|
261
|
+
RootAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* L5: + preloader (root-specific: fn receives no preloaderContext) */
|
|
265
|
+
interface RootBuilderWithPreloader<
|
|
266
|
+
TPath extends string,
|
|
267
|
+
TParams,
|
|
268
|
+
TSearch,
|
|
269
|
+
TAuth extends AuthenticateMode,
|
|
270
|
+
> extends RootBuilderWithLoader<TPath, TParams, TSearch, TAuth, {}> {
|
|
271
|
+
preloader<T extends Record<string, unknown>>(
|
|
272
|
+
fn: (ctx: RootPreloaderContext<TParams, TSearch, TAuth>) => Promise<T> | T,
|
|
273
|
+
): RootBuilderWithLoader<TPath, TParams, TSearch, TAuth, Awaited<T>>;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* L6: + effects */
|
|
277
|
+
interface RootBuilderAfterAuthorize<
|
|
278
|
+
TPath extends string,
|
|
279
|
+
TParams,
|
|
280
|
+
TSearch,
|
|
281
|
+
TAuth extends AuthenticateMode,
|
|
282
|
+
> extends RootBuilderWithPreloader<TPath, TParams, TSearch, TAuth> {
|
|
283
|
+
effects(config: EffectsConfig<TParams, TSearch>): RootBuilderWithPreloader<TPath, TParams, TSearch, TAuth>;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* L7: + authorize (root-specific: no preloaderContext in ctx) */
|
|
287
|
+
interface RootBuilderAfterAuthenticate<
|
|
288
|
+
TPath extends string,
|
|
289
|
+
TParams,
|
|
290
|
+
TSearch,
|
|
291
|
+
TAuth extends AuthenticateMode,
|
|
292
|
+
> extends RootBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth> {
|
|
293
|
+
authorize(
|
|
294
|
+
fn: (ctx: RootAuthorizeContext<TParams, TSearch, TAuth>) => boolean | Promise<boolean>,
|
|
295
|
+
): RootBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth>;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* L8: + authenticate */
|
|
299
|
+
interface RootBuilderAfterInput<TPath extends string, TParams, TSearch> extends RootBuilderAfterAuthenticate<
|
|
300
|
+
TPath,
|
|
301
|
+
TParams,
|
|
302
|
+
TSearch,
|
|
303
|
+
false
|
|
304
|
+
> {
|
|
305
|
+
authenticate(...args: unknown[]): RootBuilderAfterAuthenticate<TPath, TParams, TSearch, true>;
|
|
306
|
+
authenticateOptional(...args: unknown[]): RootBuilderAfterAuthenticate<TPath, TParams, TSearch, "optional">;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* L9: + input */
|
|
310
|
+
interface RootBuilderAfterCache<TPath extends string> extends RootBuilderAfterInput<
|
|
311
|
+
TPath,
|
|
312
|
+
Record<string, string>,
|
|
313
|
+
Record<string, string>
|
|
314
|
+
> {
|
|
315
|
+
input<
|
|
316
|
+
PV extends ParamsValidator<unknown> | undefined = undefined,
|
|
317
|
+
SV extends SearchParamsValidator<unknown> | undefined = undefined,
|
|
318
|
+
>(config: {
|
|
319
|
+
params?: PV;
|
|
320
|
+
searchParams?: SV;
|
|
321
|
+
}): RootBuilderAfterInput<
|
|
322
|
+
TPath,
|
|
323
|
+
PV extends ParamsValidator<infer P> ? P : Record<string, string>,
|
|
324
|
+
SV extends SearchParamsValidator<infer S> ? S : Record<string, string>
|
|
325
|
+
>;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/* L10: initial */
|
|
329
|
+
export interface RootLayoutBuilderInitial<TPath extends string> extends RootBuilderAfterCache<TPath> {
|
|
330
|
+
cache(config: CacheConfig<TPath>): RootBuilderAfterCache<TPath>;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
type RootLayoutResultFull<
|
|
334
|
+
TPath extends string,
|
|
335
|
+
TParams,
|
|
336
|
+
TSearch,
|
|
337
|
+
TAuth extends AuthenticateMode,
|
|
338
|
+
TPreloaderContext,
|
|
339
|
+
TLoaderData,
|
|
340
|
+
> = RootLayoutResult<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> &
|
|
341
|
+
RootAfterRender<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
342
|
+
|
|
343
|
+
/* ── factory functions ──────────────────────────────────────────── */
|
|
344
|
+
|
|
345
|
+
function createResultWithBoundaries<
|
|
346
|
+
TPath extends string,
|
|
347
|
+
TParams,
|
|
348
|
+
TSearch,
|
|
349
|
+
TAuth extends AuthenticateMode,
|
|
350
|
+
TPreloaderContext,
|
|
351
|
+
TLoaderData,
|
|
352
|
+
>(
|
|
353
|
+
state: BuilderStateInternal,
|
|
354
|
+
renderFn: (props: RootRenderProps<TParams, TSearch, TPreloaderContext, TLoaderData>) => unknown,
|
|
355
|
+
errorFn?: (props: RootErrorRenderProps<TParams, TSearch>) => unknown,
|
|
356
|
+
notFoundFn?: (props: RootNotFoundRenderProps<TParams, TSearch>) => unknown,
|
|
357
|
+
unauthenticatedFn?: (props: RootUnauthenticatedRenderProps<TParams, TSearch>) => unknown,
|
|
358
|
+
unauthorizedFn?: (props: RootUnauthorizedRenderProps<TParams, TSearch>) => unknown,
|
|
359
|
+
): RootLayoutResultFull<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
360
|
+
function boundarySlot<TProps>(
|
|
361
|
+
existing: ((props: TProps) => unknown) | undefined,
|
|
362
|
+
make: () => (fn: (props: TProps) => unknown) => unknown,
|
|
363
|
+
): unknown {
|
|
364
|
+
if (existing) return existing;
|
|
365
|
+
const builder = make();
|
|
366
|
+
Object.defineProperty(builder, BUILDER_MARKER, { value: true });
|
|
367
|
+
return builder;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return {
|
|
371
|
+
_type: "root-layout" as const,
|
|
372
|
+
authenticate: state.authenticate,
|
|
373
|
+
authenticateMode: state.authenticateMode,
|
|
374
|
+
authorize: state.authorize,
|
|
375
|
+
cache: state.cache,
|
|
376
|
+
effectsConfig: state.effectsConfig,
|
|
377
|
+
errorRender: boundarySlot(
|
|
378
|
+
errorFn,
|
|
379
|
+
() => (fn) =>
|
|
380
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
381
|
+
state,
|
|
382
|
+
renderFn,
|
|
383
|
+
fn,
|
|
384
|
+
notFoundFn,
|
|
385
|
+
unauthenticatedFn,
|
|
386
|
+
unauthorizedFn,
|
|
387
|
+
),
|
|
388
|
+
),
|
|
389
|
+
head: state.head,
|
|
390
|
+
headReplace: state.headReplace,
|
|
391
|
+
headers: state.headers,
|
|
392
|
+
inputConfig: state.inputConfig,
|
|
393
|
+
loader: state.loader,
|
|
394
|
+
notFoundRender: boundarySlot(
|
|
395
|
+
notFoundFn,
|
|
396
|
+
() => (fn) =>
|
|
397
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
398
|
+
state,
|
|
399
|
+
renderFn,
|
|
400
|
+
errorFn,
|
|
401
|
+
fn,
|
|
402
|
+
unauthenticatedFn,
|
|
403
|
+
unauthorizedFn,
|
|
404
|
+
),
|
|
405
|
+
),
|
|
406
|
+
preloader: state.preloader,
|
|
407
|
+
render: renderFn,
|
|
408
|
+
unauthenticatedRender: boundarySlot(
|
|
409
|
+
unauthenticatedFn,
|
|
410
|
+
() => (fn) =>
|
|
411
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
412
|
+
state,
|
|
413
|
+
renderFn,
|
|
414
|
+
errorFn,
|
|
415
|
+
notFoundFn,
|
|
416
|
+
fn,
|
|
417
|
+
unauthorizedFn,
|
|
418
|
+
),
|
|
419
|
+
),
|
|
420
|
+
unauthorizedRender: boundarySlot(
|
|
421
|
+
unauthorizedFn,
|
|
422
|
+
() => (fn) =>
|
|
423
|
+
createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(
|
|
424
|
+
state,
|
|
425
|
+
renderFn,
|
|
426
|
+
errorFn,
|
|
427
|
+
notFoundFn,
|
|
428
|
+
unauthenticatedFn,
|
|
429
|
+
fn,
|
|
430
|
+
),
|
|
431
|
+
),
|
|
432
|
+
virtualPath: state.virtualPath,
|
|
433
|
+
} as RootLayoutResultFull<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function createBuilderRenderOnly<
|
|
437
|
+
TPath extends string,
|
|
438
|
+
TParams,
|
|
439
|
+
TSearch,
|
|
440
|
+
TAuth extends AuthenticateMode,
|
|
441
|
+
TPreloaderContext,
|
|
442
|
+
TLoaderData,
|
|
443
|
+
>(state: BuilderStateInternal): RootBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
444
|
+
return {
|
|
445
|
+
render(fn) {
|
|
446
|
+
return createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(state, fn);
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function createBuilderWithHeaders<
|
|
452
|
+
TPath extends string,
|
|
453
|
+
TParams,
|
|
454
|
+
TSearch,
|
|
455
|
+
TAuth extends AuthenticateMode,
|
|
456
|
+
TPreloaderContext,
|
|
457
|
+
TLoaderData,
|
|
458
|
+
>(state: BuilderStateInternal): RootBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
459
|
+
return {
|
|
460
|
+
...createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(state),
|
|
461
|
+
headers(fn) {
|
|
462
|
+
return createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>({
|
|
463
|
+
...state,
|
|
464
|
+
headers: fn,
|
|
465
|
+
});
|
|
466
|
+
},
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function createBuilderWithHead<
|
|
471
|
+
TPath extends string,
|
|
472
|
+
TParams,
|
|
473
|
+
TSearch,
|
|
474
|
+
TAuth extends AuthenticateMode,
|
|
475
|
+
TPreloaderContext,
|
|
476
|
+
TLoaderData,
|
|
477
|
+
>(state: BuilderStateInternal): RootBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData> {
|
|
478
|
+
return {
|
|
479
|
+
...createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>(state),
|
|
480
|
+
head(fn, options) {
|
|
481
|
+
return createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, TLoaderData>({
|
|
482
|
+
...state,
|
|
483
|
+
head: fn,
|
|
484
|
+
headReplace: options?.replace,
|
|
485
|
+
});
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
function createBuilderWithLoader<
|
|
491
|
+
TPath extends string,
|
|
492
|
+
TParams,
|
|
493
|
+
TSearch,
|
|
494
|
+
TAuth extends AuthenticateMode,
|
|
495
|
+
TPreloaderContext,
|
|
496
|
+
>(state: BuilderStateInternal): RootBuilderWithLoader<TPath, TParams, TSearch, TAuth, TPreloaderContext> {
|
|
497
|
+
return {
|
|
498
|
+
head(fn, options) {
|
|
499
|
+
return createBuilderWithHeaders<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>({
|
|
500
|
+
...state,
|
|
501
|
+
head: fn,
|
|
502
|
+
headReplace: options?.replace,
|
|
503
|
+
});
|
|
504
|
+
},
|
|
505
|
+
headers(fn) {
|
|
506
|
+
return createBuilderRenderOnly<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>({
|
|
507
|
+
...state,
|
|
508
|
+
headers: fn,
|
|
509
|
+
});
|
|
510
|
+
},
|
|
511
|
+
loader<T>(fn: (ctx: RootLoaderContext<TParams, TSearch, TAuth, TPreloaderContext>) => Promise<T> | T) {
|
|
512
|
+
return createBuilderWithHead<TPath, TParams, TSearch, TAuth, TPreloaderContext, Awaited<T>>({
|
|
513
|
+
...state,
|
|
514
|
+
loader: fn,
|
|
515
|
+
});
|
|
516
|
+
},
|
|
517
|
+
render(fn) {
|
|
518
|
+
return createResultWithBoundaries<TPath, TParams, TSearch, TAuth, TPreloaderContext, void>(state, fn);
|
|
519
|
+
},
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function createBuilderWithPreloader<TPath extends string, TParams, TSearch, TAuth extends AuthenticateMode>(
|
|
524
|
+
state: BuilderStateInternal,
|
|
525
|
+
): RootBuilderWithPreloader<TPath, TParams, TSearch, TAuth> {
|
|
526
|
+
return {
|
|
527
|
+
...createBuilderWithLoader<TPath, TParams, TSearch, TAuth, {}>(state),
|
|
528
|
+
preloader<T extends Record<string, unknown>>(
|
|
529
|
+
fn: (ctx: RootPreloaderContext<TParams, TSearch, TAuth>) => Promise<T> | T,
|
|
530
|
+
) {
|
|
531
|
+
return createBuilderWithLoader<TPath, TParams, TSearch, TAuth, Awaited<T>>({
|
|
532
|
+
...state,
|
|
533
|
+
preloader: fn,
|
|
534
|
+
});
|
|
535
|
+
},
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
function createBuilderAfterAuthorize<TPath extends string, TParams, TSearch, TAuth extends AuthenticateMode>(
|
|
540
|
+
state: BuilderStateInternal,
|
|
541
|
+
): RootBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth> {
|
|
542
|
+
return {
|
|
543
|
+
...createBuilderWithPreloader<TPath, TParams, TSearch, TAuth>(state),
|
|
544
|
+
effects(config) {
|
|
545
|
+
return createBuilderWithPreloader<TPath, TParams, TSearch, TAuth>({
|
|
546
|
+
...state,
|
|
547
|
+
effectsConfig: config,
|
|
548
|
+
});
|
|
549
|
+
},
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
function createBuilderAfterAuthenticate<TPath extends string, TParams, TSearch, TAuth extends AuthenticateMode>(
|
|
554
|
+
state: BuilderStateInternal,
|
|
555
|
+
): RootBuilderAfterAuthenticate<TPath, TParams, TSearch, TAuth> {
|
|
556
|
+
return {
|
|
557
|
+
...createBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth>(state),
|
|
558
|
+
authorize(fn) {
|
|
559
|
+
return createBuilderAfterAuthorize<TPath, TParams, TSearch, TAuth>({
|
|
560
|
+
...state,
|
|
561
|
+
authorize: fn,
|
|
562
|
+
});
|
|
563
|
+
},
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function createBuilderAfterInput<TPath extends string, TParams, TSearch>(
|
|
568
|
+
state: BuilderStateInternal,
|
|
569
|
+
): RootBuilderAfterInput<TPath, TParams, TSearch> {
|
|
570
|
+
return {
|
|
571
|
+
...createBuilderAfterAuthenticate<TPath, TParams, TSearch, false>(state),
|
|
572
|
+
authenticate(...args: unknown[]) {
|
|
573
|
+
return createBuilderAfterAuthenticate<TPath, TParams, TSearch, true>({
|
|
574
|
+
...state,
|
|
575
|
+
authenticate: args,
|
|
576
|
+
authenticateMode: true,
|
|
577
|
+
});
|
|
578
|
+
},
|
|
579
|
+
authenticateOptional(...args: unknown[]) {
|
|
580
|
+
return createBuilderAfterAuthenticate<TPath, TParams, TSearch, "optional">({
|
|
581
|
+
...state,
|
|
582
|
+
authenticate: args,
|
|
583
|
+
authenticateMode: "optional",
|
|
584
|
+
});
|
|
585
|
+
},
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
function createBuilderAfterCache<TPath extends string>(state: BuilderStateInternal): RootBuilderAfterCache<TPath> {
|
|
590
|
+
const base = createBuilderAfterInput<TPath, Record<string, string>, Record<string, string>>(state);
|
|
591
|
+
return Object.assign(base, {
|
|
592
|
+
input(config: { params?: ParamsValidator<unknown>; searchParams?: SearchParamsValidator<unknown> }) {
|
|
593
|
+
return createBuilderAfterInput({ ...state, inputConfig: config });
|
|
594
|
+
},
|
|
595
|
+
}) as RootBuilderAfterCache<TPath>;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/* ── public API ─────────────────────────────────────────────────── */
|
|
599
|
+
|
|
600
|
+
export function createRootLayout<TPath extends string>(virtualPath: TPath): RootLayoutBuilderInitial<TPath> {
|
|
601
|
+
const state: BuilderStateInternal = { virtualPath };
|
|
602
|
+
return {
|
|
603
|
+
...createBuilderAfterCache<TPath>(state),
|
|
604
|
+
cache(config) {
|
|
605
|
+
return createBuilderAfterCache<TPath>({ ...state, cache: config });
|
|
606
|
+
},
|
|
607
|
+
};
|
|
608
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export { createLayout } from "./create-layout.ts";
|
|
2
|
+
export type { InterceptConfig } from "./create-page.ts";
|
|
3
|
+
export { createPage } from "./create-page.ts";
|
|
4
|
+
export { createPathSegment } from "./create-path-segment.ts";
|
|
5
|
+
export { createRootLayout } from "./create-root-layout.ts";
|
|
6
|
+
export type {
|
|
7
|
+
ExtractPathParams,
|
|
8
|
+
FlareRegister,
|
|
9
|
+
InferAuthMode,
|
|
10
|
+
InferLoaderData,
|
|
11
|
+
InferParams,
|
|
12
|
+
InferPreloaderContext,
|
|
13
|
+
InferSearchParams,
|
|
14
|
+
ParentAuthResolution,
|
|
15
|
+
ParentPreloaderContext,
|
|
16
|
+
PreloaderChain,
|
|
17
|
+
ResolvedAuth,
|
|
18
|
+
ResolvedEnv,
|
|
19
|
+
ResolvedServerContext,
|
|
20
|
+
RouteAuthMode,
|
|
21
|
+
RouteLoaderData,
|
|
22
|
+
RouteModule,
|
|
23
|
+
RouteParams,
|
|
24
|
+
RouteParamsProps,
|
|
25
|
+
RoutePathParams,
|
|
26
|
+
RoutePaths,
|
|
27
|
+
RoutePreloaderContext,
|
|
28
|
+
RouteSearchParams,
|
|
29
|
+
RouteSearchProps,
|
|
30
|
+
RouteSearchType,
|
|
31
|
+
RouteVirtualPaths,
|
|
32
|
+
} from "./register.ts";
|
|
33
|
+
export type {
|
|
34
|
+
AuthenticateMode,
|
|
35
|
+
CacheConfig,
|
|
36
|
+
CdnCacheConfig,
|
|
37
|
+
ClientCacheConfig,
|
|
38
|
+
DeferFn,
|
|
39
|
+
Deferred,
|
|
40
|
+
EffectsConfig,
|
|
41
|
+
HeadConfig,
|
|
42
|
+
InputConfig,
|
|
43
|
+
LoaderCause,
|
|
44
|
+
PrefetchStrategy,
|
|
45
|
+
ResponseHeaders,
|
|
46
|
+
ServerThrowHelpers,
|
|
47
|
+
SsrCacheConfig,
|
|
48
|
+
} from "./types.ts";
|
|
49
|
+
export { BUILDER_MARKER } from "./types.ts";
|