@typed/navigation 0.1.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 (141) hide show
  1. package/dist/DOM.d.ts +12 -0
  2. package/dist/DOM.d.ts.map +1 -0
  3. package/dist/DOM.js +89 -0
  4. package/dist/DOM.js.map +1 -0
  5. package/dist/Memory.d.ts +10 -0
  6. package/dist/Memory.d.ts.map +1 -0
  7. package/dist/Memory.js +55 -0
  8. package/dist/Memory.js.map +1 -0
  9. package/dist/Navigation.d.ts +117 -0
  10. package/dist/Navigation.d.ts.map +1 -0
  11. package/dist/Navigation.js +36 -0
  12. package/dist/Navigation.js.map +1 -0
  13. package/dist/_makeServerWindow.d.ts +16 -0
  14. package/dist/_makeServerWindow.d.ts.map +1 -0
  15. package/dist/_makeServerWindow.js +9 -0
  16. package/dist/_makeServerWindow.js.map +1 -0
  17. package/dist/cjs/DOM.d.ts +12 -0
  18. package/dist/cjs/DOM.d.ts.map +1 -0
  19. package/dist/cjs/DOM.js +118 -0
  20. package/dist/cjs/DOM.js.map +1 -0
  21. package/dist/cjs/Memory.d.ts +10 -0
  22. package/dist/cjs/Memory.d.ts.map +1 -0
  23. package/dist/cjs/Memory.js +82 -0
  24. package/dist/cjs/Memory.js.map +1 -0
  25. package/dist/cjs/Navigation.d.ts +117 -0
  26. package/dist/cjs/Navigation.d.ts.map +1 -0
  27. package/dist/cjs/Navigation.js +69 -0
  28. package/dist/cjs/Navigation.js.map +1 -0
  29. package/dist/cjs/_makeServerWindow.d.ts +16 -0
  30. package/dist/cjs/_makeServerWindow.d.ts.map +1 -0
  31. package/dist/cjs/_makeServerWindow.js +36 -0
  32. package/dist/cjs/_makeServerWindow.js.map +1 -0
  33. package/dist/cjs/constant.d.ts +2 -0
  34. package/dist/cjs/constant.d.ts.map +1 -0
  35. package/dist/cjs/constant.js +30 -0
  36. package/dist/cjs/constant.js.map +1 -0
  37. package/dist/cjs/dom-intent.d.ts +29 -0
  38. package/dist/cjs/dom-intent.d.ts.map +1 -0
  39. package/dist/cjs/dom-intent.js +173 -0
  40. package/dist/cjs/dom-intent.js.map +1 -0
  41. package/dist/cjs/history.d.ts +31 -0
  42. package/dist/cjs/history.d.ts.map +1 -0
  43. package/dist/cjs/history.js +115 -0
  44. package/dist/cjs/history.js.map +1 -0
  45. package/dist/cjs/index.d.ts +4 -0
  46. package/dist/cjs/index.d.ts.map +1 -0
  47. package/dist/cjs/index.js +20 -0
  48. package/dist/cjs/index.js.map +1 -0
  49. package/dist/cjs/json.d.ts +13 -0
  50. package/dist/cjs/json.d.ts.map +1 -0
  51. package/dist/cjs/json.js +24 -0
  52. package/dist/cjs/json.js.map +1 -0
  53. package/dist/cjs/memory-intent.d.ts +28 -0
  54. package/dist/cjs/memory-intent.d.ts.map +1 -0
  55. package/dist/cjs/memory-intent.js +149 -0
  56. package/dist/cjs/memory-intent.js.map +1 -0
  57. package/dist/cjs/model.d.ts +22 -0
  58. package/dist/cjs/model.d.ts.map +1 -0
  59. package/dist/cjs/model.js +48 -0
  60. package/dist/cjs/model.js.map +1 -0
  61. package/dist/cjs/shared-intent.d.ts +15 -0
  62. package/dist/cjs/shared-intent.d.ts.map +1 -0
  63. package/dist/cjs/shared-intent.js +82 -0
  64. package/dist/cjs/shared-intent.js.map +1 -0
  65. package/dist/cjs/storage.d.ts +19 -0
  66. package/dist/cjs/storage.d.ts.map +1 -0
  67. package/dist/cjs/storage.js +101 -0
  68. package/dist/cjs/storage.js.map +1 -0
  69. package/dist/cjs/util.d.ts +5 -0
  70. package/dist/cjs/util.d.ts.map +1 -0
  71. package/dist/cjs/util.js +39 -0
  72. package/dist/cjs/util.js.map +1 -0
  73. package/dist/constant.d.ts +2 -0
  74. package/dist/constant.d.ts.map +1 -0
  75. package/dist/constant.js +4 -0
  76. package/dist/constant.js.map +1 -0
  77. package/dist/dom-intent.d.ts +29 -0
  78. package/dist/dom-intent.d.ts.map +1 -0
  79. package/dist/dom-intent.js +141 -0
  80. package/dist/dom-intent.js.map +1 -0
  81. package/dist/history.d.ts +31 -0
  82. package/dist/history.d.ts.map +1 -0
  83. package/dist/history.js +88 -0
  84. package/dist/history.js.map +1 -0
  85. package/dist/index.d.ts +4 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +4 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/intent.d.ts +31 -0
  90. package/dist/intent.d.ts.map +1 -0
  91. package/dist/intent.js +157 -0
  92. package/dist/intent.js.map +1 -0
  93. package/dist/json.d.ts +13 -0
  94. package/dist/json.d.ts.map +1 -0
  95. package/dist/json.js +17 -0
  96. package/dist/json.js.map +1 -0
  97. package/dist/memory-intent.d.ts +28 -0
  98. package/dist/memory-intent.d.ts.map +1 -0
  99. package/dist/memory-intent.js +117 -0
  100. package/dist/memory-intent.js.map +1 -0
  101. package/dist/model.d.ts +22 -0
  102. package/dist/model.d.ts.map +1 -0
  103. package/dist/model.js +21 -0
  104. package/dist/model.js.map +1 -0
  105. package/dist/shared-intent.d.ts +15 -0
  106. package/dist/shared-intent.d.ts.map +1 -0
  107. package/dist/shared-intent.js +51 -0
  108. package/dist/shared-intent.js.map +1 -0
  109. package/dist/storage.d.ts +19 -0
  110. package/dist/storage.d.ts.map +1 -0
  111. package/dist/storage.js +73 -0
  112. package/dist/storage.js.map +1 -0
  113. package/dist/tsconfig.cjs.build.tsbuildinfo +1 -0
  114. package/dist/util.d.ts +5 -0
  115. package/dist/util.d.ts.map +1 -0
  116. package/dist/util.js +12 -0
  117. package/dist/util.js.map +1 -0
  118. package/eslintrc.json +3 -0
  119. package/package.json +38 -0
  120. package/project.json +43 -0
  121. package/src/DOM.test.ts +704 -0
  122. package/src/DOM.ts +165 -0
  123. package/src/Memory.test.ts +464 -0
  124. package/src/Memory.ts +102 -0
  125. package/src/Navigation.ts +192 -0
  126. package/src/_makeServerWindow.ts +28 -0
  127. package/src/constant.ts +5 -0
  128. package/src/dom-intent.ts +276 -0
  129. package/src/history.ts +141 -0
  130. package/src/index.ts +3 -0
  131. package/src/json.ts +31 -0
  132. package/src/memory-intent.ts +221 -0
  133. package/src/model.ts +54 -0
  134. package/src/shared-intent.ts +120 -0
  135. package/src/storage.ts +101 -0
  136. package/src/util.ts +20 -0
  137. package/tsconfig.build.json +4 -0
  138. package/tsconfig.build.tsbuildinfo +1 -0
  139. package/tsconfig.cjs.build.json +22 -0
  140. package/tsconfig.json +27 -0
  141. package/vite.config.js +3 -0
