fibrae 0.2.2 → 0.3.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/dist/cli/build.d.ts +34 -0
- package/dist/cli/build.js +92 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/cli.d.ts +10 -0
- package/dist/cli/cli.js +43 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.js +5 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/html.d.ts +13 -0
- package/dist/cli/html.js +101 -0
- package/dist/cli/html.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/vite-plugin.d.ts +9 -0
- package/dist/cli/vite-plugin.js +143 -0
- package/dist/cli/vite-plugin.js.map +1 -0
- package/dist/components.d.ts +27 -29
- package/dist/components.js +32 -52
- package/dist/components.js.map +1 -1
- package/dist/core.js +7 -10
- package/dist/core.js.map +1 -1
- package/dist/dom.d.ts +13 -4
- package/dist/dom.js +91 -26
- package/dist/dom.js.map +1 -1
- package/dist/fiber-boundary.d.ts +39 -0
- package/dist/fiber-boundary.js +151 -0
- package/dist/fiber-boundary.js.map +1 -0
- package/dist/fiber-commit.d.ts +27 -0
- package/dist/fiber-commit.js +243 -0
- package/dist/fiber-commit.js.map +1 -0
- package/dist/fiber-render.d.ts +9 -9
- package/dist/fiber-render.js +165 -958
- package/dist/fiber-render.js.map +1 -1
- package/dist/fiber-tree.d.ts +77 -0
- package/dist/fiber-tree.js +152 -0
- package/dist/fiber-tree.js.map +1 -0
- package/dist/fiber-update.d.ts +46 -0
- package/dist/fiber-update.js +515 -0
- package/dist/fiber-update.js.map +1 -0
- package/dist/h.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime/index.d.ts +253 -2
- package/dist/live/atom.d.ts +31 -0
- package/dist/live/atom.js +33 -0
- package/dist/live/atom.js.map +1 -0
- package/dist/live/client.d.ts +50 -0
- package/dist/live/client.js +90 -0
- package/dist/live/client.js.map +1 -0
- package/dist/live/codec.d.ts +39 -0
- package/dist/live/codec.js +41 -0
- package/dist/live/codec.js.map +1 -0
- package/dist/live/config.d.ts +13 -0
- package/dist/live/config.js +11 -0
- package/dist/live/config.js.map +1 -0
- package/dist/live/index.d.ts +25 -0
- package/dist/live/index.js +19 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/server.d.ts +83 -0
- package/dist/live/server.js +106 -0
- package/dist/live/server.js.map +1 -0
- package/dist/live/sse-stream.d.ts +14 -0
- package/dist/live/sse-stream.js +30 -0
- package/dist/live/sse-stream.js.map +1 -0
- package/dist/live/types.d.ts +40 -0
- package/dist/live/types.js +20 -0
- package/dist/live/types.js.map +1 -0
- package/dist/router/History.d.ts +2 -2
- package/dist/router/History.js.map +1 -1
- package/dist/router/Link.d.ts +8 -4
- package/dist/router/Link.js +13 -34
- package/dist/router/Link.js.map +1 -1
- package/dist/router/Navigator.d.ts +12 -1
- package/dist/router/Navigator.js +31 -68
- package/dist/router/Navigator.js.map +1 -1
- package/dist/router/Route.d.ts +16 -3
- package/dist/router/Route.js +32 -25
- package/dist/router/Route.js.map +1 -1
- package/dist/router/Router.d.ts +27 -19
- package/dist/router/Router.js +78 -101
- package/dist/router/Router.js.map +1 -1
- package/dist/router/RouterBuilder.d.ts +106 -34
- package/dist/router/RouterBuilder.js +78 -39
- package/dist/router/RouterBuilder.js.map +1 -1
- package/dist/router/RouterOutlet.d.ts +1 -18
- package/dist/router/RouterOutlet.js +25 -8
- package/dist/router/RouterOutlet.js.map +1 -1
- package/dist/router/RouterState.d.ts +1 -1
- package/dist/router/index.d.ts +4 -4
- package/dist/router/index.js +4 -2
- package/dist/router/index.js.map +1 -1
- package/dist/router/utils.d.ts +36 -0
- package/dist/router/utils.js +48 -0
- package/dist/router/utils.js.map +1 -0
- package/dist/runtime.d.ts +10 -7
- package/dist/runtime.js +20 -2
- package/dist/runtime.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +15 -29
- package/dist/server.js.map +1 -1
- package/dist/shared.d.ts +58 -59
- package/dist/shared.js +51 -13
- package/dist/shared.js.map +1 -1
- package/dist/tracking.d.ts +4 -3
- package/dist/tracking.js +6 -1
- package/dist/tracking.js.map +1 -1
- package/package.json +32 -7
- package/dist/hydration.d.ts +0 -30
- package/dist/hydration.js +0 -355
- package/dist/hydration.js.map +0 -1
- package/dist/render.d.ts +0 -19
- package/dist/render.js +0 -285
- package/dist/render.js.map +0 -1
- package/dist/scope-utils.d.ts +0 -14
- package/dist/scope-utils.js +0 -29
- package/dist/scope-utils.js.map +0 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
* Server-side LiveSync — polls an Effect source, diffs, and streams via SSE.
|
|
4
|
+
*/
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { HttpServerResponse } from "@effect/platform";
|
|
7
|
+
import type { DurationInput } from "effect/Duration";
|
|
8
|
+
import type { LiveChannel } from "./types.js";
|
|
9
|
+
import { type LiveAtom } from "./atom.js";
|
|
10
|
+
/**
|
|
11
|
+
* Options for `serve()`.
|
|
12
|
+
*
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export interface ServeOptions<A, R> {
|
|
16
|
+
/** Effect that fetches the current state from the upstream source. */
|
|
17
|
+
readonly source: Effect.Effect<A, never, R>;
|
|
18
|
+
/** Polling interval. Accepts Duration or duration string (e.g. "2 seconds"). */
|
|
19
|
+
readonly interval?: DurationInput;
|
|
20
|
+
/**
|
|
21
|
+
* Custom equality function for deduplication. Defaults to `Equal.equals`.
|
|
22
|
+
* Set to `false` to disable deduplication entirely.
|
|
23
|
+
*
|
|
24
|
+
* Note: `Equal.equals` uses structural equality for Effect `Data` types
|
|
25
|
+
* and reference equality (`Object.is`) for plain objects. If your source
|
|
26
|
+
* returns plain objects, pass a custom equality function.
|
|
27
|
+
*/
|
|
28
|
+
readonly equals?: ((a: A, b: A) => boolean) | false;
|
|
29
|
+
/** Interval for SSE keepalive comments. Set to false to disable. Defaults to "30 seconds". */
|
|
30
|
+
readonly heartbeatInterval?: DurationInput | false;
|
|
31
|
+
/** SSE retry interval sent to client for reconnection timing. */
|
|
32
|
+
readonly retryInterval?: DurationInput;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create an SSE request handler for a single LiveChannel.
|
|
36
|
+
*
|
|
37
|
+
* Returns an `Effect` that produces an `HttpServerResponse` with a
|
|
38
|
+
* streaming body. The source Effect's `R` requirement propagates
|
|
39
|
+
* so the caller provides dependencies via `Effect.provide`.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const handler = LiveSync.serve(LightsChannel, {
|
|
44
|
+
* source: bridge.get("/lights").pipe(Effect.map(dictToArray)),
|
|
45
|
+
* interval: "2 seconds",
|
|
46
|
+
* })
|
|
47
|
+
* HttpRouter.get("/api/live", handler)
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @since 1.0.0
|
|
51
|
+
*/
|
|
52
|
+
export declare const serve: <A, I, R>(channel: LiveChannel<A, I> | LiveAtom<A, I>, options: ServeOptions<A, R>) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, R>;
|
|
53
|
+
/**
|
|
54
|
+
* Options for a single channel within `serveGroup()`.
|
|
55
|
+
*
|
|
56
|
+
* @since 1.0.0
|
|
57
|
+
*/
|
|
58
|
+
export interface ServeGroupChannelOptions<A, I, R> {
|
|
59
|
+
readonly channel: LiveChannel<A, I> | LiveAtom<A, I>;
|
|
60
|
+
readonly source: Effect.Effect<A, never, R>;
|
|
61
|
+
readonly interval?: DurationInput;
|
|
62
|
+
/**
|
|
63
|
+
* Custom equality function for deduplication. Defaults to `Equal.equals`.
|
|
64
|
+
* Set to `false` to disable deduplication entirely.
|
|
65
|
+
*/
|
|
66
|
+
readonly equals?: ((a: A, b: A) => boolean) | false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create an SSE handler that multiplexes multiple channels over one connection.
|
|
70
|
+
*
|
|
71
|
+
* Each channel polls independently at its own interval. Events are tagged
|
|
72
|
+
* with `event: <channel.name>` so the client can dispatch to the correct atom.
|
|
73
|
+
* All events share a monotonic `id:` counter across channels.
|
|
74
|
+
*
|
|
75
|
+
* @since 1.0.0
|
|
76
|
+
*/
|
|
77
|
+
export declare const serveGroup: <Channels extends readonly ServeGroupChannelOptions<any, any, any>[]>(options: {
|
|
78
|
+
readonly channels: Channels;
|
|
79
|
+
/** Interval for SSE keepalive comments. Set to false to disable. Defaults to "30 seconds". */
|
|
80
|
+
readonly heartbeatInterval?: false | DurationInput | undefined;
|
|
81
|
+
/** SSE retry interval sent to client for reconnection timing. */
|
|
82
|
+
readonly retryInterval?: DurationInput | undefined;
|
|
83
|
+
}) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, Channels[number] extends ServeGroupChannelOptions<any, any, infer R> ? R : never>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
* Server-side LiveSync — polls an Effect source, diffs, and streams via SSE.
|
|
4
|
+
*/
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Stream from "effect/Stream";
|
|
7
|
+
import * as Schedule from "effect/Schedule";
|
|
8
|
+
import * as Schema from "effect/Schema";
|
|
9
|
+
import * as Equal from "effect/Equal";
|
|
10
|
+
import * as Ref from "effect/Ref";
|
|
11
|
+
import * as Duration from "effect/Duration";
|
|
12
|
+
import { HttpServerResponse } from "@effect/platform";
|
|
13
|
+
import { isLiveAtom } from "./atom.js";
|
|
14
|
+
import { encodeSSE, encodeComment, encodeRetry, SSE_HEADERS } from "./codec.js";
|
|
15
|
+
/** Extract event name and schema from a LiveChannel or LiveAtom */
|
|
16
|
+
const resolveChannel = (channelOrAtom) => {
|
|
17
|
+
if (isLiveAtom(channelOrAtom)) {
|
|
18
|
+
const atom = channelOrAtom;
|
|
19
|
+
return { name: atom._live.event, schema: atom._live.schema };
|
|
20
|
+
}
|
|
21
|
+
const ch = channelOrAtom;
|
|
22
|
+
return { name: ch.name, schema: ch.schema };
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Create an SSE request handler for a single LiveChannel.
|
|
26
|
+
*
|
|
27
|
+
* Returns an `Effect` that produces an `HttpServerResponse` with a
|
|
28
|
+
* streaming body. The source Effect's `R` requirement propagates
|
|
29
|
+
* so the caller provides dependencies via `Effect.provide`.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const handler = LiveSync.serve(LightsChannel, {
|
|
34
|
+
* source: bridge.get("/lights").pipe(Effect.map(dictToArray)),
|
|
35
|
+
* interval: "2 seconds",
|
|
36
|
+
* })
|
|
37
|
+
* HttpRouter.get("/api/live", handler)
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @since 1.0.0
|
|
41
|
+
*/
|
|
42
|
+
export const serve = (channel, options) => {
|
|
43
|
+
const { name, schema } = resolveChannel(channel);
|
|
44
|
+
const interval = options.interval ?? "2 seconds";
|
|
45
|
+
const eq = options.equals !== undefined ? options.equals : (a, b) => Equal.equals(a, b);
|
|
46
|
+
const heartbeatInterval = options.heartbeatInterval ?? "30 seconds";
|
|
47
|
+
return Effect.gen(function* () {
|
|
48
|
+
const context = yield* Effect.context();
|
|
49
|
+
const idRef = yield* Ref.make(0);
|
|
50
|
+
const pollStream = Stream.repeatEffect(options.source).pipe(Stream.schedule(Schedule.spaced(interval)));
|
|
51
|
+
const deduped = eq !== false ? pollStream.pipe(Stream.changesWith(eq)) : pollStream;
|
|
52
|
+
const dataStream = deduped.pipe(Stream.mapEffect((value) => Schema.encode(schema)(value).pipe(Effect.orDie)), Stream.mapEffect((encoded) => Ref.getAndUpdate(idRef, (n) => n + 1).pipe(Effect.map((id) => encodeSSE(name, encoded, String(id))))));
|
|
53
|
+
const heartbeat = heartbeatInterval === false
|
|
54
|
+
? Stream.empty
|
|
55
|
+
: Stream.repeatEffect(Effect.succeed(encodeComment("ping"))).pipe(Stream.schedule(Schedule.spaced(heartbeatInterval)));
|
|
56
|
+
const retry = options.retryInterval !== undefined
|
|
57
|
+
? Stream.make(encodeRetry(Duration.toMillis(options.retryInterval)))
|
|
58
|
+
: Stream.empty;
|
|
59
|
+
const sseStream = Stream.mergeAll([retry, dataStream, heartbeat], {
|
|
60
|
+
concurrency: "unbounded",
|
|
61
|
+
}).pipe(Stream.provideContext(context));
|
|
62
|
+
// cast needed: effect/platform's StreamTypeId symbol differs from our effect version
|
|
63
|
+
return HttpServerResponse.stream(sseStream, {
|
|
64
|
+
contentType: "text/event-stream",
|
|
65
|
+
headers: SSE_HEADERS,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Create an SSE handler that multiplexes multiple channels over one connection.
|
|
71
|
+
*
|
|
72
|
+
* Each channel polls independently at its own interval. Events are tagged
|
|
73
|
+
* with `event: <channel.name>` so the client can dispatch to the correct atom.
|
|
74
|
+
* All events share a monotonic `id:` counter across channels.
|
|
75
|
+
*
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
*/
|
|
78
|
+
export const serveGroup = (options) => Effect.gen(function* () {
|
|
79
|
+
const context = yield* Effect.context();
|
|
80
|
+
const heartbeatInterval = options.heartbeatInterval ?? "30 seconds";
|
|
81
|
+
const idRef = yield* Ref.make(0);
|
|
82
|
+
const channelStreams = options.channels.map((opt) => {
|
|
83
|
+
const { name, schema } = resolveChannel(opt.channel);
|
|
84
|
+
const pollInterval = opt.interval ?? "2 seconds";
|
|
85
|
+
const eq = opt.equals !== undefined ? opt.equals : (a, b) => Equal.equals(a, b);
|
|
86
|
+
const pollStream = Stream.repeatEffect(opt.source).pipe(Stream.schedule(Schedule.spaced(pollInterval)));
|
|
87
|
+
const deduped = eq !== false ? pollStream.pipe(Stream.changesWith(eq)) : pollStream;
|
|
88
|
+
return deduped.pipe(Stream.mapEffect((value) => Schema.encode(schema)(value).pipe(Effect.orDie)), Stream.mapEffect((encoded) => Ref.getAndUpdate(idRef, (n) => n + 1).pipe(Effect.map((id) => encodeSSE(name, encoded, String(id))))));
|
|
89
|
+
});
|
|
90
|
+
const dataStream = Stream.mergeAll(channelStreams, { concurrency: "unbounded" });
|
|
91
|
+
const heartbeat = heartbeatInterval === false
|
|
92
|
+
? Stream.empty
|
|
93
|
+
: Stream.repeatEffect(Effect.succeed(encodeComment("ping"))).pipe(Stream.schedule(Schedule.spaced(heartbeatInterval)));
|
|
94
|
+
const retry = options.retryInterval !== undefined
|
|
95
|
+
? Stream.make(encodeRetry(Duration.toMillis(options.retryInterval)))
|
|
96
|
+
: Stream.empty;
|
|
97
|
+
const sseStream = Stream.mergeAll([retry, dataStream, heartbeat], {
|
|
98
|
+
concurrency: "unbounded",
|
|
99
|
+
}).pipe(Stream.provideContext(context));
|
|
100
|
+
// cast needed: effect/platform's StreamTypeId symbol differs from our effect version
|
|
101
|
+
return HttpServerResponse.stream(sseStream, {
|
|
102
|
+
contentType: "text/event-stream",
|
|
103
|
+
headers: SSE_HEADERS,
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/live/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as Stream from "effect/Stream";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
/**
|
|
4
|
+
* Create an Effect Stream from a Server-Sent Events endpoint.
|
|
5
|
+
*
|
|
6
|
+
* Each emission is a decoded value of type `A`. The stream
|
|
7
|
+
* stays open until the scope is closed (component unmounts).
|
|
8
|
+
*/
|
|
9
|
+
export declare const sseStream: <A, I>(options: {
|
|
10
|
+
readonly url: string;
|
|
11
|
+
readonly event: string;
|
|
12
|
+
readonly schema: Schema.Schema<A, I, never>;
|
|
13
|
+
readonly withCredentials?: boolean | undefined;
|
|
14
|
+
}) => Stream.Stream<A, never, never>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Stream from "effect/Stream";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Schema from "effect/Schema";
|
|
4
|
+
/**
|
|
5
|
+
* Create an Effect Stream from a Server-Sent Events endpoint.
|
|
6
|
+
*
|
|
7
|
+
* Each emission is a decoded value of type `A`. The stream
|
|
8
|
+
* stays open until the scope is closed (component unmounts).
|
|
9
|
+
*/
|
|
10
|
+
export const sseStream = (options) => {
|
|
11
|
+
const decode = Schema.decodeUnknownSync(Schema.parseJson(options.schema));
|
|
12
|
+
return Stream.async((emit) => {
|
|
13
|
+
const es = new EventSource(options.url, {
|
|
14
|
+
withCredentials: options.withCredentials ?? false,
|
|
15
|
+
});
|
|
16
|
+
es.addEventListener(options.event, (e) => {
|
|
17
|
+
try {
|
|
18
|
+
emit.single(decode(e.data));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Decode errors are silently skipped — atom stays at previous value
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
es.onerror = () => {
|
|
25
|
+
// EventSource auto-reconnects; don't end the stream
|
|
26
|
+
};
|
|
27
|
+
return Effect.sync(() => es.close());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=sse-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-stream.js","sourceRoot":"","sources":["../../src/live/sse-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAO,OAK/B,EAAkC,EAAE;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1E,OAAO,MAAM,CAAC,KAAK,CAAI,CAAC,IAAI,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;YACtC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,KAAK;SAClD,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAe,EAAE,EAAE;YACrD,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,oEAAoE;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;YAChB,oDAAoD;QACtD,CAAC,CAAC;QAEF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
* LiveChannel — shared definition imported by both server and client.
|
|
4
|
+
*/
|
|
5
|
+
import type * as Schema from "effect/Schema";
|
|
6
|
+
import type { Atom } from "@effect-atom/atom";
|
|
7
|
+
/**
|
|
8
|
+
* A LiveChannel defines a named server→client sync point:
|
|
9
|
+
* - `name`: SSE event name (used as `event:` field)
|
|
10
|
+
* - `schema`: Effect Schema for type-safe encode/decode over the wire
|
|
11
|
+
* - `atom`: Writable atom that the client updates on each SSE event
|
|
12
|
+
*
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export interface LiveChannel<A, I = A> {
|
|
16
|
+
readonly _tag: "LiveChannel";
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly schema: Schema.Schema<A, I>;
|
|
19
|
+
readonly atom: Atom.Writable<A>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Construct a LiveChannel.
|
|
23
|
+
*
|
|
24
|
+
* @deprecated Use `live()` to create live atoms instead.
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const LightsChannel = LiveSync.channel({
|
|
28
|
+
* name: "lights",
|
|
29
|
+
* schema: Schema.Array(Light),
|
|
30
|
+
* atom: LightsAtom,
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
*/
|
|
36
|
+
export declare const channel: <A, I>(opts: {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly schema: Schema.Schema<A, I, never>;
|
|
39
|
+
readonly atom: Atom.Writable<A, A>;
|
|
40
|
+
}) => LiveChannel<A, I>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Construct a LiveChannel.
|
|
3
|
+
*
|
|
4
|
+
* @deprecated Use `live()` to create live atoms instead.
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* const LightsChannel = LiveSync.channel({
|
|
8
|
+
* name: "lights",
|
|
9
|
+
* schema: Schema.Array(Light),
|
|
10
|
+
* atom: LightsAtom,
|
|
11
|
+
* })
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export const channel = (opts) => ({
|
|
17
|
+
_tag: "LiveChannel",
|
|
18
|
+
...opts,
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/live/types.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAO,IAI7B,EAAqB,EAAE,CAAC,CAAC;IACxB,IAAI,EAAE,aAAsB;IAC5B,GAAG,IAAI;CACR,CAAC,CAAC"}
|
package/dist/router/History.d.ts
CHANGED
|
@@ -109,11 +109,11 @@ export declare const getLocation: Effect.Effect<HistoryLocation, never, History
|
|
|
109
109
|
/**
|
|
110
110
|
* Push a new location.
|
|
111
111
|
*/
|
|
112
|
-
export declare const push: (path: string, state?: unknown) => Effect.Effect<void, never,
|
|
112
|
+
export declare const push: (path: string, state?: unknown) => Effect.Effect<void, never, AtomRegistry.AtomRegistry | History>;
|
|
113
113
|
/**
|
|
114
114
|
* Replace current location.
|
|
115
115
|
*/
|
|
116
|
-
export declare const replace: (path: string, state?: unknown) => Effect.Effect<void, never,
|
|
116
|
+
export declare const replace: (path: string, state?: unknown) => Effect.Effect<void, never, AtomRegistry.AtomRegistry | History>;
|
|
117
117
|
/**
|
|
118
118
|
* Go back in history.
|
|
119
119
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/router/History.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/router/History.ts"],"names":[],"mappings":"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"}
|
package/dist/router/Link.d.ts
CHANGED
|
@@ -17,10 +17,11 @@ import type { Router } from "./Router.js";
|
|
|
17
17
|
import type { VElement, VChild } from "../shared.js";
|
|
18
18
|
/**
|
|
19
19
|
* Props for the Link component.
|
|
20
|
+
* RouteNames constrains `to` to valid route names when created via createLink.
|
|
20
21
|
*/
|
|
21
|
-
export interface LinkProps {
|
|
22
|
-
/** Route name to navigate to */
|
|
23
|
-
readonly to:
|
|
22
|
+
export interface LinkProps<RouteNames extends string = string> {
|
|
23
|
+
/** Route name to navigate to — constrained to valid route names */
|
|
24
|
+
readonly to: RouteNames;
|
|
24
25
|
/** Path parameters for the route */
|
|
25
26
|
readonly params?: Record<string, unknown>;
|
|
26
27
|
/** Search/query parameters */
|
|
@@ -43,10 +44,13 @@ export interface LinkProps {
|
|
|
43
44
|
* - Building hrefs from route names
|
|
44
45
|
* - Checking active state
|
|
45
46
|
*
|
|
47
|
+
* The returned Link component constrains `to` to the router's valid route names.
|
|
48
|
+
*
|
|
46
49
|
* Usage:
|
|
47
50
|
* ```typescript
|
|
48
51
|
* const Link = createLink(appRouter);
|
|
49
52
|
* <Link to="posts" params={{ id: 123 }}>View Post</Link>
|
|
53
|
+
* // <Link to="typo" /> — compile-time error!
|
|
50
54
|
* ```
|
|
51
55
|
*/
|
|
52
|
-
export declare function createLink(router: Router): (props: LinkProps) => Effect.Effect<VElement, never,
|
|
56
|
+
export declare function createLink<RouteNames extends string>(router: Router<string, RouteNames>): (props: LinkProps<RouteNames>) => Effect.Effect<VElement, never, AtomRegistry.AtomRegistry | Navigator>;
|
package/dist/router/Link.js
CHANGED
|
@@ -14,46 +14,22 @@ import * as Effect from "effect/Effect";
|
|
|
14
14
|
import * as Option from "effect/Option";
|
|
15
15
|
import { Atom, Registry as AtomRegistry } from "@effect-atom/atom";
|
|
16
16
|
import { Navigator } from "./Navigator.js";
|
|
17
|
+
import { findRouteByName, groupBasePath, buildSearchString } from "./utils.js";
|
|
17
18
|
// =============================================================================
|
|
18
19
|
// Helpers
|
|
19
20
|
// =============================================================================
|
|
20
|
-
/**
|
|
21
|
-
* Find a route by name in the router.
|
|
22
|
-
*/
|
|
23
|
-
function findRouteByName(router, name) {
|
|
24
|
-
for (const group of router.groups) {
|
|
25
|
-
for (const route of group.routes) {
|
|
26
|
-
if (route.name === name) {
|
|
27
|
-
return Option.some(route);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return Option.none();
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Build search string from params object.
|
|
35
|
-
*/
|
|
36
|
-
function buildSearchString(params) {
|
|
37
|
-
const searchParams = new URLSearchParams();
|
|
38
|
-
for (const [key, value] of Object.entries(params)) {
|
|
39
|
-
if (value !== undefined && value !== null) {
|
|
40
|
-
searchParams.set(key, String(value));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const str = searchParams.toString();
|
|
44
|
-
return str ? `?${str}` : "";
|
|
45
|
-
}
|
|
46
21
|
/**
|
|
47
22
|
* Build the href for a route with params.
|
|
23
|
+
* Returns Effect since route.interpolate is effectful.
|
|
48
24
|
*/
|
|
49
25
|
function buildHref(router, routeName, params, search, basePath = "") {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
26
|
+
return findRouteByName(router, routeName).pipe(Option.match({
|
|
27
|
+
onNone: () => Effect.succeed("#"),
|
|
28
|
+
onSome: ({ route, group }) => route.interpolate(params ?? {}).pipe(Effect.map((pathname) => {
|
|
29
|
+
const searchString = search ? buildSearchString(search) : "";
|
|
30
|
+
return `${basePath}${groupBasePath(group)}${pathname}${searchString}`;
|
|
31
|
+
}), Effect.catchAll(() => Effect.succeed("#"))),
|
|
32
|
+
}));
|
|
57
33
|
}
|
|
58
34
|
// =============================================================================
|
|
59
35
|
// Link Component Factory
|
|
@@ -65,10 +41,13 @@ function buildHref(router, routeName, params, search, basePath = "") {
|
|
|
65
41
|
* - Building hrefs from route names
|
|
66
42
|
* - Checking active state
|
|
67
43
|
*
|
|
44
|
+
* The returned Link component constrains `to` to the router's valid route names.
|
|
45
|
+
*
|
|
68
46
|
* Usage:
|
|
69
47
|
* ```typescript
|
|
70
48
|
* const Link = createLink(appRouter);
|
|
71
49
|
* <Link to="posts" params={{ id: 123 }}>View Post</Link>
|
|
50
|
+
* // <Link to="typo" /> — compile-time error!
|
|
72
51
|
* ```
|
|
73
52
|
*/
|
|
74
53
|
export function createLink(router) {
|
|
@@ -77,7 +56,7 @@ export function createLink(router) {
|
|
|
77
56
|
const navigator = yield* Navigator;
|
|
78
57
|
const currentRoute = yield* Atom.get(navigator.currentRoute);
|
|
79
58
|
// Build href for SSR/accessibility (includes basePath)
|
|
80
|
-
const href = buildHref(router, props.to, props.params, props.search, navigator.basePath);
|
|
59
|
+
const href = yield* buildHref(router, props.to, props.params, props.search, navigator.basePath);
|
|
81
60
|
// Check if this link is active
|
|
82
61
|
const isActive = Option.match(currentRoute, {
|
|
83
62
|
onNone: () => false,
|
package/dist/router/Link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/router/Link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/router/Link.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,10 +91,21 @@ export interface NavigatorOptions {
|
|
|
91
91
|
* - Supports basePath for apps mounted at non-root paths
|
|
92
92
|
*/
|
|
93
93
|
export declare function NavigatorLive(router: Router, navigatorOptions?: NavigatorOptions): Layer.Layer<Navigator, never, History | AtomRegistry.AtomRegistry>;
|
|
94
|
+
/**
|
|
95
|
+
* Create a typed go() function constrained to valid route names.
|
|
96
|
+
*
|
|
97
|
+
* Usage:
|
|
98
|
+
* ```typescript
|
|
99
|
+
* const go = createGo(AppRouter);
|
|
100
|
+
* yield* go("posts"); // OK
|
|
101
|
+
* yield* go("typo"); // compile-time error!
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function createGo<RouteNames extends string>(_router: Router<string, RouteNames>): (routeName: RouteNames, options?: NavigateOptions) => Effect.Effect<void, never, Navigator | AtomRegistry.AtomRegistry>;
|
|
94
105
|
/**
|
|
95
106
|
* Navigate to a route by name.
|
|
96
107
|
*/
|
|
97
|
-
export declare const go: (routeName: string, options?: NavigateOptions) => Effect.Effect<void, never,
|
|
108
|
+
export declare const go: (routeName: string, options?: NavigateOptions<Record<string, unknown>, Record<string, unknown>> | undefined) => Effect.Effect<void, never, AtomRegistry.AtomRegistry | Navigator>;
|
|
98
109
|
/**
|
|
99
110
|
* Go back in history.
|
|
100
111
|
*/
|