@typed/template 0.5.4 → 0.7.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 (109) hide show
  1. package/dist/cjs/ElementRef.js.map +1 -1
  2. package/dist/cjs/ElementSource.js.map +1 -1
  3. package/dist/cjs/Html.js.map +1 -1
  4. package/dist/cjs/Many.js.map +1 -1
  5. package/dist/cjs/RenderContext.js.map +1 -1
  6. package/dist/cjs/RenderTemplate.js.map +1 -1
  7. package/dist/cjs/Test.js.map +1 -1
  8. package/dist/cjs/internal/EventSource.js.map +1 -1
  9. package/dist/cjs/internal/hydrate.js.map +1 -1
  10. package/dist/cjs/internal/indexRefCounter.js.map +1 -1
  11. package/dist/cjs/internal/parts.js.map +1 -1
  12. package/dist/cjs/internal/render.js +3 -2
  13. package/dist/cjs/internal/render.js.map +1 -1
  14. package/dist/cjs/internal/server.js +2 -6
  15. package/dist/cjs/internal/server.js.map +1 -1
  16. package/dist/dts/Directive.d.ts +14 -14
  17. package/dist/dts/Directive.d.ts.map +1 -1
  18. package/dist/dts/ElementRef.d.ts +7 -7
  19. package/dist/dts/ElementRef.d.ts.map +1 -1
  20. package/dist/dts/ElementSource.d.ts +5 -5
  21. package/dist/dts/ElementSource.d.ts.map +1 -1
  22. package/dist/dts/EventHandler.d.ts +12 -12
  23. package/dist/dts/EventHandler.d.ts.map +1 -1
  24. package/dist/dts/Html.d.ts +2 -2
  25. package/dist/dts/Html.d.ts.map +1 -1
  26. package/dist/dts/Hydrate.d.ts +2 -2
  27. package/dist/dts/Hydrate.d.ts.map +1 -1
  28. package/dist/dts/Many.d.ts +8 -8
  29. package/dist/dts/Many.d.ts.map +1 -1
  30. package/dist/dts/Part.d.ts +14 -14
  31. package/dist/dts/Part.d.ts.map +1 -1
  32. package/dist/dts/Placeholder.d.ts +6 -6
  33. package/dist/dts/Placeholder.d.ts.map +1 -1
  34. package/dist/dts/Platform.d.ts +1 -1
  35. package/dist/dts/Platform.d.ts.map +1 -1
  36. package/dist/dts/Render.d.ts +2 -2
  37. package/dist/dts/Render.d.ts.map +1 -1
  38. package/dist/dts/RenderContext.d.ts +5 -5
  39. package/dist/dts/RenderContext.d.ts.map +1 -1
  40. package/dist/dts/RenderTemplate.d.ts +2 -2
  41. package/dist/dts/RenderTemplate.d.ts.map +1 -1
  42. package/dist/dts/Renderable.d.ts +3 -3
  43. package/dist/dts/Renderable.d.ts.map +1 -1
  44. package/dist/dts/Test.d.ts +12 -12
  45. package/dist/dts/Test.d.ts.map +1 -1
  46. package/dist/dts/Vitest.d.ts +2 -2
  47. package/dist/dts/Vitest.d.ts.map +1 -1
  48. package/dist/dts/internal/EventSource.d.ts +2 -2
  49. package/dist/dts/internal/EventSource.d.ts.map +1 -1
  50. package/dist/dts/internal/hydrate.d.ts.map +1 -1
  51. package/dist/dts/internal/indexRefCounter.d.ts +5 -5
  52. package/dist/dts/internal/indexRefCounter.d.ts.map +1 -1
  53. package/dist/dts/internal/module-augmentation.d.ts +13 -13
  54. package/dist/dts/internal/module-augmentation.d.ts.map +1 -1
  55. package/dist/dts/internal/parts.d.ts +39 -39
  56. package/dist/dts/internal/parts.d.ts.map +1 -1
  57. package/dist/dts/internal/render.d.ts +1 -1
  58. package/dist/dts/internal/render.d.ts.map +1 -1
  59. package/dist/dts/internal/server.d.ts +2 -2
  60. package/dist/dts/internal/server.d.ts.map +1 -1
  61. package/dist/dts/internal/utils.d.ts +1 -1
  62. package/dist/esm/ElementRef.js.map +1 -1
  63. package/dist/esm/ElementSource.js.map +1 -1
  64. package/dist/esm/Html.js.map +1 -1
  65. package/dist/esm/Many.js.map +1 -1
  66. package/dist/esm/RenderContext.js.map +1 -1
  67. package/dist/esm/RenderTemplate.js.map +1 -1
  68. package/dist/esm/Test.js.map +1 -1
  69. package/dist/esm/internal/EventSource.js.map +1 -1
  70. package/dist/esm/internal/hydrate.js.map +1 -1
  71. package/dist/esm/internal/indexRefCounter.js.map +1 -1
  72. package/dist/esm/internal/parts.js +4 -4
  73. package/dist/esm/internal/parts.js.map +1 -1
  74. package/dist/esm/internal/render.js +3 -2
  75. package/dist/esm/internal/render.js.map +1 -1
  76. package/dist/esm/internal/server.js +2 -6
  77. package/dist/esm/internal/server.js.map +1 -1
  78. package/package.json +8 -16
  79. package/src/Directive.ts +24 -24
  80. package/src/ElementRef.ts +11 -11
  81. package/src/ElementSource.ts +18 -18
  82. package/src/EventHandler.ts +18 -18
  83. package/src/Html.ts +33 -33
  84. package/src/Hydrate.ts +4 -4
  85. package/src/Many.ts +26 -26
  86. package/src/Part.ts +14 -14
  87. package/src/Placeholder.ts +13 -13
  88. package/src/Platform.ts +3 -3
  89. package/src/Render.ts +5 -5
  90. package/src/RenderContext.ts +8 -8
  91. package/src/RenderTemplate.ts +2 -6
  92. package/src/Renderable.ts +6 -6
  93. package/src/Test.ts +13 -13
  94. package/src/Vitest.ts +2 -2
  95. package/src/internal/EventSource.ts +4 -4
  96. package/src/internal/hydrate.ts +3 -7
  97. package/src/internal/indexRefCounter.ts +9 -17
  98. package/src/internal/module-augmentation.ts +15 -15
  99. package/src/internal/parts.ts +61 -63
  100. package/src/internal/render.ts +29 -28
  101. package/src/internal/server.ts +8 -10
  102. package/TemplateInstance/package.json +0 -6
  103. package/dist/cjs/TemplateInstance.js +0 -51
  104. package/dist/cjs/TemplateInstance.js.map +0 -1
  105. package/dist/dts/TemplateInstance.d.ts +0 -33
  106. package/dist/dts/TemplateInstance.d.ts.map +0 -1
  107. package/dist/esm/TemplateInstance.js +0 -43
  108. package/dist/esm/TemplateInstance.js.map +0 -1
  109. package/src/TemplateInstance.ts +0 -83
