@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/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<
|
|
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,10 +20,10 @@ 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
|
-
): Effect.Effect<RenderContext.RenderContext | Exclude<R, RenderTemplate
|
|
26
|
+
): Effect.Effect<HttpServer.response.ServerResponse, E, RenderContext.RenderContext | Exclude<R, RenderTemplate>> {
|
|
27
27
|
return Effect.contextWithEffect((ctx) =>
|
|
28
28
|
HttpServer.response.stream(
|
|
29
29
|
Stream.provideContext(Stream.encodeText(toStream(renderToHtml(fx))), 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,11 +40,11 @@ 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
|
-
Document | RenderContext | RootElement | Exclude<Exclude<R, RenderTemplate>, Scope.Scope>,
|
|
46
45
|
never,
|
|
47
|
-
never
|
|
46
|
+
never,
|
|
47
|
+
Document | RenderContext | RootElement | Exclude<Exclude<R, RenderTemplate>, Scope.Scope>
|
|
48
48
|
> {
|
|
49
49
|
return Fx.drainLayer(Fx.switchMapCause(render(rendered), (e) => Fx.fromEffect(Effect.logError(e))))
|
|
50
50
|
}
|
package/src/RenderContext.ts
CHANGED
|
@@ -57,7 +57,7 @@ export const RenderContext: Context.Tagged<RenderContext, RenderContext> = Conte
|
|
|
57
57
|
* @since 1.0.0
|
|
58
58
|
*/
|
|
59
59
|
export interface RenderQueue {
|
|
60
|
-
readonly add: (part: unknown, task: () => void) => Effect.Effect<
|
|
60
|
+
readonly add: (part: unknown, task: () => void) => Effect.Effect<void, never, Scope.Scope>
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
/**
|
|
@@ -120,7 +120,7 @@ const buildWithCurrentEnvironment = (environment: Environment, skipRenderSchedul
|
|
|
120
120
|
export const dom: (
|
|
121
121
|
window: Window & GlobalThis,
|
|
122
122
|
options?: DomServicesElementParams & { readonly skipRenderScheduling?: boolean }
|
|
123
|
-
) => Layer.Layer<
|
|
123
|
+
) => Layer.Layer<RenderContext | CurrentEnvironment | DomServices> = (window, options) =>
|
|
124
124
|
Layer.provideMerge(
|
|
125
125
|
Layer.mergeAll(
|
|
126
126
|
buildWithCurrentEnvironment(
|
|
@@ -135,11 +135,11 @@ export const dom: (
|
|
|
135
135
|
/**
|
|
136
136
|
* @since 1.0.0
|
|
137
137
|
*/
|
|
138
|
-
export const server: Layer.Layer<
|
|
138
|
+
export const server: Layer.Layer<RenderContext | CurrentEnvironment> = buildWithCurrentEnvironment(
|
|
139
139
|
"server"
|
|
140
140
|
)
|
|
141
141
|
|
|
142
|
-
const static_: Layer.Layer<
|
|
142
|
+
const static_: Layer.Layer<RenderContext | CurrentEnvironment> = buildWithCurrentEnvironment("static")
|
|
143
143
|
|
|
144
144
|
export {
|
|
145
145
|
/**
|
|
@@ -151,7 +151,7 @@ export {
|
|
|
151
151
|
class RenderQueueImpl implements RenderQueue {
|
|
152
152
|
queue = new Map<unknown, () => void>()
|
|
153
153
|
scheduled = false
|
|
154
|
-
run: Effect.Effect<
|
|
154
|
+
run: Effect.Effect<void, never, Scope.Scope>
|
|
155
155
|
|
|
156
156
|
constructor(
|
|
157
157
|
readonly scope: Scope.Scope,
|
|
@@ -196,7 +196,7 @@ class RenderQueueImpl implements RenderQueue {
|
|
|
196
196
|
)
|
|
197
197
|
})
|
|
198
198
|
|
|
199
|
-
runIdle: Effect.Effect<
|
|
199
|
+
runIdle: Effect.Effect<void, never, Scope.Scope> = Effect.suspend(() => {
|
|
200
200
|
return Effect.flatMap(
|
|
201
201
|
Idle.whenIdle(this.options),
|
|
202
202
|
(deadline) =>
|
|
@@ -219,8 +219,8 @@ class RenderQueueImpl implements RenderQueue {
|
|
|
219
219
|
)
|
|
220
220
|
})
|
|
221
221
|
|
|
222
|
-
runAnimationFrame: Effect.Effect<
|
|
223
|
-
Effect.asyncOption<
|
|
222
|
+
runAnimationFrame: Effect.Effect<void, never, Scope.Scope> = Effect.zipRight(
|
|
223
|
+
Effect.asyncOption<void>((cb) => {
|
|
224
224
|
const id = requestAnimationFrame(() => cb(Effect.unit))
|
|
225
225
|
return Option.some(Effect.sync(() => cancelAnimationFrame(id)))
|
|
226
226
|
}),
|
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<
|
|
18
|
-
| Effect<
|
|
19
|
-
| Fx<
|
|
20
|
-
| ReadonlyArray<Renderable<
|
|
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
|
+
| Effect<any, E, R>
|
|
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,32 +42,32 @@ 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<
|
|
47
|
-
readonly interrupt: Effect.Effect<
|
|
45
|
+
readonly errors: RefSubject.Computed<ReadonlyArray<E>>
|
|
46
|
+
readonly lastError: RefSubject.Filtered<E>
|
|
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>
|
|
50
|
-
readonly dispatchEvent: (options: EventOptions) => Effect.Effect<
|
|
51
|
-
readonly click: (options?: Omit<EventOptions, "event">) => Effect.Effect<
|
|
50
|
+
readonly dispatchEvent: (options: EventOptions) => Effect.Effect<void, Cause.NoSuchElementException>
|
|
51
|
+
readonly click: (options?: Omit<EventOptions, "event">) => Effect.Effect<void, Cause.NoSuchElementException>
|
|
52
52
|
}
|
|
53
53
|
|
|
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] }
|
|
62
62
|
): Effect.Effect<
|
|
63
|
-
|
|
63
|
+
TestRender<E>,
|
|
64
64
|
never,
|
|
65
|
-
|
|
65
|
+
Scope.Scope | Exclude<Exclude<R, RenderTemplate>, RenderContext.RenderContext | CurrentEnvironment | DomServices>
|
|
66
66
|
> {
|
|
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,
|
|
@@ -155,7 +155,7 @@ export function click<E>(
|
|
|
155
155
|
|
|
156
156
|
function getOrMakeWindow(
|
|
157
157
|
options?: HappyDOMOptions
|
|
158
|
-
): Effect.Effect<
|
|
158
|
+
): Effect.Effect<Window & GlobalThis, never, Scope.Scope> {
|
|
159
159
|
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
160
160
|
return Effect.gen(function*(_) {
|
|
161
161
|
window.document.head.innerHTML = ""
|
|
@@ -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,
|
package/src/Vitest.ts
CHANGED
|
@@ -24,7 +24,7 @@ export {
|
|
|
24
24
|
*/
|
|
25
25
|
export function it<E, A>(
|
|
26
26
|
name: string,
|
|
27
|
-
test: () => Effect.Effect<
|
|
27
|
+
test: () => Effect.Effect<A, E, Scope>,
|
|
28
28
|
options?: vitest.TestOptions
|
|
29
29
|
) {
|
|
30
30
|
return vitest.it(
|
|
@@ -45,7 +45,7 @@ export function test<E, A>(
|
|
|
45
45
|
name: string,
|
|
46
46
|
test: (options: {
|
|
47
47
|
readonly clock: TestClock.TestClock
|
|
48
|
-
}) => Effect.Effect<Scope | TestServices.TestServices
|
|
48
|
+
}) => Effect.Effect<A, E, Scope | TestServices.TestServices>,
|
|
49
49
|
options?: vitest.TestOptions
|
|
50
50
|
) {
|
|
51
51
|
return vitest.it(
|
|
@@ -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>(
|
|
@@ -16,11 +16,11 @@ export interface EventSource {
|
|
|
16
16
|
handler: Handler<Ev>
|
|
17
17
|
) => void
|
|
18
18
|
|
|
19
|
-
readonly setup: (rendered: Rendered, scope: Scope.Scope) => Effect.Effect<
|
|
19
|
+
readonly setup: (rendered: Rendered, scope: Scope.Scope) => Effect.Effect<void>
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
type Entry = readonly [Element, Handler<any>]
|
|
23
|
-
type Run = <E, A>(effect: Effect.Effect<
|
|
23
|
+
type Run = <E, A>(effect: Effect.Effect<A, E>) => Fiber.RuntimeFiber<A, E>
|
|
24
24
|
|
|
25
25
|
const disposable = (f: () => void): Disposable => ({
|
|
26
26
|
[Symbol.dispose]: f
|
|
@@ -130,7 +130,7 @@ export function makeEventSource(): EventSource {
|
|
|
130
130
|
const disposables: Array<Disposable> = []
|
|
131
131
|
const fibers = new Map<symbol, Fiber.RuntimeFiber<any, any>>()
|
|
132
132
|
const runFork = Runtime.runFork(runtime)
|
|
133
|
-
const run: Run = <E, A>(effect: Effect.Effect<
|
|
133
|
+
const run: Run = <E, A>(effect: Effect.Effect<A, E>) => {
|
|
134
134
|
const id = Symbol()
|
|
135
135
|
const fiber = runFork(Effect.onExit(effect, () => Effect.sync(() => fibers.delete(id))))
|
|
136
136
|
fibers.set(id, fiber)
|
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>())
|
|
@@ -95,13 +91,13 @@ export const hydrateTemplate: (document: Document, ctx: RenderContext) => Render
|
|
|
95
91
|
}
|
|
96
92
|
|
|
97
93
|
// Connect our interpolated values to our template parts
|
|
98
|
-
const effects: Array<Effect.Effect<Scope.Scope | Placeholder.Context<Values[number]
|
|
94
|
+
const effects: Array<Effect.Effect<void, never, Scope.Scope | Placeholder.Context<Values[number]>>> = []
|
|
99
95
|
for (const [part, path] of template.parts) {
|
|
100
96
|
const eff = renderPart2(part, where, path, ctx)
|
|
101
97
|
if (eff !== null) {
|
|
102
98
|
effects.push(
|
|
103
99
|
...(Array.isArray(eff) ? eff : [eff]) as Array<
|
|
104
|
-
Effect.Effect<Scope.Scope | Placeholder.Context<Values[number]
|
|
100
|
+
Effect.Effect<void, never, Scope.Scope | Placeholder.Context<Values[number]>>
|
|
105
101
|
>
|
|
106
102
|
)
|
|
107
103
|
}
|
|
@@ -3,19 +3,15 @@ import * as Effect from "effect/Effect"
|
|
|
3
3
|
import * as Option from "effect/Option"
|
|
4
4
|
|
|
5
5
|
export type IndexRefCounter = {
|
|
6
|
-
release: (index: number) => Effect.Effect<
|
|
7
|
-
wait: Effect.Effect<
|
|
6
|
+
release: (index: number) => Effect.Effect<void>
|
|
7
|
+
wait: Effect.Effect<void>
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
|
-
export function indexRefCounter(expected: number): Effect.Effect<
|
|
14
|
-
|
|
15
|
-
never,
|
|
16
|
-
IndexRefCounter
|
|
17
|
-
> {
|
|
18
|
-
return Effect.map(Deferred.make<never, void>(), (deferred) => {
|
|
13
|
+
export function indexRefCounter(expected: number): Effect.Effect<IndexRefCounter> {
|
|
14
|
+
return Effect.map(Deferred.make<void>(), (deferred) => {
|
|
19
15
|
const done = Deferred.succeed(deferred, undefined)
|
|
20
16
|
const indexes = new Set<number>(Array.from({ length: expected }, (_, i) => i))
|
|
21
17
|
|
|
@@ -37,20 +33,16 @@ export function indexRefCounter(expected: number): Effect.Effect<
|
|
|
37
33
|
}
|
|
38
34
|
|
|
39
35
|
export type IndexRefCounter2 = {
|
|
40
|
-
release: (index: number) => Effect.Effect<
|
|
41
|
-
expect: (count: number) => Effect.Effect<
|
|
42
|
-
wait: Effect.Effect<
|
|
36
|
+
release: (index: number) => Effect.Effect<void>
|
|
37
|
+
expect: (count: number) => Effect.Effect<boolean>
|
|
38
|
+
wait: Effect.Effect<void>
|
|
43
39
|
}
|
|
44
40
|
|
|
45
41
|
/**
|
|
46
42
|
* @internal
|
|
47
43
|
*/
|
|
48
|
-
export function indexRefCounter2(): Effect.Effect<
|
|
49
|
-
|
|
50
|
-
never,
|
|
51
|
-
IndexRefCounter2
|
|
52
|
-
> {
|
|
53
|
-
return Effect.map(Deferred.make<never, void>(), (deferred) => {
|
|
44
|
+
export function indexRefCounter2(): Effect.Effect<IndexRefCounter2> {
|
|
45
|
+
return Effect.map(Deferred.make<void>(), (deferred) => {
|
|
54
46
|
let expected: Option.Option<number> = Option.none<number>()
|
|
55
47
|
const done = Deferred.succeed(deferred, undefined)
|
|
56
48
|
const indexes = new Set<number>()
|
|
@@ -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
|
@@ -33,47 +33,46 @@ import { findHoleComment } from "./utils.js"
|
|
|
33
33
|
|
|
34
34
|
const strictEq = Equivalence.strict<any>()
|
|
35
35
|
|
|
36
|
-
const base = <T extends Part["_tag"]>(tag: T) =>
|
|
37
|
-
|
|
38
|
-
readonly _tag: T = tag
|
|
39
|
-
|
|
40
|
-
constructor(
|
|
41
|
-
readonly index: number,
|
|
42
|
-
readonly commit: (
|
|
43
|
-
params: {
|
|
44
|
-
previous: Extract<Part, { readonly _tag: T }>["value"]
|
|
45
|
-
value: Extract<Part, { readonly _tag: T }>["value"]
|
|
46
|
-
part: Extract<Part, { readonly _tag: T }>
|
|
47
|
-
}
|
|
48
|
-
) => Effect.Effect<Scope, never, void>,
|
|
49
|
-
public value: Extract<Part, { readonly _tag: T }>["value"],
|
|
50
|
-
readonly eq: Equivalence.Equivalence<Extract<Part, { readonly _tag: T }>["value"]> = equals
|
|
51
|
-
) {
|
|
52
|
-
this.update = this.update.bind(this)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
update(input: this["value"]) {
|
|
56
|
-
const previous = this.value as any
|
|
57
|
-
const value = this.getValue(input) as any
|
|
36
|
+
const base = <T extends Part["_tag"]>(tag: T) => (class Base {
|
|
37
|
+
readonly _tag: T = tag
|
|
58
38
|
|
|
59
|
-
|
|
60
|
-
|
|
39
|
+
constructor(
|
|
40
|
+
readonly index: number,
|
|
41
|
+
readonly commit: (
|
|
42
|
+
params: {
|
|
43
|
+
previous: Extract<Part, { readonly _tag: T }>["value"]
|
|
44
|
+
value: Extract<Part, { readonly _tag: T }>["value"]
|
|
45
|
+
part: Extract<Part, { readonly _tag: T }>
|
|
61
46
|
}
|
|
47
|
+
) => Effect.Effect<void, never, Scope>,
|
|
48
|
+
public value: Extract<Part, { readonly _tag: T }>["value"],
|
|
49
|
+
readonly eq: Equivalence.Equivalence<Extract<Part, { readonly _tag: T }>["value"]> = equals
|
|
50
|
+
) {
|
|
51
|
+
this.update = this.update.bind(this)
|
|
52
|
+
}
|
|
62
53
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
value,
|
|
67
|
-
part: this as any
|
|
68
|
-
}),
|
|
69
|
-
() => Effect.sync(() => this.value = value)
|
|
70
|
-
)
|
|
71
|
-
}
|
|
54
|
+
update(input: this["value"]) {
|
|
55
|
+
const previous = this.value as any
|
|
56
|
+
const value = this.getValue(input) as any
|
|
72
57
|
|
|
73
|
-
|
|
74
|
-
return
|
|
58
|
+
if (this.eq(previous as any, value as any)) {
|
|
59
|
+
return Effect.unit
|
|
75
60
|
}
|
|
61
|
+
|
|
62
|
+
return Effect.flatMap(
|
|
63
|
+
this.commit.call(this, {
|
|
64
|
+
previous,
|
|
65
|
+
value,
|
|
66
|
+
part: this as any
|
|
67
|
+
}),
|
|
68
|
+
() => Effect.sync(() => this.value = value)
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
getValue(value: unknown) {
|
|
73
|
+
return value
|
|
76
74
|
}
|
|
75
|
+
})
|
|
77
76
|
|
|
78
77
|
export class AttributePartImpl extends base("attribute") implements AttributePart {
|
|
79
78
|
constructor(
|
|
@@ -295,8 +294,8 @@ export class EventPartImpl implements EventPart {
|
|
|
295
294
|
readonly name: string,
|
|
296
295
|
readonly index: number,
|
|
297
296
|
readonly source: ElementSource<any>,
|
|
298
|
-
readonly onCause: <E>(cause: Cause<E>) => Effect.Effect<
|
|
299
|
-
readonly addEventListener: <Ev extends Event>(handler: EventHandler<
|
|
297
|
+
readonly onCause: <E>(cause: Cause<E>) => Effect.Effect<unknown>,
|
|
298
|
+
readonly addEventListener: <Ev extends Event>(handler: EventHandler<Ev>) => void
|
|
300
299
|
) {
|
|
301
300
|
}
|
|
302
301
|
}
|
|
@@ -489,35 +488,34 @@ function fromKeyValue(name: string, value: unknown): Array<NameValue> {
|
|
|
489
488
|
}
|
|
490
489
|
}
|
|
491
490
|
|
|
492
|
-
const sparse = <T extends SparsePart["_tag"]>(tag: T) =>
|
|
493
|
-
|
|
494
|
-
readonly _tag: T = tag
|
|
495
|
-
|
|
496
|
-
constructor(
|
|
497
|
-
readonly commit: (
|
|
498
|
-
params: {
|
|
499
|
-
previous: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
|
|
500
|
-
value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
|
|
501
|
-
part: Extract<SparsePart, { readonly _tag: T }>
|
|
502
|
-
}
|
|
503
|
-
) => Effect.Effect<Scope, never, void>,
|
|
504
|
-
public value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>,
|
|
505
|
-
readonly eq: Equivalence.Equivalence<SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>> =
|
|
506
|
-
equals
|
|
507
|
-
) {}
|
|
508
|
-
|
|
509
|
-
update = (value: this["value"]) => {
|
|
510
|
-
if (this.eq(this.value as any, value as any)) {
|
|
511
|
-
return Effect.unit
|
|
512
|
-
}
|
|
491
|
+
const sparse = <T extends SparsePart["_tag"]>(tag: T) => (class Base {
|
|
492
|
+
readonly _tag: T = tag
|
|
513
493
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
494
|
+
constructor(
|
|
495
|
+
readonly commit: (
|
|
496
|
+
params: {
|
|
497
|
+
previous: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
|
|
498
|
+
value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
|
|
499
|
+
part: Extract<SparsePart, { readonly _tag: T }>
|
|
500
|
+
}
|
|
501
|
+
) => Effect.Effect<void, never, Scope>,
|
|
502
|
+
public value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>,
|
|
503
|
+
readonly eq: Equivalence.Equivalence<SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>> =
|
|
504
|
+
equals
|
|
505
|
+
) {}
|
|
506
|
+
|
|
507
|
+
update = (value: this["value"]) => {
|
|
508
|
+
if (this.eq(this.value as any, value as any)) {
|
|
509
|
+
return Effect.unit
|
|
519
510
|
}
|
|
511
|
+
|
|
512
|
+
return this.commit({
|
|
513
|
+
previous: this.value,
|
|
514
|
+
value: this.value = value as any,
|
|
515
|
+
part: this
|
|
516
|
+
} as any)
|
|
520
517
|
}
|
|
518
|
+
})
|
|
521
519
|
|
|
522
520
|
type SparseAttributeValues<T extends ReadonlyArray<AttributePart | ClassNamePart | CommentPart | StaticText>> =
|
|
523
521
|
ReadonlyArray<
|