@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.
- package/dist/cjs/ElementRef.js.map +1 -1
- package/dist/cjs/ElementSource.js.map +1 -1
- package/dist/cjs/Html.js.map +1 -1
- package/dist/cjs/Many.js.map +1 -1
- package/dist/cjs/RenderContext.js.map +1 -1
- package/dist/cjs/RenderTemplate.js.map +1 -1
- package/dist/cjs/Test.js.map +1 -1
- package/dist/cjs/internal/EventSource.js.map +1 -1
- package/dist/cjs/internal/hydrate.js.map +1 -1
- package/dist/cjs/internal/indexRefCounter.js.map +1 -1
- package/dist/cjs/internal/parts.js.map +1 -1
- package/dist/cjs/internal/render.js +3 -2
- package/dist/cjs/internal/render.js.map +1 -1
- package/dist/cjs/internal/server.js +2 -6
- package/dist/cjs/internal/server.js.map +1 -1
- package/dist/dts/Directive.d.ts +14 -14
- package/dist/dts/Directive.d.ts.map +1 -1
- package/dist/dts/ElementRef.d.ts +7 -7
- package/dist/dts/ElementRef.d.ts.map +1 -1
- package/dist/dts/ElementSource.d.ts +5 -5
- package/dist/dts/ElementSource.d.ts.map +1 -1
- package/dist/dts/EventHandler.d.ts +12 -12
- package/dist/dts/EventHandler.d.ts.map +1 -1
- package/dist/dts/Html.d.ts +2 -2
- package/dist/dts/Html.d.ts.map +1 -1
- package/dist/dts/Hydrate.d.ts +2 -2
- package/dist/dts/Hydrate.d.ts.map +1 -1
- package/dist/dts/Many.d.ts +8 -8
- package/dist/dts/Many.d.ts.map +1 -1
- package/dist/dts/Part.d.ts +14 -14
- package/dist/dts/Part.d.ts.map +1 -1
- package/dist/dts/Placeholder.d.ts +6 -6
- package/dist/dts/Placeholder.d.ts.map +1 -1
- package/dist/dts/Platform.d.ts +1 -1
- package/dist/dts/Platform.d.ts.map +1 -1
- package/dist/dts/Render.d.ts +2 -2
- package/dist/dts/Render.d.ts.map +1 -1
- package/dist/dts/RenderContext.d.ts +5 -5
- package/dist/dts/RenderContext.d.ts.map +1 -1
- package/dist/dts/RenderTemplate.d.ts +2 -2
- package/dist/dts/RenderTemplate.d.ts.map +1 -1
- package/dist/dts/Renderable.d.ts +3 -3
- package/dist/dts/Renderable.d.ts.map +1 -1
- package/dist/dts/Test.d.ts +12 -12
- package/dist/dts/Test.d.ts.map +1 -1
- package/dist/dts/Vitest.d.ts +2 -2
- package/dist/dts/Vitest.d.ts.map +1 -1
- package/dist/dts/internal/EventSource.d.ts +2 -2
- package/dist/dts/internal/EventSource.d.ts.map +1 -1
- package/dist/dts/internal/hydrate.d.ts.map +1 -1
- package/dist/dts/internal/indexRefCounter.d.ts +5 -5
- package/dist/dts/internal/indexRefCounter.d.ts.map +1 -1
- package/dist/dts/internal/module-augmentation.d.ts +13 -13
- package/dist/dts/internal/module-augmentation.d.ts.map +1 -1
- package/dist/dts/internal/parts.d.ts +39 -39
- package/dist/dts/internal/parts.d.ts.map +1 -1
- package/dist/dts/internal/render.d.ts +1 -1
- package/dist/dts/internal/render.d.ts.map +1 -1
- package/dist/dts/internal/server.d.ts +2 -2
- package/dist/dts/internal/server.d.ts.map +1 -1
- package/dist/dts/internal/utils.d.ts +1 -1
- package/dist/esm/ElementRef.js.map +1 -1
- package/dist/esm/ElementSource.js.map +1 -1
- package/dist/esm/Html.js.map +1 -1
- package/dist/esm/Many.js.map +1 -1
- package/dist/esm/RenderContext.js.map +1 -1
- package/dist/esm/RenderTemplate.js.map +1 -1
- package/dist/esm/Test.js.map +1 -1
- package/dist/esm/internal/EventSource.js.map +1 -1
- package/dist/esm/internal/hydrate.js.map +1 -1
- package/dist/esm/internal/indexRefCounter.js.map +1 -1
- package/dist/esm/internal/parts.js +4 -4
- package/dist/esm/internal/parts.js.map +1 -1
- package/dist/esm/internal/render.js +3 -2
- package/dist/esm/internal/render.js.map +1 -1
- package/dist/esm/internal/server.js +2 -6
- package/dist/esm/internal/server.js.map +1 -1
- package/package.json +8 -16
- package/src/Directive.ts +24 -24
- package/src/ElementRef.ts +11 -11
- package/src/ElementSource.ts +18 -18
- package/src/EventHandler.ts +18 -18
- package/src/Html.ts +33 -33
- package/src/Hydrate.ts +4 -4
- package/src/Many.ts +26 -26
- package/src/Part.ts +14 -14
- package/src/Placeholder.ts +13 -13
- package/src/Platform.ts +3 -3
- package/src/Render.ts +5 -5
- package/src/RenderContext.ts +8 -8
- package/src/RenderTemplate.ts +2 -6
- package/src/Renderable.ts +6 -6
- package/src/Test.ts +13 -13
- package/src/Vitest.ts +2 -2
- package/src/internal/EventSource.ts +4 -4
- package/src/internal/hydrate.ts +3 -7
- package/src/internal/indexRefCounter.ts +9 -17
- package/src/internal/module-augmentation.ts +15 -15
- package/src/internal/parts.ts +61 -63
- package/src/internal/render.ts +29 -28
- package/src/internal/server.ts +8 -10
- package/TemplateInstance/package.json +0 -6
- package/dist/cjs/TemplateInstance.js +0 -51
- package/dist/cjs/TemplateInstance.js.map +0 -1
- package/dist/dts/TemplateInstance.d.ts +0 -33
- package/dist/dts/TemplateInstance.d.ts.map +0 -1
- package/dist/esm/TemplateInstance.js +0 -43
- package/dist/esm/TemplateInstance.js.map +0 -1
- package/src/TemplateInstance.ts +0 -83
package/src/ElementSource.ts
CHANGED
|
@@ -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
|
-
|
|
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<
|
|
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<
|
|
57
|
+
) => Fx.Fx<EventWithCurrentTarget<Rendered.Elements<T>[number], EventMap[Type]>, never, Scope.Scope>
|
|
58
58
|
|
|
59
|
-
readonly dispatchEvent: (event: Event, wait?: DurationInput) => Effect.Effect<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
302
|
-
private captureMap = new Map<any, Fx.Fx<
|
|
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<
|
|
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<
|
|
329
|
+
toEffect(): Effect.Effect<Rendered.Elements<T>, NoSuchElementException> {
|
|
330
330
|
return this.elements
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
toFx(): Fx.Fx<
|
|
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<
|
|
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
|
|
package/src/EventHandler.ts
CHANGED
|
@@ -17,32 +17,32 @@ export type EventHandlerTypeId = typeof EventHandlerTypeId
|
|
|
17
17
|
/**
|
|
18
18
|
* @since 1.0.0
|
|
19
19
|
*/
|
|
20
|
-
export interface EventHandler<
|
|
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<
|
|
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
|
|
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
|
|
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
|
|
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<
|
|
43
|
+
handler: (event: Ev) => Effect<unknown, E, R>,
|
|
44
44
|
options?: AddEventListenerOptions
|
|
45
|
-
): EventHandler<
|
|
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<
|
|
57
|
+
handler: (event: Ev) => Effect<unknown, E, R>,
|
|
58
58
|
options?: AddEventListenerOptions
|
|
59
|
-
): EventHandler<
|
|
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<
|
|
67
|
+
handler: (event: Ev) => Effect<unknown, E, R>,
|
|
68
68
|
options?: AddEventListenerOptions
|
|
69
|
-
): EventHandler<
|
|
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<
|
|
77
|
+
handler: (event: Ev) => Effect<unknown, E, R>,
|
|
78
78
|
options?: AddEventListenerOptions
|
|
79
|
-
): EventHandler<
|
|
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<
|
|
88
|
+
handler: (event: EventWithTarget<T, Ev>) => Effect<unknown, E, R>,
|
|
89
89
|
options?: AddEventListenerOptions
|
|
90
|
-
): EventHandler<
|
|
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 <
|
|
100
|
-
handler: (event: KeyboardEvent & { key: Keys[number] }) => Effect<
|
|
99
|
+
return <E, R>(
|
|
100
|
+
handler: (event: KeyboardEvent & { key: Keys[number] }) => Effect<unknown, E, R>,
|
|
101
101
|
options?: AddEventListenerOptions
|
|
102
|
-
): EventHandler<
|
|
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<
|
|
34
|
-
fx: Fx.Fx<
|
|
35
|
-
): Fx.Fx<Exclude<R, RenderTemplate> | RenderContext
|
|
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<
|
|
51
|
-
fx: Fx.Fx<
|
|
52
|
-
): Effect.Effect<Exclude<R, RenderTemplate> | RenderContext
|
|
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
|
-
|
|
61
|
+
RenderEvent,
|
|
62
62
|
Placeholder.Error<Values[number]>,
|
|
63
|
-
|
|
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.
|
|
75
|
-
Placeholder.
|
|
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<
|
|
85
|
+
function renderChunk<E, R>(
|
|
86
86
|
chunk: HtmlChunk,
|
|
87
87
|
values: ReadonlyArray<Renderable<any, any>>,
|
|
88
88
|
isStatic: boolean
|
|
89
|
-
): Fx.Fx<
|
|
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<
|
|
93
|
+
return renderPart<E, R>(chunk, values, isStatic)
|
|
94
94
|
} else {
|
|
95
|
-
return renderSparsePart<
|
|
95
|
+
return renderSparsePart<E, R>(chunk, values) as Fx.Fx<RenderEvent, E, R>
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
function renderNode<
|
|
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<
|
|
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<
|
|
125
|
-
(r) => renderNode<
|
|
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<
|
|
134
|
+
function renderPart<E, R>(
|
|
135
135
|
chunk: PartChunk,
|
|
136
136
|
values: ReadonlyArray<Renderable<any, any>>,
|
|
137
137
|
isStatic: boolean
|
|
138
|
-
): Fx.Fx<
|
|
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<
|
|
144
|
-
return Fx.make((sink: Sink.Sink<
|
|
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<
|
|
154
|
-
return Fx.append(renderNode<
|
|
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<
|
|
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<
|
|
183
|
+
function renderSparsePart<E, R>(
|
|
184
184
|
chunk: SparsePartChunk,
|
|
185
185
|
values: ReadonlyArray<Renderable<any, any>>
|
|
186
|
-
): Fx.Fx<
|
|
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<
|
|
198
|
-
return Fx.make<
|
|
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<
|
|
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<
|
|
216
|
-
return Fx.make<
|
|
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<
|
|
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<
|
|
24
|
-
): Fx.Fx<Exclude<R, RenderTemplate> | Document | RenderContext | RootElement
|
|
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
|
|
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<
|
|
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<
|
|
24
|
-
values: Fx.Fx<
|
|
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<
|
|
27
|
-
): Fx.Fx<
|
|
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<
|
|
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<
|
|
91
|
-
Success: (value: RefSubject.Computed<
|
|
90
|
+
Failure: (data: RefSubject.Computed<E1>, computed: TODO) => Failure
|
|
91
|
+
Success: (value: RefSubject.Computed<A>, computed: TODO) => Success
|
|
92
92
|
}
|
|
93
|
-
): <
|
|
94
|
-
fx: Fx.Fx<
|
|
93
|
+
): <E, R>(
|
|
94
|
+
fx: Fx.Fx<AsyncData.AsyncData<ReadonlyArray<A>, E1>, E, R>
|
|
95
95
|
) => Fx.Fx<
|
|
96
|
-
|
|
96
|
+
Fx.Fx.Success<NoData | Loading | Failure | Success>,
|
|
97
97
|
E | Fx.Fx.Error<NoData | Loading | Failure | Success>,
|
|
98
|
-
Fx.Fx.
|
|
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<
|
|
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<
|
|
118
|
-
Success: (value: RefSubject.Computed<
|
|
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
|
-
|
|
121
|
+
Fx.Fx.Success<NoData | Loading | Failure | Success>,
|
|
122
122
|
E | Fx.Fx.Error<NoData | Loading | Failure | Success>,
|
|
123
|
-
Fx.Fx.
|
|
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<
|
|
134
|
-
Loading extends Fx.Fx<
|
|
135
|
-
Failure extends Fx.Fx<
|
|
136
|
-
Success extends Fx.Fx<
|
|
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<
|
|
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<
|
|
143
|
-
Failure: (data: RefSubject.Computed<
|
|
144
|
-
Success: (value: RefSubject.Computed<
|
|
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
|
-
|
|
147
|
+
RenderEvent | ReadonlyArray<RenderEvent>,
|
|
148
148
|
E | Fx.Fx.Error<NoData | Loading | Failure | Success>,
|
|
149
|
-
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
83
|
-
readonly addEventListener: (handler: EventHandler<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
184
|
+
readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
/**
|