@@ -29,12 +29,12 @@ export interface ElementSource<
29
29
  Versioned.Versioned<
30
30
  never,
31
31
  never,
32
- Scope.Scope,
33
- never,
34
32
  Rendered.Elements<T>,
35
33
  never,
34
+ Scope.Scope,
35
+ Rendered.Elements<T>,
36
36
  NoSuchElementException,
37
- Rendered.Elements<T>
37
+ never
38
38
  >
39
39
  {
40
40
  readonly selector: Selector
@@ -49,21 +49,21 @@ export interface ElementSource<
49
49
  ): ElementSource<Target, EventMap>
50
50
  }
51
51
 
52
- readonly elements: RefSubject.Filtered<never, never, Rendered.Elements<T>>
52
+ readonly elements: RefSubject.Filtered<Rendered.Elements<T>>
53
53
 
54
54
  readonly events: <Type extends keyof EventMap>(
55
55
  type: Type,
56
56
  options?: AddEventListenerOptions
57
- ) => Fx.Fx<Scope.Scope, never, EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>>
57
+ ) => Fx.Fx<EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>, never, Scope.Scope>
58
58
 
59
- readonly dispatchEvent: (event: Event, wait?: DurationInput) => Effect.Effect<never, NoSuchElementException, void>
59
+ readonly dispatchEvent: (event: Event, wait?: DurationInput) => Effect.Effect<void, NoSuchElementException>
60
60
  }
61
61
 
62
62
  /**
63
63
  * @since 1.0.0
64
64
  */
65
65
  export function ElementSource<T extends Rendered, EventMap extends {} = DefaultEventMap<T>>(
66
- rootElement: RefSubject.Filtered<never, never, T>
66
+ rootElement: RefSubject.Filtered<T>
67
67
  ): ElementSource<T, EventMap> {
68
68
  return new ElementSourceImpl<T, EventMap>(rootElement) as any
69
69
  }
