@typed/navigation 0.5.3 → 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.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/Blocking.js +53 -0
  4. package/dist/cjs/Blocking.js.map +1 -0
  5. package/dist/cjs/Layer.js +27 -0
  6. package/dist/cjs/Layer.js.map +1 -0
  7. package/dist/cjs/Navigation.js +184 -62
  8. package/dist/cjs/Navigation.js.map +1 -1
  9. package/dist/cjs/index.js +36 -17
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/internal/fromWindow.js +376 -0
  12. package/dist/cjs/internal/fromWindow.js.map +1 -0
  13. package/dist/cjs/internal/memory.js +67 -0
  14. package/dist/cjs/internal/memory.js.map +1 -0
  15. package/dist/cjs/internal/shared.js +403 -0
  16. package/dist/cjs/internal/shared.js.map +1 -0
  17. package/dist/dts/Blocking.d.ts +33 -0
  18. package/dist/dts/Blocking.d.ts.map +1 -0
  19. package/dist/dts/Layer.d.ts +44 -0
  20. package/dist/dts/Layer.d.ts.map +1 -0
  21. package/dist/dts/Navigation.d.ts +377 -0
  22. package/dist/dts/Navigation.d.ts.map +1 -0
  23. package/dist/dts/index.d.ts +17 -0
  24. package/dist/dts/index.d.ts.map +1 -0
  25. package/dist/dts/internal/fromWindow.d.ts +12 -0
  26. package/dist/dts/internal/fromWindow.d.ts.map +1 -0
  27. package/dist/dts/internal/memory.d.ts +6 -0
  28. package/dist/dts/internal/memory.d.ts.map +1 -0
  29. package/dist/dts/internal/shared.d.ts +139 -0
  30. package/dist/dts/internal/shared.d.ts.map +1 -0
  31. package/dist/esm/Blocking.js +39 -0
  32. package/dist/esm/Blocking.js.map +1 -0
  33. package/dist/esm/Layer.js +18 -0
  34. package/dist/esm/Layer.js.map +1 -0
  35. package/dist/esm/Navigation.js +166 -0
  36. package/dist/esm/Navigation.js.map +1 -0
  37. package/dist/esm/index.js +17 -0
  38. package/dist/esm/index.js.map +1 -0
  39. package/dist/esm/internal/fromWindow.js +273 -0
  40. package/dist/esm/internal/fromWindow.js.map +1 -0
  41. package/dist/esm/internal/memory.js +54 -0
  42. package/dist/esm/internal/memory.js.map +1 -0
  43. package/dist/esm/internal/shared.js +336 -0
  44. package/dist/esm/internal/shared.js.map +1 -0
  45. package/dist/esm/package.json +4 -0
  46. package/package.json +52 -32
  47. package/src/Blocking.ts +102 -0
  48. package/src/Layer.ts +53 -0
  49. package/src/Navigation.ts +342 -159
  50. package/src/index.ts +17 -3
  51. package/src/internal/fromWindow.ts +421 -0
  52. package/src/internal/memory.ts +79 -0
  53. package/src/internal/shared.ts +514 -0
  54. package/dist/DOM.d.ts +0 -12
  55. package/dist/DOM.d.ts.map +0 -1
  56. package/dist/DOM.js +0 -87
  57. package/dist/DOM.js.map +0 -1
  58. package/dist/Memory.d.ts +0 -10
  59. package/dist/Memory.d.ts.map +0 -1
  60. package/dist/Memory.js +0 -55
  61. package/dist/Memory.js.map +0 -1
  62. package/dist/Navigation.d.ts +0 -116
  63. package/dist/Navigation.d.ts.map +0 -1
  64. package/dist/Navigation.js +0 -36
  65. package/dist/Navigation.js.map +0 -1
  66. package/dist/_makeServerWindow.d.ts +0 -16
  67. package/dist/_makeServerWindow.d.ts.map +0 -1
  68. package/dist/_makeServerWindow.js +0 -9
  69. package/dist/_makeServerWindow.js.map +0 -1
  70. package/dist/cjs/DOM.d.ts +0 -12
  71. package/dist/cjs/DOM.d.ts.map +0 -1
  72. package/dist/cjs/DOM.js +0 -116
  73. package/dist/cjs/DOM.js.map +0 -1
  74. package/dist/cjs/Memory.d.ts +0 -10
  75. package/dist/cjs/Memory.d.ts.map +0 -1
  76. package/dist/cjs/Memory.js +0 -82
  77. package/dist/cjs/Memory.js.map +0 -1
  78. package/dist/cjs/Navigation.d.ts +0 -116
  79. package/dist/cjs/Navigation.d.ts.map +0 -1
  80. package/dist/cjs/_makeServerWindow.d.ts +0 -16
  81. package/dist/cjs/_makeServerWindow.d.ts.map +0 -1
  82. package/dist/cjs/_makeServerWindow.js +0 -36
  83. package/dist/cjs/_makeServerWindow.js.map +0 -1
  84. package/dist/cjs/constant.d.ts +0 -2
  85. package/dist/cjs/constant.d.ts.map +0 -1
  86. package/dist/cjs/constant.js +0 -30
  87. package/dist/cjs/constant.js.map +0 -1
  88. package/dist/cjs/dom-intent.d.ts +0 -28
  89. package/dist/cjs/dom-intent.d.ts.map +0 -1
  90. package/dist/cjs/dom-intent.js +0 -172
  91. package/dist/cjs/dom-intent.js.map +0 -1
  92. package/dist/cjs/history.d.ts +0 -31
  93. package/dist/cjs/history.d.ts.map +0 -1
  94. package/dist/cjs/history.js +0 -131
  95. package/dist/cjs/history.js.map +0 -1
  96. package/dist/cjs/index.d.ts +0 -4
  97. package/dist/cjs/index.d.ts.map +0 -1
  98. package/dist/cjs/json.d.ts +0 -13
  99. package/dist/cjs/json.d.ts.map +0 -1
  100. package/dist/cjs/json.js +0 -24
  101. package/dist/cjs/json.js.map +0 -1
  102. package/dist/cjs/memory-intent.d.ts +0 -27
  103. package/dist/cjs/memory-intent.d.ts.map +0 -1
  104. package/dist/cjs/memory-intent.js +0 -156
  105. package/dist/cjs/memory-intent.js.map +0 -1
  106. package/dist/cjs/model.d.ts +0 -22
  107. package/dist/cjs/model.d.ts.map +0 -1
  108. package/dist/cjs/model.js +0 -48
  109. package/dist/cjs/model.js.map +0 -1
  110. package/dist/cjs/shared-intent.d.ts +0 -14
  111. package/dist/cjs/shared-intent.d.ts.map +0 -1
  112. package/dist/cjs/shared-intent.js +0 -82
  113. package/dist/cjs/shared-intent.js.map +0 -1
  114. package/dist/cjs/storage.d.ts +0 -19
  115. package/dist/cjs/storage.d.ts.map +0 -1
  116. package/dist/cjs/storage.js +0 -101
  117. package/dist/cjs/storage.js.map +0 -1
  118. package/dist/cjs/util.d.ts +0 -5
  119. package/dist/cjs/util.d.ts.map +0 -1
  120. package/dist/cjs/util.js +0 -39
  121. package/dist/cjs/util.js.map +0 -1
  122. package/dist/constant.d.ts +0 -2
  123. package/dist/constant.d.ts.map +0 -1
  124. package/dist/constant.js +0 -4
  125. package/dist/constant.js.map +0 -1
  126. package/dist/dom-intent.d.ts +0 -28
  127. package/dist/dom-intent.d.ts.map +0 -1
  128. package/dist/dom-intent.js +0 -140
  129. package/dist/dom-intent.js.map +0 -1
  130. package/dist/history.d.ts +0 -31
  131. package/dist/history.d.ts.map +0 -1
  132. package/dist/history.js +0 -104
  133. package/dist/history.js.map +0 -1
  134. package/dist/index.d.ts +0 -4
  135. package/dist/index.d.ts.map +0 -1
  136. package/dist/index.js +0 -4
  137. package/dist/index.js.map +0 -1
  138. package/dist/intent.d.ts +0 -31
  139. package/dist/intent.d.ts.map +0 -1
  140. package/dist/intent.js +0 -157
  141. package/dist/intent.js.map +0 -1
  142. package/dist/json.d.ts +0 -13
  143. package/dist/json.d.ts.map +0 -1
  144. package/dist/json.js +0 -17
  145. package/dist/json.js.map +0 -1
  146. package/dist/memory-intent.d.ts +0 -27
  147. package/dist/memory-intent.d.ts.map +0 -1
  148. package/dist/memory-intent.js +0 -124
  149. package/dist/memory-intent.js.map +0 -1
  150. package/dist/model.d.ts +0 -22
  151. package/dist/model.d.ts.map +0 -1
  152. package/dist/model.js +0 -21
  153. package/dist/model.js.map +0 -1
  154. package/dist/shared-intent.d.ts +0 -14
  155. package/dist/shared-intent.d.ts.map +0 -1
  156. package/dist/shared-intent.js +0 -51
  157. package/dist/shared-intent.js.map +0 -1
  158. package/dist/storage.d.ts +0 -19
  159. package/dist/storage.d.ts.map +0 -1
  160. package/dist/storage.js +0 -73
  161. package/dist/storage.js.map +0 -1
  162. package/dist/tsconfig.cjs.build.tsbuildinfo +0 -1
  163. package/dist/util.d.ts +0 -5
  164. package/dist/util.d.ts.map +0 -1
  165. package/dist/util.js +0 -12
  166. package/dist/util.js.map +0 -1
  167. package/eslintrc.json +0 -3
  168. package/project.json +0 -46
  169. package/src/DOM.test.ts +0 -699
  170. package/src/DOM.ts +0 -163
  171. package/src/Memory.test.ts +0 -464
  172. package/src/Memory.ts +0 -102
  173. package/src/_makeServerWindow.ts +0 -28
  174. package/src/dom-intent.ts +0 -268
  175. package/src/history.ts +0 -165
  176. package/src/json.ts +0 -31
  177. package/src/memory-intent.ts +0 -224
  178. package/src/model.ts +0 -54
  179. package/src/shared-intent.ts +0 -117
  180. package/src/storage.ts +0 -101
  181. package/src/util.ts +0 -20
  182. package/tsconfig.build.json +0 -4
  183. package/tsconfig.build.tsbuildinfo +0 -1
  184. package/tsconfig.cjs.build.json +0 -22
  185. package/tsconfig.json +0 -27
  186. package/vite.config.mjs +0 -3
