@typed/navigation 0.18.0 → 0.18.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.
Files changed (113) hide show
  1. package/.nvmrc +1 -0
  2. package/biome.json +39 -0
  3. package/dist/Blocking.d.ts +23 -0
  4. package/dist/Blocking.js +41 -0
  5. package/dist/Blocking.js.map +1 -0
  6. package/dist/Destination.d.ts +11 -0
  7. package/dist/Destination.js +10 -0
  8. package/dist/Destination.js.map +1 -0
  9. package/dist/Error.d.ts +33 -0
  10. package/dist/Error.js +22 -0
  11. package/dist/Error.js.map +1 -0
  12. package/dist/Event.d.ts +45 -0
  13. package/dist/Event.js +17 -0
  14. package/dist/Event.js.map +1 -0
  15. package/dist/Forms.d.ts +79 -0
  16. package/dist/Forms.js +111 -0
  17. package/dist/Forms.js.map +1 -0
  18. package/dist/Handler.d.ts +6 -0
  19. package/dist/Handler.js +2 -0
  20. package/dist/Handler.js.map +1 -0
  21. package/dist/{dts/Layer.d.ts → Layer.d.ts} +11 -8
  22. package/dist/{esm/Layer.js → Layer.js} +2 -2
  23. package/dist/Layer.js.map +1 -0
  24. package/dist/NavigateOptions.d.ts +7 -0
  25. package/dist/NavigateOptions.js +7 -0
  26. package/dist/NavigateOptions.js.map +1 -0
  27. package/dist/Navigation.d.ts +79 -0
  28. package/dist/Navigation.js +49 -0
  29. package/dist/Navigation.js.map +1 -0
  30. package/dist/NavigationType.d.ts +3 -0
  31. package/dist/NavigationType.js +3 -0
  32. package/dist/NavigationType.js.map +1 -0
  33. package/dist/ProposedDestination.d.ts +13 -0
  34. package/dist/ProposedDestination.js +4 -0
  35. package/dist/ProposedDestination.js.map +1 -0
  36. package/dist/Url.d.ts +13 -0
  37. package/dist/Url.js +72 -0
  38. package/dist/Url.js.map +1 -0
  39. package/dist/index.d.ts +12 -0
  40. package/dist/index.js +13 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/internal/fromWindow.d.ts +4 -0
  43. package/dist/{esm/internal → internal}/fromWindow.js +125 -136
  44. package/dist/internal/fromWindow.js.map +1 -0
  45. package/dist/internal/memory.d.ts +6 -0
  46. package/dist/internal/memory.js +59 -0
  47. package/dist/internal/memory.js.map +1 -0
  48. package/dist/{dts/internal → internal}/shared.d.ts +44 -46
  49. package/dist/{esm/internal → internal}/shared.js +121 -168
  50. package/dist/internal/shared.js.map +1 -0
  51. package/package.json +35 -53
  52. package/readme.md +243 -0
  53. package/src/Blocking.ts +65 -65
  54. package/src/Destination.ts +14 -0
  55. package/src/Error.ts +28 -0
  56. package/src/Event.ts +26 -0
  57. package/src/Forms.ts +216 -0
  58. package/src/Handler.ts +16 -0
  59. package/src/Layer.ts +20 -9
  60. package/src/NavigateOptions.ts +9 -0
  61. package/src/Navigation.test.ts +697 -0
  62. package/src/Navigation.ts +135 -472
  63. package/src/NavigationType.ts +5 -0
  64. package/src/ProposedDestination.ts +8 -0
  65. package/src/Url.ts +106 -0
  66. package/src/index.ts +12 -17
  67. package/src/internal/fromWindow.ts +163 -234
  68. package/src/internal/memory.ts +62 -49
  69. package/src/internal/shared.ts +218 -377
  70. package/tsconfig.json +30 -0
  71. package/Blocking/package.json +0 -6
  72. package/LICENSE +0 -21
  73. package/Layer/package.json +0 -6
  74. package/Navigation/package.json +0 -6
  75. package/README.md +0 -5
  76. package/dist/cjs/Blocking.js +0 -58
  77. package/dist/cjs/Blocking.js.map +0 -1
  78. package/dist/cjs/Layer.js +0 -27
  79. package/dist/cjs/Layer.js.map +0 -1
  80. package/dist/cjs/Navigation.js +0 -278
  81. package/dist/cjs/Navigation.js.map +0 -1
  82. package/dist/cjs/index.js +0 -39
  83. package/dist/cjs/index.js.map +0 -1
  84. package/dist/cjs/internal/fromWindow.js +0 -436
  85. package/dist/cjs/internal/fromWindow.js.map +0 -1
  86. package/dist/cjs/internal/memory.js +0 -72
  87. package/dist/cjs/internal/memory.js.map +0 -1
  88. package/dist/cjs/internal/shared.js +0 -525
  89. package/dist/cjs/internal/shared.js.map +0 -1
  90. package/dist/dts/Blocking.d.ts +0 -34
  91. package/dist/dts/Blocking.d.ts.map +0 -1
  92. package/dist/dts/Layer.d.ts.map +0 -1
  93. package/dist/dts/Navigation.d.ts +0 -451
  94. package/dist/dts/Navigation.d.ts.map +0 -1
  95. package/dist/dts/index.d.ts +0 -17
  96. package/dist/dts/index.d.ts.map +0 -1
  97. package/dist/dts/internal/fromWindow.d.ts +0 -12
  98. package/dist/dts/internal/fromWindow.d.ts.map +0 -1
  99. package/dist/dts/internal/memory.d.ts +0 -6
  100. package/dist/dts/internal/memory.d.ts.map +0 -1
  101. package/dist/dts/internal/shared.d.ts.map +0 -1
  102. package/dist/esm/Blocking.js +0 -46
  103. package/dist/esm/Blocking.js.map +0 -1
  104. package/dist/esm/Layer.js.map +0 -1
  105. package/dist/esm/Navigation.js +0 -238
  106. package/dist/esm/Navigation.js.map +0 -1
  107. package/dist/esm/index.js +0 -17
  108. package/dist/esm/index.js.map +0 -1
  109. package/dist/esm/internal/fromWindow.js.map +0 -1
  110. package/dist/esm/internal/memory.js +0 -56
  111. package/dist/esm/internal/memory.js.map +0 -1
  112. package/dist/esm/internal/shared.js.map +0 -1
  113. package/dist/esm/package.json +0 -4