@@ -165,7 +165,7 @@ function makeEventStream<Ev extends Event>(
165
165
  eventName: string,
166
166
  options: EventListenerOptions = {}
167
167
  ) {
168
- return function(element: Rendered): Fx.Fx<never, never, Ev> {
168
+ return function(element: Rendered): Fx.Fx<Ev> {
169
169
  const { capture } = options
170
170
  const cssSelector = cssSelectors.join(" ")
171
171
  const lastTwoCssSelectors = cssSelectors.slice(-2).join("")
@@ -174,7 +174,7 @@ function makeEventStream<Ev extends Event>(
174
174
  const event$ = Fx.mergeAll(
175
175
  elements.map((element) =>
176
176
  Fx.filter(
177
- Fx.make<never, never, Ev>((sink) =>
177
+ Fx.make<Ev>((sink) =>
178
178
  Effect.scoped(Effect.zipRight(
179
179
  addEventListener(element, {
180
180
  eventName,
@@ -203,14 +203,14 @@ function makeElementEventStream<Ev extends Event>(
203
203
  eventName: string,
204
204
  options: EventListenerOptions = {}
205
205
  ) {
206
- return function(rendered: Rendered): Fx.Fx<never, never, Ev> {
206
+ return function(rendered: Rendered): Fx.Fx<Ev> {
207
207
  const { capture } = options
208
208
  const elements = getElements(rendered)
209
209
 
210
210
  const event$ = Fx.mergeAll(
211
211
  elements.map((element) =>
212
212
  Fx.filter(
213
- Fx.make<never, never, Ev>((sink) =>
213
+ Fx.make<Ev>((sink) =>
214
214
  Effect.scoped(Effect.zipRight(
215
215
  addEventListener(element, {
216
216
  eventName,
@@ -295,17 +295,17 @@ function isElement(element: RenderedWithoutArray): element is Element {
295
295
  export class ElementSourceImpl<
296
296
  T extends Rendered,
297
297
  EventMap extends {} = DefaultEventMap<Rendered.Elements<T>[number]>
298
- > extends FxEffectBase<Scope.Scope, never, Rendered.Elements<T>, never, NoSuchElementException, Rendered.Elements<T>>
298
+ > extends FxEffectBase<Rendered.Elements<T>, never, Scope.Scope, Rendered.Elements<T>, NoSuchElementException, never>
299
299
  implements ElementSource<T, EventMap>
300
300
  {
301
- private bubbleMap = new Map<any, Fx.Fx<Scope.Scope, never, any>>()
302
- private captureMap = new Map<any, Fx.Fx<Scope.Scope, never, any>>()
301
+ private bubbleMap = new Map<any, Fx.Fx<any, never, Scope.Scope>>()
302
+ private captureMap = new Map<any, Fx.Fx<any, never, Scope.Scope>>()
303
303
 
304
304
  readonly elements: ElementSource<T, EventMap>["elements"]
305
305
  readonly version: ElementSource<T, EventMap>["version"]
306
306
 
307
307
  constructor(
308
- readonly rootElement: RefSubject.Filtered<never, never, T>,
308
+ readonly rootElement: RefSubject.Filtered<T>,
309
309
  readonly selector: Selector = CssSelectors([])
310
310
  ) {
311
311
  super()
@@ -326,11 +326,11 @@ export class ElementSourceImpl<
326
326
  return new ElementSourceImpl<T>(RefSubject.filterMapEffect(Versioned.of(rootElement), Effect.succeedSome)) as any
327
327
  }
328
328
 
329
- toEffect(): Effect.Effect<never, NoSuchElementException, Rendered.Elements<T>> {
329
+ toEffect(): Effect.Effect<Rendered.Elements<T>, NoSuchElementException> {
330
330
  return this.elements
331
331
  }
332
332
 
333
- toFx(): Fx.Fx<Scope.Scope, never, Rendered.Elements<T>> {
333
+ toFx(): Fx.Fx<Rendered.Elements<T>, never, Scope.Scope> {
334
334
  return this.elements
335
335
  }
336
336
 
@@ -353,7 +353,7 @@ export class ElementSourceImpl<
353
353
  events<Type extends keyof EventMap>(
354
354
  type: Type,
355
355
  options?: AddEventListenerOptions
356
- ): Fx.Fx<Scope.Scope, never, EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>> {
356
+ ): Fx.Fx<EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>, never, Scope.Scope> {
357
357
  const capture = options?.capture === true
358
358
  const map = capture ? this.captureMap : this.bubbleMap
359
359
 
@@ -17,32 +17,32 @@ export type EventHandlerTypeId = typeof EventHandlerTypeId
17
17
  /**
18
18
  * @since 1.0.0
19
19
  */
20
- export interface EventHandler<R, E, Ev extends Event = Event> extends Placeholder<R, E, null> {
20
+ export interface EventHandler<Ev extends Event = Event, E = never, R = never> extends Placeholder<never, E, R> {
21
21
  readonly [EventHandlerTypeId]: EventHandlerTypeId
22
- readonly handler: (event: Ev) => Effect<R, E, unknown>
22
+ readonly handler: (event: Ev) => Effect<unknown, E, R>
23
23
  readonly options: AddEventListenerOptions | undefined
24
24
  }
25
25
 
26
26
  /**
27
27
  * @since 1.0.0
28
28
  */
29
- export type Context<T> = T extends EventHandler<infer R, infer _E, infer _Ev> ? R : never
29
+ export type Context<T> = T extends EventHandler<infer _Ev, infer _E, infer R> ? R : never
30
30
  /**
31
31
  * @since 1.0.0
32
32
  */
33
- export type Error<T> = T extends EventHandler<infer _R, infer E, infer _Ev> ? E : never
33
+ export type Error<T> = T extends EventHandler<infer _Ev, infer E, infer _R> ? E : never
34
34
  /**
35
35
  * @since 1.0.0
36
36
  */
37
- export type EventOf<T> = T extends EventHandler<infer _R, infer _E, infer Ev> ? Ev : never
37
+ export type EventOf<T> = T extends EventHandler<infer Ev, infer _E, infer _R> ? Ev : never
38
38
 
39
39
  /**
40
40
  * @since 1.0.0
41
41
  */
42
42
  export function make<R, E, Ev extends Event>(
43
- handler: (event: Ev) => Effect<R, E, unknown>,
43
+ handler: (event: Ev) => Effect<unknown, E, R>,
44
44
  options?: AddEventListenerOptions
45
- ): EventHandler<R, E, Ev> {
45
+ ): EventHandler<Ev, E, R> {
46
46
  return {
47
47
  [EventHandlerTypeId]: EventHandlerTypeId,
48
48
  handler,
@@ -54,9 +54,9 @@ export function make<R, E, Ev extends Event>(
54
54
  * @since 1.0.0
55
55
  */
56
56
  export function preventDefault<R, E, Ev extends Event>(
57
- handler: (event: Ev) => Effect<R, E, unknown>,
57
+ handler: (event: Ev) => Effect<unknown, E, R>,
58
58
  options?: AddEventListenerOptions
59
- ): EventHandler<R, E, Ev> {
59
+ ): EventHandler<Ev, E, R> {
60
60
  return make((ev) => (ev.preventDefault(), handler(ev)), options)
61
61
  }
62
62
 
@@ -64,9 +64,9 @@ export function preventDefault<R, E, Ev extends Event>(
64
64
  * @since 1.0.0
65
65
  */
66
66
  export function stopPropagation<R, E, Ev extends Event>(
67
- handler: (event: Ev) => Effect<R, E, unknown>,
67
+ handler: (event: Ev) => Effect<unknown, E, R>,
68
68
  options?: AddEventListenerOptions
69
- ): EventHandler<R, E, Ev> {
69
+ ): EventHandler<Ev, E, R> {
70
70
  return make((ev) => (ev.stopPropagation(), handler(ev)), options)
71
71
  }
72
72
 
@@ -74,9 +74,9 @@ export function stopPropagation<R, E, Ev extends Event>(
74
74
  * @since 1.0.0
75
75
  */
76
76
  export function stopImmediatePropagation<R, E, Ev extends Event>(
77
- handler: (event: Ev) => Effect<R, E, unknown>,
77
+ handler: (event: Ev) => Effect<unknown, E, R>,
78
78
  options?: AddEventListenerOptions
79
- ): EventHandler<R, E, Ev> {
79
+ ): EventHandler<Ev, E, R> {
80
80
  return make((ev) => (ev.stopImmediatePropagation(), handler(ev)), options)
81
81
  }
82
82
 
@@ -85,9 +85,9 @@ export function stopImmediatePropagation<R, E, Ev extends Event>(
85
85
  */
86
86
  export function target<T extends HTMLElement>() {
87
87
  return <R, E, Ev extends Event>(
88
- handler: (event: EventWithTarget<T, Ev>) => Effect<R, E, unknown>,
88
+ handler: (event: EventWithTarget<T, Ev>) => Effect<unknown, E, R>,
89
89
  options?: AddEventListenerOptions
90
- ): EventHandler<R, E, EventWithTarget<T, Ev>> => {
90
+ ): EventHandler<EventWithTarget<T, Ev>, E, R> => {
91
91
  return make(handler, options)
92
92
  }
93
93
  }
@@ -96,9 +96,9 @@ export function target<T extends HTMLElement>() {
96
96
  * @since 1.0.0
97
97
  */
98
98
  export function keys<Keys extends ReadonlyArray<string>>(...keys: Keys) {
99
- return <R, E>(
100
- handler: (event: KeyboardEvent & { key: Keys[number] }) => Effect<R, E, unknown>,
99
+ return <E, R>(
100
+ handler: (event: KeyboardEvent & { key: Keys[number] }) => Effect<unknown, E, R>,
101
101
  options?: AddEventListenerOptions
102
- ): EventHandler<R, E, KeyboardEvent> =>
102
+ ): EventHandler<KeyboardEvent, E, R> =>
103
103
  make((ev: KeyboardEvent) => !isUsingKeyModifier(ev) && keys.includes(ev.key) ? handler(ev as any) : unit, options)
104
104
  }
package/src/Html.ts CHANGED
@@ -30,9 +30,9 @@ const [padStart, padEnd] = [[TYPED_START], [TYPED_END]] as const
30
30
  /**
31
31
  * @since 1.0.0
32
32
  */
33
- export function renderToHtml<R, E>(
34
- fx: Fx.Fx<R, E, RenderEvent>
35
- ): Fx.Fx<Exclude<R, RenderTemplate> | RenderContext, E, string> {
33
+ export function renderToHtml<E, R>(
34
+ fx: Fx.Fx<RenderEvent, E, R>
35
+ ): Fx.Fx<string, E, Exclude<R, RenderTemplate> | RenderContext> {
36
36
  return Fx.fromFxEffect(
37
37
  RenderContext.with((ctx) =>
38
38
  fx.pipe(
@@ -47,9 +47,9 @@ export function renderToHtml<R, E>(
47
47
  /**
48
48
  * @since 1.0.0
49
49
  */
50
- export function renderToHtmlString<R, E>(
51
- fx: Fx.Fx<R, E, RenderEvent>
52
- ): Effect.Effect<Exclude<R, RenderTemplate> | RenderContext, E, string> {
50
+ export function renderToHtmlString<E, R>(
51
+ fx: Fx.Fx<RenderEvent, E, R>
52
+ ): Effect.Effect<string, E, Exclude<R, RenderTemplate> | RenderContext> {
53
53
  return Effect.map(Fx.toReadonlyArray(renderToHtml(fx)), join(""))
54
54
  }
55
55
 
@@ -58,9 +58,9 @@ function renderHtml(ctx: RenderContext) {
58
58
  templateStrings: TemplateStringsArray,
59
59
  values: Values
60
60
  ): Fx.Fx<
61
- Scope.Scope | Placeholder.Context<readonly [] extends Values ? never : Values[number]>,
61
+ RenderEvent,
62
62
  Placeholder.Error<Values[number]>,
63
- RenderEvent
63
+ Scope.Scope | Placeholder.Context<readonly [] extends Values ? never : Values[number]>
64
64
  > => {
65
65
  const isStatic = ctx.environment === "static"
66
66
  const entry = getServerEntry(templateStrings, ctx.templateCache, isStatic)
@@ -71,8 +71,8 @@ function renderHtml(ctx: RenderContext) {
71
71
  Fx.mergeOrdered(
72
72
  entry.chunks.map((chunk) =>
73
73
  renderChunk<
74
- Placeholder.Context<readonly [] extends Values ? never : Values[number]>,
75
- Placeholder.Error<Values[number]>
74
+ Placeholder.Error<Values[number]>,
75
+ Placeholder.Context<readonly [] extends Values ? never : Values[number]>
76
76
  >(chunk, values, isStatic)
77
77
  )
78
78
  ),
@@ -82,21 +82,21 @@ function renderHtml(ctx: RenderContext) {
82
82
  }
83
83
  }
84
84
 
85
- function renderChunk<R, E>(
85
+ function renderChunk<E, R>(
86
86
  chunk: HtmlChunk,
87
87
  values: ReadonlyArray<Renderable<any, any>>,
88
88
  isStatic: boolean
89
- ): Fx.Fx<R, E, RenderEvent> {
89
+ ): Fx.Fx<RenderEvent, E, R> {
90
90
  if (chunk._tag === "text") {
91
91
  return Fx.succeed(HtmlRenderEvent(chunk.value))
92
92
  } else if (chunk._tag === "part") {
93
- return renderPart<R, E>(chunk, values, isStatic)
93
+ return renderPart<E, R>(chunk, values, isStatic)
94
94
  } else {
95
- return renderSparsePart<R, E>(chunk, values) as Fx.Fx<R, E, RenderEvent>
95
+ return renderSparsePart<E, R>(chunk, values) as Fx.Fx<RenderEvent, E, R>
96
96
  }
97
97
  }
98
98
 
99
- function renderNode<R, E>(renderable: Renderable<any, any>, isStatic: boolean): Fx.Fx<R, E, RenderEvent> {
99
+ function renderNode<E, R>(renderable: Renderable<any, any>, isStatic: boolean): Fx.Fx<RenderEvent, E, R> {
100
100
  switch (typeof renderable) {
101
101
  case "string":
102
102
  case "number":
@@ -111,7 +111,7 @@ function renderNode<R, E>(renderable: Renderable<any, any>, isStatic: boolean):
111
111
  }
112
112
  }
113
113
 
114
- function renderObject<R, E>(renderable: object | null | undefined, isStatic: boolean) {
114
+ function renderObject<E, R>(renderable: object | null | undefined, isStatic: boolean) {
115
115
  if (renderable === null || renderable === undefined) {
116
116
  return isStatic ? Fx.empty : Fx.succeed(HtmlRenderEvent(TEXT_START))
117
117
  } else if (Array.isArray(renderable)) {
@@ -121,8 +121,8 @@ function renderObject<R, E>(renderable: object | null | undefined, isStatic: boo
121
121
  return Fx.concatMap(takeOneIfNotRenderEvent(renderable), (r) => renderNode(r, isStatic) as any)
122
122
  } else if (Effect.isEffect(renderable)) {
123
123
  return Fx.switchMap(
124
- Fx.fromEffect(renderable as Effect.Effect<R, E, Renderable>),
125
- (r) => renderNode<R, E>(r, isStatic)
124
+ Fx.fromEffect(renderable as Effect.Effect<Renderable, E, R>),
125
+ (r) => renderNode<E, R>(r, isStatic)
126
126
  )
127
127
  } else if (isRenderEvent(renderable)) {
128
128
  return Fx.succeed(renderable)
@@ -131,17 +131,17 @@ function renderObject<R, E>(renderable: object | null | undefined, isStatic: boo
131
131
  }
132
132
  }
133
133
 
134
- function renderPart<R, E>(
134
+ function renderPart<E, R>(
135
135
  chunk: PartChunk,
136
136
  values: ReadonlyArray<Renderable<any, any>>,
137
137
  isStatic: boolean
138
- ): Fx.Fx<R, E, RenderEvent> {
138
+ ): Fx.Fx<RenderEvent, E, R> {
139
139
  const { node, render } = chunk
140
140
  const renderable: Renderable<any, any> = values[node.index]
141
141
 
142
142
  // Refs and events are not rendered into HTML
143
- if (isDirective<R, E>(renderable)) {
144
- return Fx.make((sink: Sink.Sink<never, E, RenderEvent>) => {
143
+ if (isDirective<E, R>(renderable)) {
144
+ return Fx.make<RenderEvent, E, R>((sink: Sink.Sink<RenderEvent, E>) => {
145
145
  const part = partNodeToPart(
146
146
  node,
147
147
  (value) => sink.onSuccess(HtmlRenderEvent(render(value)))
@@ -150,8 +150,8 @@ function renderPart<R, E>(
150
150
  return Effect.catchAllCause(renderable(part), sink.onFailure)
151
151
  })
152
152
  } else if (node._tag === "node") {
153
- if (isStatic) return renderNode<R, E>(renderable, isStatic)
154
- return Fx.append(renderNode<R, E>(renderable, isStatic), HtmlRenderEvent(TYPED_HOLE(node.index)))
153
+ if (isStatic) return renderNode<E, R>(renderable, isStatic)
154
+ return Fx.append(renderNode<E, R>(renderable, isStatic), HtmlRenderEvent(TYPED_HOLE(node.index)))
155
155
  } else if (node._tag === "properties") {
156
156
  if (renderable == null) return Fx.empty
157
157
  return Fx.map(
@@ -166,7 +166,7 @@ function renderPart<R, E>(
166
166
  } else {
167
167
  if (renderable === null) return Fx.succeed(HtmlRenderEvent(render(renderable)))
168
168
 
169
- const html = Fx.filterMap(Fx.take(unwrapRenderable<R, E>(renderable), 1), (value) => {
169
+ const html = Fx.filterMap(Fx.take(unwrapRenderable<E, R>(renderable), 1), (value) => {
170
170
  const s = render(value)
171
171
 
172
172
  return s ? Option.some(HtmlRenderEvent(s)) : Option.none()
@@ -180,10 +180,10 @@ function renderPart<R, E>(
180
180
  }
181
181
  }
182
182
 
183
- function renderSparsePart<R, E>(
183
+ function renderSparsePart<E, R>(
184
184
  chunk: SparsePartChunk,
185
185
  values: ReadonlyArray<Renderable<any, any>>
186
- ): Fx.Fx<R, E, RenderEvent> {
186
+ ): Fx.Fx<RenderEvent, E, R> {
187
187
  const { node, render } = chunk
188
188
 
189
189
  return Fx.map(
@@ -194,8 +194,8 @@ function renderSparsePart<R, E>(
194
194
 
195
195
  const renderable: Renderable<any, any> = (values as any)[node.index]
196
196
 
197
- if (isDirective<R, E>(renderable)) {
198
- return Fx.make<R, E, unknown>((sink: Sink.Sink<never, E, unknown>) =>
197
+ if (isDirective<E, R>(renderable)) {
198
+ return Fx.make<unknown, E, R>((sink: Sink.Sink<unknown, E>) =>
199
199
  Effect.catchAllCause(
200
200
  renderable(partNodeToPart(node, (value) => sink.onSuccess(value))),
201
201
  sink.onFailure
@@ -203,7 +203,7 @@ function renderSparsePart<R, E>(
203
203
  )
204
204
  }
205
205
 
206
- return unwrapRenderable<R, E>(renderable)
206
+ return unwrapRenderable<E, R>(renderable)
207
207
  })
208
208
  ),
209
209
  1
@@ -212,8 +212,8 @@ function renderSparsePart<R, E>(
212
212
  )
213
213
  }
214
214
 
215
- function takeOneIfNotRenderEvent<R, E, A>(fx: Fx.Fx<R, E, A>): Fx.Fx<R, E, A> {
216
- return Fx.make<R, E, A>((sink) =>
215
+ function takeOneIfNotRenderEvent<A, E, R>(fx: Fx.Fx<A, E, R>): Fx.Fx<A, E, R> {
216
+ return Fx.make<A, E, R>((sink) =>
217
217
  Sink.withEarlyExit(sink, (sink) =>
218
218
  fx.run(
219
219
  Sink.make(
@@ -249,7 +249,7 @@ function getServerEntry(
249
249
  }
250
250
  }
251
251
 
252
- function unwrapRenderable<R, E>(renderable: Renderable<any, any>): Fx.Fx<R, E, any> {
252
+ function unwrapRenderable<E, R>(renderable: Renderable<any, any>): Fx.Fx<any, E, R> {
253
253
  switch (typeof renderable) {
254
254
  case "undefined":
255
255
  case "object": {
package/src/Hydrate.ts CHANGED
@@ -20,8 +20,8 @@ import { RenderTemplate } from "./RenderTemplate.js"
20
20
  * @since 1.0.0
21
21
  */
22
22
  export function hydrate<R, E, T extends RenderEvent | null>(
23
- rendered: Fx.Fx<R, E, T>
24
- ): Fx.Fx<Exclude<R, RenderTemplate> | Document | RenderContext | RootElement, E, ToRendered<T>> {
23
+ rendered: Fx.Fx<T, E, R>
24
+ ): Fx.Fx<ToRendered<T>, E, Exclude<R, RenderTemplate> | Document | RenderContext | RootElement> {
25
25
  return Fx.fromFxEffect(Effect.contextWith((context) => {
26
26
  const [document, renderContext, { rootElement }] = Context.getMany(context, Document, RenderContext, RootElement)
27
27
  const ctx: HydrateContext = {
@@ -40,14 +40,14 @@ export function hydrate<R, E, T extends RenderEvent | null>(
40
40
  Fx.mapEffect(rendered, (what) => attachRoot(renderContext.renderCache, rootElement, what)),
41
41
  layer
42
42
  )
43
- })) as Fx.Fx<Exclude<R, RenderTemplate> | Document | RenderContext | RootElement, E, ToRendered<T>>
43
+ })) as Fx.Fx<ToRendered<T>, E, Exclude<R, RenderTemplate> | Document | RenderContext | RootElement>
44
44
  }
45
45
 
46
46
  /**
47
47
  * @since 1.0.0
48
48
  */
49
49
  export function hydrateLayer<R, E, T extends RenderEvent | null>(
50
- rendered: Fx.Fx<R, E, T>
50
+ rendered: Fx.Fx<T, E, R>
51
51
  ) {
52
52
  return Fx.drainLayer(Fx.switchMapCause(hydrate(rendered), (cause) => Fx.fromEffect(Effect.logError(cause))))
53
53
  }
package/src/Many.ts CHANGED
@@ -20,14 +20,14 @@ import { HtmlRenderEvent, type RenderEvent } from "./RenderEvent.js"
20
20
  /**
21
21
  * @since 1.0.0
22
22
  */
23
- export function many<R, E, A, B extends PropertyKey, R2, E2>(
24
- values: Fx.Fx<R, E, ReadonlyArray<A>>,
23
+ export function many<A, E, R, B extends PropertyKey, R2, E2>(
24
+ values: Fx.Fx<ReadonlyArray<A>, E, R>,
25
25
  getKey: (a: NoInfer<A>) => B,
26
- f: (a: RefSubject.RefSubject<never, never, NoInfer<A>>, key: B) => Fx.Fx<R2, E2, RenderEvent>
27
- ): Fx.Fx<R | R2 | Scope.Scope | RenderContext, E | E2, RenderEvent | ReadonlyArray<RenderEvent>> {
26
+ f: (a: RefSubject.RefSubject<NoInfer<A>>, key: B) => Fx.Fx<RenderEvent, E2, R2>
27
+ ): Fx.Fx<RenderEvent | ReadonlyArray<RenderEvent>, E | E2, R | R2 | Scope.Scope | RenderContext> {
28
28
  return Fx.fromFxEffect(
29
29
  Effect.contextWith(
30
- (context): Fx.Fx<R | R2 | RenderContext | Scope.Scope, E | E2, RenderEvent | ReadonlyArray<RenderEvent>> => {
30
+ (context): Fx.Fx<RenderEvent | ReadonlyArray<RenderEvent>, E | E2, R | R2 | RenderContext | Scope.Scope> => {
31
31
  const ctx = get(context, RenderContext)
32
32
  const hydrateContext = getOption(context, HydrateContext)
33
33
 
@@ -87,15 +87,15 @@ export const manyAsyncData: {
87
87
  matchers: {
88
88
  NoData: () => NoData
89
89
  Loading: (todo: TODO) => Loading
90
- Failure: (data: RefSubject.Computed<never, never, E1>, computed: TODO) => Failure
91
- Success: (value: RefSubject.Computed<never, never, A>, computed: TODO) => Success
90
+ Failure: (data: RefSubject.Computed<E1>, computed: TODO) => Failure
91
+ Success: (value: RefSubject.Computed<A>, computed: TODO) => Success
92
92
  }
93
- ): <R, E>(
94
- fx: Fx.Fx<R, E, AsyncData.AsyncData<E1, ReadonlyArray<A>>>
93
+ ): <E, R>(
94
+ fx: Fx.Fx<AsyncData.AsyncData<ReadonlyArray<A>, E1>, E, R>
95
95
  ) => Fx.Fx<
96
- R | Fx.Fx.Context<NoData | Loading | Failure | Success>,
96
+ Fx.Fx.Success<NoData | Loading | Failure | Success>,
97
97
  E | Fx.Fx.Error<NoData | Loading | Failure | Success>,
98
- Fx.Fx.Success<NoData | Loading | Failure | Success>
98
+ R | Fx.Fx.Context<NoData | Loading | Failure | Success>
99
99
  >
100
100
 
101
101
  <
@@ -109,18 +109,18 @@ export const manyAsyncData: {
109
109
  Failure extends Fx.Fx<any, any, any>,
110
110
  Success extends Fx.Fx<any, any, any>
111
111
  >(
112
- fx: Fx.Fx<R, E, AsyncData.AsyncData<E1, ReadonlyArray<A>>>,
112
+ fx: Fx.Fx<AsyncData.AsyncData<ReadonlyArray<A>, E1>, E, R>,
113
113
  getKey: (a: A) => B,
114
114
  matchers: {
115
115
  NoData: () => NoData
116
116
  Loading: (data: TODO) => Loading
117
- Failure: (data: RefSubject.Computed<never, never, E1>, computed: TODO) => Failure
118
- Success: (value: RefSubject.Computed<never, never, A>, computed: TODO) => Success
117
+ Failure: (data: RefSubject.Computed<E1>, computed: TODO) => Failure
118
+ Success: (value: RefSubject.Computed<A>, computed: TODO) => Success
119
119
  }
120
120
  ): Fx.Fx<
121
- R | Fx.Fx.Context<NoData | Loading | Failure | Success>,
121
+ Fx.Fx.Success<NoData | Loading | Failure | Success>,
122
122
  E | Fx.Fx.Error<NoData | Loading | Failure | Success>,
123
- Fx.Fx.Success<NoData | Loading | Failure | Success>
123
+ R | Fx.Fx.Context<NoData | Loading | Failure | Success>
124
124
  >
125
125
  } = dual(
126
126
  3,
@@ -130,23 +130,23 @@ export const manyAsyncData: {
130
130
  E1,
131
131
  A,
132
132
  B extends PropertyKey,
133
- NoData extends Fx.Fx<any, any, RenderEvent>,
134
- Loading extends Fx.Fx<any, any, RenderEvent>,
135
- Failure extends Fx.Fx<any, any, RenderEvent>,
136
- Success extends Fx.Fx<any, any, RenderEvent>
133
+ NoData extends Fx.Fx<RenderEvent, any, any>,
134
+ Loading extends Fx.Fx<RenderEvent, any, any>,
135
+ Failure extends Fx.Fx<RenderEvent, any, any>,
136
+ Success extends Fx.Fx<RenderEvent, any, any>
137
137
  >(
138
- fx: Fx.Fx<R, E, AsyncData.AsyncData<E1, ReadonlyArray<A>>>,
138
+ fx: Fx.Fx<AsyncData.AsyncData<ReadonlyArray<A>, E1>, E, R>,
139
139
  getKey: (a: A) => B,
140
140
  matchers: {
141
141
  NoData: NoData
142
- Loading: (data: RefSubject.Filtered<never, never, Progress>) => Loading
143
- Failure: (data: RefSubject.Computed<never, never, E1>) => Failure
144
- Success: (value: RefSubject.Computed<never, never, A>, key: B) => Success
142
+ Loading: (data: RefSubject.Filtered<Progress>) => Loading
143
+ Failure: (data: RefSubject.Computed<E1>) => Failure
144
+ Success: (value: RefSubject.Computed<A>, key: B) => Success
145
145
  }
146
146
  ): Fx.Fx<
147
- R | Fx.Fx.Context<NoData | Loading | Failure | Success>,
147
+ RenderEvent | ReadonlyArray<RenderEvent>,
148
148
  E | Fx.Fx.Error<NoData | Loading | Failure | Success>,
149
- RenderEvent | ReadonlyArray<RenderEvent>
149
+ R | Fx.Fx.Context<NoData | Loading | Failure | Success>
150
150
  > => {
151
151
  return RefAsyncData.matchAsyncData(fx, {
152
152
  NoData: matchers.NoData,
package/src/Part.ts CHANGED
@@ -33,7 +33,7 @@ export interface AttributePart {
33
33
  readonly value: string | null | undefined
34
34
  readonly index: number
35
35
 
36
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
36
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
37
37
  }
38
38
 
39
39
  /**
@@ -45,7 +45,7 @@ export interface BooleanPart {
45
45
  readonly value: boolean | null | undefined
46
46
  readonly index: number
47
47
 
48
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
48
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
49
49
  }
50
50
 
51
51
  /**
@@ -56,7 +56,7 @@ export interface ClassNamePart {
56
56
  readonly value: ReadonlyArray<string> | null | undefined
57
57
  readonly index: number
58
58
 
59
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
59
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
60
60
  }
61
61
 
62
62
  /**
@@ -67,7 +67,7 @@ export interface DataPart {
67
67
  readonly value: Readonly<Record<string, string | undefined>> | null | undefined
68
68
  readonly index: number
69
69
 
70
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
70
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
71
71
  }
72
72
 
73
73
  /**
@@ -79,8 +79,8 @@ export interface EventPart {
79
79
  readonly source: ElementSource<any>
80
80
  readonly value: null
81
81
  readonly index: number
82
- readonly onCause: (cause: Cause<unknown>) => Effect<never, never, unknown>
83
- readonly addEventListener: (handler: EventHandler<never, never, Event>) => void
82
+ readonly onCause: (cause: Cause<unknown>) => Effect<unknown>
83
+ readonly addEventListener: (handler: EventHandler<Event>) => void
84
84
  }
85
85
 
86
86
  /**
@@ -92,7 +92,7 @@ export interface PropertyPart {
92
92
  readonly value: unknown
93
93
  readonly index: number
94
94
 
95
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
95
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
96
96
  }
97
97
 
98
98
  /**
@@ -112,7 +112,7 @@ export interface CommentPart {
112
112
  readonly value: string | null | undefined
113
113
  readonly index: number
114
114
 
115
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
115
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
116
116
  }
117
117
 
118
118
  /**
@@ -123,7 +123,7 @@ export interface TextPart {
123
123
  readonly value: string | null | undefined
124
124
  readonly index: number
125
125
 
126
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
126
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
127
127
  }
128
128
 
129
129
  /**
@@ -134,7 +134,7 @@ export interface NodePart {
134
134
  readonly value: unknown
135
135
  readonly index: number
136
136
 
137
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
137
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
138
138
  }
139
139
 
140
140
  /**
@@ -145,7 +145,7 @@ export interface PropertiesPart {
145
145
  readonly value: Readonly<Record<string, any>> | null | undefined
146
146
  readonly index: number
147
147
 
148
- readonly update: (value: this["value"]) => Effect<Scope, never, void>
148
+ readonly update: (value: this["value"]) => Effect<void, never, Scope>
149
149
  }
150
150
 
151
151
  /**
@@ -161,7 +161,7 @@ export interface SparseAttributePart {
161
161
  readonly name: string
162
162
  readonly parts: ReadonlyArray<AttributePart | StaticText>
163
163
 
164
- readonly update: (value: ReadonlyArray<string>) => Effect<Scope, never, void>
164
+ readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
165
165
  }
166
166
 
167
167
  /**
@@ -171,7 +171,7 @@ export interface SparseClassNamePart {
171
171
  readonly _tag: "sparse/className"
172
172
  readonly parts: ReadonlyArray<ClassNamePart | StaticText>
173
173
 
174
- readonly update: (value: ReadonlyArray<string>) => Effect<Scope, never, void>
174
+ readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
175
175
  }
176
176
 
177
177
  /**
@@ -181,7 +181,7 @@ export interface SparseCommentPart {
181
181
  readonly _tag: "sparse/comment"
182
182
  readonly parts: ReadonlyArray<CommentPart | StaticText>
183
183
 
184
- readonly update: (value: ReadonlyArray<string>) => Effect<Scope, never, void>
184
+ readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
185
185
  }
186
186
 
187
187
  /**