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