@@ -0,0 +1,336 @@
1
+ import { Schema } from "@effect/schema";
2
+ import * as RefSubject from "@typed/fx/RefSubject";
3
+ import { GetRandomValues, makeUuid } from "@typed/id";
4
+ import { Effect, Either, Option } from "effect";
5
+ import { Destination, Transition } from "../Navigation";
6
+ export const NavigationState = Schema.struct({
7
+ entries: Schema.array(Destination),
8
+ index: Schema.number,
9
+ transition: Schema.optionFromNullable(Transition)
10
+ });
11
+ export const getUrl = (origin, urlOrPath) => {
12
+ return typeof urlOrPath === "string" ? new URL(urlOrPath, origin) : urlOrPath;
13
+ };
14
+ export function setupFromModelAndIntent(modelAndIntent, origin, base, getRandomValues, newNavigationState) {
15
+ const { beforeHandlers, canGoBack, canGoForward, commit, handlers, state } = modelAndIntent;
16
+ const entries = state.map((s) => s.entries);
17
+ const currentEntry = state.map((s) => s.entries[s.index]);
18
+ const transition = state.map((s) => s.transition);
19
+ const runBeforeHandlers = (event) => Effect.gen(function* (_) {
20
+ const handlers = yield* _(beforeHandlers);
21
+ const matches = [];
22
+ for (const [handler, ctx] of handlers) {
23
+ const exit = yield* _(handler(event), Effect.provide(ctx), Effect.either);
24
+ if (Either.isRight(exit)) {
25
+ const match = exit.right;
26
+ if (Option.isSome(match)) {
27
+ matches.push(Effect.provide(match.value, ctx));
28
+ }
29
+ }
30
+ else {
31
+ return Option.some(exit.left);
32
+ }
33
+ }
34
+ if (matches.length > 0) {
35
+ for (const match of matches) {
36
+ const exit = yield* _(match, Effect.either);
37
+ if (Either.isLeft(exit)) {
38
+ return Option.some(exit.left);
39
+ }
40
+ }
41
+ }
42
+ return Option.none();
43
+ });
44
+ const runHandlers = (event) => Effect.gen(function* (_) {
45
+ const eventHandlers = yield* _(handlers);
46
+ const matches = [];
47
+ for (const [handler, ctx] of eventHandlers) {
48
+ const match = yield* _(handler(event), Effect.provide(ctx));
49
+ if (Option.isSome(match)) {
50
+ matches.push(Effect.provide(match.value, ctx));
51
+ }
52
+ }
53
+ if (matches.length > 0) {
54
+ yield* _(Effect.all(matches));
55
+ }
56
+ });
57
+ const runNavigationEvent = (beforeEvent, get, set, depth, skipCommit = false) => Effect.gen(function* (_) {
58
+ let current = yield* _(get);
59
+ current = yield* _(set({ ...current, transition: Option.some(beforeEvent) }));
60
+ if (!skipCommit) {
61
+ const beforeError = yield* _(runBeforeHandlers(beforeEvent));
62
+ if (Option.isSome(beforeError)) {
63
+ return yield* _(handleError(beforeError.value, get, set, depth));
64
+ }
65
+ }
66
+ const to = isDestination(beforeEvent.to) ? beforeEvent.to : yield* _(upgradeProposedDestination(beforeEvent.to));
67
+ if (!skipCommit) {
68
+ yield* _(commit(to, beforeEvent));
69
+ }
70
+ if (newNavigationState) {
71
+ const { entries, index } = yield* _(set(newNavigationState()));
72
+ return entries[index];
73
+ }
74
+ else {
75
+ const event = {
76
+ type: beforeEvent.type,
77
+ info: beforeEvent.info,
78
+ destination: to
79
+ };
80
+ if (beforeEvent.type === "push") {
81
+ const index = current.index + 1;
82
+ const entries = current.entries.slice(0, index).concat([to]);
83
+ yield* _(set({ entries, index, transition: Option.none() }));
84
+ }
85
+ else if (beforeEvent.type === "replace") {
86
+ const index = current.index;
87
+ const before = current.entries.slice(0, index);
88
+ const after = current.entries.slice(index + 1);
89
+ const entries = [...before, to, ...after];
90
+ yield* _(set({ entries, index, transition: Option.none() }));
91
+ }
92
+ else if (beforeEvent.type === "reload") {
93
+ yield* _(set({ ...current, transition: Option.none() }));
94
+ }
95
+ else {
96
+ const { delta } = beforeEvent;
97
+ const nextIndex = current.index + delta;
98
+ yield* _(set({ ...current, index: nextIndex, transition: Option.none() }));
99
+ }
100
+ yield* _(runHandlers(event));
101
+ }
102
+ return to;
103
+ }).pipe(GetRandomValues.provide(getRandomValues));
104
+ const handleError = (error, get, set, depth) => Effect.gen(function* (_) {
105
+ if (depth >= 25) {
106
+ return yield* _(Effect.dieMessage(`Redirect loop detected.`));
107
+ }
108
+ const { entries, index } = yield* _(get);
109
+ const from = entries[index];
110
+ if (error._tag === "CancelNavigation") {
111
+ yield* _(set({ entries, index, transition: Option.none() }));
112
+ return from;
113
+ }
114
+ else {
115
+ const event = yield* _(makeRedirectEvent(origin, error, from));
116
+ return yield* _(runNavigationEvent(event, get, set, depth + 1));
117
+ }
118
+ });
119
+ const navigate = (pathOrUrl, options, skipCommit = false) => state.runUpdate((get, set) => Effect.gen(function* (_) {
120
+ const state = yield* _(get);
121
+ const from = state.entries[state.index];
122
+ const history = options?.history ?? "auto";
123
+ const to = yield* _(makeOrUpdateDestination(state, getUrl(origin, pathOrUrl), options?.state, origin), GetRandomValues.provide(getRandomValues));
124
+ const type = history === "auto" ? from.key === to.key ? "replace" : "push" : history;
125
+ const event = {
126
+ type,
127
+ from,
128
+ to,
129
+ delta: type === "replace" ? 0 : 1,
130
+ info: options?.info
131
+ };
132
+ return yield* _(runNavigationEvent(event, get, set, 0, skipCommit));
133
+ }));
134
+ const traverseTo = (key, options, skipCommit = false) => state.runUpdate((get, set) => Effect.gen(function* (_) {
135
+ const state = yield* _(get);
136
+ const { entries, index } = state;
137
+ const from = entries[index];
138
+ const nextIndex = entries.findIndex((e) => e.key === key);
139
+ if (nextIndex === -1)
140
+ return from;
141
+ const id = yield* _(makeUuid, GetRandomValues.provide(getRandomValues));
142
+ const to = { ...entries[nextIndex], id };
143
+ const delta = nextIndex - index;
144
+ const event = {
145
+ type: "traverse",
146
+ from,
147
+ to,
148
+ delta,
149
+ info: options?.info
150
+ };
151
+ return yield* _(runNavigationEvent(event, get, set, 0, skipCommit));
152
+ }));
153
+ const back = (options, skipCommit = false) => Effect.gen(function* (_) {
154
+ const { entries, index } = yield* _(state);
155
+ if (index === 0)
156
+ return entries[index];
157
+ const { key } = entries[index - 1];
158
+ return yield* _(traverseTo(key, options, skipCommit));
159
+ });
160
+ const forward = (options, skipCommit = false) => Effect.gen(function* (_) {
161
+ const { entries, index } = yield* _(state);
162
+ if (index === entries.length - 1)
163
+ return entries[index];
164
+ const { key } = entries[index + 1];
165
+ return yield* _(traverseTo(key, options, skipCommit));
166
+ });
167
+ const reload = (options, skipCommit = false) => state.runUpdate((get, set) => Effect.gen(function* (_) {
168
+ const { entries, index } = yield* _(state);
169
+ const current = entries[index];
170
+ const event = {
171
+ type: "reload",
172
+ from: current,
173
+ to: current,
174
+ delta: 0,
175
+ info: options?.info
176
+ };
177
+ return yield* _(runNavigationEvent(event, get, set, 0, skipCommit));
178
+ }));
179
+ const beforeNavigation = (handler) => Effect.contextWithEffect((ctx) => {
180
+ const entry = [handler, ctx];
181
+ return Effect.zipRight(beforeHandlers.update((handlers) => new Set([...handlers, entry])), Effect.addFinalizer(() => beforeHandlers.update((handlers) => {
182
+ const updated = new Set(handlers);
183
+ updated.delete(entry);
184
+ return updated;
185
+ })));
186
+ });
187
+ const onNavigation = (handler) => Effect.contextWithEffect((ctx) => {
188
+ const entry = [handler, ctx];
189
+ return Effect.zipRight(handlers.update((handlers) => new Set([...handlers, entry])), Effect.addFinalizer(() => handlers.update((handlers) => {
190
+ const updated = new Set(handlers);
191
+ updated.delete(entry);
192
+ return updated;
193
+ })));
194
+ });
195
+ const updateCurrentEntry = (options) => state.runUpdate((get, set) => Effect.gen(function* (_) {
196
+ const { entries, index } = yield* _(get);
197
+ const current = entries[index];
198
+ const event = {
199
+ type: "replace",
200
+ from: current,
201
+ to: { ...current, state: options.state },
202
+ delta: 0,
203
+ info: null
204
+ };
205
+ return yield* _(runNavigationEvent(event, get, set, 0));
206
+ }));
207
+ const navigation = {
208
+ back,
209
+ base,
210
+ beforeNavigation,
211
+ canGoBack,
212
+ canGoForward,
213
+ currentEntry,
214
+ entries,
215
+ forward,
216
+ navigate,
217
+ onNavigation,
218
+ origin,
219
+ reload,
220
+ transition,
221
+ traverseTo,
222
+ updateCurrentEntry
223
+ };
224
+ return navigation;
225
+ }
226
+ export function makeRedirectEvent(origin, redirect, from) {
227
+ return Effect.gen(function* (_) {
228
+ const url = getUrl(origin, redirect.path);
229
+ const to = yield* _(makeDestination(url, redirect.options?.state, origin));
230
+ const event = {
231
+ type: "replace",
232
+ from,
233
+ to,
234
+ delta: 0,
235
+ info: redirect.options?.info
236
+ };
237
+ return event;
238
+ });
239
+ }
240
+ export function makeOrUpdateDestination(navigationState, url, state, origin) {
241
+ return Effect.gen(function* (_) {
242
+ const current = navigationState.entries[navigationState.index];
243
+ const isSameOriginAndPath = url.origin === current.url.origin && url.pathname === current.url.pathname;
244
+ if (isSameOriginAndPath) {
245
+ const id = yield* _(makeUuid);
246
+ const destination = {
247
+ id,
248
+ key: current.key,
249
+ url,
250
+ state: getOriginalState(state),
251
+ sameDocument: url.origin === origin
252
+ };
253
+ return destination;
254
+ }
255
+ else {
256
+ return yield* _(makeDestination(url, state, origin));
257
+ }
258
+ });
259
+ }
260
+ export function makeDestination(url, state, origin) {
261
+ return Effect.gen(function* (_) {
262
+ if (isPatchedState(state)) {
263
+ const destination = {
264
+ id: state.id,
265
+ key: state.key,
266
+ url,
267
+ state: state.originalHistoryState,
268
+ sameDocument: url.origin === origin
269
+ };
270
+ return destination;
271
+ }
272
+ const id = yield* _(makeUuid);
273
+ const key = yield* _(makeUuid);
274
+ const destination = {
275
+ id,
276
+ key,
277
+ url,
278
+ state,
279
+ sameDocument: url.origin === origin
280
+ };
281
+ return destination;
282
+ });
283
+ }
284
+ export function upgradeProposedDestination(proposed) {
285
+ return Effect.gen(function* (_) {
286
+ const id = yield* _(makeUuid);
287
+ const key = yield* _(makeUuid);
288
+ const destination = {
289
+ id,
290
+ key,
291
+ url: proposed.url,
292
+ state: proposed.state,
293
+ sameDocument: proposed.sameDocument
294
+ };
295
+ return destination;
296
+ });
297
+ }
298
+ export function isPatchedState(state) {
299
+ if (state === null || !(typeof state === "object") || Array.isArray(state))
300
+ return false;
301
+ if ("id" in state && "key" in state && "originalHistoryState" in state)
302
+ return true;
303
+ return false;
304
+ }
305
+ export function getOriginalState(state) {
306
+ if (isPatchedState(state))
307
+ return state.originalHistoryState;
308
+ return state;
309
+ }
310
+ export function getOriginFromUrl(url) {
311
+ try {
312
+ if (typeof url === "string") {
313
+ return new URL(url).origin;
314
+ }
315
+ else {
316
+ return url.origin;
317
+ }
318
+ }
319
+ catch {
320
+ return "http://localhost";
321
+ }
322
+ }
323
+ export function isDestination(proposed) {
324
+ return "id" in proposed && "key" in proposed;
325
+ }
326
+ export function makeHandlersState() {
327
+ return Effect.gen(function* (_) {
328
+ const beforeHandlers = yield* _(RefSubject.fromEffect(Effect.sync(() => new Set())));
329
+ const handlers = yield* _(RefSubject.fromEffect(Effect.sync(() => new Set())));
330
+ return {
331
+ beforeHandlers,
332
+ handlers
333
+ };
334
+ });
335
+ }
336
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/internal/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "sideEffects": []
4
+ }
package/package.json CHANGED
@@ -1,39 +1,59 @@
1
1
  {
2
2
  "name": "@typed/navigation",
3
- "version": "0.5.3",
4
- "type": "module",
5
- "main": "dist/index.js",
6
- "module": "dist/index.js",
7
- "typings": "dist/index.d.ts",
8
- "types": "dist/index.d.ts",
3
+ "version": "0.6.0",
4
+ "description": "",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/tylors/typed.git"
9
+ },
10
+ "sideEffects": [],
11
+ "author": "Typed contributors",
12
+ "dependencies": {
13
+ "@effect/schema": "0.49.4",
14
+ "effect": "2.0.0-next.56",
15
+ "@typed/context": "0.1.0",
16
+ "@typed/dom": "0.1.0",
17
+ "@typed/fx": "1.18.0",
18
+ "@typed/id": "0.1.0"
19
+ },
20
+ "main": "./dist/cjs/index.js",
21
+ "module": "./dist/esm/index.js",
22
+ "types": "./dist/dts/index.d.ts",
9
23
  "exports": {
24
+ "./package.json": "./package.json",
10
25
  ".": {
11
- "import": "./dist/index.js",
12
- "require": "./dist/cjs/index.js",
13
- "types": "./dist/index.d.ts"
26
+ "types": "./dist/dts/index.d.ts",
27
+ "import": "./dist/esm/index.js",
28
+ "default": "./dist/cjs/index.js"
29
+ },
30
+ "./Blocking": {
31
+ "types": "./dist/dts/Blocking.d.ts",
32
+ "import": "./dist/esm/Blocking.js",
33
+ "default": "./dist/cjs/Blocking.js"
34
+ },
35
+ "./Layer": {
36
+ "types": "./dist/dts/Layer.d.ts",
37
+ "import": "./dist/esm/Layer.js",
38
+ "default": "./dist/cjs/Layer.js"
14
39
  },
15
- "./*": {
16
- "import": "./dist/*.js",
17
- "require": "./dist/cjs/*.js",
18
- "types": "./dist/*.d.ts"
40
+ "./Navigation": {
41
+ "types": "./dist/dts/Navigation.d.ts",
42
+ "import": "./dist/esm/Navigation.js",
43
+ "default": "./dist/cjs/Navigation.js"
19
44
  }
20
45
  },
21
- "dependencies": {
22
- "@effect/data": "^0.17.6",
23
- "@effect/io": "^0.38.2",
24
- "@typed/context": "0.18.3",
25
- "@typed/dom": "8.18.3",
26
- "@typed/fx": "1.17.3",
27
- "@typed/path": "0.6.3",
28
- "happy-dom": "^10.11.0"
29
- },
30
- "publishConfig": {
31
- "access": "public"
32
- },
33
- "sideEffects": false,
34
- "devDependencies": {
35
- "@types/node": "^20.5.6",
36
- "vitest": "0.34.3"
37
- },
38
- "gitHead": "0c9ea5d90dfcd6ae89256c7527fbcb99b5d2d6b7"
39
- }
46
+ "typesVersions": {
47
+ "*": {
48
+ "Blocking": [
49
+ "./dist/dts/Blocking.d.ts"
50
+ ],
51
+ "Layer": [
52
+ "./dist/dts/Layer.d.ts"
53
+ ],
54
+ "Navigation": [
55
+ "./dist/dts/Navigation.d.ts"
56
+ ]
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+
5
+ import type * as Computed from "@typed/fx/Computed"
6
+ import * as RefSubject from "@typed/fx/RefSubject"
7
+ import type { Scope } from "effect"
8
+ import { Deferred, Effect, Option } from "effect"
9
+ import type { BeforeNavigationEvent, CancelNavigation, Destination, NavigateOptions, RedirectError } from "./Navigation"
10
+ import { cancelNavigation, Navigation, redirectToPath } from "./Navigation"
11
+
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+ export interface BlockNavigation extends Computed.Computed<never, never, Option.Option<Blocking>> {
16
+ readonly isBlocking: Computed.Computed<never, never, boolean>
17
+ }
18
+
19
+ /**
20
+ * @since 1.0.0
21
+ */
22
+ export interface Blocking extends BeforeNavigationEvent {
23
+ readonly cancel: Effect.Effect<never, never, Destination>
24
+ readonly confirm: Effect.Effect<never, never, Destination>
25
+ readonly redirect: (urlOrPath: string | URL, options?: NavigateOptions) => Effect.Effect<never, never, Destination>
26
+ }
27
+
28
+ type InternalBlockState = Unblocked | Blocked
29
+
30
+ type Unblocked = {
31
+ readonly _tag: "Unblocked"
32
+ }
33
+ const Unblocked: Unblocked = { _tag: "Unblocked" }
34
+
35
+ type Blocked = {
36
+ readonly _tag: "Blocked"
37
+ readonly event: BeforeNavigationEvent
38
+ readonly deferred: Deferred.Deferred<RedirectError | CancelNavigation, void>
39
+ }
40
+
41
+ const Blocked = (event: BeforeNavigationEvent) =>
42
+ Effect.map(
43
+ Deferred.make<RedirectError | CancelNavigation, void>(),
44
+ (deferred): Blocked => ({ _tag: "Blocked", deferred, event })
45
+ )
46
+
47
+ /**
48
+ * @since 1.0.0
49
+ */
50
+ export interface UseBlockNavigationParams<R = never> {
51
+ readonly shouldBlock?: (event: BeforeNavigationEvent) => Effect.Effect<R, RedirectError | CancelNavigation, boolean>
52
+ }
53
+
54
+ /**
55
+ * @since 1.0.0
56
+ */
57
+ export const useBlockNavigation = <R = never>(
58
+ params: UseBlockNavigationParams<R> = {}
59
+ ): Effect.Effect<Navigation | R | Scope.Scope, never, BlockNavigation> =>
60
+ Effect.gen(function*(_) {
61
+ const navigation = yield* _(Navigation)
62
+ const blockState = yield* _(RefSubject.of<InternalBlockState>(Unblocked))
63
+
64
+ yield* _(
65
+ navigation.beforeNavigation<R, never>((event) =>
66
+ blockState.modifyEffect((state) =>
67
+ Effect.gen(function*(_) {
68
+ // Can't block twice
69
+ if (state._tag === "Blocked") return [Option.none(), state] as const
70
+
71
+ if (params.shouldBlock && !(yield* _(params.shouldBlock(event)))) {
72
+ return [Option.none(), state] as const
73
+ }
74
+
75
+ const updated = yield* _(Blocked(event))
76
+
77
+ return [
78
+ Option.some(Deferred.await(updated.deferred)),
79
+ updated
80
+ ] as const
81
+ })
82
+ )
83
+ )
84
+ )
85
+
86
+ const blockNavigation: BlockNavigation = Object.assign(
87
+ blockState.map((s) => s._tag === "Blocked" ? Option.some(blockedToBlocking(navigation, s)) : Option.none()),
88
+ { isBlocking: blockState.map((s) => s._tag === "Blocked") }
89
+ )
90
+
91
+ return blockNavigation
92
+ })
93
+
94
+ function blockedToBlocking(navigation: Navigation, state: Blocked): Blocking {
95
+ return {
96
+ ...state.event,
97
+ cancel: Effect.zipRight(Deferred.fail(state.deferred, cancelNavigation), navigation.currentEntry),
98
+ confirm: Effect.zipRight(Deferred.succeed(state.deferred, undefined), navigation.currentEntry),
99
+ redirect: (url, options) =>
100
+ Effect.zipRight(Deferred.fail(state.deferred, redirectToPath(url, options)), navigation.currentEntry)
101
+ }
102
+ }
package/src/Layer.ts ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+
5
+ import type { Effect, Layer } from "effect"
6
+ import * as internalFromWindow from "./internal/fromWindow"
7
+ import * as internalMemory from "./internal/memory"
8
+ import type { BeforeNavigationEvent, Destination, Navigation, NavigationError } from "./Navigation"
9
+
10
+ /**
11
+ * @since 1.0.0
12
+ */
13
+ export const fromWindow: Layer.Layer<Window, never, Navigation> = internalFromWindow.fromWindow
14
+
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export interface MemoryOptions {
19
+ readonly entries: ReadonlyArray<Destination>
20
+ readonly origin?: string | undefined
21
+ readonly base?: string | undefined
22
+ readonly currentIndex?: number | undefined
23
+ readonly maxEntries?: number | undefined
24
+ readonly commit?: Commit
25
+ }
26
+
27
+ /**
28
+ * @since 1.0.0
29
+ */
30
+ export const memory: (options: MemoryOptions) => Layer.Layer<never, never, Navigation> = internalMemory.memory
31
+
32
+ /**
33
+ * @since 1.0.0
34
+ */
35
+ export interface InitialMemoryOptions {
36
+ readonly url: string | URL
37
+ readonly origin?: string | undefined
38
+ readonly base?: string | undefined
39
+ readonly maxEntries?: number | undefined
40
+ readonly state?: unknown
41
+ readonly commit?: Commit
42
+ }
43
+
44
+ /**
45
+ * @since 1.0.0
46
+ */
47
+ export const initialMemory: (options: InitialMemoryOptions) => Layer.Layer<never, never, Navigation> =
48
+ internalMemory.initialMemory
49
+
50
+ /**
51
+ * @since 1.0.0
52
+ */
53
+ export type Commit = (to: Destination, event: BeforeNavigationEvent) => Effect.Effect<never, NavigationError, void>