@typed/template 0.12.0 → 0.14.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 (123) hide show
  1. package/compiler-tools/package.json +6 -0
  2. package/dist/cjs/Directive.js +1 -1
  3. package/dist/cjs/Directive.js.map +1 -1
  4. package/dist/cjs/ElementRef.js +4 -4
  5. package/dist/cjs/ElementRef.js.map +1 -1
  6. package/dist/cjs/ElementSource.js +11 -7
  7. package/dist/cjs/ElementSource.js.map +1 -1
  8. package/dist/cjs/EventHandler.js +1 -1
  9. package/dist/cjs/EventHandler.js.map +1 -1
  10. package/dist/cjs/Html.js +10 -10
  11. package/dist/cjs/Html.js.map +1 -1
  12. package/dist/cjs/Hydrate.js +4 -18
  13. package/dist/cjs/Hydrate.js.map +1 -1
  14. package/dist/cjs/Many.js +4 -4
  15. package/dist/cjs/Many.js.map +1 -1
  16. package/dist/cjs/Placeholder.js +2 -2
  17. package/dist/cjs/Placeholder.js.map +1 -1
  18. package/dist/cjs/Platform.js +10 -11
  19. package/dist/cjs/Platform.js.map +1 -1
  20. package/dist/cjs/Render.js +5 -5
  21. package/dist/cjs/Render.js.map +1 -1
  22. package/dist/cjs/RenderContext.js +3 -3
  23. package/dist/cjs/RenderContext.js.map +1 -1
  24. package/dist/cjs/RenderQueue.js +11 -9
  25. package/dist/cjs/RenderQueue.js.map +1 -1
  26. package/dist/cjs/RenderTemplate.js +2 -2
  27. package/dist/cjs/RenderTemplate.js.map +1 -1
  28. package/dist/cjs/Template.js.map +1 -1
  29. package/dist/cjs/Test.js +12 -12
  30. package/dist/cjs/Test.js.map +1 -1
  31. package/dist/cjs/Vitest.js +5 -5
  32. package/dist/cjs/Vitest.js.map +1 -1
  33. package/dist/cjs/compiler-tools.js +100 -0
  34. package/dist/cjs/compiler-tools.js.map +1 -0
  35. package/dist/cjs/index.js +6 -6
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/cjs/internal/EventSource.js +4 -4
  38. package/dist/cjs/internal/EventSource.js.map +1 -1
  39. package/dist/cjs/internal/HydrateContext.js.map +1 -1
  40. package/dist/cjs/internal/browser.js +1 -1
  41. package/dist/cjs/internal/browser.js.map +1 -1
  42. package/dist/cjs/internal/indexRefCounter.js +4 -4
  43. package/dist/cjs/internal/indexRefCounter.js.map +1 -1
  44. package/dist/cjs/internal/parser.js +4 -4
  45. package/dist/cjs/internal/parser.js.map +1 -1
  46. package/dist/cjs/internal/parser2.js +1 -1
  47. package/dist/cjs/internal/parser2.js.map +1 -1
  48. package/dist/cjs/internal/server-parts.js +2 -2
  49. package/dist/cjs/internal/server-parts.js.map +1 -1
  50. package/dist/cjs/internal/server.js +1 -1
  51. package/dist/cjs/internal/server.js.map +1 -1
  52. package/dist/cjs/internal/utils.js +2 -2
  53. package/dist/cjs/internal/utils.js.map +1 -1
  54. package/dist/cjs/internal/v2/parts.js +1 -1
  55. package/dist/cjs/internal/v2/parts.js.map +1 -1
  56. package/dist/cjs/internal/v2/render-sync-parts.js +3 -3
  57. package/dist/cjs/internal/v2/render-sync-parts.js.map +1 -1
  58. package/dist/cjs/internal/v2/render.js +250 -75
  59. package/dist/cjs/internal/v2/render.js.map +1 -1
  60. package/dist/cjs/internal/v2/sync-parts.js +1 -1
  61. package/dist/cjs/internal/v2/sync-parts.js.map +1 -1
  62. package/dist/dts/ElementRef.d.ts.map +1 -1
  63. package/dist/dts/ElementSource.d.ts +3 -1
  64. package/dist/dts/ElementSource.d.ts.map +1 -1
  65. package/dist/dts/EventHandler.d.ts.map +1 -1
  66. package/dist/dts/Html.d.ts +1 -1
  67. package/dist/dts/Html.d.ts.map +1 -1
  68. package/dist/dts/Hydrate.d.ts +2 -9
  69. package/dist/dts/Hydrate.d.ts.map +1 -1
  70. package/dist/dts/Platform.d.ts +5 -5
  71. package/dist/dts/Platform.d.ts.map +1 -1
  72. package/dist/dts/Render.d.ts.map +1 -1
  73. package/dist/dts/RenderQueue.d.ts.map +1 -1
  74. package/dist/dts/Template.d.ts +3 -3
  75. package/dist/dts/Template.d.ts.map +1 -1
  76. package/dist/dts/Vitest.d.ts.map +1 -1
  77. package/dist/dts/compiler-tools.d.ts +143 -0
  78. package/dist/dts/compiler-tools.d.ts.map +1 -0
  79. package/dist/dts/internal/server-parts.d.ts.map +1 -1
  80. package/dist/dts/internal/utils.d.ts.map +1 -1
  81. package/dist/dts/internal/v2/parts.d.ts.map +1 -1
  82. package/dist/dts/internal/v2/render.d.ts +31 -10
  83. package/dist/dts/internal/v2/render.d.ts.map +1 -1
  84. package/dist/dts/internal/v2/sync-parts.d.ts.map +1 -1
  85. package/dist/esm/ElementRef.js +1 -1
  86. package/dist/esm/ElementRef.js.map +1 -1
  87. package/dist/esm/ElementSource.js +14 -8
  88. package/dist/esm/ElementSource.js.map +1 -1
  89. package/dist/esm/Html.js +2 -2
  90. package/dist/esm/Html.js.map +1 -1
  91. package/dist/esm/Hydrate.js +0 -12
  92. package/dist/esm/Hydrate.js.map +1 -1
  93. package/dist/esm/Platform.js +3 -4
  94. package/dist/esm/Platform.js.map +1 -1
  95. package/dist/esm/RenderQueue.js +3 -1
  96. package/dist/esm/RenderQueue.js.map +1 -1
  97. package/dist/esm/Template.js.map +1 -1
  98. package/dist/esm/Test.js +2 -2
  99. package/dist/esm/Test.js.map +1 -1
  100. package/dist/esm/compiler-tools.js +91 -0
  101. package/dist/esm/compiler-tools.js.map +1 -0
  102. package/dist/esm/internal/HydrateContext.js.map +1 -1
  103. package/dist/esm/internal/v2/render.js +231 -63
  104. package/dist/esm/internal/v2/render.js.map +1 -1
  105. package/package.json +20 -11
  106. package/src/ElementRef.ts +35 -13
  107. package/src/ElementSource.ts +131 -53
  108. package/src/Html.ts +2 -2
  109. package/src/Hydrate.ts +2 -37
  110. package/src/Platform.ts +9 -10
  111. package/src/RenderQueue.ts +3 -1
  112. package/src/Template.ts +4 -2
  113. package/src/Test.ts +2 -2
  114. package/src/compiler-tools.ts +250 -0
  115. package/src/internal/HydrateContext.ts +0 -2
  116. package/src/internal/v2/render.ts +279 -54
  117. package/dist/cjs/internal/v2/hydrate.js +0 -202
  118. package/dist/cjs/internal/v2/hydrate.js.map +0 -1
  119. package/dist/dts/internal/v2/hydrate.d.ts +0 -7
  120. package/dist/dts/internal/v2/hydrate.d.ts.map +0 -1
  121. package/dist/esm/internal/v2/hydrate.js +0 -195
  122. package/dist/esm/internal/v2/hydrate.js.map +0 -1
  123. package/src/internal/v2/hydrate.ts +0 -289
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typed/template",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -9,19 +9,20 @@
9
9
  },
