@rikalabs/effect-react 0.0.1
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 +179 -0
- package/dist/actions/http.d.ts +18 -0
- package/dist/actions/index.d.ts +4 -0
- package/dist/actions/react.d.ts +7 -0
- package/dist/actions/service.d.ts +18 -0
- package/dist/actions/types.d.ts +33 -0
- package/dist/boundary/codecs.d.ts +40 -0
- package/dist/boundary/errors.d.ts +22 -0
- package/dist/boundary/index.d.ts +2 -0
- package/dist/chunk-2GIUCKL2.js +16 -0
- package/dist/chunk-2GIUCKL2.js.map +1 -0
- package/dist/chunk-2TG7YEVD.js +11 -0
- package/dist/chunk-2TG7YEVD.js.map +1 -0
- package/dist/chunk-6FI4ROTW.js +152 -0
- package/dist/chunk-6FI4ROTW.js.map +1 -0
- package/dist/chunk-C5JI7D7W.js +213 -0
- package/dist/chunk-C5JI7D7W.js.map +1 -0
- package/dist/chunk-EEYASTXR.js +99 -0
- package/dist/chunk-EEYASTXR.js.map +1 -0
- package/dist/chunk-H7MOLKTU.js +301 -0
- package/dist/chunk-H7MOLKTU.js.map +1 -0
- package/dist/chunk-IVIYY6S5.js +77 -0
- package/dist/chunk-IVIYY6S5.js.map +1 -0
- package/dist/chunk-JKN75OYC.js +87 -0
- package/dist/chunk-JKN75OYC.js.map +1 -0
- package/dist/chunk-M2CJG6T7.js +24 -0
- package/dist/chunk-M2CJG6T7.js.map +1 -0
- package/dist/chunk-MDGEGQZB.js +206 -0
- package/dist/chunk-MDGEGQZB.js.map +1 -0
- package/dist/chunk-NI2GNZ7S.js +78 -0
- package/dist/chunk-NI2GNZ7S.js.map +1 -0
- package/dist/chunk-O7XTA7H3.js +423 -0
- package/dist/chunk-O7XTA7H3.js.map +1 -0
- package/dist/chunk-S67FHWAR.js +88 -0
- package/dist/chunk-S67FHWAR.js.map +1 -0
- package/dist/chunk-SKC3HMF3.js +17 -0
- package/dist/chunk-SKC3HMF3.js.map +1 -0
- package/dist/chunk-TUJZ6XJY.js +127 -0
- package/dist/chunk-TUJZ6XJY.js.map +1 -0
- package/dist/chunk-WPV3WFMS.js +38 -0
- package/dist/chunk-WPV3WFMS.js.map +1 -0
- package/dist/chunk-XIBEKS5A.js +301 -0
- package/dist/chunk-XIBEKS5A.js.map +1 -0
- package/dist/chunk-YG22YP5K.js +68 -0
- package/dist/chunk-YG22YP5K.js.map +1 -0
- package/dist/chunk-ZMZQBREU.js +262 -0
- package/dist/chunk-ZMZQBREU.js.map +1 -0
- package/dist/client/index.cjs +191 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.js +14 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config/index.cjs +63 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.ts +32 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/data/react.d.ts +10 -0
- package/dist/data/service.d.ts +20 -0
- package/dist/data/types.d.ts +31 -0
- package/dist/devtools/events.d.ts +37 -0
- package/dist/devtools/index.cjs +149 -0
- package/dist/devtools/index.cjs.map +1 -0
- package/dist/devtools/index.d.ts +2 -0
- package/dist/devtools/index.js +18 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/devtools/react.d.ts +8 -0
- package/dist/form/index.cjs +301 -0
- package/dist/form/index.cjs.map +1 -0
- package/dist/form/index.d.ts +3 -0
- package/dist/form/index.js +14 -0
- package/dist/form/index.js.map +1 -0
- package/dist/form/react.d.ts +9 -0
- package/dist/form/service.d.ts +3 -0
- package/dist/form/types.d.ts +41 -0
- package/dist/framework/app.d.ts +21 -0
- package/dist/framework/cache.d.ts +10 -0
- package/dist/framework/contracts.d.ts +32 -0
- package/dist/framework/index.cjs +1006 -0
- package/dist/framework/index.cjs.map +1 -0
- package/dist/framework/index.d.ts +4 -0
- package/dist/framework/index.js +35 -0
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/manifest.d.ts +12 -0
- package/dist/framework/vite.d.ts +13 -0
- package/dist/framework-vite/index.cjs +163 -0
- package/dist/framework-vite/index.cjs.map +1 -0
- package/dist/framework-vite/index.d.ts +1 -0
- package/dist/framework-vite/index.js +125 -0
- package/dist/framework-vite/index.js.map +1 -0
- package/dist/grid/grid.d.ts +8 -0
- package/dist/grid/index.cjs +238 -0
- package/dist/grid/index.cjs.map +1 -0
- package/dist/grid/index.d.ts +2 -0
- package/dist/grid/index.js +19 -0
- package/dist/grid/index.js.map +1 -0
- package/dist/grid/types.d.ts +35 -0
- package/dist/index.cjs +2512 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/app.d.ts +26 -0
- package/dist/kernel/index.d.ts +3 -0
- package/dist/kernel/runtime.d.ts +5 -0
- package/dist/kernel/telemetry.d.ts +37 -0
- package/dist/navigation/index.d.ts +4 -0
- package/dist/navigation/matcher.d.ts +13 -0
- package/dist/navigation/react.d.ts +12 -0
- package/dist/navigation/service.d.ts +23 -0
- package/dist/navigation/types.d.ts +65 -0
- package/dist/query/index.cjs +361 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/index.d.ts +3 -0
- package/dist/query/index.js +30 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/react.d.ts +27 -0
- package/dist/query/service.d.ts +10 -0
- package/dist/query/types.d.ts +5 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/provider.d.ts +10 -0
- package/dist/realtime/channel.d.ts +15 -0
- package/dist/realtime/index.cjs +117 -0
- package/dist/realtime/index.cjs.map +1 -0
- package/dist/realtime/index.d.ts +2 -0
- package/dist/realtime/index.js +15 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/presence.d.ts +22 -0
- package/dist/render/hydration.d.ts +24 -0
- package/dist/render/index.d.ts +2 -0
- package/dist/render/ssr.d.ts +13 -0
- package/dist/router/helpers.d.ts +26 -0
- package/dist/router/index.cjs +236 -0
- package/dist/router/index.cjs.map +1 -0
- package/dist/router/index.d.ts +4 -0
- package/dist/router/index.js +40 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/react.d.ts +5 -0
- package/dist/router/service.d.ts +5 -0
- package/dist/router/types.d.ts +1 -0
- package/dist/server/index.cjs +174 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/state/index.cjs +128 -0
- package/dist/state/index.cjs.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.js +36 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/react.d.ts +3 -0
- package/dist/state/service.d.ts +28 -0
- package/dist/testing/index.cjs +970 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +13 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/virtual/index.cjs +160 -0
- package/dist/virtual/index.cjs.map +1 -0
- package/dist/virtual/index.d.ts +2 -0
- package/dist/virtual/index.js +21 -0
- package/dist/virtual/index.js.map +1 -0
- package/dist/virtual/types.d.ts +25 -0
- package/dist/virtual/virtual.d.ts +9 -0
- package/package.json +156 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/realtime/index.ts
|
|
21
|
+
var realtime_exports = {};
|
|
22
|
+
__export(realtime_exports, {
|
|
23
|
+
createChannel: () => createChannel,
|
|
24
|
+
createPresence: () => createPresence,
|
|
25
|
+
publish: () => publish,
|
|
26
|
+
publishAll: () => publishAll,
|
|
27
|
+
subscribe: () => subscribe
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(realtime_exports);
|
|
30
|
+
|
|
31
|
+
// src/realtime/channel.ts
|
|
32
|
+
var import_effect = require("effect");
|
|
33
|
+
var createChannel = (options = {}) => import_effect.Effect.map(import_effect.PubSub.unbounded(options), (pubsub) => {
|
|
34
|
+
const subscribe2 = () => import_effect.Stream.fromPubSub(pubsub);
|
|
35
|
+
return {
|
|
36
|
+
publish: (message) => import_effect.PubSub.publish(pubsub, message).pipe(import_effect.Effect.asVoid),
|
|
37
|
+
publishAll: (messages) => import_effect.PubSub.publishAll(pubsub, messages).pipe(import_effect.Effect.asVoid),
|
|
38
|
+
subscribe: subscribe2,
|
|
39
|
+
stream: subscribe2(),
|
|
40
|
+
shutdown: import_effect.PubSub.shutdown(pubsub)
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
var publish = (channel, message) => channel.publish(message);
|
|
44
|
+
var publishAll = (channel, messages) => channel.publishAll(messages);
|
|
45
|
+
var subscribe = (channel) => channel.subscribe();
|
|
46
|
+
|
|
47
|
+
// src/realtime/presence.ts
|
|
48
|
+
var import_effect2 = require("effect");
|
|
49
|
+
var cloneMembers = (members) => new Map(members);
|
|
50
|
+
var applyPresenceEvent = (members, event) => {
|
|
51
|
+
const next = new Map(members);
|
|
52
|
+
if (event._tag === "join") {
|
|
53
|
+
next.set(event.memberId, event.member);
|
|
54
|
+
} else {
|
|
55
|
+
next.delete(event.memberId);
|
|
56
|
+
}
|
|
57
|
+
return next;
|
|
58
|
+
};
|
|
59
|
+
var createPresence = (options) => import_effect2.Effect.gen(function* () {
|
|
60
|
+
const channel = yield* createChannel();
|
|
61
|
+
const membersRef = yield* import_effect2.Ref.make(/* @__PURE__ */ new Map());
|
|
62
|
+
const getMembers = import_effect2.Ref.get(membersRef).pipe(
|
|
63
|
+
import_effect2.Effect.map((members2) => cloneMembers(members2))
|
|
64
|
+
);
|
|
65
|
+
const events = subscribe(channel);
|
|
66
|
+
const members = import_effect2.Stream.flatMap(
|
|
67
|
+
import_effect2.Stream.fromEffect(getMembers),
|
|
68
|
+
(initialMembers) => events.pipe(
|
|
69
|
+
import_effect2.Stream.scan(
|
|
70
|
+
initialMembers,
|
|
71
|
+
(current, event) => applyPresenceEvent(current, event)
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
const join = (member) => {
|
|
76
|
+
const memberId = options.identify(member);
|
|
77
|
+
const event = {
|
|
78
|
+
_tag: "join",
|
|
79
|
+
memberId,
|
|
80
|
+
member,
|
|
81
|
+
timestamp: Date.now()
|
|
82
|
+
};
|
|
83
|
+
return import_effect2.Ref.update(membersRef, (current) => {
|
|
84
|
+
const next = new Map(current);
|
|
85
|
+
next.set(memberId, member);
|
|
86
|
+
return next;
|
|
87
|
+
}).pipe(import_effect2.Effect.zipRight(publish(channel, event)));
|
|
88
|
+
};
|
|
89
|
+
const leave = (memberId) => {
|
|
90
|
+
const event = {
|
|
91
|
+
_tag: "leave",
|
|
92
|
+
memberId,
|
|
93
|
+
timestamp: Date.now()
|
|
94
|
+
};
|
|
95
|
+
return import_effect2.Ref.update(membersRef, (current) => {
|
|
96
|
+
const next = new Map(current);
|
|
97
|
+
next.delete(memberId);
|
|
98
|
+
return next;
|
|
99
|
+
}).pipe(import_effect2.Effect.zipRight(publish(channel, event)));
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
events,
|
|
103
|
+
members,
|
|
104
|
+
getMembers,
|
|
105
|
+
join,
|
|
106
|
+
leave
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
110
|
+
0 && (module.exports = {
|
|
111
|
+
createChannel,
|
|
112
|
+
createPresence,
|
|
113
|
+
publish,
|
|
114
|
+
publishAll,
|
|
115
|
+
subscribe
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/realtime/index.ts","../../src/realtime/channel.ts","../../src/realtime/presence.ts"],"sourcesContent":["export * from \"./channel\";\nexport * from \"./presence\";\n","import { Effect, PubSub, Stream } from \"effect\";\n\nexport interface CreateChannelOptions {\n readonly replay?: number;\n}\n\nexport interface RealtimeChannel<Message> {\n readonly publish: (message: Message) => Effect.Effect<void>;\n readonly publishAll: (messages: Iterable<Message>) => Effect.Effect<void>;\n readonly subscribe: () => Stream.Stream<Message>;\n readonly stream: Stream.Stream<Message>;\n readonly shutdown: Effect.Effect<void>;\n}\n\nexport const createChannel = <Message>(\n options: CreateChannelOptions = {},\n): Effect.Effect<RealtimeChannel<Message>> =>\n Effect.map(PubSub.unbounded<Message>(options), (pubsub) => {\n const subscribe = (): Stream.Stream<Message> => Stream.fromPubSub(pubsub);\n\n return {\n publish: (message) => PubSub.publish(pubsub, message).pipe(Effect.asVoid),\n publishAll: (messages) => PubSub.publishAll(pubsub, messages).pipe(Effect.asVoid),\n subscribe,\n stream: subscribe(),\n shutdown: PubSub.shutdown(pubsub),\n };\n });\n\nexport const publish = <Message>(\n channel: RealtimeChannel<Message>,\n message: Message,\n): Effect.Effect<void> => channel.publish(message);\n\nexport const publishAll = <Message>(\n channel: RealtimeChannel<Message>,\n messages: Iterable<Message>,\n): Effect.Effect<void> => channel.publishAll(messages);\n\nexport const subscribe = <Message>(channel: RealtimeChannel<Message>): Stream.Stream<Message> =>\n channel.subscribe();\n","import { Effect, Ref, Stream } from \"effect\";\nimport { createChannel, publish, subscribe } from \"./channel\";\n\nexport type PresenceEvent<MemberId extends string, Member> =\n | {\n readonly _tag: \"join\";\n readonly memberId: MemberId;\n readonly member: Member;\n readonly timestamp: number;\n }\n | {\n readonly _tag: \"leave\";\n readonly memberId: MemberId;\n readonly timestamp: number;\n };\n\nexport interface CreatePresenceOptions<MemberId extends string, Member> {\n readonly identify: (member: Member) => MemberId;\n}\n\nexport interface Presence<MemberId extends string, Member> {\n readonly events: Stream.Stream<PresenceEvent<MemberId, Member>>;\n readonly members: Stream.Stream<ReadonlyMap<MemberId, Member>>;\n readonly getMembers: Effect.Effect<ReadonlyMap<MemberId, Member>>;\n readonly join: (member: Member) => Effect.Effect<void>;\n readonly leave: (memberId: MemberId) => Effect.Effect<void>;\n}\n\nconst cloneMembers = <MemberId extends string, Member>(\n members: ReadonlyMap<MemberId, Member>,\n): ReadonlyMap<MemberId, Member> => new Map(members);\n\nconst applyPresenceEvent = <MemberId extends string, Member>(\n members: ReadonlyMap<MemberId, Member>,\n event: PresenceEvent<MemberId, Member>,\n): ReadonlyMap<MemberId, Member> => {\n const next = new Map(members);\n if (event._tag === \"join\") {\n next.set(event.memberId, event.member);\n } else {\n next.delete(event.memberId);\n }\n return next;\n};\n\nexport const createPresence = <MemberId extends string, Member>(\n options: CreatePresenceOptions<MemberId, Member>,\n): Effect.Effect<Presence<MemberId, Member>> =>\n Effect.gen(function* () {\n const channel = yield* createChannel<PresenceEvent<MemberId, Member>>();\n const membersRef = yield* Ref.make(new Map<MemberId, Member>());\n\n const getMembers: Effect.Effect<ReadonlyMap<MemberId, Member>> = Ref.get(membersRef).pipe(\n Effect.map((members) => cloneMembers(members)),\n );\n\n const events = subscribe(channel);\n\n const members = Stream.flatMap(\n Stream.fromEffect(getMembers),\n (initialMembers) =>\n events.pipe(\n Stream.scan(initialMembers, (current, event) =>\n applyPresenceEvent(current, event),\n ),\n ),\n );\n\n const join = (member: Member): Effect.Effect<void> => {\n const memberId = options.identify(member);\n const event: PresenceEvent<MemberId, Member> = {\n _tag: \"join\",\n memberId,\n member,\n timestamp: Date.now(),\n };\n\n return Ref.update(membersRef, (current) => {\n const next = new Map(current);\n next.set(memberId, member);\n return next;\n }).pipe(Effect.zipRight(publish(channel, event)));\n };\n\n const leave = (memberId: MemberId): Effect.Effect<void> => {\n const event: PresenceEvent<MemberId, Member> = {\n _tag: \"leave\",\n memberId,\n timestamp: Date.now(),\n };\n\n return Ref.update(membersRef, (current) => {\n const next = new Map(current);\n next.delete(memberId);\n return next;\n }).pipe(Effect.zipRight(publish(channel, event)));\n };\n\n return {\n events,\n members,\n getMembers,\n join,\n leave,\n };\n });\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAuC;AAchC,IAAM,gBAAgB,CAC3B,UAAgC,CAAC,MAEjC,qBAAO,IAAI,qBAAO,UAAmB,OAAO,GAAG,CAAC,WAAW;AACzD,QAAMA,aAAY,MAA8B,qBAAO,WAAW,MAAM;AAExE,SAAO;AAAA,IACL,SAAS,CAAC,YAAY,qBAAO,QAAQ,QAAQ,OAAO,EAAE,KAAK,qBAAO,MAAM;AAAA,IACxE,YAAY,CAAC,aAAa,qBAAO,WAAW,QAAQ,QAAQ,EAAE,KAAK,qBAAO,MAAM;AAAA,IAChF,WAAAA;AAAA,IACA,QAAQA,WAAU;AAAA,IAClB,UAAU,qBAAO,SAAS,MAAM;AAAA,EAClC;AACF,CAAC;AAEI,IAAM,UAAU,CACrB,SACA,YACwB,QAAQ,QAAQ,OAAO;AAE1C,IAAM,aAAa,CACxB,SACA,aACwB,QAAQ,WAAW,QAAQ;AAE9C,IAAM,YAAY,CAAU,YACjC,QAAQ,UAAU;;;ACxCpB,IAAAC,iBAAoC;AA4BpC,IAAM,eAAe,CACnB,YACkC,IAAI,IAAI,OAAO;AAEnD,IAAM,qBAAqB,CACzB,SACA,UACkC;AAClC,QAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,MAAI,MAAM,SAAS,QAAQ;AACzB,SAAK,IAAI,MAAM,UAAU,MAAM,MAAM;AAAA,EACvC,OAAO;AACL,SAAK,OAAO,MAAM,QAAQ;AAAA,EAC5B;AACA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAC5B,YAEA,sBAAO,IAAI,aAAa;AACtB,QAAM,UAAU,OAAO,cAA+C;AACtE,QAAM,aAAa,OAAO,mBAAI,KAAK,oBAAI,IAAsB,CAAC;AAE9D,QAAM,aAA2D,mBAAI,IAAI,UAAU,EAAE;AAAA,IACnF,sBAAO,IAAI,CAACC,aAAY,aAAaA,QAAO,CAAC;AAAA,EAC/C;AAEA,QAAM,SAAS,UAAU,OAAO;AAEhC,QAAM,UAAU,sBAAO;AAAA,IACrB,sBAAO,WAAW,UAAU;AAAA,IAC5B,CAAC,mBACC,OAAO;AAAA,MACL,sBAAO;AAAA,QAAK;AAAA,QAAgB,CAAC,SAAS,UACpC,mBAAmB,SAAS,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACJ;AAEA,QAAM,OAAO,CAAC,WAAwC;AACpD,UAAM,WAAW,QAAQ,SAAS,MAAM;AACxC,UAAM,QAAyC;AAAA,MAC7C,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,WAAO,mBAAI,OAAO,YAAY,CAAC,YAAY;AACzC,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,WAAK,IAAI,UAAU,MAAM;AACzB,aAAO;AAAA,IACT,CAAC,EAAE,KAAK,sBAAO,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC;AAAA,EAClD;AAEA,QAAM,QAAQ,CAAC,aAA4C;AACzD,UAAM,QAAyC;AAAA,MAC7C,MAAM;AAAA,MACN;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,WAAO,mBAAI,OAAO,YAAY,CAAC,YAAY;AACzC,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,WAAK,OAAO,QAAQ;AACpB,aAAO;AAAA,IACT,CAAC,EAAE,KAAK,sBAAO,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC;AAAA,EAClD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;","names":["subscribe","import_effect","members"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Effect, Stream } from "effect";
|
|
2
|
+
export type PresenceEvent<MemberId extends string, Member> = {
|
|
3
|
+
readonly _tag: "join";
|
|
4
|
+
readonly memberId: MemberId;
|
|
5
|
+
readonly member: Member;
|
|
6
|
+
readonly timestamp: number;
|
|
7
|
+
} | {
|
|
8
|
+
readonly _tag: "leave";
|
|
9
|
+
readonly memberId: MemberId;
|
|
10
|
+
readonly timestamp: number;
|
|
11
|
+
};
|
|
12
|
+
export interface CreatePresenceOptions<MemberId extends string, Member> {
|
|
13
|
+
readonly identify: (member: Member) => MemberId;
|
|
14
|
+
}
|
|
15
|
+
export interface Presence<MemberId extends string, Member> {
|
|
16
|
+
readonly events: Stream.Stream<PresenceEvent<MemberId, Member>>;
|
|
17
|
+
readonly members: Stream.Stream<ReadonlyMap<MemberId, Member>>;
|
|
18
|
+
readonly getMembers: Effect.Effect<ReadonlyMap<MemberId, Member>>;
|
|
19
|
+
readonly join: (member: Member) => Effect.Effect<void>;
|
|
20
|
+
readonly leave: (memberId: MemberId) => Effect.Effect<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare const createPresence: <MemberId extends string, Member>(options: CreatePresenceOptions<MemberId, Member>) => Effect.Effect<Presence<MemberId, Member>>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { Boundary } from "../boundary";
|
|
3
|
+
import { Data } from "../data/service";
|
|
4
|
+
import type { QuerySnapshot } from "../data/types";
|
|
5
|
+
import { Navigation } from "../navigation/service";
|
|
6
|
+
export interface HydrationState {
|
|
7
|
+
readonly version: 1;
|
|
8
|
+
readonly data: readonly (readonly [string, QuerySnapshot<unknown, unknown>])[];
|
|
9
|
+
readonly navigationHref: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const HydrationStateSchema: Schema.Struct<{
|
|
12
|
+
version: Schema.Literal<[1]>;
|
|
13
|
+
data: Schema.Array$<Schema.Tuple2<typeof Schema.String, Schema.Struct<{
|
|
14
|
+
key: typeof Schema.String;
|
|
15
|
+
phase: Schema.Union<[Schema.Literal<["initial"]>, Schema.Literal<["loading"]>, Schema.Literal<["success"]>, Schema.Literal<["failure"]>]>;
|
|
16
|
+
data: Schema.NullishOr<typeof Schema.Unknown>;
|
|
17
|
+
error: Schema.NullishOr<typeof Schema.Unknown>;
|
|
18
|
+
updatedAt: Schema.NullishOr<typeof Schema.Number>;
|
|
19
|
+
}>>>;
|
|
20
|
+
navigationHref: typeof Schema.String;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const dehydrateAppState: () => Effect.Effect<HydrationState, never, Data | Navigation>;
|
|
23
|
+
export declare const createHydrationScript: (state: HydrationState, globalName?: string) => string;
|
|
24
|
+
export declare const hydrateAppState: (payload: unknown) => Effect.Effect<void, unknown, Boundary | Data | Navigation>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { ReactElement } from "react";
|
|
3
|
+
import type { AppServices } from "../kernel/app";
|
|
4
|
+
import type { AppManagedRuntime } from "../kernel/runtime";
|
|
5
|
+
export interface CreateSsrHandlerOptions<E> {
|
|
6
|
+
readonly runtime: AppManagedRuntime<AppServices>;
|
|
7
|
+
readonly render: (request: Request) => Effect.Effect<ReactElement, E, AppServices>;
|
|
8
|
+
readonly status?: number;
|
|
9
|
+
readonly headers?: HeadersInit;
|
|
10
|
+
readonly hydrationGlobalName?: string;
|
|
11
|
+
readonly onError?: (error: E | Error) => Response;
|
|
12
|
+
}
|
|
13
|
+
export declare const createSsrHandler: <E>(options: CreateSsrHandlerOptions<E>) => (request: Request) => Promise<Response>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AnyRouteDefinition, RouteDefinition } from "./types";
|
|
2
|
+
type ExtractSegmentParam<Segment extends string> = Segment extends `:${infer Param}` ? Param : never;
|
|
3
|
+
type ExtractPathParams<Path extends string> = Path extends `${infer Head}/${infer Tail}` ? ExtractSegmentParam<Head> | ExtractPathParams<Tail> : ExtractSegmentParam<Path>;
|
|
4
|
+
type SearchPrimitive = string | number | boolean;
|
|
5
|
+
type SearchFieldInput<Value> = Value extends readonly (infer Item)[] ? Item | readonly Item[] | null | undefined : Value | readonly Value[] | null | undefined;
|
|
6
|
+
type SearchFallback = Readonly<Record<string, SearchPrimitive | readonly SearchPrimitive[] | null | undefined>>;
|
|
7
|
+
export type RoutePathParams<Path extends string> = [
|
|
8
|
+
ExtractPathParams<Path>
|
|
9
|
+
] extends [never] ? Record<never, never> : {
|
|
10
|
+
readonly [K in ExtractPathParams<Path>]: string | number | boolean;
|
|
11
|
+
};
|
|
12
|
+
export type RouteSearchInput<TRoute extends AnyRouteDefinition> = TRoute extends RouteDefinition<string, infer Search, unknown> ? {
|
|
13
|
+
readonly [K in keyof Search]?: SearchFieldInput<Search[K]>;
|
|
14
|
+
} : SearchFallback;
|
|
15
|
+
export interface RouteHrefOptions<TRoute extends AnyRouteDefinition> {
|
|
16
|
+
readonly params?: RoutePathParams<TRoute["path"]>;
|
|
17
|
+
readonly search?: RouteSearchInput<TRoute>;
|
|
18
|
+
}
|
|
19
|
+
export interface RouteUrlOptions<TRoute extends AnyRouteDefinition> extends RouteHrefOptions<TRoute> {
|
|
20
|
+
readonly base?: string | URL;
|
|
21
|
+
}
|
|
22
|
+
export declare const routeSearchText: (search?: SearchFallback) => string;
|
|
23
|
+
export declare const routePath: <TRoute extends AnyRouteDefinition>(route: TRoute, params?: RoutePathParams<TRoute["path"]>) => string;
|
|
24
|
+
export declare const routeHref: <TRoute extends AnyRouteDefinition>(route: TRoute, options?: RouteHrefOptions<TRoute>) => string;
|
|
25
|
+
export declare const routeUrl: <TRoute extends AnyRouteDefinition>(route: TRoute, options?: RouteUrlOptions<TRoute>) => URL;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/router/index.ts
|
|
21
|
+
var router_exports = {};
|
|
22
|
+
__export(router_exports, {
|
|
23
|
+
Link: () => Link,
|
|
24
|
+
NavigationCancelledError: () => NavigationCancelledError,
|
|
25
|
+
NavigationRuntimeError: () => NavigationRuntimeError,
|
|
26
|
+
Outlet: () => Outlet,
|
|
27
|
+
defineLoader: () => defineLoader,
|
|
28
|
+
defineRoute: () => defineRoute,
|
|
29
|
+
navigate: () => navigate,
|
|
30
|
+
revalidateNavigation: () => revalidateNavigation,
|
|
31
|
+
routeHref: () => routeHref,
|
|
32
|
+
routePath: () => routePath,
|
|
33
|
+
routeSearchText: () => routeSearchText,
|
|
34
|
+
routeUrl: () => routeUrl,
|
|
35
|
+
useNavigate: () => useNavigate2,
|
|
36
|
+
useNavigationSnapshot: () => useNavigationSnapshot2,
|
|
37
|
+
useRouteMatch: () => useRouteMatch
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(router_exports);
|
|
40
|
+
|
|
41
|
+
// src/navigation/types.ts
|
|
42
|
+
var defineRoute = (route) => route;
|
|
43
|
+
var defineLoader = (loader) => loader;
|
|
44
|
+
var NavigationRuntimeError = class extends Error {
|
|
45
|
+
constructor(messageText) {
|
|
46
|
+
super(messageText);
|
|
47
|
+
this.messageText = messageText;
|
|
48
|
+
this.name = "NavigationRuntimeError";
|
|
49
|
+
}
|
|
50
|
+
_tag = "NavigationRuntimeError";
|
|
51
|
+
};
|
|
52
|
+
var NavigationCancelledError = class extends Error {
|
|
53
|
+
constructor(pathname) {
|
|
54
|
+
super(`Navigation cancelled for ${pathname}`);
|
|
55
|
+
this.pathname = pathname;
|
|
56
|
+
this.name = "NavigationCancelledError";
|
|
57
|
+
}
|
|
58
|
+
_tag = "NavigationCancelledError";
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// src/navigation/matcher.ts
|
|
62
|
+
var normalizePathname = (pathname) => {
|
|
63
|
+
if (pathname.length === 0) {
|
|
64
|
+
return "/";
|
|
65
|
+
}
|
|
66
|
+
const withSlash = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
67
|
+
if (withSlash.length > 1 && withSlash.endsWith("/")) {
|
|
68
|
+
return withSlash.slice(0, -1);
|
|
69
|
+
}
|
|
70
|
+
return withSlash;
|
|
71
|
+
};
|
|
72
|
+
var buildHref = (pathname, searchText) => searchText.length > 0 ? `${normalizePathname(pathname)}${searchText}` : normalizePathname(pathname);
|
|
73
|
+
|
|
74
|
+
// src/router/helpers.ts
|
|
75
|
+
var PARAM_PATTERN = /:([A-Za-z0-9_]+)/g;
|
|
76
|
+
var appendSearchValue = (params, key, value) => {
|
|
77
|
+
if (value === null || value === void 0) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (Array.isArray(value)) {
|
|
81
|
+
for (const nestedValue of value) {
|
|
82
|
+
appendSearchValue(params, key, nestedValue);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
87
|
+
params.append(key, String(value));
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var defaultBase = () => {
|
|
91
|
+
if (typeof window === "undefined") {
|
|
92
|
+
return "http://localhost";
|
|
93
|
+
}
|
|
94
|
+
return window.location.origin;
|
|
95
|
+
};
|
|
96
|
+
var routeSearchText = (search) => {
|
|
97
|
+
if (search === void 0) {
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
const params = new URLSearchParams();
|
|
101
|
+
const keys = Object.keys(search).sort((a, b) => a.localeCompare(b));
|
|
102
|
+
for (const key of keys) {
|
|
103
|
+
appendSearchValue(params, key, search[key]);
|
|
104
|
+
}
|
|
105
|
+
const text = params.toString();
|
|
106
|
+
return text.length > 0 ? `?${text}` : "";
|
|
107
|
+
};
|
|
108
|
+
var routePath = (route, params) => route.path.replace(PARAM_PATTERN, (_match, name) => {
|
|
109
|
+
const value = params?.[name];
|
|
110
|
+
if (value === void 0) {
|
|
111
|
+
throw new Error(`Missing route param '${name}' for route '${route.id}'`);
|
|
112
|
+
}
|
|
113
|
+
return encodeURIComponent(String(value));
|
|
114
|
+
});
|
|
115
|
+
var routeHref = (route, options = {}) => buildHref(
|
|
116
|
+
routePath(route, options.params),
|
|
117
|
+
routeSearchText(options.search)
|
|
118
|
+
);
|
|
119
|
+
var routeUrl = (route, options = {}) => new URL(
|
|
120
|
+
routeHref(route, options),
|
|
121
|
+
options.base ?? defaultBase()
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// src/router/service.ts
|
|
125
|
+
var import_effect3 = require("effect");
|
|
126
|
+
|
|
127
|
+
// src/navigation/service.ts
|
|
128
|
+
var import_effect = require("effect");
|
|
129
|
+
var Navigation = class extends import_effect.Context.Tag("EffectReact/Navigation")() {
|
|
130
|
+
};
|
|
131
|
+
var navigateTo = (href) => import_effect.Effect.flatMap(Navigation, (service) => service.navigate(href));
|
|
132
|
+
|
|
133
|
+
// src/navigation/react.tsx
|
|
134
|
+
var import_effect2 = require("effect");
|
|
135
|
+
var import_react2 = require("react");
|
|
136
|
+
|
|
137
|
+
// src/react/provider.tsx
|
|
138
|
+
var import_react = require("react");
|
|
139
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
140
|
+
var RuntimeContext = (0, import_react.createContext)(null);
|
|
141
|
+
var useEffectRuntime = () => {
|
|
142
|
+
const runtime = (0, import_react.useContext)(RuntimeContext);
|
|
143
|
+
if (runtime === null) {
|
|
144
|
+
throw new Error("Effect runtime is not available. Wrap your app with <EffectProvider>.");
|
|
145
|
+
}
|
|
146
|
+
return runtime;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// src/navigation/react.tsx
|
|
150
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
151
|
+
var useNavigationService = () => {
|
|
152
|
+
const runtime = useEffectRuntime();
|
|
153
|
+
return (0, import_react2.useMemo)(() => runtime.runSync(Navigation), [runtime]);
|
|
154
|
+
};
|
|
155
|
+
var useNavigationSnapshot = () => {
|
|
156
|
+
const runtime = useEffectRuntime();
|
|
157
|
+
const navigation = useNavigationService();
|
|
158
|
+
const subscribe = (0, import_react2.useCallback)(
|
|
159
|
+
(listener) => {
|
|
160
|
+
const fiber = runtime.runFork(
|
|
161
|
+
import_effect2.Stream.runForEach(navigation.snapshots, () => import_effect2.Effect.sync(listener))
|
|
162
|
+
);
|
|
163
|
+
return () => {
|
|
164
|
+
runtime.runFork(import_effect2.Fiber.interrupt(fiber));
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
[navigation, runtime]
|
|
168
|
+
);
|
|
169
|
+
const getSnapshot = (0, import_react2.useCallback)(
|
|
170
|
+
() => runtime.runSync(navigation.getSnapshot),
|
|
171
|
+
[navigation, runtime]
|
|
172
|
+
);
|
|
173
|
+
return (0, import_react2.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
174
|
+
};
|
|
175
|
+
var useNavigate = () => {
|
|
176
|
+
const runtime = useEffectRuntime();
|
|
177
|
+
const navigation = useNavigationService();
|
|
178
|
+
return (0, import_react2.useCallback)(
|
|
179
|
+
(href) => runtime.runPromise(navigation.navigate(href)),
|
|
180
|
+
[navigation, runtime]
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
var Link = ({ to, onClick, children, ...rest }) => {
|
|
184
|
+
const navigate2 = useNavigate();
|
|
185
|
+
const handleClick = (0, import_react2.useCallback)(
|
|
186
|
+
(event) => {
|
|
187
|
+
onClick?.(event);
|
|
188
|
+
if (event.defaultPrevented) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (event.button !== 0 || event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
event.preventDefault();
|
|
195
|
+
void navigate2(to);
|
|
196
|
+
},
|
|
197
|
+
[navigate2, onClick, to]
|
|
198
|
+
);
|
|
199
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("a", { ...rest, href: to, onClick: handleClick, children });
|
|
200
|
+
};
|
|
201
|
+
var Outlet = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
|
|
202
|
+
|
|
203
|
+
// src/router/service.ts
|
|
204
|
+
var navigate = (href) => navigateTo(href);
|
|
205
|
+
var revalidateNavigation = () => import_effect3.Effect.flatMap(Navigation, (service) => service.revalidate());
|
|
206
|
+
|
|
207
|
+
// src/router/react.tsx
|
|
208
|
+
var useNavigate2 = () => useNavigate();
|
|
209
|
+
var useNavigationSnapshot2 = () => useNavigationSnapshot();
|
|
210
|
+
var useRouteMatch = (route) => {
|
|
211
|
+
const snapshot = useNavigationSnapshot2();
|
|
212
|
+
const match = snapshot.match;
|
|
213
|
+
if (match === null || match.route.id !== route.id) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
return match;
|
|
217
|
+
};
|
|
218
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
219
|
+
0 && (module.exports = {
|
|
220
|
+
Link,
|
|
221
|
+
NavigationCancelledError,
|
|
222
|
+
NavigationRuntimeError,
|
|
223
|
+
Outlet,
|
|
224
|
+
defineLoader,
|
|
225
|
+
defineRoute,
|
|
226
|
+
navigate,
|
|
227
|
+
revalidateNavigation,
|
|
228
|
+
routeHref,
|
|
229
|
+
routePath,
|
|
230
|
+
routeSearchText,
|
|
231
|
+
routeUrl,
|
|
232
|
+
useNavigate,
|
|
233
|
+
useNavigationSnapshot,
|
|
234
|
+
useRouteMatch
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/router/index.ts","../../src/navigation/types.ts","../../src/navigation/matcher.ts","../../src/router/helpers.ts","../../src/router/service.ts","../../src/navigation/service.ts","../../src/navigation/react.tsx","../../src/react/provider.tsx","../../src/router/react.tsx"],"sourcesContent":["export * from \"./types\";\nexport * from \"./helpers\";\nexport * from \"./service\";\nexport * from \"./react\";\n","import type { Effect, Schedule, Schema } from \"effect\";\nimport type { BoundaryDecodeError } from \"../boundary\";\n\nexport interface RouteDefinition<Path extends string, Search, SearchEncoded = Search> {\n readonly id: string;\n readonly path: Path;\n readonly search?: Schema.Schema<Search, SearchEncoded, never>;\n}\n\nexport const defineRoute = <Path extends string, Search = Record<never, never>, SearchEncoded = Search>(\n route: RouteDefinition<Path, Search, SearchEncoded>,\n): RouteDefinition<Path, Search, SearchEncoded> => route;\n\nexport interface AnyRouteDefinition {\n readonly id: string;\n readonly path: string;\n readonly search?: Schema.Schema.All;\n}\n\nexport interface RouteMatch<TRoute extends AnyRouteDefinition> {\n readonly route: TRoute;\n readonly pathname: string;\n readonly params: Readonly<Record<string, string>>;\n readonly search: unknown;\n}\n\nexport interface LoaderContext<TRoute extends AnyRouteDefinition> {\n readonly route: TRoute;\n readonly pathname: string;\n readonly searchText: string;\n readonly params: Readonly<Record<string, string>>;\n readonly search: unknown;\n readonly dependencyResults: Readonly<Record<string, unknown>>;\n}\n\nexport interface LoaderDefinition<\n Name extends string,\n RouteId extends string,\n Output,\n E,\n TRoute extends AnyRouteDefinition = AnyRouteDefinition,\n> {\n readonly name: Name;\n readonly routeId: RouteId;\n readonly dependsOn?: readonly string[];\n readonly retry?: Schedule.Schedule<unknown, E, never>;\n readonly run: (context: LoaderContext<TRoute>) => Effect.Effect<Output, E, never>;\n}\n\nexport const defineLoader = <\n Name extends string,\n RouteId extends string,\n Output,\n E,\n TRoute extends AnyRouteDefinition = AnyRouteDefinition,\n>(\n loader: LoaderDefinition<Name, RouteId, Output, E, TRoute>,\n): LoaderDefinition<Name, RouteId, Output, E, TRoute> => loader;\n\nexport type AnyLoaderDefinition = LoaderDefinition<string, string, unknown, never, AnyRouteDefinition>;\n\nexport type LoaderSnapshotEntry =\n | {\n readonly _tag: \"pending\";\n }\n | {\n readonly _tag: \"success\";\n readonly value: unknown;\n }\n | {\n readonly _tag: \"failure\";\n readonly error: unknown;\n };\n\nexport interface NavigationSnapshot {\n readonly pathname: string;\n readonly searchText: string;\n readonly href: string;\n readonly status: \"idle\" | \"loading\" | \"success\" | \"failure\";\n readonly match: RouteMatch<AnyRouteDefinition> | null;\n readonly loaders: Readonly<Record<string, LoaderSnapshotEntry>>;\n readonly error: unknown;\n}\n\nexport class NavigationRuntimeError extends Error {\n readonly _tag = \"NavigationRuntimeError\" as const;\n\n constructor(readonly messageText: string) {\n super(messageText);\n this.name = \"NavigationRuntimeError\";\n }\n}\n\nexport class NavigationCancelledError extends Error {\n readonly _tag = \"NavigationCancelledError\" as const;\n\n constructor(readonly pathname: string) {\n super(`Navigation cancelled for ${pathname}`);\n this.name = \"NavigationCancelledError\";\n }\n}\n\nexport type NavigationError =\n | NavigationRuntimeError\n | NavigationCancelledError\n | BoundaryDecodeError;\n","import type { AnyRouteDefinition, RouteMatch } from \"./types\";\n\nconst normalizePathname = (pathname: string): string => {\n if (pathname.length === 0) {\n return \"/\";\n }\n const withSlash = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n if (withSlash.length > 1 && withSlash.endsWith(\"/\")) {\n return withSlash.slice(0, -1);\n }\n return withSlash;\n};\n\nconst scoreRoute = (path: string): number => {\n if (path === \"/\") {\n return 10;\n }\n return path\n .split(\"/\")\n .filter((segment) => segment.length > 0)\n .reduce((score, segment) => {\n if (segment === \"*\") {\n return score;\n }\n if (segment.startsWith(\":\")) {\n return score + 2;\n }\n return score + 5;\n }, 0);\n};\n\nconst splitSegments = (path: string): readonly string[] =>\n normalizePathname(path)\n .split(\"/\")\n .filter((segment) => segment.length > 0);\n\nconst matchRoutePath = (\n routePath: string,\n pathname: string,\n): Readonly<Record<string, string>> | null => {\n const routeSegments = splitSegments(routePath);\n const pathSegments = splitSegments(pathname);\n\n const params: Record<string, string> = {};\n let i = 0;\n let j = 0;\n\n while (i < routeSegments.length && j < pathSegments.length) {\n const routeSegment = routeSegments[i]!;\n const pathSegment = pathSegments[j]!;\n\n if (routeSegment === \"*\") {\n return params;\n }\n\n if (routeSegment.startsWith(\":\")) {\n params[routeSegment.slice(1)] = decodeURIComponent(pathSegment);\n i += 1;\n j += 1;\n continue;\n }\n\n if (routeSegment !== pathSegment) {\n return null;\n }\n\n i += 1;\n j += 1;\n }\n\n if (i < routeSegments.length && routeSegments[i] === \"*\") {\n return params;\n }\n\n if (i !== routeSegments.length || j !== pathSegments.length) {\n return null;\n }\n\n return params;\n};\n\nexport interface MatchInput {\n readonly routes: readonly AnyRouteDefinition[];\n readonly pathname: string;\n readonly search: unknown;\n}\n\nexport const matchRoute = ({ routes, pathname, search }: MatchInput): RouteMatch<AnyRouteDefinition> | null => {\n const normalized = normalizePathname(pathname);\n const sorted = [...routes].sort((a, b) => scoreRoute(b.path) - scoreRoute(a.path));\n\n for (const route of sorted) {\n const params = matchRoutePath(route.path, normalized);\n if (params !== null) {\n return {\n route,\n pathname: normalized,\n params,\n search,\n };\n }\n }\n\n return null;\n};\n\nexport const buildHref = (pathname: string, searchText: string): string =>\n searchText.length > 0 ? `${normalizePathname(pathname)}${searchText}` : normalizePathname(pathname);\n\nexport const normalizeSearchText = (searchText: string): string => {\n if (searchText.length === 0 || searchText === \"?\") {\n return \"\";\n }\n return searchText.startsWith(\"?\") ? searchText : `?${searchText}`;\n};\n\nexport const parseHref = (href: string): { readonly pathname: string; readonly searchText: string } => {\n const [pathPart, ...searchParts] = href.split(\"?\");\n return {\n pathname: normalizePathname(pathPart ?? \"/\"),\n searchText: normalizeSearchText(searchParts.length === 0 ? \"\" : searchParts.join(\"?\")),\n };\n};\n","import { buildHref } from \"../navigation/matcher\";\nimport type { AnyRouteDefinition, RouteDefinition } from \"./types\";\n\ntype ExtractSegmentParam<Segment extends string> =\n Segment extends `:${infer Param}` ? Param : never;\n\ntype ExtractPathParams<Path extends string> =\n Path extends `${infer Head}/${infer Tail}`\n ? ExtractSegmentParam<Head> | ExtractPathParams<Tail>\n : ExtractSegmentParam<Path>;\n\ntype SearchPrimitive = string | number | boolean;\ntype SearchFieldInput<Value> =\n Value extends readonly (infer Item)[]\n ? Item | readonly Item[] | null | undefined\n : Value | readonly Value[] | null | undefined;\n\ntype SearchFallback = Readonly<Record<string, SearchPrimitive | readonly SearchPrimitive[] | null | undefined>>;\n\nexport type RoutePathParams<Path extends string> =\n [ExtractPathParams<Path>] extends [never]\n ? Record<never, never>\n : {\n readonly [K in ExtractPathParams<Path>]: string | number | boolean;\n };\n\nexport type RouteSearchInput<TRoute extends AnyRouteDefinition> =\n TRoute extends RouteDefinition<string, infer Search, unknown>\n ? {\n readonly [K in keyof Search]?: SearchFieldInput<Search[K]>;\n }\n : SearchFallback;\n\nexport interface RouteHrefOptions<TRoute extends AnyRouteDefinition> {\n readonly params?: RoutePathParams<TRoute[\"path\"]>;\n readonly search?: RouteSearchInput<TRoute>;\n}\n\nexport interface RouteUrlOptions<TRoute extends AnyRouteDefinition>\n extends RouteHrefOptions<TRoute> {\n readonly base?: string | URL;\n}\n\nconst PARAM_PATTERN = /:([A-Za-z0-9_]+)/g;\n\nconst appendSearchValue = (\n params: URLSearchParams,\n key: string,\n value: unknown,\n): void => {\n if (value === null || value === undefined) {\n return;\n }\n if (Array.isArray(value)) {\n for (const nestedValue of value) {\n appendSearchValue(params, key, nestedValue);\n }\n return;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n params.append(key, String(value));\n }\n};\n\nconst defaultBase = (): string => {\n if (typeof window === \"undefined\") {\n return \"http://localhost\";\n }\n return window.location.origin;\n};\n\nexport const routeSearchText = (search?: SearchFallback): string => {\n if (search === undefined) {\n return \"\";\n }\n\n const params = new URLSearchParams();\n const keys = Object.keys(search).sort((a, b) => a.localeCompare(b));\n for (const key of keys) {\n appendSearchValue(params, key, search[key]);\n }\n\n const text = params.toString();\n return text.length > 0 ? `?${text}` : \"\";\n};\n\nexport const routePath = <TRoute extends AnyRouteDefinition>(\n route: TRoute,\n params?: RoutePathParams<TRoute[\"path\"]>,\n): string =>\n route.path.replace(PARAM_PATTERN, (_match, name: string) => {\n const value = (params as Readonly<Record<string, string | number | boolean>> | undefined)?.[name];\n if (value === undefined) {\n throw new Error(`Missing route param '${name}' for route '${route.id}'`);\n }\n return encodeURIComponent(String(value));\n });\n\nexport const routeHref = <TRoute extends AnyRouteDefinition>(\n route: TRoute,\n options: RouteHrefOptions<TRoute> = {},\n): string =>\n buildHref(\n routePath(route, options.params),\n routeSearchText(options.search as SearchFallback | undefined),\n );\n\nexport const routeUrl = <TRoute extends AnyRouteDefinition>(\n route: TRoute,\n options: RouteUrlOptions<TRoute> = {},\n): URL =>\n new URL(\n routeHref(route, options),\n options.base ?? defaultBase(),\n );\n","import { Effect } from \"effect\";\nimport { Navigation, navigateTo } from \"../navigation\";\nimport type { NavigationError, NavigationSnapshot } from \"./types\";\n\nexport const navigate = (\n href: string,\n): Effect.Effect<NavigationSnapshot, NavigationError, Navigation> =>\n navigateTo(href);\n\nexport const revalidateNavigation = (): Effect.Effect<NavigationSnapshot, NavigationError, Navigation> =>\n Effect.flatMap(Navigation, (service) => service.revalidate());\n","import {\n Cause,\n Context,\n Effect,\n Fiber,\n Layer,\n Option,\n Ref,\n type Schema,\n type Stream,\n SubscriptionRef,\n} from \"effect\";\nimport { Boundary } from \"../boundary\";\nimport { Telemetry } from \"../kernel/telemetry\";\nimport { buildHref, matchRoute, normalizeSearchText, parseHref } from \"./matcher\";\nimport {\n type AnyLoaderDefinition,\n type AnyRouteDefinition,\n type LoaderSnapshotEntry,\n NavigationCancelledError,\n type NavigationSnapshot,\n NavigationRuntimeError,\n} from \"./types\";\nimport type { NavigationError } from \"./types\";\n\nconst describeUnknown = (value: unknown): string => {\n if (value instanceof Error) {\n return `${value.name}: ${value.message}`;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst initialSnapshot: NavigationSnapshot = {\n pathname: \"/\",\n searchText: \"\",\n href: \"/\",\n status: \"idle\",\n match: null,\n loaders: {},\n error: undefined,\n};\n\nconst toLoadersByName = (loaders: readonly AnyLoaderDefinition[]): ReadonlyMap<string, AnyLoaderDefinition> =>\n new Map(loaders.map((loader) => [loader.name, loader] as const));\n\nconst planLoaderBatches = (\n loaders: readonly AnyLoaderDefinition[],\n): Effect.Effect<readonly (readonly AnyLoaderDefinition[])[], NavigationRuntimeError, never> => {\n const byName = toLoadersByName(loaders);\n const depthByName = new Map<string, number>();\n const visiting = new Set<string>();\n\n const resolveDepth = (name: string): Effect.Effect<number, NavigationRuntimeError, never> => {\n const cached = depthByName.get(name);\n if (cached !== undefined) {\n return Effect.succeed(cached);\n }\n\n if (visiting.has(name)) {\n return Effect.fail(new NavigationRuntimeError(`Cyclic loader dependency detected at ${name}`));\n }\n\n const loader = byName.get(name);\n if (loader === undefined) {\n return Effect.fail(new NavigationRuntimeError(`Loader dependency '${name}' is not registered`));\n }\n\n visiting.add(name);\n\n const dependencies = loader.dependsOn ?? [];\n return Effect.forEach(dependencies, resolveDepth).pipe(\n Effect.map((depths) => {\n const depth = depths.length === 0 ? 0 : Math.max(...depths) + 1;\n depthByName.set(name, depth);\n visiting.delete(name);\n return depth;\n }),\n Effect.catchAll((error) => {\n visiting.delete(name);\n return Effect.fail(error);\n }),\n );\n };\n\n return Effect.gen(function* () {\n const entries = yield* Effect.forEach(loaders, (loader) =>\n Effect.map(resolveDepth(loader.name), (depth) => [depth, loader] as const),\n );\n\n const grouped = new Map<number, AnyLoaderDefinition[]>();\n for (const [depth, loader] of entries) {\n const existing = grouped.get(depth);\n if (existing === undefined) {\n grouped.set(depth, [loader]);\n } else {\n existing.push(loader);\n }\n }\n\n const depths = Array.from(grouped.keys()).sort((a, b) => a - b);\n return depths.map((depth) => grouped.get(depth) ?? []);\n });\n};\n\nexport interface NavigationService {\n readonly navigate: (href: string) => Effect.Effect<NavigationSnapshot, NavigationError, never>;\n readonly revalidate: () => Effect.Effect<NavigationSnapshot, NavigationError, never>;\n readonly getSnapshot: Effect.Effect<NavigationSnapshot, never, never>;\n readonly hydrateSnapshot: (snapshot: NavigationSnapshot) => Effect.Effect<void, never, never>;\n readonly snapshots: Stream.Stream<NavigationSnapshot>;\n}\n\nexport class Navigation extends Context.Tag(\"EffectReact/Navigation\")<\n Navigation,\n NavigationService\n>() {}\n\nexport interface MakeNavigationLayerOptions {\n readonly routes: readonly AnyRouteDefinition[];\n readonly loaders?: readonly AnyLoaderDefinition[];\n readonly initialHref?: string;\n}\n\nexport const makeNavigationLayer = (\n options: MakeNavigationLayerOptions,\n): Layer.Layer<Navigation, never, Boundary | Telemetry> => {\n const loaders = options.loaders ?? [];\n const initial = parseHref(options.initialHref ?? \"/\");\n\n return Layer.effect(\n Navigation,\n Effect.gen(function* () {\n const boundary = yield* Boundary;\n const telemetry = yield* Telemetry;\n const snapshotsRef = yield* SubscriptionRef.make<NavigationSnapshot>({\n ...initialSnapshot,\n pathname: initial.pathname,\n searchText: initial.searchText,\n href: buildHref(initial.pathname, initial.searchText),\n });\n const activeFiberRef = yield* Ref.make<Option.Option<Fiber.RuntimeFiber<NavigationSnapshot, NavigationError>>>(Option.none());\n\n const runLoaders = (\n snapshot: NavigationSnapshot,\n ): Effect.Effect<Readonly<Record<string, LoaderSnapshotEntry>>, NavigationRuntimeError, never> =>\n Effect.gen(function* () {\n if (snapshot.match === null) {\n return {};\n }\n\n const routeLoaders = loaders.filter((loader) => loader.routeId === snapshot.match!.route.id);\n if (routeLoaders.length === 0) {\n return {};\n }\n\n const batches = yield* planLoaderBatches(routeLoaders);\n const results: Record<string, unknown> = {};\n const states: Record<string, LoaderSnapshotEntry> = {};\n\n for (const loader of routeLoaders) {\n states[loader.name] = { _tag: \"pending\" };\n }\n\n yield* SubscriptionRef.update(snapshotsRef, (current) => ({\n ...current,\n loaders: {\n ...current.loaders,\n ...states,\n },\n }));\n\n for (const batch of batches) {\n const exits = yield* Effect.all(\n batch.map((loader) => {\n const base = loader.run({\n route: snapshot.match!.route,\n pathname: snapshot.pathname,\n searchText: snapshot.searchText,\n params: snapshot.match!.params,\n search: snapshot.match!.search,\n dependencyResults: results,\n });\n\n const withRetry = loader.retry ? Effect.retry(base, loader.retry) : base;\n return Effect.exit(withRetry).pipe(Effect.map((exit) => [loader, exit] as const));\n }),\n {\n concurrency: \"unbounded\",\n },\n );\n\n for (const [loader, exit] of exits) {\n if (exit._tag === \"Success\") {\n results[loader.name] = exit.value;\n states[loader.name] = {\n _tag: \"success\",\n value: exit.value,\n };\n continue;\n }\n\n const failure = Cause.failureOption(exit.cause);\n states[loader.name] = {\n _tag: \"failure\",\n error: failure._tag === \"Some\" ? failure.value : Cause.pretty(exit.cause),\n };\n\n yield* SubscriptionRef.update(snapshotsRef, (current) => ({\n ...current,\n status: \"failure\",\n loaders: {\n ...current.loaders,\n ...states,\n },\n error: states[loader.name],\n }) satisfies NavigationSnapshot);\n\n return yield* Effect.fail(\n new NavigationRuntimeError(`Loader '${loader.name}' failed for route '${snapshot.match!.route.id}'`),\n );\n }\n\n yield* SubscriptionRef.update(snapshotsRef, (current) => ({\n ...current,\n loaders: {\n ...current.loaders,\n ...states,\n },\n }) satisfies NavigationSnapshot);\n }\n\n return states;\n });\n\n const performNavigation = (\n href: string,\n ): Effect.Effect<NavigationSnapshot, NavigationError, never> =>\n Effect.gen(function* () {\n const { pathname, searchText } = parseHref(href);\n const searchParams = new URLSearchParams(searchText);\n\n const candidate = options.routes.find((route) => matchRoute({\n routes: [route],\n pathname,\n search: {},\n }) !== null);\n\n const decodedSearch =\n candidate?.search === undefined\n ? Effect.succeed({} as unknown)\n : boundary.decodeUnknown({\n source: `route:${candidate.id}:search`,\n schema: candidate.search as Schema.Schema<unknown, unknown, never>,\n value: Object.fromEntries(searchParams.entries()),\n });\n\n const search = yield* decodedSearch;\n const matched = matchRoute({\n routes: options.routes,\n pathname,\n search,\n });\n\n if (matched === null) {\n return yield* Effect.fail(\n new NavigationRuntimeError(`No route matched pathname '${pathname}'`),\n );\n }\n\n yield* telemetry.emit({\n _tag: \"navigation\",\n phase: \"start\",\n pathname,\n routeId: matched.route.id,\n timestamp: Date.now(),\n });\n\n const loadingSnapshot: NavigationSnapshot = {\n pathname,\n searchText: normalizeSearchText(searchText),\n href: buildHref(pathname, normalizeSearchText(searchText)),\n status: \"loading\",\n match: matched,\n loaders: {},\n error: undefined,\n };\n\n yield* SubscriptionRef.set(snapshotsRef, loadingSnapshot);\n\n const loaderStates = yield* runLoaders(loadingSnapshot);\n\n const completed: NavigationSnapshot = {\n ...loadingSnapshot,\n status: \"success\",\n loaders: loaderStates,\n error: undefined,\n };\n\n yield* SubscriptionRef.set(snapshotsRef, completed);\n yield* telemetry.emit({\n _tag: \"navigation\",\n phase: \"success\",\n pathname,\n routeId: matched.route.id,\n timestamp: Date.now(),\n });\n\n return completed;\n });\n\n const navigate: NavigationService[\"navigate\"] = (href) =>\n Effect.gen(function* () {\n const previous = yield* Ref.getAndSet(activeFiberRef, Option.none());\n if (Option.isSome(previous)) {\n yield* Fiber.interrupt(previous.value);\n yield* telemetry.emit({\n _tag: \"navigation\",\n phase: \"cancel\",\n pathname: href,\n timestamp: Date.now(),\n });\n }\n\n const fiber = yield* Effect.fork(performNavigation(href));\n yield* Ref.set(activeFiberRef, Option.some(fiber));\n\n const exit = yield* Effect.exit(Fiber.join(fiber));\n\n const current = yield* Ref.get(activeFiberRef);\n if (Option.isSome(current) && current.value === fiber) {\n yield* Ref.set(activeFiberRef, Option.none());\n }\n\n if (exit._tag === \"Success\") {\n return exit.value;\n }\n\n if (Cause.isInterruptedOnly(exit.cause)) {\n return yield* Effect.fail(new NavigationCancelledError(href));\n }\n\n const failure = Cause.failureOption(exit.cause);\n if (failure._tag === \"Some\") {\n return yield* Effect.fail(\n failure.value instanceof NavigationRuntimeError\n ? failure.value\n : new NavigationRuntimeError(describeUnknown(failure.value)),\n );\n }\n\n return yield* Effect.fail(new NavigationRuntimeError(Cause.pretty(exit.cause)));\n }).pipe(\n Effect.tapError((error) =>\n telemetry.emit({\n _tag: \"navigation\",\n phase: \"failure\",\n pathname: href,\n timestamp: Date.now(),\n detail: error,\n }),\n ),\n );\n\n const revalidate: NavigationService[\"revalidate\"] =\n () =>\n Effect.gen(function* () {\n const snapshot = yield* SubscriptionRef.get(snapshotsRef);\n return yield* navigate(snapshot.href);\n });\n\n return {\n navigate,\n revalidate,\n getSnapshot: SubscriptionRef.get(snapshotsRef),\n hydrateSnapshot: (snapshot) => SubscriptionRef.set(snapshotsRef, snapshot),\n snapshots: snapshotsRef.changes,\n } satisfies NavigationService;\n }),\n );\n};\n\nexport const navigateTo = (\n href: string,\n): Effect.Effect<NavigationSnapshot, NavigationError, Navigation> =>\n Effect.flatMap(Navigation, (service) => service.navigate(href));\n","import { Effect, Fiber, Stream } from \"effect\";\nimport {\n type AnchorHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useSyncExternalStore,\n} from \"react\";\nimport { useEffectRuntime } from \"../react/provider\";\nimport { Navigation } from \"./service\";\nimport type { NavigationSnapshot } from \"./types\";\n\nconst useNavigationService = () => {\n const runtime = useEffectRuntime();\n return useMemo(() => runtime.runSync(Navigation), [runtime]);\n};\n\nexport const useNavigationSnapshot = (): NavigationSnapshot => {\n const runtime = useEffectRuntime();\n const navigation = useNavigationService();\n\n const subscribe = useCallback(\n (listener: () => void) => {\n const fiber = runtime.runFork(\n Stream.runForEach(navigation.snapshots, () => Effect.sync(listener)),\n );\n\n return () => {\n runtime.runFork(Fiber.interrupt(fiber));\n };\n },\n [navigation, runtime],\n );\n\n const getSnapshot = useCallback(\n () => runtime.runSync(navigation.getSnapshot),\n [navigation, runtime],\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n\nexport const useNavigate = (): ((href: string) => Promise<NavigationSnapshot>) => {\n const runtime = useEffectRuntime();\n const navigation = useNavigationService();\n\n return useCallback(\n (href: string) => runtime.runPromise(navigation.navigate(href)),\n [navigation, runtime],\n );\n};\n\nexport interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> {\n readonly to: string;\n readonly children?: ReactNode;\n}\n\nexport const Link = ({ to, onClick, children, ...rest }: LinkProps) => {\n const navigate = useNavigate();\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.button !== 0 || event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) {\n return;\n }\n event.preventDefault();\n void navigate(to);\n },\n [navigate, onClick, to],\n );\n\n return (\n <a {...rest} href={to} onClick={handleClick}>\n {children}\n </a>\n );\n};\n\nexport const Outlet = ({ children }: { readonly children?: ReactNode }) => <>{children}</>;\n","import type { ManagedRuntime } from \"effect\";\nimport { createContext, useContext, useEffect, type ReactNode } from \"react\";\nimport type { AppServices } from \"../kernel/app\";\n\nexport type EffectReactManagedRuntime<R = AppServices> = ManagedRuntime.ManagedRuntime<R, never>;\n\nconst RuntimeContext = createContext<EffectReactManagedRuntime | null>(null);\n\nexport interface EffectProviderProps {\n readonly runtime: EffectReactManagedRuntime;\n readonly children?: ReactNode;\n}\n\nexport const EffectProvider = ({ runtime, children }: EffectProviderProps) => {\n useEffect(\n () => () => {\n void runtime.dispose();\n },\n [runtime],\n );\n\n return <RuntimeContext.Provider value={runtime}>{children}</RuntimeContext.Provider>;\n};\n\nexport const useEffectRuntime = (): EffectReactManagedRuntime => {\n const runtime = useContext(RuntimeContext);\n if (runtime === null) {\n throw new Error(\"Effect runtime is not available. Wrap your app with <EffectProvider>.\");\n }\n return runtime;\n};\n","import {\n useNavigate as useNavigationNavigate,\n useNavigationSnapshot as useNavigationState,\n} from \"../navigation/react\";\nimport type { AnyRouteDefinition, NavigationSnapshot, RouteMatch } from \"./types\";\n\nexport {\n Link,\n Outlet,\n type LinkProps,\n} from \"../navigation/react\";\n\nexport const useNavigate = (): ((href: string) => Promise<NavigationSnapshot>) =>\n useNavigationNavigate();\n\nexport const useNavigationSnapshot = (): NavigationSnapshot =>\n useNavigationState();\n\nexport const useRouteMatch = <TRoute extends AnyRouteDefinition>(\n route: TRoute,\n): RouteMatch<TRoute> | null => {\n const snapshot = useNavigationSnapshot();\n const match = snapshot.match;\n if (match === null || match.route.id !== route.id) {\n return null;\n }\n return match as RouteMatch<TRoute>;\n};\n"],"mappings":"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","names":["useNavigate","useNavigationSnapshot","import_effect","import_effect","import_react","import_jsx_runtime","navigate","useNavigate","useNavigationSnapshot"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Link,
|
|
3
|
+
Outlet,
|
|
4
|
+
navigate,
|
|
5
|
+
revalidateNavigation,
|
|
6
|
+
routeHref,
|
|
7
|
+
routePath,
|
|
8
|
+
routeSearchText,
|
|
9
|
+
routeUrl,
|
|
10
|
+
useNavigate,
|
|
11
|
+
useNavigationSnapshot,
|
|
12
|
+
useRouteMatch
|
|
13
|
+
} from "../chunk-6FI4ROTW.js";
|
|
14
|
+
import "../chunk-2GIUCKL2.js";
|
|
15
|
+
import {
|
|
16
|
+
NavigationCancelledError,
|
|
17
|
+
NavigationRuntimeError,
|
|
18
|
+
defineLoader,
|
|
19
|
+
defineRoute
|
|
20
|
+
} from "../chunk-O7XTA7H3.js";
|
|
21
|
+
import "../chunk-YG22YP5K.js";
|
|
22
|
+
import "../chunk-SKC3HMF3.js";
|
|
23
|
+
export {
|
|
24
|
+
Link,
|
|
25
|
+
NavigationCancelledError,
|
|
26
|
+
NavigationRuntimeError,
|
|
27
|
+
Outlet,
|
|
28
|
+
defineLoader,
|
|
29
|
+
defineRoute,
|
|
30
|
+
navigate,
|
|
31
|
+
revalidateNavigation,
|
|
32
|
+
routeHref,
|
|
33
|
+
routePath,
|
|
34
|
+
routeSearchText,
|
|
35
|
+
routeUrl,
|
|
36
|
+
useNavigate,
|
|
37
|
+
useNavigationSnapshot,
|
|
38
|
+
useRouteMatch
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AnyRouteDefinition, NavigationSnapshot, RouteMatch } from "./types";
|
|
2
|
+
export { Link, Outlet, type LinkProps, } from "../navigation/react";
|
|
3
|
+
export declare const useNavigate: () => ((href: string) => Promise<NavigationSnapshot>);
|
|
4
|
+
export declare const useNavigationSnapshot: () => NavigationSnapshot;
|
|
5
|
+
export declare const useRouteMatch: <TRoute extends AnyRouteDefinition>(route: TRoute) => RouteMatch<TRoute> | null;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { Navigation } from "../navigation";
|
|
3
|
+
import type { NavigationError, NavigationSnapshot } from "./types";
|
|
4
|
+
export declare const navigate: (href: string) => Effect.Effect<NavigationSnapshot, NavigationError, Navigation>;
|
|
5
|
+
export declare const revalidateNavigation: () => Effect.Effect<NavigationSnapshot, NavigationError, Navigation>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defineLoader, defineRoute, NavigationCancelledError, NavigationRuntimeError, type AnyLoaderDefinition, type AnyRouteDefinition, type LoaderContext, type LoaderDefinition, type LoaderSnapshotEntry, type NavigationError, type NavigationSnapshot, type RouteDefinition, type RouteMatch, } from "../navigation/types";
|