@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,242 @@
|
|
|
1
|
+
import type { AuthenticateMode } from "./types.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module augmentation target. Apps extend via:
|
|
5
|
+
*
|
|
6
|
+
* declare module "@lovrozagar/flare" {
|
|
7
|
+
* interface FlareRegister {
|
|
8
|
+
* auth: AppAuth
|
|
9
|
+
* }
|
|
10
|
+
* }
|
|
11
|
+
*/
|
|
12
|
+
export interface FlareRegister {}
|
|
13
|
+
|
|
14
|
+
/* ── Path param extraction ────────────────────────────────── */
|
|
15
|
+
|
|
16
|
+
type _ExtractSegment<T extends string> = T extends `[[...${infer N}]]`
|
|
17
|
+
? { [K in N]: string[] | undefined }
|
|
18
|
+
: T extends `[[${infer N}]]`
|
|
19
|
+
? { [K in N]: string | undefined }
|
|
20
|
+
: T extends `[...${infer N}]`
|
|
21
|
+
? { [K in N]: string[] }
|
|
22
|
+
: T extends `[${infer N}]`
|
|
23
|
+
? { [K in N]: string }
|
|
24
|
+
: {};
|
|
25
|
+
|
|
26
|
+
type _ExtractPathParams<T extends string> = T extends `${infer Head}/${infer Tail}`
|
|
27
|
+
? _ExtractSegment<Head> & _ExtractPathParams<Tail>
|
|
28
|
+
: _ExtractSegment<T>;
|
|
29
|
+
|
|
30
|
+
export type ExtractPathParams<T extends string> =
|
|
31
|
+
_ExtractPathParams<T> extends infer R ? { [K in keyof R]: R[K] } : never;
|
|
32
|
+
|
|
33
|
+
/* resolve env type: user-augmented when set, unknown fallback otherwise */
|
|
34
|
+
export type ResolvedEnv = FlareRegister extends { env: infer E } ? E : unknown;
|
|
35
|
+
|
|
36
|
+
/* resolve serverContext type: user-augmented when set, loose fallback otherwise */
|
|
37
|
+
export type ResolvedServerContext = FlareRegister extends { serverContext: infer SC } ? SC : Record<string, unknown>;
|
|
38
|
+
|
|
39
|
+
/* resolve queryClient: present when hasQueryClient is true, absent otherwise */
|
|
40
|
+
export type ResolvedQueryClient = FlareRegister extends { hasQueryClient: true }
|
|
41
|
+
? { queryClient: import("@tanstack/solid-query").QueryClient }
|
|
42
|
+
: {};
|
|
43
|
+
|
|
44
|
+
/* resolve auth type: Auth when required, Auth|null when optional, null when false */
|
|
45
|
+
type RegisteredAuth = FlareRegister extends { auth: infer A } ? A : null;
|
|
46
|
+
|
|
47
|
+
export type ResolvedAuth<TAuth extends AuthenticateMode> = TAuth extends true
|
|
48
|
+
? RegisteredAuth
|
|
49
|
+
: TAuth extends "optional"
|
|
50
|
+
? RegisteredAuth | null
|
|
51
|
+
: null;
|
|
52
|
+
|
|
53
|
+
/* ── Auth mode utilities ───────────────────────────────────── */
|
|
54
|
+
|
|
55
|
+
/* registered auth modes map — virtualPath → AuthenticateMode */
|
|
56
|
+
type RegisteredAuthModes = FlareRegister extends { authModes: infer M } ? M : {};
|
|
57
|
+
|
|
58
|
+
/** Infer auth mode from a route module result type */
|
|
59
|
+
export type InferAuthMode<T> = T extends { authenticateMode: infer M extends AuthenticateMode } ? M : false;
|
|
60
|
+
|
|
61
|
+
/** Auth mode for a route by virtualPath — reads from generated authModes map */
|
|
62
|
+
export type RouteAuthMode<TPath extends string> = TPath extends keyof RegisteredAuthModes
|
|
63
|
+
? RegisteredAuthModes[TPath] extends AuthenticateMode
|
|
64
|
+
? RegisteredAuthModes[TPath]
|
|
65
|
+
: false
|
|
66
|
+
: false;
|
|
67
|
+
|
|
68
|
+
/** Resolve effective auth from parent chain — strictest wins: true > "optional" > false */
|
|
69
|
+
type StrictestAuth<A extends AuthenticateMode, B extends AuthenticateMode> = A extends true
|
|
70
|
+
? true
|
|
71
|
+
: B extends true
|
|
72
|
+
? true
|
|
73
|
+
: A extends "optional"
|
|
74
|
+
? "optional"
|
|
75
|
+
: B extends "optional"
|
|
76
|
+
? "optional"
|
|
77
|
+
: false;
|
|
78
|
+
|
|
79
|
+
type AuthChain<TPaths extends readonly string[]> = TPaths extends readonly [
|
|
80
|
+
infer First extends string,
|
|
81
|
+
...infer Rest extends readonly string[],
|
|
82
|
+
]
|
|
83
|
+
? StrictestAuth<RouteAuthMode<First>, AuthChain<Rest>>
|
|
84
|
+
: false;
|
|
85
|
+
|
|
86
|
+
/** Initial auth for a route based on parent chain */
|
|
87
|
+
export type ParentAuthResolution<TPath extends string> = TPath extends keyof RegisteredRouteParents
|
|
88
|
+
? RegisteredRouteParents[TPath] extends readonly string[]
|
|
89
|
+
? AuthChain<RegisteredRouteParents[TPath]>
|
|
90
|
+
: false
|
|
91
|
+
: false;
|
|
92
|
+
|
|
93
|
+
/* ── Route type utilities ──────────────────────────────────── */
|
|
94
|
+
|
|
95
|
+
/* registered maps — resolve to empty when not augmented */
|
|
96
|
+
type RegisteredRoutes = FlareRegister extends { routes: infer R } ? R : {};
|
|
97
|
+
type RegisteredRouteModules = FlareRegister extends { routeModules: infer M } ? M : {};
|
|
98
|
+
type RegisteredRouteParents = FlareRegister extends { routeParents: infer P } ? P : {};
|
|
99
|
+
|
|
100
|
+
/** All registered URL paths (e.g. "/about", "/blog/[slug]") — string when not registered */
|
|
101
|
+
export type RoutePaths = "routes" extends keyof FlareRegister ? keyof RegisteredRoutes & string : string;
|
|
102
|
+
|
|
103
|
+
/** All registered virtualPaths (e.g. "_root_/about") — string when not registered */
|
|
104
|
+
export type RouteVirtualPaths = "routeModules" extends keyof FlareRegister
|
|
105
|
+
? keyof RegisteredRouteModules & string
|
|
106
|
+
: string;
|
|
107
|
+
|
|
108
|
+
/** Resolve the route module type for a given virtualPath */
|
|
109
|
+
export type RouteModule<TPath extends string> = TPath extends keyof RegisteredRouteModules
|
|
110
|
+
? RegisteredRouteModules[TPath]
|
|
111
|
+
: never;
|
|
112
|
+
|
|
113
|
+
/** Extract loaderData type from a route module's render props */
|
|
114
|
+
export type InferLoaderData<T> = T extends { render: (props: infer P) => unknown }
|
|
115
|
+
? P extends { loaderData: infer L }
|
|
116
|
+
? L
|
|
117
|
+
: void
|
|
118
|
+
: void;
|
|
119
|
+
|
|
120
|
+
/** Extract own preloader context from a route module's render props */
|
|
121
|
+
export type InferPreloaderContext<T> = T extends { render: (props: infer P) => unknown }
|
|
122
|
+
? P extends { preloaderContext: infer C }
|
|
123
|
+
? C
|
|
124
|
+
: {}
|
|
125
|
+
: {};
|
|
126
|
+
|
|
127
|
+
/** Extract params type from a route module's render props */
|
|
128
|
+
export type InferParams<T> = T extends { render: (props: infer P) => unknown }
|
|
129
|
+
? P extends { location: { params: infer Params } }
|
|
130
|
+
? Params
|
|
131
|
+
: Record<string, string | string[]>
|
|
132
|
+
: Record<string, string | string[]>;
|
|
133
|
+
|
|
134
|
+
/** Extract search params type from a route module's render props */
|
|
135
|
+
export type InferSearchParams<T> = T extends { render: (props: infer P) => unknown }
|
|
136
|
+
? P extends { location: { search: infer S } }
|
|
137
|
+
? S
|
|
138
|
+
: Record<string, string>
|
|
139
|
+
: Record<string, string>;
|
|
140
|
+
|
|
141
|
+
/** Recursively intersect preloader contexts from a tuple of virtualPaths */
|
|
142
|
+
export type PreloaderChain<TPaths extends readonly string[]> = TPaths extends readonly [
|
|
143
|
+
infer First extends string,
|
|
144
|
+
...infer Rest extends readonly string[],
|
|
145
|
+
]
|
|
146
|
+
? InferPreloaderContext<RouteModule<First>> & PreloaderChain<Rest>
|
|
147
|
+
: {};
|
|
148
|
+
|
|
149
|
+
/* ── Route search params utilities ────────────────────────── */
|
|
150
|
+
|
|
151
|
+
type RegisteredRouteSearchParams = FlareRegister extends { routeSearchParams: infer S } ? S : {};
|
|
152
|
+
|
|
153
|
+
/** Resolved search param type for a URL path — specific when registered, loose otherwise */
|
|
154
|
+
export type RouteSearchType<TPath extends string> = "routeSearchParams" extends keyof FlareRegister
|
|
155
|
+
? TPath extends keyof RegisteredRouteSearchParams
|
|
156
|
+
? RegisteredRouteSearchParams[TPath]
|
|
157
|
+
: Record<string, unknown>
|
|
158
|
+
: Record<string, unknown>;
|
|
159
|
+
|
|
160
|
+
/** Optional search prop — typed when route has .input(), loose otherwise */
|
|
161
|
+
export type RouteSearchProps<TPath extends string> = { search?: RouteSearchType<TPath> };
|
|
162
|
+
|
|
163
|
+
/* ── Route params utilities ──────────────────────────────── */
|
|
164
|
+
|
|
165
|
+
type RegisteredRouteParams = FlareRegister extends { routeParams: infer P } ? P : {};
|
|
166
|
+
|
|
167
|
+
/** Extract params shape — prefers routeParams (validator-inferred) over routes (URL-derived) */
|
|
168
|
+
export type RouteParams<TPath extends string> = "routeParams" extends keyof FlareRegister
|
|
169
|
+
? TPath extends keyof RegisteredRouteParams
|
|
170
|
+
? RegisteredRouteParams[TPath]
|
|
171
|
+
: "routes" extends keyof FlareRegister
|
|
172
|
+
? TPath extends keyof RegisteredRoutes
|
|
173
|
+
? RegisteredRoutes[TPath] extends { params: infer P }
|
|
174
|
+
? P
|
|
175
|
+
: {}
|
|
176
|
+
: {}
|
|
177
|
+
: ExtractPathParams<TPath>
|
|
178
|
+
: "routes" extends keyof FlareRegister
|
|
179
|
+
? TPath extends keyof RegisteredRoutes
|
|
180
|
+
? RegisteredRoutes[TPath] extends { params: infer P }
|
|
181
|
+
? P
|
|
182
|
+
: {}
|
|
183
|
+
: {}
|
|
184
|
+
: ExtractPathParams<TPath>;
|
|
185
|
+
|
|
186
|
+
/** Conditional params prop — required when route has params, forbidden otherwise */
|
|
187
|
+
export type RouteParamsProps<TPath extends string> = "routeParams" extends keyof FlareRegister
|
|
188
|
+
? _ParamsFromInferred<TPath>
|
|
189
|
+
: "routes" extends keyof FlareRegister
|
|
190
|
+
? _ParamsForRoute<TPath>
|
|
191
|
+
: _ParamsFromPath<TPath>;
|
|
192
|
+
|
|
193
|
+
type _ParamsFromInferred<TPath extends string> = TPath extends keyof RegisteredRouteParams
|
|
194
|
+
? [keyof RegisteredRouteParams[TPath]] extends [never]
|
|
195
|
+
? { params?: never }
|
|
196
|
+
: { params: RegisteredRouteParams[TPath] }
|
|
197
|
+
: "routes" extends keyof FlareRegister
|
|
198
|
+
? _ParamsForRoute<TPath>
|
|
199
|
+
: _ParamsFromPath<TPath>;
|
|
200
|
+
|
|
201
|
+
type _ParamsForRoute<TPath extends string> = TPath extends keyof RegisteredRoutes
|
|
202
|
+
? RegisteredRoutes[TPath] extends { params: infer P }
|
|
203
|
+
? [keyof P] extends [never]
|
|
204
|
+
? { params?: never }
|
|
205
|
+
: { params: P }
|
|
206
|
+
: { params?: never }
|
|
207
|
+
: { params?: never };
|
|
208
|
+
|
|
209
|
+
type _ParamsFromPath<TPath extends string> = [keyof ExtractPathParams<TPath>] extends [never]
|
|
210
|
+
? { params?: never }
|
|
211
|
+
: { params: ExtractPathParams<TPath> };
|
|
212
|
+
|
|
213
|
+
/** Loader data type for a route by virtualPath — falls back to unknown for unregistered paths */
|
|
214
|
+
export type RouteLoaderData<TPath extends string> = [RouteModule<TPath>] extends [never]
|
|
215
|
+
? unknown
|
|
216
|
+
: InferLoaderData<RouteModule<TPath>>;
|
|
217
|
+
|
|
218
|
+
/** Path params type for a route by virtualPath — falls back to ExtractPathParams for unregistered paths */
|
|
219
|
+
export type RoutePathParams<TPath extends string> = [RouteModule<TPath>] extends [never]
|
|
220
|
+
? ExtractPathParams<TPath>
|
|
221
|
+
: InferParams<RouteModule<TPath>>;
|
|
222
|
+
|
|
223
|
+
/** Search params type for a route by virtualPath — falls back to unknown for unregistered paths */
|
|
224
|
+
export type RouteSearchParams<TPath extends string> = [RouteModule<TPath>] extends [never]
|
|
225
|
+
? unknown
|
|
226
|
+
: InferSearchParams<RouteModule<TPath>>;
|
|
227
|
+
|
|
228
|
+
/** Parent preloader context for a route (parents only, excludes self) — used by builders */
|
|
229
|
+
export type ParentPreloaderContext<TPath extends string> = TPath extends keyof RegisteredRouteParents
|
|
230
|
+
? RegisteredRouteParents[TPath] extends readonly string[]
|
|
231
|
+
? PreloaderChain<RegisteredRouteParents[TPath]>
|
|
232
|
+
: {}
|
|
233
|
+
: {};
|
|
234
|
+
|
|
235
|
+
/** Accumulated preloader context for a route (includes all parent layouts) — falls back to unknown */
|
|
236
|
+
export type RoutePreloaderContext<TPath extends string> = [RouteModule<TPath>] extends [never]
|
|
237
|
+
? unknown
|
|
238
|
+
: TPath extends keyof RegisteredRouteParents
|
|
239
|
+
? RegisteredRouteParents[TPath] extends readonly string[]
|
|
240
|
+
? PreloaderChain<[...RegisteredRouteParents[TPath], TPath]>
|
|
241
|
+
: InferPreloaderContext<RouteModule<TPath>>
|
|
242
|
+
: InferPreloaderContext<RouteModule<TPath>>;
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import type { Duration } from "../duration/index.ts";
|
|
2
|
+
import type { RedirectOptions } from "../errors/index.ts";
|
|
3
|
+
import type { Location } from "../router-primitives/index.ts";
|
|
4
|
+
import type { FlareStore, FlareStoreEntry, StaticEntryData } from "../store/index.ts";
|
|
5
|
+
import type { RouteParamsProps, RoutePaths, RouteSearchProps } from "./register.ts";
|
|
6
|
+
|
|
7
|
+
export type { FlareStore, FlareStoreEntry, StaticEntryData };
|
|
8
|
+
|
|
9
|
+
export type AuthenticateMode = false | "optional" | true;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Symbol marker for route builder chain methods that look like render fns
|
|
13
|
+
* but return builder objects. Used to filter them out in SSR/hydration/navigation
|
|
14
|
+
* so Outlet doesn't try to call them as component render fns.
|
|
15
|
+
*/
|
|
16
|
+
export const BUILDER_MARKER = Symbol("flare-builder");
|
|
17
|
+
|
|
18
|
+
/* server-only throw helpers — attached to preloader/authorize/loader contexts */
|
|
19
|
+
export interface ServerThrowHelpers {
|
|
20
|
+
notFound: (message?: string) => never;
|
|
21
|
+
redirect: <TPath extends RoutePaths>(options: RedirectOptions<TPath>) => never;
|
|
22
|
+
unauthenticated: (message?: string) => never;
|
|
23
|
+
unauthorized: (message?: string) => never;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* cache config */
|
|
27
|
+
export type PrefetchStrategy = false | "intent" | "render" | "viewport";
|
|
28
|
+
|
|
29
|
+
export interface ClientCacheConfig {
|
|
30
|
+
cacheDeferred?: boolean;
|
|
31
|
+
gcTime?: Duration;
|
|
32
|
+
prefetch?: PrefetchStrategy;
|
|
33
|
+
prefetchGcTime?: Duration;
|
|
34
|
+
prefetchStaleTime?: Duration;
|
|
35
|
+
staleTime?: Duration;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface SsrCacheConfig {
|
|
39
|
+
key?: (ctx: { params: Record<string, string | string[]> }) => string;
|
|
40
|
+
staleTime?: Duration;
|
|
41
|
+
tags?: string[] | ((ctx: { params: Record<string, string | string[]> }) => string[]);
|
|
42
|
+
ttl?: Duration;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface CdnCacheConfig {
|
|
46
|
+
maxAge?: Duration;
|
|
47
|
+
private?: boolean;
|
|
48
|
+
swr?: Duration;
|
|
49
|
+
tags?: string[] | ((ctx: { params: Record<string, string | string[]> }) => string[]);
|
|
50
|
+
vary?: string[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* static/ISR route cache — conditional on path params */
|
|
54
|
+
type _Segment<T extends string> = T extends `[[...${infer N}]]`
|
|
55
|
+
? { [K in N]: string[] | undefined }
|
|
56
|
+
: T extends `[[${infer N}]]`
|
|
57
|
+
? { [K in N]: string | undefined }
|
|
58
|
+
: T extends `[...${infer N}]`
|
|
59
|
+
? { [K in N]: string[] }
|
|
60
|
+
: T extends `[${infer N}]`
|
|
61
|
+
? { [K in N]: string }
|
|
62
|
+
: {};
|
|
63
|
+
|
|
64
|
+
type _PathParams<T extends string> = T extends `${infer H}/${infer R}` ? _Segment<H> & _PathParams<R> : _Segment<T>;
|
|
65
|
+
|
|
66
|
+
type FlatPathParams<T extends string> = _PathParams<T> extends infer R ? { [K in keyof R]: R[K] } : never;
|
|
67
|
+
|
|
68
|
+
type HasDynamicSegments<T extends string> = T extends `${string}[${string}]${string}` ? true : false;
|
|
69
|
+
|
|
70
|
+
export type StaticDeferMode = "resolve" | "stream";
|
|
71
|
+
|
|
72
|
+
type ParamsFn<TPath extends string> = (ctx: {
|
|
73
|
+
params: Record<string, string | string[]>;
|
|
74
|
+
}) => FlatPathParams<TPath>[] | Promise<FlatPathParams<TPath>[]>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* SSG config — fully static at build time, no revalidation.
|
|
78
|
+
*
|
|
79
|
+
* - `true` — static, inherits params from parent layouts
|
|
80
|
+
* - `{ defer?: ... }` — static with defer mode
|
|
81
|
+
* - `(ctx) => Params[]` — static with dynamic segments (shorthand)
|
|
82
|
+
* - `{ params, defer? }` — static with dynamic segments + options
|
|
83
|
+
*/
|
|
84
|
+
type SsgCacheConfig<TPath extends string> =
|
|
85
|
+
| true
|
|
86
|
+
| { defer?: StaticDeferMode }
|
|
87
|
+
| (HasDynamicSegments<TPath> extends true
|
|
88
|
+
? ParamsFn<TPath> | { defer?: StaticDeferMode; params: ParamsFn<TPath> }
|
|
89
|
+
: never);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* ISR config — incremental static regeneration.
|
|
93
|
+
*
|
|
94
|
+
* - `true` — on-demand ISR, no build-time prerender, tag-invalidated only
|
|
95
|
+
* - `{ revalidate?, defer? }` — time-based ISR, inherits params from parent layouts
|
|
96
|
+
* - `{ revalidate?, params, defer?, dynamicParams? }` — ISR with dynamic segments
|
|
97
|
+
*
|
|
98
|
+
* When `revalidate` is omitted, pages are cached forever and only
|
|
99
|
+
* refreshed via on-demand revalidation (tags/keys).
|
|
100
|
+
*
|
|
101
|
+
* `dynamicParams` (default `true`): when `false`, unlisted param values return 404.
|
|
102
|
+
* When `true`, unlisted values fall through to on-demand SSR.
|
|
103
|
+
*/
|
|
104
|
+
type IsrCacheConfig<TPath extends string> =
|
|
105
|
+
| true
|
|
106
|
+
| { defer?: StaticDeferMode; revalidate?: Duration }
|
|
107
|
+
| (HasDynamicSegments<TPath> extends true
|
|
108
|
+
? {
|
|
109
|
+
defer?: StaticDeferMode;
|
|
110
|
+
dynamicParams?: boolean;
|
|
111
|
+
params: ParamsFn<TPath>;
|
|
112
|
+
revalidate?: Duration;
|
|
113
|
+
}
|
|
114
|
+
: never);
|
|
115
|
+
|
|
116
|
+
interface BaseCacheConfig {
|
|
117
|
+
cdn?: CdnCacheConfig | false;
|
|
118
|
+
client?: ClientCacheConfig | false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* ssg, isr, ssr are mutually exclusive rendering strategies via discriminated union */
|
|
122
|
+
export type CacheConfig<TPath extends string = string> = BaseCacheConfig &
|
|
123
|
+
(
|
|
124
|
+
| { isr: IsrCacheConfig<TPath>; ssg?: never; ssr?: never }
|
|
125
|
+
| { isr?: never; ssg: SsgCacheConfig<TPath>; ssr?: never }
|
|
126
|
+
| { isr?: never; ssg?: never; ssr: SsrCacheConfig }
|
|
127
|
+
| { isr?: never; ssg?: never; ssr?: never }
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
/* input validation — uses unified Validator<T> from validation module */
|
|
131
|
+
import type { StandardSchemaV1 } from "../validation/index.ts";
|
|
132
|
+
|
|
133
|
+
export type { Validator } from "../validation/index.ts";
|
|
134
|
+
|
|
135
|
+
/* Params validators receive Record<string, string | string[]> at runtime.
|
|
136
|
+
* Standard Schema validators work directly on the plain object. */
|
|
137
|
+
export type ParamsValidator<T> =
|
|
138
|
+
| StandardSchemaV1<T>
|
|
139
|
+
| { parse: (raw: Record<string, string | string[]>) => T }
|
|
140
|
+
| ((raw: Record<string, string | string[]>) => T);
|
|
141
|
+
|
|
142
|
+
/* Search params validators receive URLSearchParams at runtime.
|
|
143
|
+
* Standard Schema validators get auto-converted to plain object in the pipeline. */
|
|
144
|
+
export type SearchParamsValidator<T> =
|
|
145
|
+
| StandardSchemaV1<T>
|
|
146
|
+
| { parse: (raw: URLSearchParams) => T }
|
|
147
|
+
| ((raw: URLSearchParams) => T);
|
|
148
|
+
|
|
149
|
+
export interface InputConfig<TParams, TSearch> {
|
|
150
|
+
params?: ParamsValidator<TParams>;
|
|
151
|
+
searchParams?: SearchParamsValidator<TSearch>;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* effects */
|
|
155
|
+
export interface EffectsContext<TParams, TSearch> {
|
|
156
|
+
location: {
|
|
157
|
+
current: { hash: string; params: TParams; pathname: string; search: TSearch };
|
|
158
|
+
next: { hash: string; params: TParams; pathname: string; search: TSearch };
|
|
159
|
+
};
|
|
160
|
+
trigger: "initial" | "navigation" | "revalidation";
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface EffectsConfig<TParams, TSearch> {
|
|
164
|
+
loaderDeps?: (ctx: { search: TSearch }) => unknown[];
|
|
165
|
+
shouldRefetch?: (ctx: EffectsContext<TParams, TSearch>) => boolean;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* loader */
|
|
169
|
+
export type LoaderCause = "enter" | "prefetch" | "stay";
|
|
170
|
+
|
|
171
|
+
export interface Deferred<T> {
|
|
172
|
+
__deferred: true;
|
|
173
|
+
key: string;
|
|
174
|
+
prerender?: StaticDeferMode;
|
|
175
|
+
promise: Promise<T>;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export type DeferFn = <T>(fn: () => Promise<T>, options?: { key?: string; prerender?: StaticDeferMode }) => Deferred<T>;
|
|
179
|
+
|
|
180
|
+
/* head */
|
|
181
|
+
export interface SeoImage {
|
|
182
|
+
alt?: string;
|
|
183
|
+
height?: number;
|
|
184
|
+
type?: string;
|
|
185
|
+
url: string;
|
|
186
|
+
width?: number;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export interface FaviconConfig {
|
|
190
|
+
"96x96"?: string;
|
|
191
|
+
"192x192"?: string;
|
|
192
|
+
"512x512"?: string;
|
|
193
|
+
appleTouchIcon?: string;
|
|
194
|
+
ico?: string;
|
|
195
|
+
svg?: string;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface RobotsConfig {
|
|
199
|
+
follow?: boolean;
|
|
200
|
+
index?: boolean;
|
|
201
|
+
"max-image-preview"?: "large" | "none" | "standard";
|
|
202
|
+
"max-snippet"?: number;
|
|
203
|
+
"max-video-preview"?: number;
|
|
204
|
+
noarchive?: boolean;
|
|
205
|
+
noimageindex?: boolean;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export interface OpenGraphConfig {
|
|
209
|
+
alternateLocale?: string[];
|
|
210
|
+
audio?: Array<{ secureUrl?: string; type?: string; url: string }>;
|
|
211
|
+
description?: string;
|
|
212
|
+
images?: SeoImage[];
|
|
213
|
+
locale?: string;
|
|
214
|
+
siteName?: string;
|
|
215
|
+
title?: string;
|
|
216
|
+
type?: "article" | "product" | "profile" | "website";
|
|
217
|
+
url?: string;
|
|
218
|
+
videos?: Array<{
|
|
219
|
+
height?: number;
|
|
220
|
+
secureUrl?: string;
|
|
221
|
+
type?: string;
|
|
222
|
+
url: string;
|
|
223
|
+
width?: number;
|
|
224
|
+
}>;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export interface TwitterConfig {
|
|
228
|
+
card?: "app" | "player" | "summary" | "summary_large_image";
|
|
229
|
+
creator?: string;
|
|
230
|
+
description?: string;
|
|
231
|
+
images?: Array<{ alt?: string; url: string }>;
|
|
232
|
+
site?: string;
|
|
233
|
+
title?: string;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export interface MetaConfig {
|
|
237
|
+
applicationName?: string;
|
|
238
|
+
appleMobileWebAppCapable?: "no" | "yes";
|
|
239
|
+
appleMobileWebAppStatusBarStyle?: "black" | "black-translucent" | "default";
|
|
240
|
+
appleMobileWebAppTitle?: string;
|
|
241
|
+
author?: string;
|
|
242
|
+
charset?: string;
|
|
243
|
+
creator?: string;
|
|
244
|
+
generator?: string;
|
|
245
|
+
manifest?: string;
|
|
246
|
+
mobileWebAppCapable?: "no" | "yes";
|
|
247
|
+
publisher?: string;
|
|
248
|
+
viewport?: false | string;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface CustomHeadConfig {
|
|
252
|
+
links?: Array<Record<string, string>>;
|
|
253
|
+
meta?: Array<Record<string, string>>;
|
|
254
|
+
scripts?: Array<{ async?: boolean; children?: string; extra?: Record<string, string>; src?: string; type?: string }>;
|
|
255
|
+
styles?: Array<{ children: string }>;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export interface HeadConfig {
|
|
259
|
+
canonical?: string;
|
|
260
|
+
css?: string | string[];
|
|
261
|
+
custom?: CustomHeadConfig;
|
|
262
|
+
description?: string;
|
|
263
|
+
favicons?: FaviconConfig;
|
|
264
|
+
images?: SeoImage[];
|
|
265
|
+
jsonLd?: Array<Record<string, unknown>>;
|
|
266
|
+
keywords?: string;
|
|
267
|
+
languages?: Record<string, string>;
|
|
268
|
+
meta?: MetaConfig;
|
|
269
|
+
openGraph?: OpenGraphConfig;
|
|
270
|
+
robots?: RobotsConfig;
|
|
271
|
+
title?: string;
|
|
272
|
+
twitter?: TwitterConfig;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export interface HeadOptions {
|
|
276
|
+
replace?: boolean;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export type ResponseHeaders = Record<string, string | string[]>;
|
|
280
|
+
|
|
281
|
+
/* type-safe URL building — shared by FlareRouter (client) and server contexts */
|
|
282
|
+
export type BuildUrlOptions<TPath extends RoutePaths = RoutePaths> = {
|
|
283
|
+
hash?: string;
|
|
284
|
+
to: TPath;
|
|
285
|
+
} & RouteParamsProps<TPath> &
|
|
286
|
+
RouteSearchProps<TPath>;
|
|
287
|
+
|
|
288
|
+
/* server-only URL helpers — attached to preloader/authorize/loader/head/headers contexts */
|
|
289
|
+
export interface ServerUrlHelpers {
|
|
290
|
+
buildUrl: <TPath extends RoutePaths>(options: BuildUrlOptions<TPath>) => string;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/* re-export Location for convenience */
|
|
294
|
+
export type { Location };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { DirectionConfig } from "../direction.ts";
|
|
2
|
+
import type { LocaleConfig } from "../locale/index.tsx";
|
|
3
|
+
import type { LocationRewrite } from "../rewrite/index.ts";
|
|
4
|
+
import type { ClientCacheConfig } from "../route-builder/types.ts";
|
|
5
|
+
import type { Location, TreeNode } from "../router-primitives/types.ts";
|
|
6
|
+
import { parseFlareState as _parseFlareState } from "../state-parser/index.ts";
|
|
7
|
+
import type { ThemeConfig } from "../theme.ts";
|
|
8
|
+
|
|
9
|
+
export type PrefetchStrategy = false | "intent" | "render" | "viewport";
|
|
10
|
+
export type TrailingSlashMode = "always" | "never" | "preserve";
|
|
11
|
+
export type ViewTransitionDefaults = boolean | { types: string[] };
|
|
12
|
+
|
|
13
|
+
export interface RouterCacheConfig {
|
|
14
|
+
client?: ClientCacheConfig | false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface RouterConfig {
|
|
18
|
+
basePath?: string;
|
|
19
|
+
cache?: RouterCacheConfig;
|
|
20
|
+
caseSensitive?: boolean;
|
|
21
|
+
direction?: DirectionConfig;
|
|
22
|
+
getScrollRestorationKey?: (location: Location) => string;
|
|
23
|
+
layouts: Record<string, () => Promise<{ default: unknown }>>;
|
|
24
|
+
locale?: LocaleConfig;
|
|
25
|
+
notFoundMode?: "fuzzy" | "root";
|
|
26
|
+
queryClientGetter?: () => unknown;
|
|
27
|
+
rewrite?: LocationRewrite;
|
|
28
|
+
routeCacheMaxEntries?: number;
|
|
29
|
+
routeTree: TreeNode;
|
|
30
|
+
scrollRestoration?: boolean;
|
|
31
|
+
scrollRestorationBehavior?: "auto" | "smooth";
|
|
32
|
+
scrollRestorationMaxEntries?: number;
|
|
33
|
+
theme?: ThemeConfig;
|
|
34
|
+
trailingSlash?: TrailingSlashMode;
|
|
35
|
+
viewTransitions?: ViewTransitionDefaults;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface SerializableRouterConfig {
|
|
39
|
+
basePath?: string;
|
|
40
|
+
cache?: RouterCacheConfig;
|
|
41
|
+
caseSensitive?: boolean;
|
|
42
|
+
direction?: DirectionConfig;
|
|
43
|
+
keepalive?: false | number;
|
|
44
|
+
locale?: LocaleConfig;
|
|
45
|
+
notFoundMode?: "fuzzy" | "root";
|
|
46
|
+
routeCacheMaxEntries?: number;
|
|
47
|
+
scrollRestoration?: boolean;
|
|
48
|
+
scrollRestorationBehavior?: "auto" | "smooth";
|
|
49
|
+
scrollRestorationMaxEntries?: number;
|
|
50
|
+
theme?: ThemeConfig;
|
|
51
|
+
trailingSlash?: TrailingSlashMode;
|
|
52
|
+
viewTransitions?: ViewTransitionDefaults;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const MARKER = Symbol.for("flare/router-config");
|
|
56
|
+
|
|
57
|
+
export interface MarkedRouterConfig extends RouterConfig {
|
|
58
|
+
[key: symbol]: true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function createRouter(config: RouterConfig): MarkedRouterConfig {
|
|
62
|
+
return { ...config, [MARKER]: true } as MarkedRouterConfig;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function isRouterConfig(value: unknown): value is MarkedRouterConfig {
|
|
66
|
+
return (
|
|
67
|
+
value !== null &&
|
|
68
|
+
value !== undefined &&
|
|
69
|
+
typeof value === "object" &&
|
|
70
|
+
MARKER in (value as Record<symbol, unknown>) &&
|
|
71
|
+
(value as Record<symbol, unknown>)[MARKER] === true
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function extractSerializable(router: MarkedRouterConfig): SerializableRouterConfig {
|
|
76
|
+
const {
|
|
77
|
+
getScrollRestorationKey: _gsr,
|
|
78
|
+
layouts: _l,
|
|
79
|
+
queryClientGetter: _q,
|
|
80
|
+
rewrite: _rw,
|
|
81
|
+
routeTree: _rt,
|
|
82
|
+
...clean
|
|
83
|
+
} = router;
|
|
84
|
+
|
|
85
|
+
/* remove symbol marker */
|
|
86
|
+
const result = { ...clean } as Record<string | symbol, unknown>;
|
|
87
|
+
delete result[MARKER];
|
|
88
|
+
return result as SerializableRouterConfig;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const parseFlareState = _parseFlareState;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { buildLocation } from "./location.ts";
|
|
2
|
+
export { computeMatchId, parseMatchId } from "./match-id.ts";
|
|
3
|
+
export {
|
|
4
|
+
deriveLayouts,
|
|
5
|
+
deriveParams,
|
|
6
|
+
extractLayoutKey,
|
|
7
|
+
isParamSegment,
|
|
8
|
+
isRootLayoutPath,
|
|
9
|
+
stripGroups,
|
|
10
|
+
toUrlPath,
|
|
11
|
+
toVirtualPath,
|
|
12
|
+
} from "./paths.ts";
|
|
13
|
+
export { createTreeNode, insertRoute, matchRoute, matchRoutePartial, toLocaleMatch } from "./tree.ts";
|
|
14
|
+
export type { LocaleMatch } from "./tree.ts";
|
|
15
|
+
export type {
|
|
16
|
+
ComputeMatchIdOptions,
|
|
17
|
+
Location,
|
|
18
|
+
MatchResult,
|
|
19
|
+
ParsedMatchId,
|
|
20
|
+
PrefetchStrategy,
|
|
21
|
+
RouteData,
|
|
22
|
+
RouteMeta,
|
|
23
|
+
RouteMetaClient,
|
|
24
|
+
TreeNode,
|
|
25
|
+
} from "./types.ts";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SearchParams } from "../url/index.ts";
|
|
2
|
+
import { parseSearchParams } from "../url/index.ts";
|
|
3
|
+
import type { Location } from "./types.ts";
|
|
4
|
+
|
|
5
|
+
export function buildLocation<
|
|
6
|
+
TParams extends Record<string, string | string[]>,
|
|
7
|
+
TSearch = SearchParams,
|
|
8
|
+
THash = string,
|
|
9
|
+
>(
|
|
10
|
+
url: URL,
|
|
11
|
+
params: TParams,
|
|
12
|
+
virtualPath: string,
|
|
13
|
+
variablePath: string,
|
|
14
|
+
search?: TSearch,
|
|
15
|
+
hash?: THash,
|
|
16
|
+
): Location<TParams, TSearch, THash> {
|
|
17
|
+
const resolvedSearch = search ?? (parseSearchParams(url.searchParams) as TSearch);
|
|
18
|
+
const resolvedHash = hash ?? (url.hash as THash);
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
hash: resolvedHash,
|
|
22
|
+
params,
|
|
23
|
+
pathname: url.pathname,
|
|
24
|
+
search: resolvedSearch,
|
|
25
|
+
url,
|
|
26
|
+
variablePath,
|
|
27
|
+
virtualPath,
|
|
28
|
+
};
|
|
29
|
+
}
|