10
10
  "sideEffects": [],
11
11
  "author": "Typed contributors",
12
+ "homepage": "https://github.com/tylors/typed",
12
13
  "dependencies": {
13
- "@effect/platform": "^0.55.1",
14
- "@effect/schema": "^0.67.14",
15
- "effect": "^3.2.5",
16
- "fast-check": "^3.19.0",
14
+ "@effect/platform": "^0.66.2",
15
+ "@effect/schema": "^0.74.1",
16
+ "effect": "^3.8.4",
17
+ "fast-check": "^3.22.0",
17
18
  "html5parser": "^2.0.2",
18
- "typed-query-selector": "^2.11.2",
19
+ "typed-query-selector": "^2.12.0",
19
20
  "udomdiff": "^1.1.0",
20
- "@typed/context": "0.28.0",
21
- "@typed/dom": "16.0.0",
22
- "@typed/environment": "0.9.0",
23
- "@typed/fx": "1.30.0",
24
- "@typed/wire": "0.5.0"
21
+ "@typed/context": "0.30.0",
22
+ "@typed/dom": "18.0.0",
23
+ "@typed/environment": "0.11.0",
24
+ "@typed/fx": "1.32.0",
25
+ "@typed/wire": "0.6.0"
25
26
  },
26
27
  "main": "./dist/cjs/index.js",
