@jay-framework/fullstack-component 0.7.0 → 0.9.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/README.md +430 -69
- package/dist/index.d.ts +113 -162
- package/dist/index.js +10 -6
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -10,7 +10,8 @@ The `@jay-framework/fullstack-component` package provides a fluent builder API f
|
|
|
10
10
|
- **Fast Changing Server-side render** with dynamic data on the server
|
|
11
11
|
- **Client-side interactivity** with reactive state management
|
|
12
12
|
- **Type-safe** component contracts using Jay HTML and Jay Contracts
|
|
13
|
-
- **
|
|
13
|
+
- **Service injection** for server-side dependencies (database, API clients, etc.)
|
|
14
|
+
- **Context support** for client-side hierarchical state
|
|
14
15
|
|
|
15
16
|
## Features
|
|
16
17
|
|
|
@@ -18,22 +19,124 @@ The `@jay-framework/fullstack-component` package provides a fluent builder API f
|
|
|
18
19
|
- ⚡ **Interactive Client**: Seamless client-side interactivity with reactive signals
|
|
19
20
|
- 🎯 **Type Safety**: Full TypeScript support with generated contracts from Jay HTML
|
|
20
21
|
- 🔧 **Fluent Builder API**: Intuitive chainable API for component configuration
|
|
21
|
-
-
|
|
22
|
+
- 💉 **Service Injection**: Type-safe dependency injection for server-side services
|
|
23
|
+
- 🌐 **Context Support**: Client-side hierarchical context injection
|
|
22
24
|
- 📦 **URL Parameter Loading**: Built-in support for dynamic URL parameter handling
|
|
23
25
|
- 🚀 **Performance Optimized**: Efficient rendering with partial state updates
|
|
24
26
|
|
|
25
27
|
## Rendering Phases
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
- **Fast Rendering**: Use for dynamic data that can be cached
|
|
29
|
-
- **Partial Renders**: Only update the parts of the view state that change
|
|
30
|
-
- **Carry Forward**: Pass data between render phases to avoid recomputation
|
|
29
|
+
Jay Stack components support three rendering phases, each optimized for different data lifecycles:
|
|
31
30
|
|
|
32
|
-
| Rendering Phase
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
| Fast
|
|
36
|
-
| Interactive
|
|
31
|
+
| Rendering Phase | Rendered Where | When Rendered | Use Case |
|
|
32
|
+
| ------------------ | -------------- | ------------------------------ | --------------------------------- |
|
|
33
|
+
| **Slow (Static)** | SSR | Build time or data change time | Product names, descriptions, SKUs |
|
|
34
|
+
| **Fast (Dynamic)** | SSR | Page serving (per request) | Inventory, pricing, availability |
|
|
35
|
+
| **Interactive** | CSR | User interaction | Cart count, user selections |
|
|
36
|
+
|
|
37
|
+
### Phase-Based Type Validation
|
|
38
|
+
|
|
39
|
+
Jay Stack automatically generates **phase-specific ViewState types** from your contracts, ensuring that each render function can only return properties appropriate for its phase. This prevents accidentally including fast-changing data in slow renders or slow data in fast renders.
|
|
40
|
+
|
|
41
|
+
**Benefits:**
|
|
42
|
+
|
|
43
|
+
- 🛡️ **Compile-time safety**: TypeScript catches phase violations before deployment
|
|
44
|
+
- 📝 **Self-documenting**: The contract explicitly shows which data is static vs dynamic
|
|
45
|
+
- ⚡ **Performance**: Ensures optimal caching and rendering strategies
|
|
46
|
+
- 🎯 **Intent clarity**: Makes data lifecycle explicit in the contract
|
|
47
|
+
|
|
48
|
+
**Example:**
|
|
49
|
+
|
|
50
|
+
````typescript
|
|
51
|
+
// TypeScript automatically knows which properties are valid in each phase
|
|
52
|
+
.withSlowlyRender(async () => {
|
|
53
|
+
return partialRender({
|
|
54
|
+
productName: 'Widget', // ✅ Allowed (slow phase)
|
|
55
|
+
price: 29.99, // ❌ TypeScript Error: Not in SlowViewState
|
|
56
|
+
}, {});
|
|
57
|
+
})
|
|
58
|
+
.withFastRender(async () => {
|
|
59
|
+
return partialRender({
|
|
60
|
+
price: 29.99, // ✅ Allowed (fast phase)
|
|
61
|
+
productName: 'Widget', // ❌ TypeScript Error: Not in FastViewState
|
|
62
|
+
}, {});
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
### Specifying Phases in Contracts
|
|
66
|
+
|
|
67
|
+
You can annotate your contract properties with the `phase` attribute to control when data is rendered:
|
|
68
|
+
|
|
69
|
+
#### Jay HTML Contract
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<html>
|
|
73
|
+
<head>
|
|
74
|
+
<script type="application/yaml-jay">
|
|
75
|
+
data:
|
|
76
|
+
# Static data - rendered at build time
|
|
77
|
+
- {tag: productName, dataType: string, phase: slow}
|
|
78
|
+
- {tag: description, dataType: string, phase: slow}
|
|
79
|
+
- {tag: sku, dataType: string, phase: slow}
|
|
80
|
+
|
|
81
|
+
# Dynamic data - rendered per request
|
|
82
|
+
- {tag: price, dataType: number, phase: fast}
|
|
83
|
+
- {tag: inStock, dataType: boolean, phase: fast}
|
|
84
|
+
|
|
85
|
+
# No phase specified = defaults to 'slow'
|
|
86
|
+
- {tag: category, dataType: string}
|
|
87
|
+
</script>
|
|
88
|
+
</head>
|
|
89
|
+
<body>
|
|
90
|
+
<div>
|
|
91
|
+
<h1>{productName}</h1>
|
|
92
|
+
<p>{description}</p>
|
|
93
|
+
<p>Price: ${price}</p>
|
|
94
|
+
</div>
|
|
95
|
+
</body>
|
|
96
|
+
</html>
|
|
97
|
+
````
|
|
98
|
+
|
|
99
|
+
#### Jay Contract (Headless)
|
|
100
|
+
|
|
101
|
+
```yaml
|
|
102
|
+
name: product-contract
|
|
103
|
+
tags:
|
|
104
|
+
# Static product information
|
|
105
|
+
- tag: productName
|
|
106
|
+
dataType: string
|
|
107
|
+
phase: slow
|
|
108
|
+
|
|
109
|
+
- tag: description
|
|
110
|
+
dataType: string
|
|
111
|
+
phase: slow
|
|
112
|
+
|
|
113
|
+
- tag: sku
|
|
114
|
+
dataType: string
|
|
115
|
+
phase: slow
|
|
116
|
+
|
|
117
|
+
# Dynamic pricing and availability
|
|
118
|
+
- tag: price
|
|
119
|
+
dataType: number
|
|
120
|
+
phase: fast
|
|
121
|
+
|
|
122
|
+
- tag: inStock
|
|
123
|
+
dataType: boolean
|
|
124
|
+
phase: fast
|
|
125
|
+
|
|
126
|
+
# Interactive elements go in refs, not data
|
|
127
|
+
interactive:
|
|
128
|
+
- tag: addToCartButton
|
|
129
|
+
elementType: [button]
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Phase Rules:**
|
|
133
|
+
|
|
134
|
+
- `slow`: Value is set at build time (default if not specified)
|
|
135
|
+
- `fast`: Value is set at request time
|
|
136
|
+
- `fast+interactive`: Value is set at request time and can be modified on the client
|
|
137
|
+
- `interactive` tags are implicitly `fast+interactive` and go into the `Refs` type, not `ViewState`
|
|
138
|
+
- For nested objects, the parent's phase serves as the default for children
|
|
139
|
+
- Array children cannot have an earlier phase than their parent array
|
|
37
140
|
|
|
38
141
|
## Installation
|
|
39
142
|
|
|
@@ -55,12 +158,15 @@ For headless components, create a Jay Contract file (`my-contract.jay-contract`)
|
|
|
55
158
|
<head>
|
|
56
159
|
<script type="application/yaml-jay">
|
|
57
160
|
data:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
161
|
+
# User profile data - slow changing
|
|
162
|
+
- {tag: id, dataType: string, phase: slow}
|
|
163
|
+
- {tag: name, dataType: string, phase: slow}
|
|
164
|
+
- {tag: age, dataType: number, phase: slow}
|
|
165
|
+
- {tag: address, dataType: string, phase: slow}
|
|
166
|
+
|
|
167
|
+
# User ratings - fast changing
|
|
168
|
+
- {tag: stars, dataType: number, phase: fast}
|
|
169
|
+
- {tag: rating, dataType: number, phase: fast}
|
|
64
170
|
</script>
|
|
65
171
|
</head>
|
|
66
172
|
<body>
|
|
@@ -82,18 +188,31 @@ For headless components, create a Jay Contract file (`my-contract.jay-contract`)
|
|
|
82
188
|
```yaml
|
|
83
189
|
name: my-contract
|
|
84
190
|
tags:
|
|
191
|
+
# User profile data - slow changing
|
|
85
192
|
- tag: id
|
|
86
193
|
dataType: string
|
|
194
|
+
phase: slow
|
|
195
|
+
|
|
87
196
|
- tag: name
|
|
88
197
|
dataType: string
|
|
198
|
+
phase: slow
|
|
199
|
+
|
|
89
200
|
- tag: age
|
|
90
201
|
dataType: number
|
|
202
|
+
phase: slow
|
|
203
|
+
|
|
91
204
|
- tag: address
|
|
92
205
|
dataType: string
|
|
206
|
+
phase: slow
|
|
207
|
+
|
|
208
|
+
# User ratings - fast changing
|
|
93
209
|
- tag: stars
|
|
94
210
|
dataType: number
|
|
211
|
+
phase: fast
|
|
212
|
+
|
|
95
213
|
- tag: rating
|
|
96
214
|
dataType: number
|
|
215
|
+
phase: fast
|
|
97
216
|
```
|
|
98
217
|
|
|
99
218
|
### 2. Generate Definition Files
|
|
@@ -104,51 +223,104 @@ Run the Jay CLI to generate TypeScript definition files from your Jay HTML or co
|
|
|
104
223
|
jay-cli definitions <path to your sources>
|
|
105
224
|
```
|
|
106
225
|
|
|
226
|
+
This will generate a `.d.ts` file with:
|
|
227
|
+
|
|
228
|
+
- **Full ViewState**: All properties from your contract
|
|
229
|
+
- **Phase-specific ViewStates**: Separate types for `Slow`, `Fast`, and `Interactive` phases
|
|
230
|
+
- **Contract type**: A `JayContract` type that includes all ViewState types
|
|
231
|
+
|
|
232
|
+
**Generated Types Example** (`my-component.jay-html.d.ts`):
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { JayContract } from '@jay-framework/fullstack-component';
|
|
236
|
+
|
|
237
|
+
// Full ViewState - all properties
|
|
238
|
+
export interface MyComponentViewState {
|
|
239
|
+
id: string;
|
|
240
|
+
name: string;
|
|
241
|
+
age: number;
|
|
242
|
+
address: string;
|
|
243
|
+
stars: number;
|
|
244
|
+
rating: number;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export interface MyComponentElementRefs {}
|
|
248
|
+
|
|
249
|
+
// Phase-specific ViewStates (automatically generated)
|
|
250
|
+
export type MyComponentSlowViewState = Pick<
|
|
251
|
+
MyComponentViewState,
|
|
252
|
+
'id' | 'name' | 'age' | 'address'
|
|
253
|
+
>;
|
|
254
|
+
export type MyComponentFastViewState = Pick<MyComponentViewState, 'stars' | 'rating'>;
|
|
255
|
+
export type MyComponentInteractiveViewState = {};
|
|
256
|
+
|
|
257
|
+
// Contract type with all ViewState types
|
|
258
|
+
export type MyComponentContract = JayContract<
|
|
259
|
+
MyComponentViewState,
|
|
260
|
+
MyComponentElementRefs,
|
|
261
|
+
MyComponentSlowViewState,
|
|
262
|
+
MyComponentFastViewState,
|
|
263
|
+
MyComponentInteractiveViewState
|
|
264
|
+
>;
|
|
265
|
+
```
|
|
266
|
+
|
|
107
267
|
### 3. Build Your Full-Stack Component
|
|
108
268
|
|
|
109
269
|
```typescript
|
|
110
270
|
import { MyComponentContract } from './my-component.jay-html';
|
|
111
271
|
// or import { MyComponentContract } from './my-component.jay-contract';
|
|
112
|
-
import {
|
|
272
|
+
import {
|
|
273
|
+
makeJayStackComponent,
|
|
274
|
+
partialRender,
|
|
275
|
+
createJayService,
|
|
276
|
+
} from '@jay-framework/fullstack-component';
|
|
113
277
|
import { createJayContext } from '@jay-framework/runtime';
|
|
114
278
|
|
|
115
|
-
// Define your props
|
|
279
|
+
// Define your props
|
|
116
280
|
interface MyComponentProps {}
|
|
117
281
|
|
|
118
|
-
|
|
119
|
-
|
|
282
|
+
// Define services (server-side)
|
|
283
|
+
interface DatabaseService {
|
|
284
|
+
getUser(id: string): Promise<User>;
|
|
120
285
|
}
|
|
286
|
+
const DATABASE_SERVICE = createJayService<DatabaseService>('Database');
|
|
121
287
|
|
|
122
|
-
|
|
288
|
+
// Define contexts (client-side)
|
|
289
|
+
interface ThemeContext {
|
|
290
|
+
theme: string;
|
|
291
|
+
}
|
|
292
|
+
const ThemeContextMarker = createJayContext<ThemeContext>();
|
|
123
293
|
|
|
124
294
|
// Create the full-stack component
|
|
125
295
|
export const myComponent = makeJayStackComponent<MyComponentContract>()
|
|
126
296
|
.withProps<MyComponentProps>()
|
|
127
|
-
.
|
|
128
|
-
.
|
|
297
|
+
.withServices(DATABASE_SERVICE)
|
|
298
|
+
.withContexts(ThemeContextMarker)
|
|
299
|
+
.withSlowlyRender(async (props, database) => {
|
|
129
300
|
// Slow rendering - static data that doesn't change often
|
|
301
|
+
const user = await database.getUser('1');
|
|
130
302
|
return partialRender(
|
|
131
303
|
{
|
|
132
|
-
id:
|
|
133
|
-
name:
|
|
134
|
-
age:
|
|
135
|
-
address:
|
|
304
|
+
id: user.id,
|
|
305
|
+
name: user.name,
|
|
306
|
+
age: user.age,
|
|
307
|
+
address: user.address,
|
|
136
308
|
},
|
|
137
|
-
{ id:
|
|
309
|
+
{ id: user.id }, // Carry forward data to fast render
|
|
138
310
|
);
|
|
139
311
|
})
|
|
140
|
-
.withFastRender(async (props,
|
|
312
|
+
.withFastRender(async (props, carryForward) => {
|
|
141
313
|
// Fast rendering - dynamic data that can change
|
|
142
314
|
return partialRender(
|
|
143
315
|
{
|
|
144
316
|
stars: 4.5,
|
|
145
317
|
rating: 92,
|
|
146
318
|
},
|
|
147
|
-
{ id:
|
|
319
|
+
{ id: carryForward.id }, // Carry forward data to interactive
|
|
148
320
|
);
|
|
149
321
|
})
|
|
150
|
-
.withInteractive((props, refs) => {
|
|
151
|
-
// Client-side interactivity
|
|
322
|
+
.withInteractive((props, refs, theme) => {
|
|
323
|
+
// Client-side interactivity with context
|
|
152
324
|
return {
|
|
153
325
|
render: () => ({
|
|
154
326
|
stars: 4.5,
|
|
@@ -181,28 +353,42 @@ Full-stack components that are Jay Stack pages use `PageProps` as the props.
|
|
|
181
353
|
makeJayStackComponent<MyComponentContract>().withProps<{ userId: string }>();
|
|
182
354
|
```
|
|
183
355
|
|
|
184
|
-
#### `.
|
|
356
|
+
#### `.withServices(...serviceMarkers)`
|
|
185
357
|
|
|
186
|
-
Adds server-side
|
|
358
|
+
Adds server-side service markers for dependency injection.
|
|
187
359
|
|
|
188
360
|
```typescript
|
|
189
|
-
|
|
361
|
+
import { createJayService } from '@jay-framework/fullstack-component';
|
|
362
|
+
|
|
363
|
+
const DATABASE_SERVICE = createJayService<Database>('Database');
|
|
364
|
+
const AUTH_SERVICE = createJayService<AuthService>('Auth');
|
|
365
|
+
|
|
366
|
+
makeJayStackComponent<MyComponentContract>().withServices(DATABASE_SERVICE, AUTH_SERVICE);
|
|
190
367
|
```
|
|
191
368
|
|
|
192
|
-
|
|
369
|
+
Services are global singletons registered in `src/jay.init.ts`.
|
|
370
|
+
|
|
371
|
+
#### `.withContexts(...contextMarkers)`
|
|
193
372
|
|
|
194
373
|
Adds client-side context markers for dependency injection.
|
|
195
374
|
|
|
196
375
|
```typescript
|
|
197
|
-
|
|
376
|
+
import { createJayContext } from '@jay-framework/runtime';
|
|
377
|
+
|
|
378
|
+
const ThemeContext = createJayContext<Theme>();
|
|
379
|
+
const UserContext = createJayContext<User>();
|
|
380
|
+
|
|
381
|
+
makeJayStackComponent<MyComponentContract>().withContexts(ThemeContext, UserContext);
|
|
198
382
|
```
|
|
199
383
|
|
|
384
|
+
Contexts are hierarchical and reactive, provided by parent components using `provideContext` or `provideReactiveContext`.
|
|
385
|
+
|
|
200
386
|
#### `.withLoadParams(loadParams)`
|
|
201
387
|
|
|
202
388
|
Defines how URL parameters are loaded and converted to additional props,
|
|
203
389
|
on top of the props defined in `withProps`.
|
|
204
390
|
|
|
205
|
-
The function receives the
|
|
391
|
+
The function receives the services declared using `withServices`.
|
|
206
392
|
|
|
207
393
|
The function should return a generator that yields arrays of a subtype of `UrlParams`.
|
|
208
394
|
|
|
@@ -211,11 +397,12 @@ interface IdParams extends UrlParams {
|
|
|
211
397
|
id: string;
|
|
212
398
|
}
|
|
213
399
|
|
|
214
|
-
makeJayStackComponent<MyComponentContract>()
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
);
|
|
400
|
+
makeJayStackComponent<MyComponentContract>()
|
|
401
|
+
.withServices(DATABASE_SERVICE)
|
|
402
|
+
.withLoadParams(async function* (database: Database): AsyncIterable<IdParams[]> {
|
|
403
|
+
const items = await database.getAllItems();
|
|
404
|
+
yield items.map((item) => ({ id: item.id }));
|
|
405
|
+
});
|
|
219
406
|
```
|
|
220
407
|
|
|
221
408
|
#### `.withSlowlyRender(slowlyRender)`
|
|
@@ -225,37 +412,65 @@ Defines the slow rendering function for semi-static data.
|
|
|
225
412
|
The function's `props` parameter is a composition of the props from `.withProps`,
|
|
226
413
|
with the subtype of `UrlParams` if using `.withLoadParams`.
|
|
227
414
|
|
|
415
|
+
After props, the function receives the services declared using `withServices`.
|
|
416
|
+
|
|
228
417
|
The function should return one of:
|
|
229
418
|
|
|
230
|
-
- `PartialRender<
|
|
419
|
+
- `PartialRender<SlowViewState, CarryForward>` - for partial rendering
|
|
231
420
|
- `ServerError5xx` - for server errors
|
|
232
421
|
- `Redirect3xx` - for semi-static redirects
|
|
233
422
|
|
|
423
|
+
**Type Safety:** TypeScript automatically validates that `partialRender` only receives properties from `SlowViewState` (as defined by `phase: slow` in your contract).
|
|
424
|
+
|
|
234
425
|
```typescript
|
|
235
|
-
makeJayStackComponent<MyComponentContract>()
|
|
236
|
-
|
|
237
|
-
|
|
426
|
+
makeJayStackComponent<MyComponentContract>()
|
|
427
|
+
.withServices(DATABASE_SERVICE)
|
|
428
|
+
.withSlowlyRender(async (props, database: Database) => {
|
|
429
|
+
const data = await database.getData();
|
|
430
|
+
return partialRender(
|
|
431
|
+
{
|
|
432
|
+
productName: data.name, // ✅ OK if phase: slow
|
|
433
|
+
// price: data.price, // ❌ TypeScript error if phase: fast
|
|
434
|
+
},
|
|
435
|
+
{ carryForwardKey: data.id },
|
|
436
|
+
);
|
|
437
|
+
});
|
|
238
438
|
```
|
|
239
439
|
|
|
240
440
|
#### `.withFastRender(fastRender)`
|
|
241
441
|
|
|
242
442
|
Defines the fast rendering function for dynamic data.
|
|
243
443
|
|
|
244
|
-
The function's `props`
|
|
245
|
-
with the subtype of `UrlParams` if using `.withLoadParams
|
|
246
|
-
|
|
444
|
+
The function's first parameter is `props` - a composition of the props from `.withProps`
|
|
445
|
+
with the subtype of `UrlParams` if using `.withLoadParams`.
|
|
446
|
+
|
|
447
|
+
The second parameter is `carryForward` from `.withSlowlyRender` if used.
|
|
448
|
+
|
|
449
|
+
After that, the function receives the services declared using `withServices`.
|
|
247
450
|
|
|
248
451
|
The function should return one of:
|
|
249
452
|
|
|
250
|
-
- `PartialRender<
|
|
453
|
+
- `PartialRender<FastViewState, CarryForward>` - for partial rendering
|
|
251
454
|
- `ServerError5xx` - for server errors
|
|
252
455
|
- `ClientError4xx` - for client errors
|
|
253
456
|
- `Redirect3xx` - for dynamic redirects
|
|
254
457
|
|
|
458
|
+
**Type Safety:** TypeScript automatically validates that `partialRender` only receives properties from `FastViewState` (as defined by `phase: fast` in your contract).
|
|
459
|
+
|
|
255
460
|
```typescript
|
|
256
|
-
makeJayStackComponent<MyComponentContract>()
|
|
257
|
-
|
|
258
|
-
|
|
461
|
+
makeJayStackComponent<MyComponentContract>()
|
|
462
|
+
.withServices(INVENTORY_SERVICE)
|
|
463
|
+
.withFastRender(async (props, carryForward, inventory: InventoryService) => {
|
|
464
|
+
const status = await inventory.getStatus(carryForward.productId);
|
|
465
|
+
return partialRender(
|
|
466
|
+
{
|
|
467
|
+
inStock: status.available > 0, // ✅ OK if phase: fast
|
|
468
|
+
price: 29.99, // ✅ OK if phase: fast
|
|
469
|
+
// productName: 'Widget', // ❌ TypeScript error if phase: slow
|
|
470
|
+
},
|
|
471
|
+
{ carryForwardKey: 'data' },
|
|
472
|
+
);
|
|
473
|
+
});
|
|
259
474
|
```
|
|
260
475
|
|
|
261
476
|
#### `.withInteractive(componentConstructor)`
|
|
@@ -267,14 +482,18 @@ The function's `props` parameter is a composition of the props from `.withProps`
|
|
|
267
482
|
with the subtype of `UrlParams` if using `.withLoadParams`,
|
|
268
483
|
with the `carryForward` from `.withFastRender` if used.
|
|
269
484
|
|
|
485
|
+
After props and refs, the function receives the client-side contexts declared using `withContexts`.
|
|
486
|
+
|
|
270
487
|
The function is expected to return an object with a reactive `render` function as well as the client component API.
|
|
271
488
|
|
|
272
489
|
```typescript
|
|
273
|
-
makeJayStackComponent<MyComponentContract>()
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
})
|
|
490
|
+
makeJayStackComponent<MyComponentContract>()
|
|
491
|
+
.withContexts(ThemeContext)
|
|
492
|
+
.withInteractive((props, refs, theme: Theme) => {
|
|
493
|
+
return {
|
|
494
|
+
render: () => ({ interactiveData: 'value', currentTheme: theme.current }),
|
|
495
|
+
};
|
|
496
|
+
});
|
|
278
497
|
```
|
|
279
498
|
|
|
280
499
|
## Render Response Builders
|
|
@@ -313,6 +532,139 @@ Creates a redirect response.
|
|
|
313
532
|
return redirect3xx(301, 'http://some.domain.com');
|
|
314
533
|
```
|
|
315
534
|
|
|
535
|
+
## Complete Example with Phase Validation
|
|
536
|
+
|
|
537
|
+
Here's a complete example showing how phase annotations in your contract provide compile-time type safety:
|
|
538
|
+
|
|
539
|
+
### 1. Define Contract with Phases
|
|
540
|
+
|
|
541
|
+
**`user-profile.jay-html`**:
|
|
542
|
+
|
|
543
|
+
```html
|
|
544
|
+
<html>
|
|
545
|
+
<head>
|
|
546
|
+
<script type="application/yaml-jay">
|
|
547
|
+
data:
|
|
548
|
+
# Static user info - rendered at build time
|
|
549
|
+
- {tag: userId, dataType: string, phase: slow}
|
|
550
|
+
- {tag: username, dataType: string, phase: slow}
|
|
551
|
+
- {tag: bio, dataType: string, phase: slow}
|
|
552
|
+
|
|
553
|
+
# Dynamic activity - rendered per request
|
|
554
|
+
- {tag: lastSeen, dataType: string, phase: fast}
|
|
555
|
+
- {tag: isOnline, dataType: boolean, phase: fast}
|
|
556
|
+
- {tag: followerCount, dataType: number, phase: fast}
|
|
557
|
+
</script>
|
|
558
|
+
</head>
|
|
559
|
+
<body>
|
|
560
|
+
<div>
|
|
561
|
+
<h1>{username}</h1>
|
|
562
|
+
<p>{bio}</p>
|
|
563
|
+
<p>Followers: {followerCount}</p>
|
|
564
|
+
<span>{isOnline ? 'Online' : 'Last seen: ' + lastSeen}</span>
|
|
565
|
+
</div>
|
|
566
|
+
</body>
|
|
567
|
+
</html>
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### 2. Generated Types
|
|
571
|
+
|
|
572
|
+
**`user-profile.jay-html.d.ts`** (auto-generated):
|
|
573
|
+
|
|
574
|
+
```typescript
|
|
575
|
+
export interface UserProfileViewState {
|
|
576
|
+
userId: string;
|
|
577
|
+
username: string;
|
|
578
|
+
bio: string;
|
|
579
|
+
lastSeen: string;
|
|
580
|
+
isOnline: boolean;
|
|
581
|
+
followerCount: number;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
export interface UserProfileElementRefs {}
|
|
585
|
+
|
|
586
|
+
// Phase-specific types - automatically generated
|
|
587
|
+
export type UserProfileSlowViewState = Pick<UserProfileViewState, 'userId' | 'username' | 'bio'>;
|
|
588
|
+
export type UserProfileFastViewState = Pick<
|
|
589
|
+
UserProfileViewState,
|
|
590
|
+
'lastSeen' | 'isOnline' | 'followerCount'
|
|
591
|
+
>;
|
|
592
|
+
export type UserProfileInteractiveViewState = {};
|
|
593
|
+
|
|
594
|
+
export type UserProfileContract = JayContract<
|
|
595
|
+
UserProfileViewState,
|
|
596
|
+
UserProfileElementRefs,
|
|
597
|
+
UserProfileSlowViewState,
|
|
598
|
+
UserProfileFastViewState,
|
|
599
|
+
UserProfileInteractiveViewState
|
|
600
|
+
>;
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### 3. Implement with Type Safety
|
|
604
|
+
|
|
605
|
+
```typescript
|
|
606
|
+
import {
|
|
607
|
+
makeJayStackComponent,
|
|
608
|
+
partialRender,
|
|
609
|
+
createJayService,
|
|
610
|
+
} from '@jay-framework/fullstack-component';
|
|
611
|
+
import { UserProfileContract } from './user-profile.jay-html';
|
|
612
|
+
|
|
613
|
+
interface UserDatabase {
|
|
614
|
+
getUser(id: string): Promise<{ id: string; name: string; bio: string }>;
|
|
615
|
+
}
|
|
616
|
+
const USER_DB = createJayService<UserDatabase>('UserDB');
|
|
617
|
+
|
|
618
|
+
interface ActivityService {
|
|
619
|
+
getUserActivity(id: string): Promise<{ lastSeen: string; isOnline: boolean; followers: number }>;
|
|
620
|
+
}
|
|
621
|
+
const ACTIVITY_SERVICE = createJayService<ActivityService>('Activity');
|
|
622
|
+
|
|
623
|
+
export const userProfile = makeJayStackComponent<UserProfileContract>()
|
|
624
|
+
.withProps()
|
|
625
|
+
.withServices(USER_DB, ACTIVITY_SERVICE)
|
|
626
|
+
.withSlowlyRender(async (props, userDb) => {
|
|
627
|
+
// ✅ TypeScript knows only slow properties are allowed
|
|
628
|
+
const user = await userDb.getUser('123');
|
|
629
|
+
return partialRender(
|
|
630
|
+
{
|
|
631
|
+
userId: user.id,
|
|
632
|
+
username: user.name,
|
|
633
|
+
bio: user.bio,
|
|
634
|
+
// followerCount: 100, // ❌ TypeScript Error: Property 'followerCount'
|
|
635
|
+
// does not exist in type 'UserProfileSlowViewState'
|
|
636
|
+
},
|
|
637
|
+
{ userId: user.id },
|
|
638
|
+
);
|
|
639
|
+
})
|
|
640
|
+
.withFastRender(async (props, carryForward, userDb, activityService) => {
|
|
641
|
+
// ✅ TypeScript knows only fast properties are allowed
|
|
642
|
+
const activity = await activityService.getUserActivity(carryForward.userId);
|
|
643
|
+
return partialRender(
|
|
644
|
+
{
|
|
645
|
+
lastSeen: activity.lastSeen,
|
|
646
|
+
isOnline: activity.isOnline,
|
|
647
|
+
followerCount: activity.followers,
|
|
648
|
+
// username: 'John', // ❌ TypeScript Error: Property 'username'
|
|
649
|
+
// does not exist in type 'UserProfileFastViewState'
|
|
650
|
+
},
|
|
651
|
+
{},
|
|
652
|
+
);
|
|
653
|
+
})
|
|
654
|
+
.withInteractive((props, refs) => {
|
|
655
|
+
return {
|
|
656
|
+
render: () => ({}),
|
|
657
|
+
};
|
|
658
|
+
});
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
**Key Benefits:**
|
|
662
|
+
|
|
663
|
+
- 🔒 **Compile-time guarantees**: TypeScript prevents phase violations before deployment
|
|
664
|
+
- 📊 **Clear separation**: Slow (static) data is visually separated from fast (dynamic) data
|
|
665
|
+
- ⚡ **Optimal performance**: Framework can cache slow data aggressively
|
|
666
|
+
- 🧹 **No boilerplate**: No manual type annotations needed in render functions
|
|
667
|
+
|
|
316
668
|
## Advanced Examples
|
|
317
669
|
|
|
318
670
|
### A Product Page with URL Parameters
|
|
@@ -323,11 +675,12 @@ import {
|
|
|
323
675
|
PageProps,
|
|
324
676
|
partialRender,
|
|
325
677
|
UrlParams,
|
|
678
|
+
createJayService,
|
|
326
679
|
} from '@jay-framework/fullstack-component';
|
|
327
680
|
import { render, PageElementRefs } from './page.jay-html';
|
|
328
681
|
import { Props } from '@jay-framework/component';
|
|
329
|
-
import {
|
|
330
|
-
import {
|
|
682
|
+
import { PRODUCTS_DATABASE_SERVICE, ProductsDatabase } from '../../../services/products-database';
|
|
683
|
+
import { INVENTORY_SERVICE, InventoryService } from '../../../services/inventory';
|
|
331
684
|
|
|
332
685
|
interface ProductPageParams extends UrlParams {
|
|
333
686
|
slug: string;
|
|
@@ -342,23 +695,30 @@ interface ProductAndInventoryCarryForward {
|
|
|
342
695
|
inStock: boolean;
|
|
343
696
|
}
|
|
344
697
|
|
|
345
|
-
async function* urlLoader(): AsyncIterable<ProductPageParams[]> {
|
|
346
|
-
const products = await
|
|
698
|
+
async function* urlLoader(productsDb: ProductsDatabase): AsyncIterable<ProductPageParams[]> {
|
|
699
|
+
const products = await productsDb.getAllProducts();
|
|
347
700
|
yield products.map(({ slug }) => ({ slug }));
|
|
348
701
|
}
|
|
349
702
|
|
|
350
|
-
async function renderSlowlyChanging(
|
|
351
|
-
|
|
703
|
+
async function renderSlowlyChanging(
|
|
704
|
+
props: PageProps & ProductPageParams,
|
|
705
|
+
productsDb: ProductsDatabase,
|
|
706
|
+
) {
|
|
707
|
+
const { name, sku, price, id } = await productsDb.getProductBySlug(props.slug);
|
|
352
708
|
return partialRender({ name, sku, price, id }, { productId: id });
|
|
353
709
|
}
|
|
354
710
|
|
|
355
|
-
async function renderFastChanging(
|
|
356
|
-
|
|
711
|
+
async function renderFastChanging(
|
|
712
|
+
props: PageProps & ProductPageParams,
|
|
713
|
+
carryForward: ProductsCarryForward,
|
|
714
|
+
inventory: InventoryService,
|
|
715
|
+
) {
|
|
716
|
+
const availableProducts = await inventory.getAvailableUnits(carryForward.productId);
|
|
357
717
|
const inStock = availableProducts > 0;
|
|
358
718
|
return partialRender(
|
|
359
719
|
{ inStock },
|
|
360
720
|
{
|
|
361
|
-
productId:
|
|
721
|
+
productId: carryForward.productId,
|
|
362
722
|
inStock,
|
|
363
723
|
},
|
|
364
724
|
);
|
|
@@ -375,6 +735,7 @@ function ProductsPageConstructor(
|
|
|
375
735
|
|
|
376
736
|
export const page = makeJayStackComponent<typeof render>()
|
|
377
737
|
.withProps<PageProps>()
|
|
738
|
+
.withServices(PRODUCTS_DATABASE_SERVICE, INVENTORY_SERVICE)
|
|
378
739
|
.withLoadParams(urlLoader)
|
|
379
740
|
.withSlowlyRender(renderSlowlyChanging)
|
|
380
741
|
.withFastRender(renderFastChanging)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,35 @@
|
|
|
1
1
|
import { JayComponentCore, ContextMarkers, ComponentConstructor } from '@jay-framework/component';
|
|
2
|
-
import { JayContract,
|
|
2
|
+
import { JayContract, ExtractRefs, ExtractSlowViewState, ExtractFastViewState, ExtractInteractiveViewState } from '@jay-framework/runtime';
|
|
3
|
+
export { ExtractFastViewState, ExtractInteractiveViewState, ExtractRefs, ExtractSlowViewState, ExtractViewState, JayContract } from '@jay-framework/runtime';
|
|
3
4
|
import { Getter, Setter } from '@jay-framework/reactive';
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* A type-safe marker for identifying a service.
|
|
8
|
+
* Similar to ContextMarker but for server-side services.
|
|
9
|
+
*/
|
|
10
|
+
interface ServiceMarker<ServiceType> {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Creates a service marker used to register and retrieve services.
|
|
14
|
+
*
|
|
15
|
+
* @param name - Optional name for the service (used in error messages)
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* export interface DatabaseService {
|
|
20
|
+
* query<T>(sql: string): Promise<T[]>;
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* export const DATABASE_SERVICE = createJayService<DatabaseService>('DatabaseService');
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function createJayService<ServiceType = unknown>(name?: string): ServiceMarker<ServiceType>;
|
|
27
|
+
/**
|
|
28
|
+
* Type helper for extracting service types from an array of markers.
|
|
29
|
+
*/
|
|
30
|
+
type ServiceMarkers<T extends any[]> = {
|
|
31
|
+
[K in keyof T]: ServiceMarker<T[K]>;
|
|
32
|
+
};
|
|
5
33
|
interface PageProps {
|
|
6
34
|
language: string;
|
|
7
35
|
url: string;
|
|
@@ -22,190 +50,113 @@ interface Redirect3xx {
|
|
|
22
50
|
}
|
|
23
51
|
interface PartialRender<ViewState extends object, CarryForward> {
|
|
24
52
|
kind: 'PartialRender';
|
|
25
|
-
rendered:
|
|
53
|
+
rendered: ViewState;
|
|
26
54
|
carryForward: CarryForward;
|
|
27
55
|
}
|
|
28
56
|
type SlowlyRenderResult<ViewState extends object, CarryForward> = PartialRender<ViewState, CarryForward> | ServerError5xx | ClientError4xx | Redirect3xx;
|
|
29
57
|
type AnySlowlyRenderResult = SlowlyRenderResult<object, object>;
|
|
30
58
|
type FastRenderResult<ViewState extends object, CarryForward> = PartialRender<ViewState, CarryForward> | ServerError5xx | ClientError4xx | Redirect3xx;
|
|
31
59
|
type AnyFastRenderResult = FastRenderResult<object, object>;
|
|
32
|
-
type LoadParams<
|
|
33
|
-
type RenderSlowly<
|
|
34
|
-
type RenderFast<
|
|
35
|
-
interface JayStackComponentDefinition<
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
loadParams: LoadParams<
|
|
39
|
-
slowlyRender: RenderSlowly<
|
|
40
|
-
fastRender: RenderFast<
|
|
41
|
-
comp: ComponentConstructor<PropsT, Refs,
|
|
60
|
+
type LoadParams<Services, Params extends UrlParams> = (contexts: Services) => AsyncIterable<Params[]>;
|
|
61
|
+
type RenderSlowly<Services extends Array<object>, PropsT extends object, SlowViewState extends object, SlowlyCarryForward> = (props: PropsT, ...services: Services) => Promise<SlowlyRenderResult<SlowViewState, SlowlyCarryForward>>;
|
|
62
|
+
type RenderFast<Services extends Array<object>, PropsT extends object, FastViewState extends object, FastCarryForward> = (props: PropsT, ...services: Services) => Promise<FastRenderResult<FastViewState, FastCarryForward>>;
|
|
63
|
+
interface JayStackComponentDefinition<Refs extends object, SlowVS extends object, FastVS extends object, InteractiveVS extends object, Services extends Array<any>, Contexts extends Array<any>, PropsT extends object, Params extends UrlParams, CompCore extends JayComponentCore<PropsT, InteractiveVS>> {
|
|
64
|
+
services: ServiceMarkers<Services>;
|
|
65
|
+
contexts: ContextMarkers<Contexts>;
|
|
66
|
+
loadParams: LoadParams<Services, Params>;
|
|
67
|
+
slowlyRender: RenderSlowly<Services, PropsT, SlowVS, any>;
|
|
68
|
+
fastRender: RenderFast<Services, PropsT, FastVS, any>;
|
|
69
|
+
comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>;
|
|
42
70
|
}
|
|
43
|
-
type AnyJayStackComponentDefinition = JayStackComponentDefinition<object, object, object, object[], object[], object, UrlParams, any>;
|
|
71
|
+
type AnyJayStackComponentDefinition = JayStackComponentDefinition<object, object, object, object, object[], object[], object, UrlParams, any>;
|
|
44
72
|
|
|
45
73
|
declare function serverError5xx(status: number): ServerError5xx;
|
|
46
74
|
declare function clientError4xx(status: number): ClientError4xx;
|
|
47
75
|
declare function notFound(): ClientError4xx;
|
|
48
76
|
declare function redirect3xx(status: number, location: string): Redirect3xx;
|
|
49
|
-
declare function partialRender<ViewState extends object, CarryForward>(rendered:
|
|
77
|
+
declare function partialRender<ViewState extends object, CarryForward>(rendered: ViewState, carryForward: CarryForward): PartialRender<ViewState, CarryForward>;
|
|
50
78
|
|
|
51
|
-
type BuilderStates = 'Props' | '
|
|
79
|
+
type BuilderStates = 'Props' | 'Services' | 'Contexts' | 'UrlLoader' | 'SlowlyRender' | 'FastRender' | 'InteractiveRender' | 'Done';
|
|
52
80
|
type Signals<T extends object> = {
|
|
53
81
|
[K in keyof T]: K extends string ? [Getter<T[K]>, Setter<T[K]>] : T[K];
|
|
54
82
|
};
|
|
55
|
-
type Builder<State extends BuilderStates,
|
|
56
|
-
withProps<NewPropsT extends object>(): Builder<'
|
|
57
|
-
} : State extends '
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
withLoadParams<NewParams extends UrlParams>(loadParams: LoadParams<
|
|
61
|
-
withSlowlyRender<
|
|
83
|
+
type Builder<State extends BuilderStates, Refs extends object, SlowVS extends object, FastVS extends object, InteractiveVS extends object, Services extends Array<any>, Contexts extends Array<any>, PropsT extends object, Params extends UrlParams, CompCore extends JayComponentCore<PropsT, InteractiveVS>> = State extends 'Props' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
84
|
+
withProps<NewPropsT extends object>(): Builder<'Services', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, NewPropsT, Params, JayComponentCore<NewPropsT, InteractiveVS>>;
|
|
85
|
+
} : State extends 'Services' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
86
|
+
withServices<NewServices extends Array<any>>(...serviceMarkers: ServiceMarkers<NewServices>): Builder<'Contexts', Refs, SlowVS, FastVS, InteractiveVS, NewServices, Contexts, PropsT, Params, CompCore>;
|
|
87
|
+
withContexts<NewContexts extends Array<any>>(...contextMarkers: ContextMarkers<NewContexts>): Builder<'UrlLoader', Refs, SlowVS, FastVS, InteractiveVS, Services, NewContexts, PropsT, Params, CompCore>;
|
|
88
|
+
withLoadParams<NewParams extends UrlParams>(loadParams: LoadParams<Services, NewParams>): Builder<'SlowlyRender', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT & NewParams, NewParams, CompCore>;
|
|
89
|
+
withSlowlyRender<NewCarryForward extends object>(slowlyRender: RenderSlowly<Services, PropsT, SlowVS, NewCarryForward>): Builder<'FastRender', Refs, SlowVS, FastVS, InteractiveVS, [
|
|
62
90
|
NewCarryForward,
|
|
63
|
-
...
|
|
64
|
-
],
|
|
65
|
-
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<
|
|
91
|
+
...Services
|
|
92
|
+
], Contexts, PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
93
|
+
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<Services, PropsT, FastVS, NewCarryForward>): Builder<'InteractiveRender', Refs, SlowVS, FastVS, InteractiveVS, Services, [
|
|
66
94
|
Signals<NewCarryForward>,
|
|
67
|
-
...
|
|
68
|
-
], PropsT, Params, JayComponentCore<PropsT,
|
|
69
|
-
withInteractive(comp: ComponentConstructor<PropsT, Refs,
|
|
70
|
-
} : State extends '
|
|
71
|
-
|
|
72
|
-
withLoadParams<NewParams extends UrlParams>(loadParams: LoadParams<
|
|
73
|
-
withSlowlyRender<
|
|
95
|
+
...Contexts
|
|
96
|
+
], PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
97
|
+
withInteractive(comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>): Builder<'Done', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
98
|
+
} : State extends 'Contexts' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
99
|
+
withContexts<NewContexts extends Array<any>>(...contextMarkers: ContextMarkers<NewContexts>): Builder<'UrlLoader', Refs, SlowVS, FastVS, InteractiveVS, Services, NewContexts, PropsT, Params, CompCore>;
|
|
100
|
+
withLoadParams<NewParams extends UrlParams>(loadParams: LoadParams<Services, NewParams>): Builder<'SlowlyRender', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT & NewParams, NewParams, CompCore>;
|
|
101
|
+
withSlowlyRender<NewCarryForward extends object>(slowlyRender: RenderSlowly<Services, PropsT, SlowVS, NewCarryForward>): Builder<'FastRender', Refs, SlowVS, FastVS, InteractiveVS, [
|
|
74
102
|
NewCarryForward,
|
|
75
|
-
...
|
|
76
|
-
],
|
|
77
|
-
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<
|
|
103
|
+
...Services
|
|
104
|
+
], Contexts, PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
105
|
+
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<Services, PropsT, FastVS, NewCarryForward>): Builder<'InteractiveRender', Refs, SlowVS, FastVS, InteractiveVS, Services, [
|
|
78
106
|
Signals<NewCarryForward>,
|
|
79
|
-
...
|
|
80
|
-
], PropsT, Params, JayComponentCore<PropsT,
|
|
81
|
-
withInteractive(comp: ComponentConstructor<PropsT, Refs,
|
|
82
|
-
} : State extends 'UrlLoader' ? JayStackComponentDefinition<
|
|
83
|
-
withLoadParams<NewParams extends UrlParams>(loadParams: LoadParams<
|
|
84
|
-
withSlowlyRender<
|
|
107
|
+
...Contexts
|
|
108
|
+
], PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
109
|
+
withInteractive(comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>): Builder<'Done', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
110
|
+
} : State extends 'UrlLoader' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
111
|
+
withLoadParams<NewParams extends UrlParams>(loadParams: LoadParams<Services, NewParams>): Builder<'SlowlyRender', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT & NewParams, NewParams, CompCore>;
|
|
112
|
+
withSlowlyRender<NewCarryForward extends object>(slowlyRender: RenderSlowly<Services, PropsT, SlowVS, NewCarryForward>): Builder<'FastRender', Refs, SlowVS, FastVS, InteractiveVS, [
|
|
85
113
|
NewCarryForward,
|
|
86
|
-
...
|
|
87
|
-
],
|
|
88
|
-
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<
|
|
114
|
+
...Services
|
|
115
|
+
], Contexts, PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
116
|
+
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<Services, PropsT, FastVS, NewCarryForward>): Builder<'InteractiveRender', Refs, SlowVS, FastVS, InteractiveVS, Services, [
|
|
89
117
|
Signals<NewCarryForward>,
|
|
90
|
-
...
|
|
91
|
-
], PropsT, Params, JayComponentCore<PropsT,
|
|
92
|
-
withInteractive(comp: ComponentConstructor<PropsT, Refs,
|
|
93
|
-
} : State extends 'SlowlyRender' ? JayStackComponentDefinition<
|
|
94
|
-
withSlowlyRender<
|
|
118
|
+
...Contexts
|
|
119
|
+
], PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
120
|
+
withInteractive(comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>): Builder<'Done', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
121
|
+
} : State extends 'SlowlyRender' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
122
|
+
withSlowlyRender<NewCarryForward extends object>(slowlyRender: RenderSlowly<Services, PropsT, SlowVS, NewCarryForward>): Builder<'FastRender', Refs, SlowVS, FastVS, InteractiveVS, [
|
|
95
123
|
NewCarryForward,
|
|
96
|
-
...
|
|
97
|
-
],
|
|
98
|
-
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<
|
|
124
|
+
...Services
|
|
125
|
+
], Contexts, PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
126
|
+
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<Services, PropsT, FastVS, NewCarryForward>): Builder<'InteractiveRender', Refs, SlowVS, FastVS, InteractiveVS, Services, [
|
|
99
127
|
Signals<NewCarryForward>,
|
|
100
|
-
...
|
|
101
|
-
], PropsT, Params, JayComponentCore<PropsT,
|
|
102
|
-
withInteractive(comp: ComponentConstructor<PropsT, Refs,
|
|
103
|
-
} : State extends 'FastRender' ? JayStackComponentDefinition<
|
|
104
|
-
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<
|
|
128
|
+
...Contexts
|
|
129
|
+
], PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
130
|
+
withInteractive(comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>): Builder<'Done', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
131
|
+
} : State extends 'FastRender' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
132
|
+
withFastRender<NewCarryForward extends object>(fastRender: RenderFast<Services, PropsT, FastVS, NewCarryForward>): Builder<'InteractiveRender', Refs, SlowVS, FastVS, InteractiveVS, Services, [
|
|
105
133
|
Signals<NewCarryForward>,
|
|
106
|
-
...
|
|
107
|
-
], PropsT, Params, JayComponentCore<PropsT,
|
|
108
|
-
withInteractive(comp: ComponentConstructor<PropsT, Refs,
|
|
109
|
-
} : State extends 'InteractiveRender' ? JayStackComponentDefinition<
|
|
110
|
-
withInteractive(comp: ComponentConstructor<PropsT, Refs,
|
|
111
|
-
} : JayStackComponentDefinition<
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
};
|
|
134
|
-
withFastRender<NewCarryForward_5 extends object>(fastRender: RenderFast<NewServerContexts, NewPropsT, ExtractViewState<Render>, NewCarryForward_5>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, NewServerContexts, [Signals<NewCarryForward_5>, ...NewClientContexts], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>> & {
|
|
135
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_5>, ...NewClientContexts], JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, NewServerContexts, [Signals<NewCarryForward_5>, ...NewClientContexts], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>;
|
|
136
|
-
};
|
|
137
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, ExtractViewState<Render>, NewClientContexts, JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, NewServerContexts, NewClientContexts, NewPropsT, {}, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
138
|
-
};
|
|
139
|
-
withLoadParams<NewParams_1 extends UrlParams>(loadParams: LoadParams<NewServerContexts, NewParams_1>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, NewServerContexts, [], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT, ExtractViewState<Render>>> & {
|
|
140
|
-
withSlowlyRender<NewStaticViewState_2 extends Partial<ExtractViewState<Render>>, NewCarryForward_6 extends object>(slowlyRender: RenderSlowly<NewServerContexts, NewPropsT & NewParams_1, NewStaticViewState_2, NewCarryForward_6>): JayStackComponentDefinition<NewStaticViewState_2, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>, ExtractRefs<Render>, [NewCarryForward_6, ...NewServerContexts], [], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT & NewParams_1, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>> & {
|
|
141
|
-
withFastRender<NewCarryForward_7 extends object>(fastRender: RenderFast<[NewCarryForward_6, ...NewServerContexts], NewPropsT & NewParams_1, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>, NewCarryForward_7>): JayStackComponentDefinition<NewStaticViewState_2, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>, ExtractRefs<Render>, [NewCarryForward_6, ...NewServerContexts], [Signals<NewCarryForward_7>], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT & NewParams_1, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>>> & {
|
|
142
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_1, ExtractRefs<Render>, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>, [Signals<NewCarryForward_7>], JayComponentCore<NewPropsT & NewParams_1, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>>>): JayStackComponentDefinition<NewStaticViewState_2, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>, ExtractRefs<Render>, [NewCarryForward_6, ...NewServerContexts], [Signals<NewCarryForward_7>], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT & NewParams_1, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>>>;
|
|
143
|
-
};
|
|
144
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_1, ExtractRefs<Render>, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>, [], JayComponentCore<NewPropsT & NewParams_1, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>>): JayStackComponentDefinition<NewStaticViewState_2, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>, ExtractRefs<Render>, [NewCarryForward_6, ...NewServerContexts], [], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT & NewParams_1, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_2>>>;
|
|
145
|
-
};
|
|
146
|
-
withFastRender<NewCarryForward_8 extends object>(fastRender: RenderFast<NewServerContexts, NewPropsT & NewParams_1, ExtractViewState<Render>, NewCarryForward_8>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, NewServerContexts, [Signals<NewCarryForward_8>], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT & NewParams_1, Partial<ExtractViewState<Render>>>> & {
|
|
147
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_1, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_8>], JayComponentCore<NewPropsT & NewParams_1, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, NewServerContexts, [Signals<NewCarryForward_8>], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT & NewParams_1, Partial<ExtractViewState<Render>>>>;
|
|
148
|
-
};
|
|
149
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_1, ExtractRefs<Render>, ExtractViewState<Render>, [], JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, NewServerContexts, [], NewPropsT & NewParams_1, NewParams_1, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
150
|
-
};
|
|
151
|
-
withSlowlyRender<NewStaticViewState_3 extends Partial<ExtractViewState<Render>>, NewCarryForward_9 extends object>(slowlyRender: RenderSlowly<NewServerContexts, NewPropsT, NewStaticViewState_3, NewCarryForward_9>): JayStackComponentDefinition<NewStaticViewState_3, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>, ExtractRefs<Render>, [NewCarryForward_9, ...NewServerContexts], [], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>> & {
|
|
152
|
-
withFastRender<NewCarryForward_10 extends object>(fastRender: RenderFast<[NewCarryForward_9, ...NewServerContexts], NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>, NewCarryForward_10>): JayStackComponentDefinition<NewStaticViewState_3, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>, ExtractRefs<Render>, [NewCarryForward_9, ...NewServerContexts], [Signals<NewCarryForward_10>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>>> & {
|
|
153
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>, [Signals<NewCarryForward_10>], JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>>>): JayStackComponentDefinition<NewStaticViewState_3, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>, ExtractRefs<Render>, [NewCarryForward_9, ...NewServerContexts], [Signals<NewCarryForward_10>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>>>;
|
|
154
|
-
};
|
|
155
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>, [], JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>>): JayStackComponentDefinition<NewStaticViewState_3, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>, ExtractRefs<Render>, [NewCarryForward_9, ...NewServerContexts], [], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_3>>>;
|
|
156
|
-
};
|
|
157
|
-
withFastRender<NewCarryForward_11 extends object>(fastRender: RenderFast<NewServerContexts, NewPropsT, ExtractViewState<Render>, NewCarryForward_11>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, NewServerContexts, [Signals<NewCarryForward_11>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>> & {
|
|
158
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_11>], JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, NewServerContexts, [Signals<NewCarryForward_11>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>;
|
|
159
|
-
};
|
|
160
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, ExtractViewState<Render>, [], JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, NewServerContexts, [], NewPropsT, {}, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
161
|
-
};
|
|
162
|
-
withClientContext<NewClientContexts_1 extends any[]>(...contextMarkers: ContextMarkers<NewClientContexts_1>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], NewClientContexts_1, NewPropsT, {}, JayComponentCore<NewPropsT, ExtractViewState<Render>>> & {
|
|
163
|
-
withLoadParams<NewParams_2 extends UrlParams>(loadParams: LoadParams<[], NewParams_2>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], NewClientContexts_1, NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT, ExtractViewState<Render>>> & {
|
|
164
|
-
withSlowlyRender<NewStaticViewState_4 extends Partial<ExtractViewState<Render>>, NewCarryForward_12 extends object>(slowlyRender: RenderSlowly<[], NewPropsT & NewParams_2, NewStaticViewState_4, NewCarryForward_12>): JayStackComponentDefinition<NewStaticViewState_4, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>, ExtractRefs<Render>, [NewCarryForward_12], NewClientContexts_1, NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT & NewParams_2, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>> & {
|
|
165
|
-
withFastRender<NewCarryForward_13 extends object>(fastRender: RenderFast<[NewCarryForward_12], NewPropsT & NewParams_2, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>, NewCarryForward_13>): JayStackComponentDefinition<NewStaticViewState_4, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>, ExtractRefs<Render>, [NewCarryForward_12], [Signals<NewCarryForward_13>, ...NewClientContexts_1], NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT & NewParams_2, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>>> & {
|
|
166
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_2, ExtractRefs<Render>, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>, [Signals<NewCarryForward_13>, ...NewClientContexts_1], JayComponentCore<NewPropsT & NewParams_2, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>>>): JayStackComponentDefinition<NewStaticViewState_4, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>, ExtractRefs<Render>, [NewCarryForward_12], [Signals<NewCarryForward_13>, ...NewClientContexts_1], NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT & NewParams_2, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>>>;
|
|
167
|
-
};
|
|
168
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_2, ExtractRefs<Render>, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>, NewClientContexts_1, JayComponentCore<NewPropsT & NewParams_2, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>>): JayStackComponentDefinition<NewStaticViewState_4, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>, ExtractRefs<Render>, [NewCarryForward_12], NewClientContexts_1, NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT & NewParams_2, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_4>>>;
|
|
169
|
-
};
|
|
170
|
-
withFastRender<NewCarryForward_14 extends object>(fastRender: RenderFast<[], NewPropsT & NewParams_2, ExtractViewState<Render>, NewCarryForward_14>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_14>, ...NewClientContexts_1], NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT & NewParams_2, Partial<ExtractViewState<Render>>>> & {
|
|
171
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_2, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_14>, ...NewClientContexts_1], JayComponentCore<NewPropsT & NewParams_2, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_14>, ...NewClientContexts_1], NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT & NewParams_2, Partial<ExtractViewState<Render>>>>;
|
|
172
|
-
};
|
|
173
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_2, ExtractRefs<Render>, ExtractViewState<Render>, NewClientContexts_1, JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], NewClientContexts_1, NewPropsT & NewParams_2, NewParams_2, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
174
|
-
};
|
|
175
|
-
withSlowlyRender<NewStaticViewState_5 extends Partial<ExtractViewState<Render>>, NewCarryForward_15 extends object>(slowlyRender: RenderSlowly<[], NewPropsT, NewStaticViewState_5, NewCarryForward_15>): JayStackComponentDefinition<NewStaticViewState_5, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>, ExtractRefs<Render>, [NewCarryForward_15], NewClientContexts_1, NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>> & {
|
|
176
|
-
withFastRender<NewCarryForward_16 extends object>(fastRender: RenderFast<[NewCarryForward_15], NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>, NewCarryForward_16>): JayStackComponentDefinition<NewStaticViewState_5, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>, ExtractRefs<Render>, [NewCarryForward_15], [Signals<NewCarryForward_16>, ...NewClientContexts_1], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>>> & {
|
|
177
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>, [Signals<NewCarryForward_16>, ...NewClientContexts_1], JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>>>): JayStackComponentDefinition<NewStaticViewState_5, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>, ExtractRefs<Render>, [NewCarryForward_15], [Signals<NewCarryForward_16>, ...NewClientContexts_1], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>>>;
|
|
178
|
-
};
|
|
179
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>, NewClientContexts_1, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>>): JayStackComponentDefinition<NewStaticViewState_5, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>, ExtractRefs<Render>, [NewCarryForward_15], NewClientContexts_1, NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_5>>>;
|
|
180
|
-
};
|
|
181
|
-
withFastRender<NewCarryForward_17 extends object>(fastRender: RenderFast<[], NewPropsT, ExtractViewState<Render>, NewCarryForward_17>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_17>, ...NewClientContexts_1], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>> & {
|
|
182
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_17>, ...NewClientContexts_1], JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_17>, ...NewClientContexts_1], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>;
|
|
183
|
-
};
|
|
184
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, ExtractViewState<Render>, NewClientContexts_1, JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], NewClientContexts_1, NewPropsT, {}, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
185
|
-
};
|
|
186
|
-
withLoadParams<NewParams_3 extends UrlParams>(loadParams: LoadParams<[], NewParams_3>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], [], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT, ExtractViewState<Render>>> & {
|
|
187
|
-
withSlowlyRender<NewStaticViewState_6 extends Partial<ExtractViewState<Render>>, NewCarryForward_18 extends object>(slowlyRender: RenderSlowly<[], NewPropsT & NewParams_3, NewStaticViewState_6, NewCarryForward_18>): JayStackComponentDefinition<NewStaticViewState_6, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>, ExtractRefs<Render>, [NewCarryForward_18], [], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT & NewParams_3, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>> & {
|
|
188
|
-
withFastRender<NewCarryForward_19 extends object>(fastRender: RenderFast<[NewCarryForward_18], NewPropsT & NewParams_3, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>, NewCarryForward_19>): JayStackComponentDefinition<NewStaticViewState_6, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>, ExtractRefs<Render>, [NewCarryForward_18], [Signals<NewCarryForward_19>], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT & NewParams_3, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>>> & {
|
|
189
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_3, ExtractRefs<Render>, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>, [Signals<NewCarryForward_19>], JayComponentCore<NewPropsT & NewParams_3, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>>>): JayStackComponentDefinition<NewStaticViewState_6, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>, ExtractRefs<Render>, [NewCarryForward_18], [Signals<NewCarryForward_19>], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT & NewParams_3, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>>>;
|
|
190
|
-
};
|
|
191
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_3, ExtractRefs<Render>, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>, [], JayComponentCore<NewPropsT & NewParams_3, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>>): JayStackComponentDefinition<NewStaticViewState_6, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>, ExtractRefs<Render>, [NewCarryForward_18], [], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT & NewParams_3, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_6>>>;
|
|
192
|
-
};
|
|
193
|
-
withFastRender<NewCarryForward_20 extends object>(fastRender: RenderFast<[], NewPropsT & NewParams_3, ExtractViewState<Render>, NewCarryForward_20>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_20>], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT & NewParams_3, Partial<ExtractViewState<Render>>>> & {
|
|
194
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_3, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_20>], JayComponentCore<NewPropsT & NewParams_3, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_20>], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT & NewParams_3, Partial<ExtractViewState<Render>>>>;
|
|
195
|
-
};
|
|
196
|
-
withInteractive(comp: ComponentConstructor<NewPropsT & NewParams_3, ExtractRefs<Render>, ExtractViewState<Render>, [], JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], [], NewPropsT & NewParams_3, NewParams_3, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
197
|
-
};
|
|
198
|
-
withSlowlyRender<NewStaticViewState_7 extends Partial<ExtractViewState<Render>>, NewCarryForward_21 extends object>(slowlyRender: RenderSlowly<[], NewPropsT, NewStaticViewState_7, NewCarryForward_21>): JayStackComponentDefinition<NewStaticViewState_7, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>, ExtractRefs<Render>, [NewCarryForward_21], [], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>> & {
|
|
199
|
-
withFastRender<NewCarryForward_22 extends object>(fastRender: RenderFast<[NewCarryForward_21], NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>, NewCarryForward_22>): JayStackComponentDefinition<NewStaticViewState_7, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>, ExtractRefs<Render>, [NewCarryForward_21], [Signals<NewCarryForward_22>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>>> & {
|
|
200
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>, [Signals<NewCarryForward_22>], JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>>>): JayStackComponentDefinition<NewStaticViewState_7, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>, ExtractRefs<Render>, [NewCarryForward_21], [Signals<NewCarryForward_22>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>>>;
|
|
201
|
-
};
|
|
202
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>, [], JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>>): JayStackComponentDefinition<NewStaticViewState_7, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>, ExtractRefs<Render>, [NewCarryForward_21], [], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>> & Omit<ExtractViewState<Render>, keyof NewStaticViewState_7>>>;
|
|
203
|
-
};
|
|
204
|
-
withFastRender<NewCarryForward_23 extends object>(fastRender: RenderFast<[], NewPropsT, ExtractViewState<Render>, NewCarryForward_23>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_23>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>> & {
|
|
205
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, Partial<ExtractViewState<Render>>, [Signals<NewCarryForward_23>], JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>): JayStackComponentDefinition<object, Partial<ExtractViewState<Render>>, ExtractRefs<Render>, [], [Signals<NewCarryForward_23>], NewPropsT, {}, JayComponentCore<NewPropsT, Partial<ExtractViewState<Render>>>>;
|
|
206
|
-
};
|
|
207
|
-
withInteractive(comp: ComponentConstructor<NewPropsT, ExtractRefs<Render>, ExtractViewState<Render>, [], JayComponentCore<NewPropsT, ExtractViewState<Render>>>): JayStackComponentDefinition<object, ExtractViewState<Render>, ExtractRefs<Render>, [], [], NewPropsT, {}, JayComponentCore<NewPropsT, ExtractViewState<Render>>>;
|
|
208
|
-
};
|
|
209
|
-
};
|
|
134
|
+
...Contexts
|
|
135
|
+
], PropsT, Params, JayComponentCore<PropsT, InteractiveVS>>;
|
|
136
|
+
withInteractive(comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>): Builder<'Done', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
137
|
+
} : State extends 'InteractiveRender' ? JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore> & {
|
|
138
|
+
withInteractive(comp: ComponentConstructor<PropsT, Refs, InteractiveVS, Contexts, CompCore>): Builder<'Done', Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
139
|
+
} : JayStackComponentDefinition<Refs, SlowVS, FastVS, InteractiveVS, Services, Contexts, PropsT, Params, CompCore>;
|
|
140
|
+
/**
|
|
141
|
+
* Create a Jay Stack component from a contract.
|
|
142
|
+
*
|
|
143
|
+
* For .jay-contract files with explicit phase annotations:
|
|
144
|
+
* - SlowViewState: Properties with phase: slow (or default)
|
|
145
|
+
* - FastViewState: Properties with phase: fast
|
|
146
|
+
* - InteractiveViewState: Properties with phase: fast+interactive
|
|
147
|
+
*
|
|
148
|
+
* For .jay-html files (backward compatible):
|
|
149
|
+
* - SlowViewState, FastViewState, InteractiveViewState default to `never`
|
|
150
|
+
*
|
|
151
|
+
* Note: Full type enforcement for phase-specific render functions requires
|
|
152
|
+
* extensive refactoring of the Builder type system. Currently, the phase types
|
|
153
|
+
* are extracted but not yet enforced. See design-log/50 for full implementation plan.
|
|
154
|
+
*
|
|
155
|
+
* TODO: Add type constraints to withSlowlyRender, withFastRender, withInteractive
|
|
156
|
+
* to enforce that returned/received ViewStates match the phase-specific types.
|
|
157
|
+
*/
|
|
158
|
+
declare function makeJayStackComponent<Render extends JayContract<any, any, any, any, any>>(): Builder<'Props', ExtractRefs<Render>, ExtractSlowViewState<Render>, ExtractFastViewState<Render>, ExtractInteractiveViewState<Render>, [
|
|
159
|
+
], [
|
|
160
|
+
], {}, {}, JayComponentCore<object, ExtractInteractiveViewState<Render>>>;
|
|
210
161
|
|
|
211
|
-
export { type AnyFastRenderResult, type AnyJayStackComponentDefinition, type AnySlowlyRenderResult, type Builder, type ClientError4xx, type FastRenderResult, type JayStackComponentDefinition, type LoadParams, type PageProps, type PartialRender, type Redirect3xx, type RenderFast, type RenderSlowly, type ServerError5xx, type Signals, type SlowlyRenderResult, type UrlParams, clientError4xx, makeJayStackComponent, notFound, partialRender, redirect3xx, serverError5xx };
|
|
162
|
+
export { type AnyFastRenderResult, type AnyJayStackComponentDefinition, type AnySlowlyRenderResult, type Builder, type ClientError4xx, type FastRenderResult, type JayStackComponentDefinition, type LoadParams, type PageProps, type PartialRender, type Redirect3xx, type RenderFast, type RenderSlowly, type ServerError5xx, type ServiceMarker, type ServiceMarkers, type Signals, type SlowlyRenderResult, type UrlParams, clientError4xx, createJayService, makeJayStackComponent, notFound, partialRender, redirect3xx, serverError5xx };
|
package/dist/index.js
CHANGED
|
@@ -29,10 +29,13 @@ function redirect3xx(status, location) {
|
|
|
29
29
|
function partialRender(rendered, carryForward) {
|
|
30
30
|
return { kind: "PartialRender", rendered, carryForward };
|
|
31
31
|
}
|
|
32
|
+
function createJayService(name) {
|
|
33
|
+
return Symbol(name);
|
|
34
|
+
}
|
|
32
35
|
class BuilderImplementation {
|
|
33
36
|
constructor() {
|
|
34
|
-
__publicField(this, "
|
|
35
|
-
__publicField(this, "
|
|
37
|
+
__publicField(this, "services", []);
|
|
38
|
+
__publicField(this, "contexts", []);
|
|
36
39
|
__publicField(this, "loadParams");
|
|
37
40
|
__publicField(this, "slowlyRender");
|
|
38
41
|
__publicField(this, "fastRender");
|
|
@@ -41,12 +44,12 @@ class BuilderImplementation {
|
|
|
41
44
|
withProps() {
|
|
42
45
|
return this;
|
|
43
46
|
}
|
|
44
|
-
|
|
45
|
-
this.
|
|
47
|
+
withServices(...serviceMarkers) {
|
|
48
|
+
this.services = serviceMarkers;
|
|
46
49
|
return this;
|
|
47
50
|
}
|
|
48
|
-
|
|
49
|
-
this.
|
|
51
|
+
withContexts(...contextMarkers) {
|
|
52
|
+
this.contexts = contextMarkers;
|
|
50
53
|
return this;
|
|
51
54
|
}
|
|
52
55
|
withLoadParams(loadParams) {
|
|
@@ -71,6 +74,7 @@ function makeJayStackComponent() {
|
|
|
71
74
|
}
|
|
72
75
|
export {
|
|
73
76
|
clientError4xx,
|
|
77
|
+
createJayService,
|
|
74
78
|
makeJayStackComponent,
|
|
75
79
|
notFound,
|
|
76
80
|
partialRender,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jay-framework/fullstack-component",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,12 +26,12 @@
|
|
|
26
26
|
"test:watch": "vitest"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@jay-framework/component": "^0.
|
|
30
|
-
"@jay-framework/runtime": "^0.
|
|
29
|
+
"@jay-framework/component": "^0.9.0",
|
|
30
|
+
"@jay-framework/runtime": "^0.9.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@jay-framework/dev-environment": "^0.
|
|
34
|
-
"@jay-framework/jay-cli": "^0.
|
|
33
|
+
"@jay-framework/dev-environment": "^0.9.0",
|
|
34
|
+
"@jay-framework/jay-cli": "^0.9.0",
|
|
35
35
|
"@types/express": "^5.0.2",
|
|
36
36
|
"@types/node": "^22.15.21",
|
|
37
37
|
"nodemon": "^3.0.3",
|