@typed/navigation 0.17.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 (115) 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/internal/fromWindow.js +358 -0
  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/internal/shared.d.ts +109 -0
  49. package/dist/{esm/internal → internal}/shared.js +134 -165
  50. package/dist/internal/shared.js.map +1 -0
  51. package/package.json +35 -52
  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 +133 -468
  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 +250 -180
  68. package/src/internal/memory.ts +62 -49
  69. package/src/internal/shared.ts +238 -305
  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 -275
  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 -421
  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 -522
  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 -462
  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 +0 -114
  102. package/dist/dts/internal/shared.d.ts.map +0 -1
  103. package/dist/esm/Blocking.js +0 -46
  104. package/dist/esm/Blocking.js.map +0 -1
  105. package/dist/esm/Layer.js.map +0 -1
  106. package/dist/esm/Navigation.js +0 -237
  107. package/dist/esm/Navigation.js.map +0 -1
  108. package/dist/esm/index.js +0 -17
  109. package/dist/esm/index.js.map +0 -1
  110. package/dist/esm/internal/fromWindow.js +0 -310
  111. package/dist/esm/internal/fromWindow.js.map +0 -1
  112. package/dist/esm/internal/memory.js +0 -56
  113. package/dist/esm/internal/memory.js.map +0 -1
  114. package/dist/esm/internal/shared.js.map +0 -1
  115. 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
  }