@typed/template 0.6.0 → 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/RenderTemplate.js.map +1 -1
- package/dist/cjs/Test.js.map +1 -1
- package/dist/cjs/internal/hydrate.js.map +1 -1
- package/dist/cjs/internal/parts.js.map +1 -1
- 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 +13 -13
- package/dist/dts/Directive.d.ts.map +1 -1
- package/dist/dts/ElementRef.d.ts +2 -2
- package/dist/dts/ElementRef.d.ts.map +1 -1
- package/dist/dts/ElementSource.d.ts +4 -4
- package/dist/dts/ElementSource.d.ts.map +1 -1
- package/dist/dts/EventHandler.d.ts +11 -11
- 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 +1 -1
- 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/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 +4 -4
- package/dist/dts/Test.d.ts.map +1 -1
- package/dist/dts/internal/EventSource.d.ts +1 -1
- package/dist/dts/internal/EventSource.d.ts.map +1 -1
- package/dist/dts/internal/hydrate.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 +2 -2
- package/dist/dts/internal/parts.d.ts.map +1 -1
- package/dist/dts/internal/server.d.ts.map +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/RenderTemplate.js.map +1 -1
- package/dist/esm/Test.js.map +1 -1
- package/dist/esm/internal/hydrate.js.map +1 -1
- package/dist/esm/internal/parts.js.map +1 -1
- 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 +5 -5
- package/src/Directive.ts +19 -19
- package/src/ElementRef.ts +6 -6
- package/src/ElementSource.ts +16 -16
- package/src/EventHandler.ts +11 -11
- package/src/Html.ts +31 -31
- package/src/Hydrate.ts +4 -4
- package/src/Many.ts +26 -26
- package/src/Part.ts +1 -1
- package/src/Placeholder.ts +13 -13
- package/src/Platform.ts +2 -2
- package/src/Render.ts +3 -3
- package/src/RenderTemplate.ts +2 -6
- package/src/Renderable.ts +5 -5
- package/src/Test.ts +7 -7
- package/src/internal/EventSource.ts +1 -1
- package/src/internal/hydrate.ts +1 -5
- package/src/internal/module-augmentation.ts +15 -15
- package/src/internal/parts.ts +1 -1
- package/src/internal/render.ts +8 -8
- package/src/internal/server.ts +0 -2
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,8 +47,8 @@ export function renderToHtml<R, E>(
|
|
|
47
47
|
/**
|
|
48
48
|
* @since 1.0.0
|
|
49
49
|
*/
|
|
50
|
-
export function renderToHtmlString<
|
|
51
|
-
fx: Fx.Fx<
|
|
50
|
+
export function renderToHtmlString<E, R>(
|
|
51
|
+
fx: Fx.Fx<RenderEvent, E, R>
|
|
52
52
|
): Effect.Effect<string, E, Exclude<R, RenderTemplate> | RenderContext> {
|
|
53
53
|
return Effect.map(Fx.toReadonlyArray(renderToHtml(fx)), join(""))
|
|
54
54
|
}
|
|
@@ -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)) {
|
|
@@ -122,7 +122,7 @@ function renderObject<R, E>(renderable: object | null | undefined, isStatic: boo
|
|
|
122
122
|
} else if (Effect.isEffect(renderable)) {
|
|
123
123
|
return Fx.switchMap(
|
|
124
124
|
Fx.fromEffect(renderable as Effect.Effect<Renderable, E, R>),
|
|
125
|
-
(r) => renderNode<
|
|
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
|
@@ -80,7 +80,7 @@ export interface EventPart {
|
|
|
80
80
|
readonly value: null
|
|
81
81
|
readonly index: number
|
|
82
82
|
readonly onCause: (cause: Cause<unknown>) => Effect<unknown>
|
|
83
|
-
readonly addEventListener: (handler: EventHandler<
|
|
83
|
+
readonly addEventListener: (handler: EventHandler<Event>) => void
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
/**
|
package/src/Placeholder.ts
CHANGED
|
@@ -21,7 +21,7 @@ export type PlaceholderTypeId = typeof PlaceholderTypeId
|
|
|
21
21
|
/**
|
|
22
22
|
* @since 1.0.0
|
|
23
23
|
*/
|
|
24
|
-
export interface Placeholder<
|
|
24
|
+
export interface Placeholder<A = unknown, E = never, R = never> {
|
|
25
25
|
readonly [PlaceholderTypeId]: {
|
|
26
26
|
readonly _R: (_: never) => R
|
|
27
27
|
readonly _E: (_: never) => E
|
|
@@ -37,32 +37,32 @@ export namespace Placeholder {
|
|
|
37
37
|
* @since 1.0.0
|
|
38
38
|
*/
|
|
39
39
|
export type Any<A = any> =
|
|
40
|
-
| Placeholder<
|
|
41
|
-
| Placeholder<
|
|
42
|
-
| Placeholder<
|
|
43
|
-
| Placeholder<
|
|
40
|
+
| Placeholder<A, any, any>
|
|
41
|
+
| Placeholder<A, never, any>
|
|
42
|
+
| Placeholder<A>
|
|
43
|
+
| Placeholder<A, any>
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
46
|
* @since 1.0.0
|
|
47
47
|
*/
|
|
48
|
-
export type Context<T> = [T] extends [never] ? never : T extends Placeholder<infer
|
|
48
|
+
export type Context<T> = [T] extends [never] ? never : T extends Placeholder<infer _A, infer _E, infer R> ? R : never
|
|
49
49
|
/**
|
|
50
50
|
* @since 1.0.0
|
|
51
51
|
*/
|
|
52
|
-
export type Error<T> = [T] extends [never] ? never : T extends Placeholder<infer
|
|
52
|
+
export type Error<T> = [T] extends [never] ? never : T extends Placeholder<infer _A, infer E, infer _R> ? E : never
|
|
53
53
|
/**
|
|
54
54
|
* @since 1.0.0
|
|
55
55
|
*/
|
|
56
|
-
export type Success<T> = [T] extends [never] ? never : T extends Placeholder<infer
|
|
56
|
+
export type Success<T> = [T] extends [never] ? never : T extends Placeholder<infer A, infer _E, infer _R> ? A : never
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* @since 1.0.0
|
|
60
60
|
*/
|
|
61
|
-
export function asRef<
|
|
62
|
-
placeholder: Placeholder<
|
|
63
|
-
): Effect.Effect<RefSubject.RefSubject<
|
|
64
|
-
if (isFx<
|
|
65
|
-
return RefSubject.make(placeholder as Fx<
|
|
61
|
+
export function asRef<A = never, E = never, R = never>(
|
|
62
|
+
placeholder: Placeholder<A, E, R> | Fx<A, E, R> | Effect.Effect<A, E, R> | A
|
|
63
|
+
): Effect.Effect<RefSubject.RefSubject<A, E>, never, R | Scope.Scope> {
|
|
64
|
+
if (isFx<A, E, R>(placeholder) || Effect.isEffect(placeholder)) {
|
|
65
|
+
return RefSubject.make(placeholder as Fx<A, E, R>)
|
|
66
66
|
} else {
|
|
67
67
|
return RefSubject.of<A, E>(placeholder as A)
|
|
68
68
|
}
|
package/src/Platform.ts
CHANGED
|
@@ -20,8 +20,8 @@ const HYPHENATED_CONTENT_TYPE = { "content-type": HTML_CONTENT_TYPE }
|
|
|
20
20
|
/**
|
|
21
21
|
* @since 1.0.0
|
|
22
22
|
*/
|
|
23
|
-
export function htmlResponse<
|
|
24
|
-
fx: Fx.Fx<
|
|
23
|
+
export function htmlResponse<E, R>(
|
|
24
|
+
fx: Fx.Fx<RenderEvent, E, R>,
|
|
25
25
|
options?: HttpServer.response.Options
|
|
26
26
|
): Effect.Effect<HttpServer.response.ServerResponse, E, RenderContext.RenderContext | Exclude<R, RenderTemplate>> {
|
|
27
27
|
return Effect.contextWithEffect((ctx) =>
|
package/src/Render.ts
CHANGED
|
@@ -23,8 +23,8 @@ export type ToRendered<T extends RenderEvent | null> = T extends null ? Rendered
|
|
|
23
23
|
* @since 1.0.0
|
|
24
24
|
*/
|
|
25
25
|
export function render<R, E, T extends RenderEvent | null>(
|
|
26
|
-
rendered: Fx.Fx<
|
|
27
|
-
): Fx.Fx<Exclude<R, RenderTemplate> | Document | RenderContext | RootElement
|
|
26
|
+
rendered: Fx.Fx<T, E, R>
|
|
27
|
+
): Fx.Fx<ToRendered<T>, E, Exclude<R, RenderTemplate> | Document | RenderContext | RootElement> {
|
|
28
28
|
return Fx.fromFxEffect(Effect.contextWith((context) => {
|
|
29
29
|
const [document, ctx, { rootElement }] = Context.getMany(context, Document, RenderContext, RootElement)
|
|
30
30
|
|
|
@@ -40,7 +40,7 @@ export function render<R, E, T extends RenderEvent | null>(
|
|
|
40
40
|
* @since 1.0.0
|
|
41
41
|
*/
|
|
42
42
|
export function renderLayer<R, E, T extends RenderEvent | null>(
|
|
43
|
-
rendered: Fx.Fx<
|
|
43
|
+
rendered: Fx.Fx<T, E, R>
|
|
44
44
|
): Layer.Layer<
|
|
45
45
|
never,
|
|
46
46
|
never,
|
package/src/RenderTemplate.ts
CHANGED
|
@@ -16,11 +16,7 @@ export interface RenderTemplate {
|
|
|
16
16
|
<Values extends ReadonlyArray<Renderable<any, any>>>(
|
|
17
17
|
templateStrings: TemplateStringsArray,
|
|
18
18
|
values: Values
|
|
19
|
-
): Fx.Fx<
|
|
20
|
-
Scope | Placeholder.Context<Values[number]>,
|
|
21
|
-
Placeholder.Error<Values[number]>,
|
|
22
|
-
RenderEvent
|
|
23
|
-
>
|
|
19
|
+
): Fx.Fx<RenderEvent, Placeholder.Error<Values[number]>, Scope | Placeholder.Context<Values[number]>>
|
|
24
20
|
}
|
|
25
21
|
|
|
26
22
|
/**
|
|
@@ -38,6 +34,6 @@ export const RenderTemplate: Context.Tagged<RenderTemplate, RenderTemplate> = Co
|
|
|
38
34
|
export function html<const Values extends ReadonlyArray<Renderable<any, any>>>(
|
|
39
35
|
template: TemplateStringsArray,
|
|
40
36
|
...values: Values
|
|
41
|
-
): Fx.Fx<
|
|
37
|
+
): Fx.Fx<RenderEvent, Placeholder.Error<Values[number]>, RenderTemplate | Scope | Placeholder.Context<Values[number]>> {
|
|
42
38
|
return Fx.fromFxEffect(RenderTemplate.with((render) => render(template, values)))
|
|
43
39
|
}
|
package/src/Renderable.ts
CHANGED
|
@@ -12,12 +12,12 @@ import type { RenderEvent } from "./RenderEvent.js"
|
|
|
12
12
|
*/
|
|
13
13
|
export type Renderable<R = never, E = never> =
|
|
14
14
|
| Renderable.Value
|
|
15
|
-
| Placeholder<
|
|
16
|
-
| { readonly [key: string]: Renderable<
|
|
17
|
-
| Placeholder<
|
|
15
|
+
| Placeholder<any, E, R>
|
|
16
|
+
| { readonly [key: string]: Renderable<E, R> | Placeholder<any, E, R> | unknown } // TODO: Should we manage data attributes this way?
|
|
17
|
+
| Placeholder<any, E, R>
|
|
18
18
|
| Effect<any, E, R>
|
|
19
|
-
| Fx<
|
|
20
|
-
| ReadonlyArray<Renderable<
|
|
19
|
+
| Fx<any, E, R>
|
|
20
|
+
| ReadonlyArray<Renderable<E, R>>
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* @since 1.0.0
|
package/src/Test.ts
CHANGED
|
@@ -42,8 +42,8 @@ export interface TestRender<E> {
|
|
|
42
42
|
readonly window: Window & GlobalThis
|
|
43
43
|
readonly document: Document
|
|
44
44
|
readonly elementRef: ElementRef.ElementRef
|
|
45
|
-
readonly errors: RefSubject.Computed<
|
|
46
|
-
readonly lastError: RefSubject.Filtered<
|
|
45
|
+
readonly errors: RefSubject.Computed<ReadonlyArray<E>>
|
|
46
|
+
readonly lastError: RefSubject.Filtered<E>
|
|
47
47
|
readonly interrupt: Effect.Effect<void>
|
|
48
48
|
readonly makeEvent: (type: string, eventInitDict?: EventInit) => Event
|
|
49
49
|
readonly makeCustomEvent: <A>(type: string, eventInitDict?: CustomEventInit<A>) => CustomEvent<A>
|
|
@@ -54,8 +54,8 @@ export interface TestRender<E> {
|
|
|
54
54
|
/**
|
|
55
55
|
* @since 1.0.0
|
|
56
56
|
*/
|
|
57
|
-
export function testRender<
|
|
58
|
-
fx: Fx.Fx<
|
|
57
|
+
export function testRender<E, R>(
|
|
58
|
+
fx: Fx.Fx<RenderEvent, E, R>,
|
|
59
59
|
options?:
|
|
60
60
|
& HappyDOMOptions
|
|
61
61
|
& { readonly [K in keyof DomServicesElementParams]?: (document: Document) => DomServicesElementParams[K] }
|
|
@@ -67,7 +67,7 @@ export function testRender<R, E>(
|
|
|
67
67
|
return Effect.gen(function*(_) {
|
|
68
68
|
const window = yield* _(getOrMakeWindow(options))
|
|
69
69
|
const elementRef = yield* _(ElementRef.make())
|
|
70
|
-
const errors = yield* _(RefSubject.make<
|
|
70
|
+
const errors = yield* _(RefSubject.make<ReadonlyArray<E>>(Effect.succeed([])))
|
|
71
71
|
const fiber = yield* _(
|
|
72
72
|
fx,
|
|
73
73
|
render,
|
|
@@ -187,7 +187,7 @@ export interface TestHydrate<E, Elements> extends TestRender<E> {
|
|
|
187
187
|
* @since 1.0.0
|
|
188
188
|
*/
|
|
189
189
|
export function testHydrate<R, E, Elements>(
|
|
190
|
-
fx: Fx.Fx<
|
|
190
|
+
fx: Fx.Fx<RenderEvent, E, R>,
|
|
191
191
|
f: (rendered: Rendered, window: Window & GlobalThis) => Elements,
|
|
192
192
|
options?:
|
|
193
193
|
& HappyDOMOptions
|
|
@@ -218,7 +218,7 @@ export function testHydrate<R, E, Elements>(
|
|
|
218
218
|
const elements = f(rendered.length === 1 ? rendered[0] : rendered, window)
|
|
219
219
|
|
|
220
220
|
const elementRef = yield* _(ElementRef.make())
|
|
221
|
-
const errors = yield* _(RefSubject.make<
|
|
221
|
+
const errors = yield* _(RefSubject.make<ReadonlyArray<E>>(Effect.succeed([])))
|
|
222
222
|
const fiber = yield* _(
|
|
223
223
|
fx,
|
|
224
224
|
hydrate,
|
|
@@ -7,7 +7,7 @@ import type { EventHandler } from "../EventHandler.js"
|
|
|
7
7
|
|
|
8
8
|
type EventName = string
|
|
9
9
|
|
|
10
|
-
type Handler<Ev extends Event> = EventHandler<
|
|
10
|
+
type Handler<Ev extends Event> = EventHandler<Ev>
|
|
11
11
|
|
|
12
12
|
export interface EventSource {
|
|
13
13
|
readonly addEventListener: <Ev extends Event>(
|
package/src/internal/hydrate.ts
CHANGED
|
@@ -40,11 +40,7 @@ export const hydrateTemplate: (document: Document, ctx: RenderContext) => Render
|
|
|
40
40
|
return <Values extends ReadonlyArray<Renderable<any, any>>>(
|
|
41
41
|
templateStrings: TemplateStringsArray,
|
|
42
42
|
values: Values
|
|
43
|
-
): Fx.Fx<
|
|
44
|
-
Scope.Scope | Placeholder.Context<Values[number]>,
|
|
45
|
-
Placeholder.Error<Values[number]>,
|
|
46
|
-
RenderEvent
|
|
47
|
-
> => {
|
|
43
|
+
): Fx.Fx<RenderEvent, Placeholder.Error<Values[number]>, Scope.Scope | Placeholder.Context<Values[number]>> => {
|
|
48
44
|
return Fx.make((sink) =>
|
|
49
45
|
Effect.gen(function*(_) {
|
|
50
46
|
const context = yield* _(Effect.context<Scope.Scope>())
|
|
@@ -1,44 +1,44 @@
|
|
|
1
1
|
import type { Placeholder } from "../Placeholder.js"
|
|
2
2
|
|
|
3
3
|
declare global {
|
|
4
|
-
export interface String extends Placeholder<
|
|
4
|
+
export interface String extends Placeholder<string> {}
|
|
5
5
|
|
|
6
|
-
export interface Number extends Placeholder<
|
|
6
|
+
export interface Number extends Placeholder<number> {}
|
|
7
7
|
|
|
8
|
-
export interface Boolean extends Placeholder<
|
|
8
|
+
export interface Boolean extends Placeholder<boolean> {}
|
|
9
9
|
|
|
10
|
-
export interface Symbol extends Placeholder<
|
|
10
|
+
export interface Symbol extends Placeholder<symbol> {}
|
|
11
11
|
|
|
12
|
-
export interface BigInt extends Placeholder<
|
|
12
|
+
export interface BigInt extends Placeholder<bigint> {}
|
|
13
13
|
|
|
14
14
|
export interface Array<T> extends
|
|
15
15
|
Placeholder<
|
|
16
|
-
Placeholder.
|
|
16
|
+
Array<Placeholder.Success<T>>,
|
|
17
17
|
Placeholder.Error<T>,
|
|
18
|
-
|
|
18
|
+
Placeholder.Context<T>
|
|
19
19
|
>
|
|
20
20
|
{}
|
|
21
21
|
|
|
22
22
|
export interface ReadonlyArray<T> extends
|
|
23
23
|
Placeholder<
|
|
24
|
-
Placeholder.
|
|
24
|
+
ReadonlyArray<Placeholder.Success<T>>,
|
|
25
25
|
Placeholder.Error<T>,
|
|
26
|
-
|
|
26
|
+
Placeholder.Context<T>
|
|
27
27
|
>
|
|
28
28
|
{}
|
|
29
29
|
|
|
30
30
|
// DOM types
|
|
31
|
-
export interface Node extends Placeholder<
|
|
31
|
+
export interface Node extends Placeholder<Node> {}
|
|
32
32
|
|
|
33
|
-
export interface DocumentFragment extends Placeholder<
|
|
33
|
+
export interface DocumentFragment extends Placeholder<DocumentFragment> {}
|
|
34
34
|
|
|
35
|
-
export interface Element extends Placeholder<
|
|
35
|
+
export interface Element extends Placeholder<Element> {}
|
|
36
36
|
|
|
37
|
-
export interface HTMLElement extends Placeholder<
|
|
37
|
+
export interface HTMLElement extends Placeholder<HTMLElement> {}
|
|
38
38
|
|
|
39
|
-
export interface SVGElement extends Placeholder<
|
|
39
|
+
export interface SVGElement extends Placeholder<SVGElement> {}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
declare module "@typed/fx/Fx" {
|
|
43
|
-
export interface Fx<
|
|
43
|
+
export interface Fx<A, E, R> extends Placeholder<A, E, R> {}
|
|
44
44
|
}
|
package/src/internal/parts.ts
CHANGED
|
@@ -295,7 +295,7 @@ export class EventPartImpl implements EventPart {
|
|
|
295
295
|
readonly index: number,
|
|
296
296
|
readonly source: ElementSource<any>,
|
|
297
297
|
readonly onCause: <E>(cause: Cause<E>) => Effect.Effect<unknown>,
|
|
298
|
-
readonly addEventListener: <Ev extends Event>(handler: EventHandler<
|
|
298
|
+
readonly addEventListener: <Ev extends Event>(handler: EventHandler<Ev>) => void
|
|
299
299
|
) {
|
|
300
300
|
}
|
|
301
301
|
}
|