@@ -1,82 +1,95 @@
1
- import { Schema } from "@effect/schema"
2
- import * as Equivalence from "@effect/schema/Equivalence"
3
- import * as RefSubject from "@typed/fx/RefSubject"
4
- import { GetRandomValues, getRandomValues } from "@typed/id"
5
- import * as Effect from "effect/Effect"
6
- import type * as Layer from "effect/Layer"
7
- import * as Option from "effect/Option"
8
- import type * as Scope from "effect/Scope"
9
- import type { Commit, InitialMemoryOptions, MemoryOptions } from "../Layer.js"
10
- import { Navigation } from "../Navigation.js"
11
- import type { ModelAndIntent } from "./shared.js"
1
+ import { GetRandomValues } from '@typed/id'
2
+ import * as LazyRef from '@typed/lazy-ref'
3
+ import { Schema } from 'effect'
4
+ import * as Effect from 'effect/Effect'
5
+ import * as Layer from 'effect/Layer'
6
+ import * as Option from 'effect/Option'
7
+ import type * as Scope from 'effect/Scope'
8
+ import type { Commit, InitialMemoryOptions, MemoryOptions } from '../Layer.js'
9
+ import { Navigation } from '../Navigation.js'
12
10
  import {
13
11
  getOriginFromUrl,
14
12
  getUrl,
15
13
  makeDestination,
16
14
  makeHandlersState,
17
15
  NavigationState,
18
- setupFromModelAndIntent
19
- } from "./shared.js"
16
+ setupFromModelAndIntent,
17
+ type ModelAndIntent,
18
+ } from './shared'
20
19
 