27
28
  "module": "./dist/esm/index.js",
@@ -147,6 +148,11 @@
147
148
  "types": "./dist/dts/Vitest.d.ts",
148
149
  "import": "./dist/esm/Vitest.js",
149
150
  "default": "./dist/cjs/Vitest.js"
151
+ },
152
+ "./compiler-tools": {
153
+ "types": "./dist/dts/compiler-tools.d.ts",
154
+ "import": "./dist/esm/compiler-tools.js",
155
+ "default": "./dist/cjs/compiler-tools.js"
150
156
  }
151
157
  },
152
158
  "typesVersions": {
@@ -219,6 +225,9 @@
219
225
  ],
220
226
  "Vitest": [
221
227
  "./dist/dts/Vitest.d.ts"
228
+ ],
229
+ "compiler-tools": [
230
+ "./dist/dts/compiler-tools.d.ts"
222
231
  ]
223
232
  }
224
233
  }
package/src/ElementRef.ts CHANGED
@@ -23,8 +23,17 @@ export type ElementRefTypeId = typeof ElementRefTypeId
23
23
  * A reference to a rendered element.
24
24
  * @since 1.0.0
25
25
  */
26
- export interface ElementRef<T extends Rendered = Rendered>
27
- extends Versioned<never, never, T, never, Scope.Scope, T, NoSuchElementException, never>
26
+ export interface ElementRef<T extends Rendered = Rendered> extends
27
+ Versioned<
28
+ never,
29
+ never,
30
+ T,
31
+ never,
32
+ Scope.Scope,
33
+ T,
34
+ NoSuchElementException,
35
+ never
36
+ >
28
37
  {
29
38
  readonly [ElementRefTypeId]: RefSubject.RefSubject<Option.Option<T>>
30
39
 
@@ -39,7 +48,11 @@ const strictEqual = Option.getEquivalence((a, b) => a === b)
39
48
  /**
40
49
  * @since 1.0.0
41
50
  */
42
- export function make<T extends Rendered = Rendered>(): Effect.Effect<ElementRef<T>, never, Scope.Scope> {
51
+ export function make<T extends Rendered = Rendered>(): Effect.Effect<
52
+ ElementRef<T>,
53
+ never,
54
+ Scope.Scope
55
+ > {
43
56
  return Effect.map(
44
57
  RefSubject.of(Option.none<T>(), { eq: strictEqual }),
45
58
  (ref) => new ElementRefImpl(ref) as any as ElementRef<T>
@@ -49,23 +62,22 @@ export function make<T extends Rendered = Rendered>(): Effect.Effect<ElementRef<
49
62
  /**
50
63
  * @since 1.0.0
51
64
  */
52
- export function of<T extends Rendered>(rendered: T): Effect.Effect<ElementRef<T>, never, Scope.Scope> {
65
+ export function of<T extends Rendered>(
66
+ rendered: T
67
+ ): Effect.Effect<ElementRef<T>, never, Scope.Scope> {
53
68
  return Effect.map(
54
69
  RefSubject.of(Option.some<T>(rendered), { eq: strictEqual }),
55
70
  (ref) => new ElementRefImpl(ref) as any as ElementRef<T>
56
71
  )
57
72
  }
58
73
 
59
- // @ts-expect-error does not implement Placeholder
74
+ // @ts-expect-error Missing PlaceholderTypeId
60
75
  class ElementRefImpl<T extends Rendered> extends FxEffectBase<T, never, Scope.Scope, T, NoSuchElementException, never>
61
76
  implements ElementRef<T>
62
77
  {
63
78
  readonly [ElementRefTypeId]: RefSubject.RefSubject<Option.Option<T>>
64
79
 
65
- private source: ElementSource<
66
- T,
67
- DefaultEventMap<T>
68
- >
80
+ private source: ElementSource<T, DefaultEventMap<T>>
69
81
 
70
82
  readonly query: ElementRef<T>["query"]
71
83
  readonly events: ElementRef<T>["events"]
@@ -97,16 +109,26 @@ class ElementRefImpl<T extends Rendered> extends FxEffectBase<T, never, Scope.Sc
97
109
  * @since 1.0.0
98
110
  */
99
111
  export const set: {
100
- <A extends Rendered>(value: A): (elementRef: ElementRef<A>) => Effect.Effect<A>
112
+ <A extends Rendered>(
113
+ value: A
114
+ ): (elementRef: ElementRef<A>) => Effect.Effect<A>
101
115
  <A extends Rendered>(elementRef: ElementRef<A>, value: A): Effect.Effect<A>
102
- } = dual(2, function set<A extends Rendered>(elementRef: ElementRef<A>, value: A) {
103
- return Effect.as(RefSubject.set(elementRef[ElementRefTypeId], Option.some(value)), value)
116
+ } = dual(2, function set<
117
+ A extends Rendered
118
+ >(elementRef: ElementRef<A>, value: A) {
119
+ return Effect.as(
120
+ RefSubject.set(elementRef[ElementRefTypeId], Option.some(value)),
121
+ value
122
+ )
104
123
  })
105
124
 
106
125
  /**
107
126
  * @since 1.0.0
108
127
  */
109
- export function dispatchEvent<T extends Rendered>(ref: ElementRef<T>, event: Event) {
128
+ export function dispatchEvent<T extends Rendered>(
129
+ ref: ElementRef<T>,
130
+ event: Event
131
+ ) {
110
132
  return ref.pipe(
111
133
  Effect.flatMap((rendered) => {
112
134
  const elements = getElements(rendered)
@@ -40,7 +40,10 @@ export interface ElementSource<
40
40
  readonly selector: Selector
41
41
 
42
42
  readonly query: {
43
- <S extends string, Ev extends {} = DefaultEventMap<ParseSelector<S, Element>>>(
43
+ <
44
+ S extends string,
45
+ Ev extends {} = DefaultEventMap<ParseSelector<S, Element>>
46
+ >(
44
47
  selector: S
45
48
  ): ElementSource<ParseSelector<S, Element>, Ev>
46
49
 
@@ -54,33 +57,44 @@ export interface ElementSource<
54
57
  readonly events: <Type extends keyof EventMap>(
55
58
  type: Type,
56
59
  options?: AddEventListenerOptions
57
- ) => Fx.Fx<EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>, never, Scope.Scope>
60
+ ) => Fx.Fx<
61
+ EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>,
62
+ never,
63
+ Scope.Scope
64
+ >
58
65
 
59
- readonly dispatchEvent: (event: Event, wait?: DurationInput) => Effect.Effect<void, NoSuchElementException>
66
+ readonly dispatchEvent: (
67
+ event: Event,
68
+ wait?: DurationInput
69
+ ) => Effect.Effect<void, NoSuchElementException>
60
70
  }
61
71
 
62
72
  /**
63
73
  * @since 1.0.0
64
74
  */
65
- export function ElementSource<T extends Rendered, EventMap extends {} = DefaultEventMap<T>>(
66
- rootElement: RefSubject.Filtered<T>
67
- ): ElementSource<T, EventMap> {
75
+ export function ElementSource<
76
+ T extends Rendered,
77
+ EventMap extends {} = DefaultEventMap<T>
78
+ >(rootElement: RefSubject.Filtered<T>): ElementSource<T, EventMap> {
68
79
  return new ElementSourceImpl<T, EventMap>(rootElement) as any
69
80
  }
70
81
 
71
82
  /**
72
83
  * @since 1.0.0
73
84
  */
74
- export function fromElement<T extends Element, EventMap extends {} = DefaultEventMap<T>>(
75
- rootElement: T
76
- ): ElementSource<T, EventMap> {
85
+ export function fromElement<
86
+ T extends Element,
87
+ EventMap extends {} = DefaultEventMap<T>
88
+ >(rootElement: T): ElementSource<T, EventMap> {
77
89
  return ElementSourceImpl.fromElement(rootElement) as any
78
90
  }
79
91
 
80
92
  /**
81
93
  * @since 1.0.0
82
94
  */
83
- export type ParseSelector<T extends string, Fallback> = [T] extends [typeof ROOT_CSS_SELECTOR] ? Fallback
95
+ export type ParseSelector<T extends string, Fallback> = [T] extends [
96
+ typeof ROOT_CSS_SELECTOR
97
+ ] ? Fallback
84
98
  : Fallback extends globalThis.Element ? Extract<TQS.ParseSelector<T, Fallback>, globalThis.Element>
85
99
  : Fallback
86
100
 
@@ -106,7 +120,9 @@ type RenderedWithoutArray = Exclude<Rendered, ReadonlyArray<Rendered>>
106
120
  /**
107
121
  * @since 1.0.0
108
122
  */
109
- export function getElements<T extends Rendered>(element: T): ReadonlyArray<Element> {
123
+ export function getElements<T extends Rendered>(
124
+ element: T
125
+ ): ReadonlyArray<Element> {
110
126
  if (Array.isArray(element)) return element.flatMap(getElements)
111
127
  if (isWire(element as RenderedWithoutArray)) {
112
128
  return Array.from((element.valueOf() as DocumentFragment).children)
@@ -117,12 +133,16 @@ export function getElements<T extends Rendered>(element: T): ReadonlyArray<Eleme
117
133
  }
118
134
 
119
135
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
120
- if ((element as Node).parentElement) return [(element as Node).parentElement!]
136
+ if ((element as Node).parentElement) {
137
+ return [(element as Node).parentElement!]
138
+ }
121
139
 
122
140
  return []
123
141
  }
124
142
 
125
- function findMostSpecificElement<T extends Element>(cssSelectors: ReadonlyArray<string>) {
143
+ function findMostSpecificElement<T extends Element>(
144
+ cssSelectors: ReadonlyArray<string>
145
+ ) {
126
146
  return function(element: Rendered): T {
127
147
  const elements = getElements(element)
128
148
 
@@ -140,7 +160,9 @@ function findMostSpecificElement<T extends Element>(cssSelectors: ReadonlyArray<
140
160
  }
141
161
  }
142
162
 
143
- function findMatchingElements<El extends Element = Element>(cssSelectors: ReadonlyArray<string>) {
163
+ function findMatchingElements<El extends Element = Element>(
164
+ cssSelectors: ReadonlyArray<string>
165
+ ) {
144
166
  if (cssSelectors.length === 0) return getElements
145
167
 
146
168
  const cssSelector = cssSelectors.join(" ")
@@ -175,13 +197,15 @@ function makeEventStream<Ev extends Event>(
175
197
  elements.map((element) =>
176
198
  Fx.filter(
177
199
  Fx.make<Ev>((sink) =>
178
- Effect.scoped(Effect.zipRight(
179
- addEventListener(element, {
180
- eventName,
181
- handler: (ev) => sink.onSuccess(ev as any as Ev)
182
- }),
183
- Effect.never
184
- ))
200
+ Effect.scoped(
201
+ Effect.zipRight(
202
+ addEventListener(element, {
203
+ eventName,
204
+ handler: (ev) => sink.onSuccess(ev as any as Ev)
205
+ }),
206
+ Effect.never
207
+ )
208
+ )
185
209
  ),
186
210
  (event: Ev) =>
187
211
  ensureMatches(cssSelector, element, event, capture) ||
@@ -211,15 +235,20 @@ function makeElementEventStream<Ev extends Event>(
211
235
  elements.map((element) =>
212
236
  Fx.filter(
213
237
  Fx.make<Ev>((sink) =>
214
- Effect.scoped(Effect.zipRight(
215
- addEventListener(element, {
216
- eventName,
217
- handler: (ev) => sink.onSuccess(ev as any as Ev)
218
- }),
219
- Effect.never
220
- ))
238
+ Effect.scoped(
239
+ Effect.zipRight(
240
+ addEventListener(element, {
241
+ eventName,
242
+ handler: (ev) => sink.onSuccess(ev as any as Ev)
243
+ }),
244
+ Effect.never
245
+ )
246
+ )
221
247
  ),
222
- (event: Ev) => event.target ? currentTarget.contains(event.target as Element) : false
248
+ (event: Ev) =>
249
+ event.target
250
+ ? currentTarget.contains(event.target as Element)
251
+ : false
223
252
  )
224
253
  )
225
254
  )
@@ -262,24 +291,39 @@ const EVENT_PROPERTY_TO_REPLACE = "currentTarget"
262
291
  function cloneEvent<E extends Event>(event: E, currentTarget: Element): E {
263
292
  return new Proxy(event, {
264
293
  get(target: E, property: string | symbol) {
265
- return property === EVENT_PROPERTY_TO_REPLACE ? currentTarget : target[property as keyof E]
294
+ return property === EVENT_PROPERTY_TO_REPLACE
295
+ ? currentTarget
296
+ : target[property as keyof E]
266
297
  }
267
298
  })
268
299
  }
269
300
 
270
- function ensureMatches(cssSelector: string, element: Element, ev: Event, capture = false): boolean {
301
+ function ensureMatches(
302
+ cssSelector: string,
303
+ element: Element,
304
+ ev: Event,
305
+ capture = false
306
+ ): boolean {
271
307
  let target = ev.target as Element
272
308
 
273
- if (!cssSelector) return (capture && element.contains(target)) || target === element
309
+ if (!cssSelector) {
310
+ return (capture && element.contains(target)) || target === element
311
+ }
274
312
 
275
- for (; target && target !== element; target = target.parentElement as Element) {
313
+ for (
314
+ ;
315
+ target && target !== element;
316
+ target = target.parentElement as Element
317
+ ) {
276
318
  if (target.matches(cssSelector)) return true
277
319
  }
278
320
 
279
321
  return element.matches(cssSelector)
280
322
  }
281
323
 
282
- function isDocumentFragment(element: RenderedWithoutArray): element is DocumentFragment {
324
+ function isDocumentFragment(
325
+ element: RenderedWithoutArray
326
+ ): element is DocumentFragment {
283
327
  return element.nodeType === element.DOCUMENT_FRAGMENT_NODE
284
328
  }
285
329
 
@@ -291,13 +335,18 @@ function isElement(element: RenderedWithoutArray): element is Element {
291
335
  * @internal
292
336
  * @since 1.0.0
293
337
  */
294
- // @ts-expect-error Doesn't implement Placeholder
338
+ // @ts-expect-error Missing PlaceholderTypeId
295
339
  export class ElementSourceImpl<
296
340
  T extends Rendered,
297
341
  EventMap extends {} = DefaultEventMap<Rendered.Elements<T>[number]>
298
- > extends FxEffectBase<Rendered.Elements<T>, never, Scope.Scope, Rendered.Elements<T>, NoSuchElementException, never>
299
- implements ElementSource<T, EventMap>
300
- {
342
+ > extends FxEffectBase<
343
+ Rendered.Elements<T>,
344
+ never,
345
+ Scope.Scope,
346
+ Rendered.Elements<T>,
347
+ NoSuchElementException,
348
+ never
349
+ > implements ElementSource<T, EventMap> {
301
350
  private bubbleMap = new Map<any, Fx.Fx<any, never, Scope.Scope>>()
302
351
  private captureMap = new Map<any, Fx.Fx<any, never, Scope.Scope>>()
303
352
 
@@ -312,18 +361,23 @@ export class ElementSourceImpl<
312
361
  this.query = this.query.bind(this)
313
362
  this.events = this.events.bind(this)
314
363
 
315
- this.elements = this.selector._tag === "css" ?
316
- RefSubject.map(this.rootElement, findMatchingElements<any>(this.selector.selectors)) :
317
- RefSubject.filterMapEffect(
364
+ this.elements = this.selector._tag === "css"
365
+ ? RefSubject.map(
366
+ this.rootElement,
367
+ findMatchingElements<any>(this.selector.selectors)
368
+ )
369
+ : (RefSubject.filterMapEffect(
318
370
  Versioned.of(this.selector.element),
319
371
  (x) => Effect.succeedSome([x] as any as Rendered.Elements<T>)
320
- ) as any
372
+ ) as any)
321
373
 
322
374
  this.version = this.elements.version
323
375
  }
324
376
 
325
377
  static fromElement<T extends Rendered>(rootElement: T): ElementSource<T> {
326
- return new ElementSourceImpl<T>(RefSubject.filterMapEffect(Versioned.of(rootElement), Effect.succeedSome)) as any
378
+ return new ElementSourceImpl<T>(
379
+ RefSubject.filterMapEffect(Versioned.of(rootElement), Effect.succeedSome)
380
+ ) as any
327
381
  }
328
382
 
329
383
  toEffect(): Effect.Effect<Rendered.Elements<T>, NoSuchElementException> {
@@ -334,26 +388,39 @@ export class ElementSourceImpl<
334
388
  return this.elements
335
389
  }
336
390
 
337
- query<S extends string, Ev extends {} = DefaultEventMap<ParseSelector<S, Element>>>(
338
- selector: S
339
- ): ElementSource<ParseSelector<S, Element>, Ev> {
391
+ query<
392
+ S extends string,
393
+ Ev extends {} = DefaultEventMap<ParseSelector<S, Element>>
394
+ >(selector: S): ElementSource<ParseSelector<S, Element>, Ev> {
340
395
  if (selector === ROOT_CSS_SELECTOR) {
341
396
  return this as any
342
397
  } else if (typeof selector === "string") {
343
398
  if (this.selector._tag === "css") {
344
- return new ElementSourceImpl(this.rootElement, CssSelectors([...this.selector.selectors, selector])) as any
399
+ return new ElementSourceImpl(
400
+ this.rootElement,
401
+ CssSelectors([...this.selector.selectors, selector])
402
+ ) as any
345
403
  } else {
346
- return ElementSourceImpl.fromElement(this.selector.element).query(selector) as any
404
+ return ElementSourceImpl.fromElement(this.selector.element).query(
405
+ selector
406
+ ) as any
347
407
  }
348
408
  } else {
349
- return new ElementSourceImpl(this.rootElement, ElementSelector(selector)) as any
409
+ return new ElementSourceImpl(
410
+ this.rootElement,
411
+ ElementSelector(selector)
412
+ ) as any
350
413
  }
351
414
  }
352
415
 
353
416
  events<Type extends keyof EventMap>(
354
417
  type: Type,
355
418
  options?: AddEventListenerOptions
356
- ): Fx.Fx<EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>, never, Scope.Scope> {
419
+ ): Fx.Fx<
420
+ EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>,
421
+ never,
422
+ Scope.Scope
423
+ > {
357
424
  const capture = options?.capture === true
358
425
  const map = capture ? this.captureMap : this.bubbleMap
359
426
 
@@ -361,13 +428,24 @@ export class ElementSourceImpl<
361
428
 
362
429
  if (current === undefined) {
363
430
  if (this.selector._tag === "css") {
364
- current = RefSubject.map(this.rootElement, findMostSpecificElement(this.selector.selectors)).pipe(
365
- Fx.switchMap(makeEventStream(this.selector.selectors, type as any, options)),
431
+ current = RefSubject.map(
432
+ this.rootElement,
433
+ findMostSpecificElement(this.selector.selectors)
434
+ ).pipe(
435
+ Fx.switchMap(
436
+ makeEventStream(this.selector.selectors, type as any, options)
437
+ ),
366
438
  Fx.multicast
367
439
  )
368
440
  } else {
369
441
  current = this.rootElement.pipe(
370
- Fx.switchMap(makeElementEventStream(this.selector.element, type as string, options)),
442
+ Fx.switchMap(
443
+ makeElementEventStream(
444
+ this.selector.element,
445
+ type as string,
446
+ options
447
+ )
448
+ ),
371
449
  Fx.multicast
372
450
  )
373
451
  }
package/src/Html.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  import type { CurrentEnvironment } from "@typed/environment"
6
6
  import * as Fx from "@typed/fx/Fx"
7
7
  import * as Sink from "@typed/fx/Sink"
8
- import { TypeId } from "@typed/fx/TypeId"
8
+ import { FxTypeId } from "@typed/fx/TypeId"
9
9
  import { join } from "effect/Array"
10
10
  import * as Effect from "effect/Effect"
11
11
  import * as Layer from "effect/Layer"
@@ -380,7 +380,7 @@ function unwrapRenderable<E, R>(
380
380
  return Fx.fromFxEffect(
381
381
  Effect.map(renderable as any, unwrapRenderable<any, any>)
382
382
  )
383
- } else if (TypeId in renderable) {
383
+ } else if (FxTypeId in renderable) {
384
384
  return renderable as any
385
385
  } else return Fx.succeed(renderable as any)
386
386
  }
package/src/Hydrate.ts CHANGED
@@ -3,51 +3,17 @@
3
3
  */
4
4
 
5
5
  import * as Context from "@typed/context"
6
- import { Document } from "@typed/dom/Document"
7
- import type { DomServices, DomServicesElementParams } from "@typed/dom/DomServices"
8
- import type { GlobalThis } from "@typed/dom/GlobalThis"
9
6
  import { RootElement } from "@typed/dom/RootElement"
10
- import type { CurrentEnvironment } from "@typed/environment"
11
7
  import * as Fx from "@typed/fx/Fx"
12
8
  import * as Effect from "effect/Effect"
13
- import * as Layer from "effect/Layer"
9
+ import type * as Layer from "effect/Layer"
14
10
  import { HydrateContext } from "./internal/HydrateContext.js"
15
- import { hydrateTemplate } from "./internal/v2/hydrate.js"
16
11
  import { getHydrationRoot } from "./internal/v2/hydration-template.js"
17
12
  import { attachRoot } from "./internal/v2/render.js"
18
13
  import type { ToRendered } from "./Render.js"
19
14
  import * as RenderContext from "./RenderContext.js"
20
15
  import { type RenderEvent } from "./RenderEvent.js"
21
- import { RenderTemplate } from "./RenderTemplate.js"
22
-
23
- /**
24
- * @since 1.0.0
25
- */
26
- export const hydrateLayer = (
27
- window: Window & GlobalThis,
28
- options?: DomServicesElementParams
29
- ): Layer.Layer<
30
- | RenderTemplate
31
- | RenderContext.RenderContext
32
- | CurrentEnvironment
33
- | DomServices
34
- > =>
35
- Layer.provideMerge(
36
- RenderTemplate.layer(
37
- Effect.contextWith(
38
- (context: Context.Context<Document | RenderContext.RenderContext>) => {
39
- const [document, ctx] = Context.getMany(
40
- context,
41
- Document,
42
- RenderContext.RenderContext
43
- )
44
-
45
- return hydrateTemplate(document, ctx)
46
- }
47
- )
48
- ),
49
- RenderContext.dom(window, options)
50
- )
16
+ import type { RenderTemplate } from "./RenderTemplate.js"
51
17
 
52
18
  /**
53
19
  * @since 1.0.0
@@ -63,7 +29,6 @@ export function hydrate<R, E, T extends RenderEvent | null>(
63
29
  )
64
30
  const ctx: HydrateContext = {
65
31
  where: getHydrationRoot(rootElement),
66
- parentTemplate: null,
67
32
  hydrate: true
68
33
  }
69
34
 
package/src/Platform.ts CHANGED
@@ -2,9 +2,8 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
 
5
- import * as Headers from "@effect/platform/Http/Headers"
6
- import type { ServerRequest } from "@effect/platform/Http/ServerRequest"
7
- import * as HttpServer from "@effect/platform/HttpServer"
5
+ import type { HttpServerRequest } from "@effect/platform"
6
+ import { Headers, HttpServerResponse } from "@effect/platform"
8
7
  import type * as Fx from "@typed/fx/Fx"
9
8
  import { toStream } from "@typed/fx/Stream"
10
9
  import * as Effect from "effect/Effect"
@@ -22,10 +21,10 @@ const HYPHENATED_CONTENT_TYPE = { "content-type": HTML_CONTENT_TYPE }
22
21
  */
23
22
  export function htmlResponse<E, R>(
24
23
  fx: Fx.Fx<RenderEvent | null, E, R>,
25
- options?: HttpServer.response.Options
26
- ): Effect.Effect<HttpServer.response.ServerResponse, E, R> {
24
+ options?: HttpServerResponse.Options
25
+ ): Effect.Effect<HttpServerResponse.HttpServerResponse, E, R> {
27
26
  return Effect.contextWithEffect((ctx) =>
28
- HttpServer.response.stream(
27
+ HttpServerResponse.stream(
29
28
  Stream.provideContext(Stream.encodeText(toStream(renderToHtml(fx))), ctx),
30
29
  {
31
30
  ...CAMEL_CASE_CONTENT_TYPE,
@@ -41,9 +40,9 @@ export function htmlResponse<E, R>(
41
40
  */
42
41
  export function htmlResponseString(
43
42
  html: string,
44
- options?: HttpServer.response.Options
45
- ): HttpServer.response.ServerResponse {
46
- return HttpServer.response.raw(
43
+ options?: HttpServerResponse.Options
44
+ ): HttpServerResponse.HttpServerResponse {
45
+ return HttpServerResponse.raw(
47
46
  html,
48
47
  {
49
48
  ...CAMEL_CASE_CONTENT_TYPE,
@@ -56,7 +55,7 @@ export function htmlResponseString(
56
55
  /**
57
56
  * @since 1.0.0
58
57
  */
59
- export function getUrlFromServerRequest(request: ServerRequest): URL {
58
+ export function getUrlFromServerRequest(request: HttpServerRequest.HttpServerRequest): URL {
60
59
  const { headers } = request
61
60
  const host = Headers.get(headers, "x-forwarded-host").pipe(
62
61
  Option.orElse(() => Headers.get(headers, "host")),
@@ -366,7 +366,9 @@ class MicroTaskImpl extends BaseImpl implements RenderQueue {
366
366
  })
367
367
  return Effect.sync(() => {
368
368
  this.scheduled = false
369
- id && this._clear(id)
369
+ if (id) {
370
+ this._clear(id)
371
+ }
370
372
  })
371
373
  })
372
374
 
package/src/Template.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type { Chunk } from "effect/Chunk"
4
+ import type { Chunk, NonEmptyChunk } from "effect/Chunk"
5
5
  import { type Inspectable, NodeInspectSymbol } from "effect/Inspectable"
6
6
 
7
7
  /**
@@ -15,7 +15,9 @@ export class Template implements Inspectable {
15
15
  readonly hash: string,
16
16
  // Parts are a array of Parts to the respective path from the root node to access it prior to rendering
17
17
  /// any nodes/elements into the template.
18
- readonly parts: ReadonlyArray<readonly [part: PartNode | SparsePartNode, path: Chunk<number>]>
18
+ readonly parts: ReadonlyArray<
19
+ readonly [part: PartNode | SparsePartNode, path: Chunk<number> | NonEmptyChunk<number>]
20
+ >
19
21
  ) {}
20
22
 
21
23
  toJSON() {
package/src/Test.ts CHANGED
@@ -21,7 +21,7 @@ import type * as Scope from "effect/Scope"
21
21
  import * as ElementRef from "./ElementRef.js"
22
22
  import { ROOT_CSS_SELECTOR } from "./ElementSource.js"
23
23
  import { renderToHtml, renderToHtmlString, serverLayer, staticLayer } from "./Html.js"
24
- import { hydrate, hydrateLayer } from "./Hydrate.js"
24
+ import { hydrate } from "./Hydrate.js"
25
25
  import { adjustTime } from "./internal/utils.js"
26
26
  import { render, renderLayer } from "./Render.js"
27
27
  import type * as RenderContext from "./RenderContext.js"
@@ -263,7 +263,7 @@ export function testHydrate<R, E, Elements>(
263
263
  fromRendered(rendered)
264
264
  )
265
265
  )),
266
- Effect.provide(hydrateLayer(window)),
266
+ Effect.provide(renderLayer(window)),
267
267
  Effect.forkScoped
268
268
  )
269
269