package/dist/intent.js ADDED
@@ -0,0 +1,157 @@
1
+ import * as Option from '@effect/data/Option';
2
+ import * as Effect from '@effect/io/Effect';
3
+ import { History, Location } from '@typed/dom';
4
+ import { NavigationType, } from './Navigation.js';
5
+ import { ServiceId } from './constant.js';
6
+ import { encodeEvent } from './json.js';
7
+ import { saveToStorage } from './storage.js';
8
+ import { createKey, getUrl } from './util.js';
9
+ // Roughly the number of History entries in a browser anyways
10
+ const DEFAULT_MAX_ENTRIES = 50;
11
+ export function makeIntent(model, options) {
12
+ const maxEntries = Math.abs(options.maxEntries ?? DEFAULT_MAX_ENTRIES);
13
+ const notify = makeNotify(model);
14
+ const save = makeSave(model);
15
+ const go = makeGo(model, notify, save);
16
+ const replace = makeReplace(model, notify, save);
17
+ const push = makePush(model, notify, save, maxEntries);
18
+ return {
19
+ back: (skipHistory) => go(-1, skipHistory),
20
+ forward: (skipHistory) => go(1, skipHistory),
21
+ push,
22
+ replace,
23
+ navigate: (url, options = {}) => options.history === 'replace' ? replace(url, options) : push(url, options),
24
+ go: go,
25
+ goTo: makeGoTo(model, go),
26
+ reload: makeReload(model, notify, save),
27
+ onNavigation: makeOnNavigation(model),
28
+ };
29
+ }
30
+ // Anytime there are changes to the model, we need to notify all event handlers
31
+ export const makeNotify = (model) => (event) => Effect.gen(function* ($) {
32
+ // Notify event handlers
33
+ if (model.eventHandlers.size > 0)
34
+ yield* $(Effect.forEachDiscard(model.eventHandlers, (handler) => handler(event)));
35
+ });
36
+ export const makeSave = (model) => (event) => Effect.gen(function* ($) {
37
+ const events = yield* $(model.events);
38
+ const index = yield* $(model.index);
39
+ // Save to storage
40
+ yield* $(saveToStorage(events, index));
41
+ // Update current entry
42
+ yield* $(model.currentEntry.set(event.destination));
43
+ // Update canGoForward
44
+ yield* $(model.canGoForward.set(index < events.length - 1));
45
+ });
46
+ export const makeOnNavigation = ({ eventHandlers }) => (handler) => Effect.uninterruptibleMask((restore) => Effect.gen(function* ($) {
47
+ const context = yield* $(Effect.context());
48
+ const handler_ = (event) => restore(Effect.provideContext(handler(event), context));
49
+ eventHandlers.add(handler_);
50
+ yield* $(Effect.addFinalizer(() => Effect.sync(() => eventHandlers.delete(handler_))));
51
+ }));
52
+ export const makeReload = (model, notify, save) => Effect.gen(function* ($) {
53
+ const i = yield* $(model.index.get);
54
+ const e = yield* $(model.events);
55
+ const event = e[i];
56
+ const reloadEvent = { ...event, navigationType: NavigationType.Reload };
57
+ yield* $(notify(reloadEvent));
58
+ yield* $(save(reloadEvent));
59
+ const location = yield* $(Location);
60
+ location.reload();
61
+ return event.destination;
62
+ });
63
+ export const makeReplace = (model, notify, save) => (url, options = {}, skipHistory = false) => Effect.gen(function* ($) {
64
+ const location = yield* $(Location);
65
+ const entry = yield* $(model.currentEntry.get);
66
+ const destination = {
67
+ key: entry.key,
68
+ url: getUrl(url, location.origin),
69
+ state: options.state,
70
+ };
71
+ const event = {
72
+ destination,
73
+ hashChange: entry.url.hash !== destination.url.hash,
74
+ navigationType: NavigationType.Replace,
75
+ };
76
+ yield* $(notify(event));
77
+ if (!skipHistory) {
78
+ const history = yield* $(History);
79
+ history.replaceState.call(ServiceId, { state: options.state, event: encodeEvent(event) }, '', url);
80
+ }
81
+ const currentIndex = yield* $(model.index);
82
+ yield* $(model.events.update((entries) => {
83
+ const updated = entries.slice(0);
84
+ updated[currentIndex] = event;
85
+ return updated;
86
+ }));
87
+ yield* $(save(event));
88
+ return destination;
89
+ });
90
+ export const makePush = (model, notify, save, maxEntries) => (url, options = {}, skipHistory = false) => Effect.gen(function* ($) {
91
+ const location = yield* $(Location);
92
+ const entry = yield* $(model.currentEntry.get);
93
+ const destination = {
94
+ key: yield* $(createKey),
95
+ url: getUrl(url, location.origin),
96
+ state: options.state,
97
+ };
98
+ const event = {
99
+ destination,
100
+ hashChange: entry.url.hash !== destination.url.hash,
101
+ navigationType: NavigationType.Push,
102
+ };
103
+ // Notify event handlers
104
+ yield* $(notify(event));
105
+ if (!skipHistory) {
106
+ const history = yield* $(History);
107
+ history.pushState.call(ServiceId, { state: options.state, event: encodeEvent(event) }, '', url);
108
+ }
109
+ const currentIndex = yield* $(model.index);
110
+ // Remove all entries after the current index
111
+ // and add the new destination to the end
112
+ yield* $(model.events.update((entries) => {
113
+ const updated = entries.slice(0, currentIndex + 1);
114
+ updated.push(event);
115
+ return updated.slice(-maxEntries);
116
+ }));
117
+ // Update the index to the new destination
118
+ yield* $(model.index.update((i) => i + 1));
119
+ yield* $(save(event));
120
+ return destination;
121
+ });
122
+ export const makeGo = (model, notify, save) => (delta, skipHistory = false) => Effect.gen(function* ($) {
123
+ const currentEntries = yield* $(model.events);
124
+ const totalEntries = currentEntries.length;
125
+ const currentIndex = yield* $(model.index);
126
+ // Nothing to do here
127
+ if (delta === 0)
128
+ return currentEntries[currentIndex].destination;
129
+ const nextIndex = delta > 0
130
+ ? Math.min(currentIndex + delta, totalEntries - 1)
131
+ : Math.max(currentIndex + delta, 0);
132
+ const nextEntry = currentEntries[nextIndex];
133
+ yield* $(notify({
134
+ ...nextEntry,
135
+ navigationType: nextIndex > currentIndex ? NavigationType.Forward : NavigationType.Back,
136
+ }));
137
+ if (!skipHistory) {
138
+ const history = yield* $(History);
139
+ history.go.call(ServiceId, delta);
140
+ }
141
+ yield* $(model.index.set(nextIndex));
142
+ yield* $(save(nextEntry));
143
+ return nextEntry.destination;
144
+ });
145
+ export const makeGoTo = (model, go) => (key) => Effect.gen(function* ($) {
146
+ const entries = yield* $(model.entries);
147
+ const currentIndex = yield* $(model.index);
148
+ const nextIndex = entries.findIndex((destination) => destination.key === key);
149
+ if (nextIndex === -1)
150
+ return Option.none();
151
+ const delta = nextIndex - currentIndex;
152
+ if (delta !== 0) {
153
+ return Option.some(yield* $(go(delta)));
154
+ }
155
+ return Option.some(entries[nextIndex]);
156
+ });
157
+ //# sourceMappingURL=intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../src/intent.ts"],"names":[],"mappings":"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"}
package/dist/json.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { Destination, NavigationEvent } from './Navigation.js';
2
+ export type NavigationEventJson = {
3
+ readonly [K in keyof NavigationEvent]: NavigationEvent[K] extends Destination ? DestinationJson : NavigationEvent[K];
4
+ };
5
+ type DestinationJson = {
6
+ readonly [K in keyof Destination]: Destination[K] extends URL ? string : Destination[K];
7
+ };
8
+ export declare const decodeDestination: (d: DestinationJson) => Destination;
9
+ export declare const decodeNavigationEvent: (event: NavigationEventJson) => NavigationEvent;
10
+ export declare const encodeEvent: (event: NavigationEvent) => NavigationEventJson;
11
+ export declare const encodeDestination: (destination: Destination) => DestinationJson;
12
+ export {};
13
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,CAAC,IAAI,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,WAAW,GACzE,eAAe,GACf,eAAe,CAAC,CAAC,CAAC;CACvB,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,CAAC,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;CACxF,CAAA;AAED,eAAO,MAAM,iBAAiB,MAAO,eAAe,KAAG,WAGrD,CAAA;AAEF,eAAO,MAAM,qBAAqB,UAAW,mBAAmB,KAAG,eAGjE,CAAA;AAEF,eAAO,MAAM,WAAW,UAAW,eAAe,KAAG,mBAGnD,CAAA;AAEF,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,KAAG,eAG3D,CAAA"}
package/dist/json.js ADDED
@@ -0,0 +1,17 @@
1
+ export const decodeDestination = (d) => ({
2
+ ...d,
3
+ url: new URL(d.url),
4
+ });
5
+ export const decodeNavigationEvent = (event) => ({
6
+ ...event,
7
+ destination: decodeDestination(event.destination),
8
+ });
9
+ export const encodeEvent = (event) => ({
10
+ ...event,
11
+ destination: encodeDestination(event.destination),
12
+ });
13
+ export const encodeDestination = (destination) => ({
14
+ ...destination,
15
+ url: destination.url.href,
16
+ });
17
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAkB,EAAe,EAAE,CAAC,CAAC;IACrE,GAAG,CAAC;IACJ,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;CACpB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAA0B,EAAmB,EAAE,CAAC,CAAC;IACrF,GAAG,KAAK;IACR,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC;CAClD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAsB,EAAuB,EAAE,CAAC,CAAC;IAC3E,GAAG,KAAK;IACR,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC;CAClD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAwB,EAAmB,EAAE,CAAC,CAAC;IAC/E,GAAG,WAAW;IACd,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI;CAC1B,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { Option } from '@effect/data/Option';
2
+ import * as Cause from '@effect/io/Cause';
3
+ import * as Effect from '@effect/io/Effect';
4
+ import type { MemoryNavigationOptions } from './Memory.js';
5
+ import { Destination, NavigateOptions, NavigationError, NavigationEvent } from './Navigation.js';
6
+ import { Model } from './model.js';
7
+ import { Notify, Save, makeOnNavigation, makeOnNavigationEnd } from './shared-intent.js';
8
+ export type MemoryIntent = {
9
+ readonly back: ReturnType<ReturnType<typeof makeGo>>;
10
+ readonly forward: ReturnType<ReturnType<typeof makeGo>>;
11
+ readonly push: ReturnType<typeof makePush>;
12
+ readonly replace: ReturnType<typeof makeReplace>;
13
+ readonly navigate: (url: string, options?: NavigateOptions) => ReturnType<ReturnType<typeof makePush | typeof makeReplace>>;
14
+ readonly notify: Notify;
15
+ readonly go: ReturnType<typeof makeGo>;
16
+ readonly goTo: (key: string) => Effect.Effect<never, Cause.NoSuchElementException | NavigationError, Option<Destination>>;
17
+ readonly reload: ReturnType<typeof makeReload>;
18
+ readonly onNavigation: ReturnType<typeof makeOnNavigation>;
19
+ readonly onNavigationEnd: ReturnType<typeof makeOnNavigationEnd>;
20
+ };
21
+ export declare function makeIntent(model: Model, options: MemoryNavigationOptions): MemoryIntent;
22
+ export type Intent = ReturnType<typeof makeIntent>;
23
+ export declare const makeSave: (model: Model) => (event: NavigationEvent) => Effect.Effect<never, Cause.NoSuchElementException, void>;
24
+ export declare const makeReload: (model: Model, notify: Notify, save: Save<never>) => Effect.Effect<never, NavigationError | Cause.NoSuchElementException, Destination>;
25
+ export declare const makeReplace: (model: Model, notify: Notify, save: Save<never>, base: string, origin: string) => (url: string, options?: NavigateOptions) => Effect.Effect<never, NavigationError | Cause.NoSuchElementException, Destination>;
26
+ export declare const makePush: (model: Model, notify: Notify, save: Save<never>, base: string, origin: string, maxEntries: number) => (url: string, options?: NavigateOptions) => Effect.Effect<never, NavigationError | Cause.NoSuchElementException, Destination>;
27
+ export declare const makeGo: (model: Model, notify: Notify, save: Save<never>) => (delta: number) => Effect.Effect<never, NavigationError | Cause.NoSuchElementException, Destination>;
28
+ //# sourceMappingURL=memory-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-intent.d.ts","sourceRoot":"","sources":["../src/memory-intent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EACf,eAAe,EAEhB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EACL,MAAM,EACN,IAAI,EAGJ,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,oBAAoB,CAAA;AAM3B,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAA;IAEpD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAA;IAEvD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAA;IAE1C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAA;IAEhD,QAAQ,CAAC,QAAQ,EAAE,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,KACtB,UAAU,CAAC,UAAU,CAAC,OAAO,QAAQ,GAAG,OAAO,WAAW,CAAC,CAAC,CAAA;IAEjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IAEvB,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAA;IAEtC,QAAQ,CAAC,IAAI,EAAE,CACb,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,sBAAsB,GAAG,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAE9F,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;IAE9C,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA;IAE1D,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;CACjE,CAAA;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,GAAG,YAAY,CAwBvF;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AAElD,eAAO,MAAM,QAAQ,EAAE,CACrB,KAAK,EAAE,KAAK,KACT,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAclF,CAAA;AAEN,eAAO,MAAM,UAAU,UAAW,KAAK,UAAU,MAAM,QAAQ,KAAK,KAAK,CAAC,sFAWtE,CAAA;AAEJ,eAAO,MAAM,WAAW,UACd,KAAK,UAAU,MAAM,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAM,UAAU,MAAM,WACxE,MAAM,YAAW,eAAe,sFA6BlC,CAAA;AAEN,eAAO,MAAM,QAAQ,UAEV,KAAK,UACJ,MAAM,QACR,KAAK,KAAK,CAAC,QACX,MAAM,UACJ,MAAM,cACF,MAAM,WAEd,MAAM,YAAW,eAAe,sFAmClC,CAAA;AAEN,eAAO,MAAM,MAAM,UAAW,KAAK,UAAU,MAAM,QAAQ,KAAK,KAAK,CAAC,aAAa,MAAM,sFA2BrF,CAAA"}
@@ -0,0 +1,117 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import { NavigationType, } from './Navigation.js';
3
+ import { makeGoTo, makeNotify, makeOnNavigation, makeOnNavigationEnd, } from './shared-intent.js';
4
+ import { createKey, getUrl } from './util.js';
5
+ // Roughly the number of History entries in a browser anyways
6
+ const DEFAULT_MAX_ENTRIES = 50;
7
+ export function makeIntent(model, options) {
8
+ const { origin } = options.initialUrl;
9
+ const base = options.base ?? '/';
10
+ const maxEntries = Math.abs(options.maxEntries ?? DEFAULT_MAX_ENTRIES);
11
+ const notify = makeNotify(model);
12
+ const save = makeSave(model);
13
+ const go = makeGo(model, notify, save);
14
+ const replace = makeReplace(model, notify, save, base, origin);
15
+ const push = makePush(model, notify, save, base, origin, maxEntries);
16
+ return {
17
+ back: go(-1),
18
+ forward: go(1),
19
+ push,
20
+ replace,
21
+ navigate: (url, options = {}) => options.history === 'replace' ? replace(url, options) : push(url, options),
22
+ go: go,
23
+ goTo: makeGoTo(model, go),
24
+ reload: makeReload(model, notify, save),
25
+ onNavigation: makeOnNavigation(model),
26
+ onNavigationEnd: makeOnNavigationEnd(model),
27
+ notify,
28
+ };
29
+ }
30
+ export const makeSave = (model) => (event) => Effect.gen(function* ($) {
31
+ const events = yield* $(model.events);
32
+ const index = yield* $(model.index);
33
+ // Update current entry
34
+ yield* $(model.currentEntry.set(event.destination));
35
+ // Update canGoBack
36
+ yield* $(model.canGoBack.set(index > 0));
37
+ // Update canGoForward
38
+ yield* $(model.canGoForward.set(index < events.length - 1));
39
+ });
40
+ export const makeReload = (model, notify, save) => Effect.gen(function* ($) {
41
+ const i = yield* $(model.index.get);
42
+ const e = yield* $(model.events);
43
+ const event = e[i];
44
+ const reloadEvent = { ...event, navigationType: NavigationType.Reload };
45
+ yield* $(notify(reloadEvent));
46
+ yield* $(save(reloadEvent));
47
+ return event.destination;
48
+ });
49
+ export const makeReplace = (model, notify, save, base, origin) => (url, options = {}) => Effect.gen(function* ($) {
50
+ const entry = yield* $(model.currentEntry.get);
51
+ const destination = {
52
+ key: entry.key,
53
+ url: getUrl(url, base, origin),
54
+ state: options.state,
55
+ };
56
+ const event = {
57
+ destination,
58
+ hashChange: entry.url.hash !== destination.url.hash,
59
+ navigationType: NavigationType.Replace,
60
+ };
61
+ yield* $(notify(event));
62
+ const currentIndex = yield* $(model.index);
63
+ yield* $(model.events.update((entries) => {
64
+ const updated = entries.slice(0);
65
+ updated[currentIndex] = event;
66
+ return updated;
67
+ }));
68
+ yield* $(save(event));
69
+ return destination;
70
+ });
71
+ export const makePush = (model, notify, save, base, origin, maxEntries) => (url, options = {}) => Effect.gen(function* ($) {
72
+ const entry = yield* $(model.currentEntry.get);
73
+ const destination = {
74
+ key: yield* $(createKey),
75
+ url: getUrl(url, base, origin),
76
+ state: options.state,
77
+ };
78
+ const event = {
79
+ destination,
80
+ hashChange: entry.url.hash !== destination.url.hash,
81
+ navigationType: NavigationType.Push,
82
+ };
83
+ // Notify event handlers
84
+ yield* $(notify(event));
85
+ const currentIndex = yield* $(model.index);
86
+ // Remove all entries after the current index
87
+ // and add the new destination to the end
88
+ yield* $(model.events.update((entries) => {
89
+ const updated = entries.slice(0, currentIndex + 1);
90
+ updated.push(event);
91
+ return updated.slice(-maxEntries);
92
+ }));
93
+ // Update the index to the new destination
94
+ yield* $(model.index.update((i) => i + 1));
95
+ yield* $(save(event));
96
+ return destination;
97
+ });
98
+ export const makeGo = (model, notify, save) => (delta) => Effect.gen(function* ($) {
99
+ const currentEntries = yield* $(model.events);
100
+ const totalEntries = currentEntries.length;
101
+ const currentIndex = yield* $(model.index);
102
+ // Nothing to do here
103
+ if (delta === 0)
104
+ return currentEntries[currentIndex].destination;
105
+ const nextIndex = delta > 0
106
+ ? Math.min(currentIndex + delta, totalEntries - 1)
107
+ : Math.max(currentIndex + delta, 0);
108
+ const nextEntry = currentEntries[nextIndex];
109
+ yield* $(notify({
110
+ ...nextEntry,
111
+ navigationType: nextIndex > currentIndex ? NavigationType.Forward : NavigationType.Back,
112
+ }));
113
+ yield* $(model.index.set(nextIndex));
114
+ yield* $(save(nextEntry));
115
+ return nextEntry.destination;
116
+ });
117
+ //# sourceMappingURL=memory-intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-intent.js","sourceRoot":"","sources":["../src/memory-intent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import * as Scope from '@effect/io/Scope';
3
+ import * as Fx from '@typed/fx';
4
+ import { Destination, NavigationError, NavigationEvent, OnNavigationOptions } from './Navigation.js';
5
+ export interface Model {
6
+ readonly onNavigationHandlers: Set<readonly [
7
+ (event: NavigationEvent) => Effect.Effect<never, NavigationError, unknown>,
8
+ OnNavigationOptions?
9
+ ]>;
10
+ readonly onNavigationEndHandlers: Set<readonly [
11
+ (event: NavigationEvent) => Effect.Effect<never, never, unknown>,
12
+ OnNavigationOptions?
13
+ ]>;
14
+ readonly events: Fx.RefSubject<never, readonly NavigationEvent[]>;
15
+ readonly index: Fx.RefSubject<never, number>;
16
+ readonly entries: Fx.Computed<never, never, Destination[]>;
17
+ readonly currentEntry: Fx.RefSubject<never, Destination>;
18
+ readonly canGoBack: Fx.RefSubject<never, boolean>;
19
+ readonly canGoForward: Fx.RefSubject<never, boolean>;
20
+ }
21
+ export declare const makeModel: (initialEntries: readonly NavigationEvent[], initialIndex: number) => Effect.Effect<Scope.Scope, never, Model>;
22
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAE/B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAEpG,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAChC,SAAS;QACP,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC;QAC1E,mBAAmB,CAAC;KACrB,CACF,CAAA;IACD,QAAQ,CAAC,uBAAuB,EAAE,GAAG,CACnC,SAAS;QACP,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;QAChE,mBAAmB,CAAC;KACrB,CACF,CAAA;IACD,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC,CAAA;IACjE,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;IAC1D,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IACxD,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;CACrD;AAED,eAAO,MAAM,SAAS,mBACJ,SAAS,eAAe,EAAE,gBAC5B,MAAM,KACnB,aAAa,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAuBtC,CAAA"}
package/dist/model.js ADDED
@@ -0,0 +1,21 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import * as Fx from '@typed/fx';
3
+ export const makeModel = (initialEntries, initialIndex) => Effect.gen(function* ($) {
4
+ const events = yield* $(Fx.makeRef(Effect.succeed(initialEntries)));
5
+ const index = yield* $(Fx.makeRef(Effect.succeed(initialIndex)));
6
+ const entries = events.map((es) => es.map((e) => e.destination));
7
+ const currentEntry = yield* $(Fx.makeRef(Effect.succeed(initialEntries[initialIndex].destination)));
8
+ const canGoBack = yield* $(Fx.makeRef(Effect.succeed(initialIndex > 0)));
9
+ const canGoForward = yield* $(Fx.makeRef(Effect.succeed(initialIndex < initialEntries.length - 1)));
10
+ return {
11
+ onNavigationHandlers: new Set(),
12
+ onNavigationEndHandlers: new Set(),
13
+ events,
14
+ index,
15
+ entries,
16
+ currentEntry,
17
+ canGoBack,
18
+ canGoForward,
19
+ };
20
+ });
21
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAyB/B,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,cAA0C,EAC1C,YAAoB,EACsB,EAAE,CAC5C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;IAChE,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAC3B,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,CACrE,CAAA;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACxE,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAC3B,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CACrE,CAAA;IAED,OAAO;QACL,oBAAoB,EAAE,IAAI,GAAG,EAAE;QAC/B,uBAAuB,EAAE,IAAI,GAAG,EAAE;QAClC,MAAM;QACN,KAAK;QACL,OAAO;QACP,YAAY;QACZ,SAAS;QACT,YAAY;KACb,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import * as Option from '@effect/data/Option';
2
+ import * as Cause from '@effect/io/Cause';
3
+ import * as Effect from '@effect/io/Effect';
4
+ import * as Scope from '@effect/io/Scope';
5
+ import { Destination, NavigationError, NavigationEvent, OnNavigationOptions } from './Navigation.js';
6
+ import { Model } from './model.js';
7
+ export type Notify = (event: NavigationEvent) => Effect.Effect<never, NavigationError, void>;
8
+ export type NotifyEnd = (event: NavigationEvent) => Effect.Effect<never, never, void>;
9
+ export type Save<R> = (event: NavigationEvent) => Effect.Effect<R, Cause.NoSuchElementException, void>;
10
+ export declare const makeNotify: (model: Model) => (event: NavigationEvent) => Effect.Effect<never, NavigationError, void>;
11
+ export declare const makeOnNavigation: (model: Model) => <R>(handler: (event: NavigationEvent) => Effect.Effect<R, NavigationError, unknown>, options?: OnNavigationOptions) => Effect.Effect<Scope.Scope | R, NavigationError, void>;
12
+ export declare const makeNotifyEnd: (model: Model) => (event: NavigationEvent) => Effect.Effect<never, never, void>;
13
+ export declare const makeOnNavigationEnd: (model: Model) => <R>(handler: (event: NavigationEvent) => Effect.Effect<R, never, unknown>, options?: OnNavigationOptions) => Effect.Effect<Scope.Scope | R, never, void>;
14
+ export declare const makeGoTo: <R, E>(model: Model, go: (delta: number, skipHistory?: boolean) => Effect.Effect<R, E, Destination>) => (key: string) => Effect.Effect<R, Cause.NoSuchElementException | E, Option.Option<Destination>>;
15
+ //# sourceMappingURL=shared-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-intent.d.ts","sourceRoot":"","sources":["../src/shared-intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACpG,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,CAAA;AAC5F,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;AAErF,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,CACpB,KAAK,EAAE,eAAe,KACnB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAA;AAGzD,eAAO,MAAM,UAAU,UAAW,KAAK,aAAa,eAAe,gDAW/D,CAAA;AAEJ,eAAO,MAAM,gBAAgB,UACnB,KAAK,0BAEM,eAAe,2DACtB,mBAAmB,0DAsB5B,CAAA;AAGL,eAAO,MAAM,aAAa,UAAW,KAAK,aAAa,eAAe,sCAWlE,CAAA;AAEJ,eAAO,MAAM,mBAAmB,UACtB,KAAK,0BAEM,eAAe,iDACtB,mBAAmB,gDAsB5B,CAAA;AAEL,eAAO,MAAM,QAAQ,gBAEV,KAAK,cACA,MAAM,gBAAgB,OAAO,gDAErC,MAAM,mFAeR,CAAA"}
@@ -0,0 +1,51 @@
1
+ import * as Option from '@effect/data/Option';
2
+ import * as Effect from '@effect/io/Effect';
3
+ // Anytime there are changes to the model, we need to notify all event handlers
4
+ export const makeNotify = (model) => (event) => Effect.gen(function* ($) {
5
+ // Notify event handlers
6
+ if (model.onNavigationHandlers.size > 0)
7
+ yield* $(Effect.forEach(model.onNavigationHandlers, ([handler, options]) => (options?.passive ? Effect.fork(handler(event)) : handler(event)), { discard: true }));
8
+ });
9
+ export const makeOnNavigation = (model) => (handler, options) => Effect.uninterruptibleMask((restore) => Effect.gen(function* ($) {
10
+ const context = yield* $(Effect.context());
11
+ const handler_ = (event) => restore(Effect.provideContext(handler(event), context));
12
+ const entry = [handler_, options];
13
+ model.onNavigationHandlers.add(entry);
14
+ yield* $(Effect.addFinalizer(() => Effect.sync(() => model.onNavigationHandlers.delete(entry))));
15
+ // Send the latest navigation event on subscription
16
+ const events = yield* $(model.events);
17
+ const index = yield* $(model.index);
18
+ const event = events[index];
19
+ yield* $(restore(handler(event)));
20
+ }));
21
+ // Anytime there are changes to the model, we need to notify all event handlers
22
+ export const makeNotifyEnd = (model) => (event) => Effect.gen(function* ($) {
23
+ // Notify event handlers
24
+ if (model.onNavigationEndHandlers.size > 0)
25
+ yield* $(Effect.forEach(model.onNavigationEndHandlers, ([handler, options]) => (options?.passive ? Effect.fork(handler(event)) : handler(event)), { discard: true }));
26
+ });
27
+ export const makeOnNavigationEnd = (model) => (handler, options) => Effect.uninterruptibleMask((restore) => Effect.gen(function* ($) {
28
+ const context = yield* $(Effect.context());
29
+ const handler_ = (event) => restore(Effect.provideContext(handler(event), context));
30
+ const entry = [handler_, options];
31
+ model.onNavigationEndHandlers.add(entry);
32
+ yield* $(Effect.addFinalizer(() => Effect.sync(() => model.onNavigationEndHandlers.delete(entry))));
33
+ // Send the latest navigation event on subscription
34
+ const events = yield* $(model.events);
35
+ const index = yield* $(model.index);
36
+ const event = events[index];
37
+ yield* $(restore(handler(event)));
38
+ }));
39
+ export const makeGoTo = (model, go) => (key) => Effect.gen(function* ($) {
40
+ const entries = yield* $(model.entries);
41
+ const currentIndex = yield* $(model.index);
42
+ const nextIndex = entries.findIndex((destination) => destination.key === key);
43
+ if (nextIndex === -1)
44
+ return Option.none();
45
+ const delta = nextIndex - currentIndex;
46
+ if (delta !== 0) {
47
+ return Option.some(yield* $(go(delta)));
48
+ }
49
+ return Option.some(entries[nextIndex]);
50
+ });
51
+ //# sourceMappingURL=shared-intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-intent.js","sourceRoot":"","sources":["../src/shared-intent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import * as Option from '@effect/data/Option';
2
+ import * as Effect from '@effect/io/Effect';
3
+ import { History, Location } from '@typed/dom';
4
+ import type { DomNavigationOptions } from './DOM.js';
5
+ import { NavigationEvent } from './Navigation.js';
6
+ /**
7
+ * @internal
8
+ */
9
+ export declare const getStoredEvents: Effect.Effect<Storage, never, readonly NavigationEvent[]>;
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const getStoredIndex: Effect.Effect<import("@typed/dom").Storage, never, Option.None<number> | Option.Some<number>>;
14
+ /**
15
+ * @internal
16
+ */
17
+ export declare const getInitialValues: (base: string, options: DomNavigationOptions) => Effect.Effect<Storage | History | Location, never, readonly [readonly NavigationEvent[], number]>;
18
+ export declare const saveToStorage: (entries: readonly NavigationEvent[], index: number) => Effect.Effect<import("@typed/dom").Storage, never, void>;
19
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAA;AAEhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,eAAe,EAA+B,MAAM,iBAAiB,CAAA;AAO9E;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,eAAe,EAAE,CASlF,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,+FAczB,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,SACrB,MAAM,WACH,oBAAoB,KAC5B,aAAa,CACd,OAAO,GAAG,OAAO,GAAG,QAAQ,EAC5B,KAAK,EACL,SAAS,CAAC,SAAS,eAAe,EAAE,EAAE,MAAM,CAAC,CAwC3C,CAAA;AAEJ,eAAO,MAAM,aAAa,YAAa,SAAS,eAAe,EAAE,SAAS,MAAM,6DAI5E,CAAA"}
@@ -0,0 +1,73 @@
1
+ import * as Option from '@effect/data/Option';
2
+ import * as Effect from '@effect/io/Effect';
3
+ import { History, Location, getItem, setItem } from '@typed/dom';
4
+ import { NavigationType } from './Navigation.js';
5
+ import { decodeNavigationEvent } from './json.js';
6
+ import { createKey, getUrl } from './util.js';
7
+ const TYPED_NAVIGATION_ENTRIES_KEY = '@typed/navigation/entries';
8
+ const TYPED_NAVIGATION_INDEX_KEY = '@typed/navigation/index';
9
+ /**
10
+ * @internal
11
+ */
12
+ export const getStoredEvents = Effect.gen(function* ($) {
13
+ const option = yield* $(getItem(TYPED_NAVIGATION_ENTRIES_KEY));
14
+ if (Option.isNone(option)) {
15
+ return [];
16
+ }
17
+ return JSON.parse(option.value).map(decodeNavigationEvent);
18
+ });
19
+ /**
20
+ * @internal
21
+ */
22
+ export const getStoredIndex = Effect.gen(function* ($) {
23
+ const option = yield* $(getItem(TYPED_NAVIGATION_INDEX_KEY));
24
+ if (Option.isNone(option)) {
25
+ return Option.none();
26
+ }
27
+ const n = JSON.parse(option.value);
28
+ if (Number.isNaN(n)) {
29
+ return Option.none();
30
+ }
31
+ return Option.some(n);
32
+ });
33
+ /**
34
+ * @internal
35
+ */
36
+ export const getInitialValues = (base, options) => Effect.gen(function* ($) {
37
+ // Get Resources
38
+ const history = yield* $(History);
39
+ const location = yield* $(Location);
40
+ // Read the stored entries and index
41
+ const storedEntries = yield* $(getStoredEvents);
42
+ const storedIndex = Option.getOrElse(yield* $(getStoredIndex), () => storedEntries.length - 1);
43
+ const storedEntry = storedEntries[storedIndex];
44
+ // Read the initial url from the location
45
+ const initialUrl = getUrl(location.href, base, location.origin);
46
+ const initial = {
47
+ key: options.initialKey ?? (yield* $(createKey)),
48
+ url: initialUrl,
49
+ state: history.state?.state,
50
+ };
51
+ const initialEvent = {
52
+ destination: initial,
53
+ hashChange: false,
54
+ navigationType: NavigationType.Push,
55
+ };
56
+ // If there are no stored entries then we can just use the initial entry
57
+ if (!storedEntry) {
58
+ return [[initialEvent], 0];
59
+ }
60
+ // If we're starting on the same page as the initial entry
61
+ // then we can just use the initial entries
62
+ if (storedEntry.destination.url.href === initialUrl.href) {
63
+ return [storedEntries, storedIndex];
64
+ }
65
+ // Otherwise, we need to push the initial entry with the current page
66
+ const entries = [...storedEntries.slice(0, storedIndex + 1), initialEvent];
67
+ return [entries, entries.length - 1];
68
+ });
69
+ export const saveToStorage = (entries, index) => Effect.gen(function* ($) {
70
+ yield* $(setItem(TYPED_NAVIGATION_ENTRIES_KEY, JSON.stringify(entries)));
71
+ yield* $(setItem(TYPED_NAVIGATION_INDEX_KEY, JSON.stringify(index)));
72
+ });
73
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}