@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.
|
|
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.
|
|
134
|
-
"@solidjs/web": ">=2.0.0-rc.
|
|
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.
|
|
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.
|
|
144
|
+
"solid-js": ">=2.0.0-rc.13",
|
|
145
145
|
"tailwindcss": ">=4.0.0",
|
|
146
146
|
"vite": ">=8.0.0"
|
|
147
147
|
},
|
package/src/components/index.ts
CHANGED
|
@@ -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,
|
|
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
|
}
|
package/src/direction/index.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createContext, createEffect, createSignal,
|
|
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 ||
|
|
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. */
|
package/src/generators/index.ts
CHANGED
|
@@ -1210,7 +1210,7 @@ export function generateRouteRegistry(
|
|
|
1210
1210
|
}
|
|
1211
1211
|
|
|
1212
1212
|
if (hasServer) {
|
|
1213
|
-
lines.push(`\t\tenv:
|
|
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) {
|
package/src/lazy/index.tsx
CHANGED
|
@@ -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,
|
|
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 ||
|
|
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 ||
|
|
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;
|
package/src/server/index.ts
CHANGED
|
@@ -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()
|
|
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:
|
|
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?:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
}
|
package/src/theme/index.tsx
CHANGED
|
@@ -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 ||
|
|
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.
|