@lovrozagar/flare 0.5.0 → 0.6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovrozagar/flare",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Solid meta-framework. Server-driven, NDJSON streaming, renderToStream.",
5
5
  "keywords": [
6
6
  "flare",
@@ -130,10 +130,10 @@
130
130
  "peerDependencies": {
131
131
  "@babel/parser": ">=8.0.0",
132
132
  "@formatjs/intl-localematcher": ">=0.6.0",
133
- "@solidjs/vite-plugin": ">=3.0.0-next.0",
134
- "@solidjs/web": ">=2.0.0-rc.0",
133
+ "@solidjs/vite-plugin": ">=3.0.0-next.47",
134
+ "@solidjs/web": ">=2.0.0-rc.13",
135
135
  "@tanstack/query-broadcast-client-experimental": ">=5.0.0",
136
- "@tanstack/solid-query": ">=6.0.0-rc.0",
136
+ "@tanstack/solid-query": ">=6.0.0-rc.5",
137
137
  "isbot": ">=5.0.0",
138
138
  "magic-string": ">=0.30.0",
139
139
  "negotiator": ">=1.0.0",
@@ -141,7 +141,7 @@
141
141
  "oxc-parser": ">=0.139.0",
142
142
  "oxc-resolver": ">=11.23.0",
143
143
  "sharp": ">=0.33.0",
144
- "solid-js": ">=2.0.0-rc.0",
144
+ "solid-js": ">=2.0.0-rc.13",
145
145
  "tailwindcss": ">=4.0.0",
146
146
  "vite": ">=8.0.0"
147
147
  },
@@ -11,7 +11,7 @@ export {
11
11
  } from "./await.tsx";
12
12
  export { DirectionScript, type DirectionScriptProps } from "./direction-script.tsx";
13
13
  export { ResetCSS } from "./reset-css.tsx";
14
- export { SSRContextProvider, type SSRContextValue, setSSRContext, useSSRContext } from "./ssr-context.tsx";
14
+ export { SSRContextProvider, type SSRContextValue, useSSRContext } from "./ssr-context.tsx";
15
15
  export { ThemeScript, type ThemeScriptProps } from "./theme-script.tsx";
16
16
  export { ViewTransitionCSS, type ViewTransitionCSSProps } from "./view-transition-css.tsx";
17
17
 
@@ -18,9 +18,6 @@ export interface SSRContextValue {
18
18
 
19
19
  const SSRCtx = createContext<SSRContextValue | null>(null);
20
20
 
21
- /** @deprecated Wrap the tree with SSRContextProvider. Solid 2 has no sharedConfig.context. */
22
- export function setSSRContext(_value: SSRContextValue): void {}
23
-
24
21
  export function useSSRContext(): SSRContextValue | undefined {
25
22
  return useContext(SSRCtx) ?? undefined;
26
23
  }
@@ -1,4 +1,4 @@
1
- import { createContext, createEffect, createSignal, onSettled, sharedConfig, untrack, useContext } from "solid-js";
1
+ import { createContext, createEffect, createSignal, isHydrating, onSettled, untrack, useContext } from "solid-js";
2
2
  import { isServer, type JSX } from "@solidjs/web";
3
3
 
4
4
  export type Direction = "ltr" | "rtl";
@@ -61,7 +61,7 @@ export function DirectionProvider(props: { children: JSX.Element; config?: Direc
61
61
  storageKey: props.config?.storageKey ?? DEFAULT_CONFIG.storageKey,
62
62
  };
63
63
 
64
- const hydrating = isServer || !!sharedConfig.hydrating;
64
+ const hydrating = isServer || isHydrating();
65
65
 
66
66
  /* During SSR + hydration, start from defaultDir so the tree matches.
67
67
  DirectionScript already applied localStorage to <html> before first paint. */
@@ -1210,7 +1210,7 @@ export function generateRouteRegistry(
1210
1210
  }
1211
1211
 
1212
1212
  if (hasServer) {
1213
- lines.push(`\t\tenv: Parameters<typeof _FlareHandler["fetch"]>[1]`);
1213
+ lines.push(`\t\tenv: NonNullable<(typeof _FlareHandler)["~flare"]>["env"]`);
1214
1214
  lines.push(`\t\tserverContext: NonNullable<(typeof _FlareHandler)["~flare"]>["serverContext"]`);
1215
1215
  }
1216
1216
  if (hasQueryClient) {
@@ -1,6 +1,6 @@
1
1
  import type { JSX } from "@solidjs/web";
2
2
  import { Dynamic, isServer } from "@solidjs/web";
3
- import { type Component, createSignal, onSettled, Show, sharedConfig, untrack } from "solid-js";
3
+ import { type Component, createSignal, isHydrating, onSettled, Show, untrack } from "solid-js";
4
4
  import { retryImport } from "../internal.ts";
5
5
  import { warn } from "../logger.ts";
6
6
  import { GLOBAL_LAZY_LOADED, GLOBAL_LAZY_PENDING } from "../protocol.ts";
@@ -56,7 +56,7 @@ export function lazy<P extends Record<string, unknown>>(options: LazyOptions<P>)
56
56
  getGlobalPending().add(loadPromise);
57
57
 
58
58
  return ((props: P) => {
59
- const isSSR = isServer || !!sharedConfig.hydrating;
59
+ const isSSR = isServer || isHydrating();
60
60
 
61
61
  /* Pre-known error at render time → throw from component body */
62
62
  if (loadError) throw loadError;
@@ -116,7 +116,7 @@ export function clientLazy<P extends Record<string, unknown>>(
116
116
  }
117
117
 
118
118
  return ((props: P & { pending?: Component<P> }) => {
119
- const isSSR = isServer || !!sharedConfig.hydrating;
119
+ const isSSR = isServer || isHydrating();
120
120
 
121
121
  /* Pre-known error at render time → throw from component body */
122
122
  if (loadError) throw loadError;
@@ -43,53 +43,54 @@ export interface ServerBuilder<
43
43
  TExcluded extends string = never,
44
44
  TAuth = unknown,
45
45
  TServerContext = Record<string, unknown>,
46
+ TEnv = unknown,
46
47
  > {
47
- /** Type-only: what `.authenticateFn()` and `.serverContext()` resolve to. Generated route types read it. */
48
- readonly "~flare"?: { auth: TAuth; serverContext: TServerContext };
48
+ /** Type-only: what `.authenticateFn()`, `.serverContext()`, and `createServer<TEnv>()` resolve to. Generated route types read it. */
49
+ readonly "~flare"?: { auth: TAuth; env: TEnv; serverContext: TServerContext };
49
50
  authenticateFn: "authenticateFn" extends TExcluded
50
51
  ? never
51
52
  : <TNewAuth>(
52
53
  fn: (ctx: {
53
54
  callerData?: unknown[];
54
- env: unknown;
55
+ env: TEnv;
55
56
  request: Request;
56
57
  serverContext: Record<string, unknown>;
57
58
  url: URL;
58
59
  }) => TNewAuth | null | Promise<TNewAuth | null>,
59
- ) => ServerBuilder<TExcluded | "authenticateFn", TNewAuth, TServerContext>;
60
+ ) => ServerBuilder<TExcluded | "authenticateFn", TNewAuth, TServerContext, TEnv>;
60
61
  cache: "cache" extends TExcluded
61
62
  ? never
62
- : (config: HandlerCacheConfig) => ServerBuilder<TExcluded | "cache", TAuth, TServerContext>;
63
- fetch(request: Request, env?: unknown, ctx?: { waitUntil?: (p: Promise<unknown>) => void }): Promise<Response>;
63
+ : (config: HandlerCacheConfig) => ServerBuilder<TExcluded | "cache", TAuth, TServerContext, TEnv>;
64
+ fetch(request: Request, env?: TEnv, ctx?: { waitUntil?: (p: Promise<unknown>) => void }): Promise<Response>;
64
65
  getStaticParams(): Promise<StaticParamsMap>;
65
66
  keepalive: "keepalive" extends TExcluded
66
67
  ? never
67
- : (config: KeepaliveConfig) => ServerBuilder<TExcluded | "keepalive", TAuth, TServerContext>;
68
- mount(prefix: string, target: MountTarget): ServerBuilder<TExcluded, TAuth, TServerContext>;
68
+ : (config: KeepaliveConfig) => ServerBuilder<TExcluded | "keepalive", TAuth, TServerContext, TEnv>;
69
+ mount(prefix: string, target: MountTarget): ServerBuilder<TExcluded, TAuth, TServerContext, TEnv>;
69
70
  security: "security" extends TExcluded
70
71
  ? never
71
72
  : (
72
73
  config:
73
74
  | SecurityConfig
74
75
  | ((ctx: {
75
- env: unknown;
76
+ env: TEnv;
76
77
  nonce: string;
77
78
  request: Request;
78
79
  serverContext: Record<string, unknown>;
79
80
  }) => SecurityConfig),
80
- ) => ServerBuilder<TExcluded | "security", TAuth, TServerContext>;
81
+ ) => ServerBuilder<TExcluded | "security", TAuth, TServerContext, TEnv>;
81
82
  serverContext: "serverContext" extends TExcluded
82
83
  ? never
83
84
  : <T extends Record<string, unknown>>(
84
- fn: (ctx: { env: unknown; request: Request }) => T | Promise<T>,
85
- ) => ServerBuilder<TExcluded | "serverContext", TAuth, T>;
85
+ fn: (ctx: { env: TEnv; request: Request }) => T | Promise<T>,
86
+ ) => ServerBuilder<TExcluded | "serverContext", TAuth, T, TEnv>;
86
87
  sitemap: "sitemap" extends TExcluded
87
88
  ? never
88
- : (config: SitemapSubmitConfig) => ServerBuilder<TExcluded | "sitemap", TAuth, TServerContext>;
89
+ : (config: SitemapSubmitConfig) => ServerBuilder<TExcluded | "sitemap", TAuth, TServerContext, TEnv>;
89
90
  tracing: "tracing" extends TExcluded
90
91
  ? never
91
- : (config: TracingConfig) => ServerBuilder<TExcluded | "tracing", TAuth, TServerContext>;
92
- use(...args: (FlareMiddleware | PathMatcher | string)[]): ServerBuilder<TExcluded, TAuth, TServerContext>;
92
+ : (config: TracingConfig) => ServerBuilder<TExcluded | "tracing", TAuth, TServerContext, TEnv>;
93
+ use(...args: (FlareMiddleware | PathMatcher | string)[]): ServerBuilder<TExcluded, TAuth, TServerContext, TEnv>;
93
94
  }
94
95
 
95
96
  /* Internal implementation type — no exclusion tracking */
@@ -155,7 +156,10 @@ function bindWaitUntil(ctx?: {
155
156
  };
156
157
  }
157
158
 
158
- export function createServer(router: MarkedRouterConfig): ServerBuilder {
159
+ /** `TEnv` is the worker env (`createServer<Cloudflare.Env>(router)`); it types `ctx.env` here and in every route. */
160
+ export function createServer<TEnv = unknown>(
161
+ router: MarkedRouterConfig,
162
+ ): ServerBuilder<never, unknown, Record<string, unknown>, TEnv> {
159
163
  const middlewareEntries: MiddlewareEntry[] = [];
160
164
  const mountConfigs: MountConfig[] = [];
161
165
  let authenticateFn: ServerHandlerConfig["authenticateFn"];
@@ -293,5 +297,5 @@ export function createServer(router: MarkedRouterConfig): ServerBuilder {
293
297
  },
294
298
  };
295
299
 
296
- return builder as ServerBuilder;
300
+ return builder as ServerBuilder<never, unknown, Record<string, unknown>, TEnv>;
297
301
  }
@@ -3,8 +3,8 @@ import {
3
3
  createEffect,
4
4
  createMemo,
5
5
  createSignal,
6
+ isHydrating,
6
7
  onSettled,
7
- sharedConfig,
8
8
  untrack,
9
9
  useContext,
10
10
  } from "solid-js";
@@ -68,7 +68,7 @@ export function ThemeProvider(props: { children: JSX.Element; config?: ThemeConf
68
68
  themes: props.config?.themes ?? DEFAULT_CONFIG.themes,
69
69
  };
70
70
 
71
- const hydrating = isServer || !!sharedConfig.hydrating;
71
+ const hydrating = isServer || isHydrating();
72
72
 
73
73
  /* During SSR + hydration, always start from defaultTheme so the tree matches.
74
74
  ThemeScript already applied localStorage to <html> before first paint.