21
- export const memory = (options: MemoryOptions): Layer.Layer<Navigation> =>
22
- Navigation.scoped(
23
- Effect.gen(function*() {
20
+ export const memory = (options: MemoryOptions): Layer.Layer<Navigation, never, GetRandomValues> =>
21
+ Layer.scoped(
22
+ Navigation,
23
+ Effect.gen(function* () {
24
24
  const getRandomValues = yield* GetRandomValues
25
25
  const modelAndIntent = yield* setupMemory(options)
26
26
  const current = options.entries[options.currentIndex ?? 0]
27
27
  const origin = options.origin ?? getOriginFromUrl(current.url)
28
- const base = options.base ?? "/"
28
+ const base = options.base ?? '/'
29
29
 
30
30
  return setupFromModelAndIntent(modelAndIntent, origin, base, getRandomValues)
31
- }).pipe(Effect.provide(getRandomValues))
31
+ }),
32
32
  )
33
33
 
34
34
  export function initialMemory(
35
- options: InitialMemoryOptions
36
- ): Layer.Layer<Navigation> {
37
- return Navigation.scoped(
38
- Effect.gen(function*() {
39
- const getRandomValues = yield* GetRandomValues
40
- const origin = options.origin ?? getOriginFromUrl(options.url)
41
- const base = options.base ?? "/"
42
- const destination = yield* makeDestination(getUrl(origin, options.url), options.state, origin)
43
- const memoryOptions: MemoryOptions = {
44
- entries: [destination],
35
+ options: InitialMemoryOptions,
36
+ ): Layer.Layer<Navigation, never, GetRandomValues> {
37
+ return Layer.unwrapEffect(
38
+ Effect.gen(function* () {
39
+ const origin = getOriginFromUrl(options.url)
40
+ const base = options.base ?? '/'
41
+ const destination = yield* makeDestination(getUrl(origin, options.url, base), options.state, origin)
42
+
43
+ return memory({
44
+ ...options,
45
45
  origin,
46
46
  base,
47
+ entries: [destination],
47
48
  currentIndex: 0,
48
- maxEntries: options.maxEntries
49
- }
50
- const modelAndIntent = yield* setupMemory(memoryOptions)
51
-
52
- return setupFromModelAndIntent(modelAndIntent, origin, base, getRandomValues)
53
- }).pipe(Effect.provide(getRandomValues))
49
+ })
50
+ }),
54
51
  )
55
52
  }
56
53
 
54
+ const eq = Schema.equivalence(Schema.typeSchema(NavigationState))
55
+
56
+ const clampNavigationState =
57
+ (maxEntries: number) =>
58
+ (state: NavigationState): NavigationState => {
59
+ const entries = state.entries.slice(-maxEntries)
60
+ const index = Math.min(Math.max(0, state.index), entries.length - 1)
61
+ return {
62
+ entries,
63
+ index,
64
+ transition: state.transition,
65
+ }
66
+ }
67
+
57
68
  function setupMemory(
58
- options: MemoryOptions
69
+ options: MemoryOptions,
59
70
  ): Effect.Effect<ModelAndIntent, never, GetRandomValues | Scope.Scope> {
60
- return Effect.gen(function*() {
61
- const state = yield* RefSubject.of<NavigationState>({
62
- entries: options.entries,
63
- index: options.currentIndex ?? options.entries.length - 1,
64
- transition: Option.none()
65
- }, { eq: Equivalence.make(Schema.typeSchema(NavigationState)) })
66
-
67
- const canGoBack = RefSubject.map(state, (s) => s.index > 0)
68
- const canGoForward = RefSubject.map(state, (s) => s.index < s.entries.length - 1)
69
- const { beforeHandlers, formDataHandlers, handlers } = yield* makeHandlersState()
71
+ return Effect.gen(function* () {
72
+ const maxEntries = options.maxEntries ?? 50
73
+ const state = LazyRef.transform(
74
+ yield* LazyRef.of<NavigationState>(
75
+ {
76
+ entries: options.entries,
77
+ index: options.currentIndex ?? options.entries.length - 1,
78
+ transition: Option.none(),
79
+ },
80
+ { eq },
81
+ ),
82
+ clampNavigationState(maxEntries),
83
+ clampNavigationState(maxEntries),
84
+ )
85
+ const { beforeHandlers, handlers } = yield* makeHandlersState
70
86
  const commit: Commit = options.commit ?? (() => Effect.void)
71
87
 
72
88
  return {
73
89
  state,
74
- canGoBack,
75
- canGoForward,
76
90
  beforeHandlers,
77
91
  handlers,
78
- formDataHandlers,
79
- commit
92
+ commit,
80
93
  } as const
81
94
  })
82
95
  }