@flightdev/ui 2.0.1 → 4.0.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 +283 -68
- package/dist/{chunk-XTDK7ME5.js → chunk-S4DTUQII.js} +246 -19
- package/dist/chunk-S4DTUQII.js.map +1 -0
- package/dist/core/index.d.ts +423 -3
- package/dist/core/index.js +23 -2
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.js +29 -5
- package/dist/index.js.map +1 -0
- package/package.json +7 -183
- package/.turbo/turbo-build.log +0 -81
- package/.turbo/turbo-lint.log +0 -40
- package/.turbo/turbo-typecheck.log +0 -4
- package/TESTING.md +0 -124
- package/dist/adapter-MMD-iHNx.d.ts +0 -424
- package/dist/adapters/tier-1/angular.d.ts +0 -60
- package/dist/adapters/tier-1/angular.js +0 -2
- package/dist/adapters/tier-1/index.d.ts +0 -7
- package/dist/adapters/tier-1/index.js +0 -7
- package/dist/adapters/tier-1/qwik.d.ts +0 -55
- package/dist/adapters/tier-1/qwik.js +0 -2
- package/dist/adapters/tier-1/react.d.ts +0 -67
- package/dist/adapters/tier-1/react.js +0 -2
- package/dist/adapters/tier-1/solid.d.ts +0 -45
- package/dist/adapters/tier-1/solid.js +0 -2
- package/dist/adapters/tier-1/svelte.d.ts +0 -48
- package/dist/adapters/tier-1/svelte.js +0 -2
- package/dist/adapters/tier-1/vue.d.ts +0 -47
- package/dist/adapters/tier-1/vue.js +0 -2
- package/dist/adapters/tier-2/index.d.ts +0 -7
- package/dist/adapters/tier-2/index.js +0 -7
- package/dist/adapters/tier-2/inferno.d.ts +0 -31
- package/dist/adapters/tier-2/inferno.js +0 -2
- package/dist/adapters/tier-2/lit.d.ts +0 -34
- package/dist/adapters/tier-2/lit.js +0 -2
- package/dist/adapters/tier-2/marko.d.ts +0 -59
- package/dist/adapters/tier-2/marko.js +0 -2
- package/dist/adapters/tier-2/mithril.d.ts +0 -31
- package/dist/adapters/tier-2/mithril.js +0 -2
- package/dist/adapters/tier-2/preact.d.ts +0 -33
- package/dist/adapters/tier-2/preact.js +0 -2
- package/dist/adapters/tier-2/stencil.d.ts +0 -52
- package/dist/adapters/tier-2/stencil.js +0 -2
- package/dist/adapters/tier-3/alpine.d.ts +0 -73
- package/dist/adapters/tier-3/alpine.js +0 -2
- package/dist/adapters/tier-3/hotwire.d.ts +0 -71
- package/dist/adapters/tier-3/hotwire.js +0 -2
- package/dist/adapters/tier-3/htmx.d.ts +0 -88
- package/dist/adapters/tier-3/htmx.js +0 -2
- package/dist/adapters/tier-3/index.d.ts +0 -7
- package/dist/adapters/tier-3/index.js +0 -7
- package/dist/adapters/tier-3/petite-vue.d.ts +0 -56
- package/dist/adapters/tier-3/petite-vue.js +0 -2
- package/dist/adapters/tier-3/stimulus.d.ts +0 -63
- package/dist/adapters/tier-3/stimulus.js +0 -2
- package/dist/adapters/tier-3/vanilla.d.ts +0 -63
- package/dist/adapters/tier-3/vanilla.js +0 -2
- package/dist/chunk-2SNQ6PTM.js +0 -217
- package/dist/chunk-3D4XMIZI.js +0 -136
- package/dist/chunk-3HU6GSQ4.js +0 -125
- package/dist/chunk-4PZDNFL7.js +0 -148
- package/dist/chunk-5IBLFTYL.js +0 -114
- package/dist/chunk-64JZJ7OK.js +0 -142
- package/dist/chunk-7ZJI3QU2.js +0 -132
- package/dist/chunk-CE4FJHQJ.js +0 -133
- package/dist/chunk-DTCAUBH5.js +0 -87
- package/dist/chunk-NTASPOHG.js +0 -106
- package/dist/chunk-OI2AMQLG.js +0 -152
- package/dist/chunk-Q7HUE44H.js +0 -106
- package/dist/chunk-QH3LOWXU.js +0 -155
- package/dist/chunk-QIVAK6BH.js +0 -103
- package/dist/chunk-V34XPVGK.js +0 -103
- package/dist/chunk-VK7ZPMO7.js +0 -221
- package/dist/chunk-X6CNUW6T.js +0 -136
- package/dist/chunk-YFGSHW5S.js +0 -121
- package/dist/chunk-ZAJVSE7J.js +0 -90
- package/docs/ADAPTERS.md +0 -946
- package/docs/PATTERNS.md +0 -836
- package/src/adapters/tier-1/angular.ts +0 -223
- package/src/adapters/tier-1/index.ts +0 -12
- package/src/adapters/tier-1/qwik.ts +0 -177
- package/src/adapters/tier-1/react.ts +0 -330
- package/src/adapters/tier-1/solid.ts +0 -222
- package/src/adapters/tier-1/svelte.ts +0 -211
- package/src/adapters/tier-1/vue.ts +0 -234
- package/src/adapters/tier-2/index.ts +0 -12
- package/src/adapters/tier-2/inferno.ts +0 -149
- package/src/adapters/tier-2/lit.ts +0 -191
- package/src/adapters/tier-2/marko.ts +0 -199
- package/src/adapters/tier-2/mithril.ts +0 -152
- package/src/adapters/tier-2/preact.ts +0 -133
- package/src/adapters/tier-2/stencil.ts +0 -214
- package/src/adapters/tier-3/alpine.ts +0 -218
- package/src/adapters/tier-3/hotwire.ts +0 -254
- package/src/adapters/tier-3/htmx.ts +0 -263
- package/src/adapters/tier-3/index.ts +0 -12
- package/src/adapters/tier-3/petite-vue.ts +0 -163
- package/src/adapters/tier-3/stimulus.ts +0 -233
- package/src/adapters/tier-3/vanilla.ts +0 -252
- package/src/ambient.d.ts +0 -310
- package/src/core/adapter.ts +0 -366
- package/src/core/index.ts +0 -56
- package/src/core/registry.ts +0 -518
- package/src/core/types.ts +0 -461
- package/src/htmx.ts +0 -134
- package/src/index.ts +0 -263
- package/test/__mocks__/stencil-core.ts +0 -19
- package/test/__mocks__/stencil-hydrate.ts +0 -15
- package/test/adapters/tier-1.test.ts +0 -206
- package/test/adapters/tier-2.test.ts +0 -175
- package/test/adapters/tier-3.test.ts +0 -284
- package/test/contracts/adapter.contract.ts +0 -293
- package/test/core/core.test.ts +0 -310
- package/test/errors/error-handling.test.ts +0 -454
- package/test/integration/htmx.integration.test.ts +0 -246
- package/test/integration/react.integration.test.ts +0 -271
- package/test/integration/registry.integration.test.ts +0 -308
- package/tsconfig.json +0 -22
- package/tsup.config.ts +0 -93
- package/vitest.config.ts +0 -101
|
@@ -29,6 +29,222 @@ var TIER_INFO = {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
// src/core/adapter.ts
|
|
33
|
+
var BaseUIAdapter = class {
|
|
34
|
+
// === Default Capabilities (Override as needed) ===
|
|
35
|
+
capabilities = {
|
|
36
|
+
streaming: false,
|
|
37
|
+
partialHydration: false,
|
|
38
|
+
islands: false,
|
|
39
|
+
resumable: false,
|
|
40
|
+
ssg: true,
|
|
41
|
+
csr: true,
|
|
42
|
+
serverComponents: false
|
|
43
|
+
};
|
|
44
|
+
frameworkVersion;
|
|
45
|
+
// === Default Implementations ===
|
|
46
|
+
/**
|
|
47
|
+
* Generate hydration script.
|
|
48
|
+
* Override for framework-specific hydration.
|
|
49
|
+
*/
|
|
50
|
+
getHydrationScript(result) {
|
|
51
|
+
const data = JSON.stringify(result.hydrationData ?? {});
|
|
52
|
+
return `
|
|
53
|
+
window.__FLIGHT_DATA__ = ${data};
|
|
54
|
+
window.__FLIGHT_ADAPTER__ = '${this.id}';
|
|
55
|
+
import('/flight-client.js').then(m => m.hydrate?.());
|
|
56
|
+
`.trim();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get client entry point code.
|
|
60
|
+
* Override for framework-specific client initialization.
|
|
61
|
+
*/
|
|
62
|
+
getClientEntry() {
|
|
63
|
+
return `
|
|
64
|
+
// ${this.name} Client Entry
|
|
65
|
+
// Override getClientEntry() in your adapter for custom behavior
|
|
66
|
+
|
|
67
|
+
export function hydrate() {
|
|
68
|
+
console.log('[Flight] Hydrating with ${this.name}');
|
|
69
|
+
const data = window.__FLIGHT_DATA__;
|
|
70
|
+
const App = window.__FLIGHT_APP__;
|
|
71
|
+
|
|
72
|
+
if (App && typeof App.mount === 'function') {
|
|
73
|
+
App.mount(document.getElementById('app'), data);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
`.trim();
|
|
77
|
+
}
|
|
78
|
+
// === Helper Methods (Available to all adapters) ===
|
|
79
|
+
/**
|
|
80
|
+
* Escape HTML entities to prevent XSS
|
|
81
|
+
*/
|
|
82
|
+
escapeHtml(str) {
|
|
83
|
+
const htmlEscapes = {
|
|
84
|
+
"&": "&",
|
|
85
|
+
"<": "<",
|
|
86
|
+
">": ">",
|
|
87
|
+
'"': """,
|
|
88
|
+
"'": "'"
|
|
89
|
+
};
|
|
90
|
+
return str.replace(/[&<>"']/g, (char) => htmlEscapes[char] ?? char);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Serialize props to JSON for hydration
|
|
94
|
+
*/
|
|
95
|
+
serializeProps(props) {
|
|
96
|
+
if (props === void 0 || props === null) {
|
|
97
|
+
return "{}";
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
return JSON.stringify(props, this.jsonReplacer);
|
|
101
|
+
} catch {
|
|
102
|
+
console.warn(`[${this.id}] Failed to serialize props`);
|
|
103
|
+
return "{}";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* JSON replacer for serialization
|
|
108
|
+
*/
|
|
109
|
+
jsonReplacer(_key, value) {
|
|
110
|
+
if (value instanceof Map) {
|
|
111
|
+
return { __type: "Map", data: Array.from(value.entries()) };
|
|
112
|
+
}
|
|
113
|
+
if (value instanceof Set) {
|
|
114
|
+
return { __type: "Set", data: Array.from(value) };
|
|
115
|
+
}
|
|
116
|
+
if (value instanceof Date) {
|
|
117
|
+
return { __type: "Date", data: value.toISOString() };
|
|
118
|
+
}
|
|
119
|
+
if (typeof value === "bigint") {
|
|
120
|
+
return { __type: "BigInt", data: value.toString() };
|
|
121
|
+
}
|
|
122
|
+
if (typeof value === "function") {
|
|
123
|
+
return void 0;
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a hydration marker comment
|
|
129
|
+
*/
|
|
130
|
+
createHydrationMarker(id, type = "start") {
|
|
131
|
+
return `<!--flight:${type}:${id}-->`;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Wrap content with hydration markers
|
|
135
|
+
*/
|
|
136
|
+
wrapWithMarkers(id, content) {
|
|
137
|
+
return `${this.createHydrationMarker(id, "start")}${content}${this.createHydrationMarker(id, "end")}`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Generate a unique component ID
|
|
141
|
+
*/
|
|
142
|
+
generateId() {
|
|
143
|
+
return `f${Math.random().toString(36).slice(2, 9)}`;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Create timing information
|
|
147
|
+
*/
|
|
148
|
+
createTiming(startTime) {
|
|
149
|
+
return { total: performance.now() - startTime };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Merge render context with defaults
|
|
153
|
+
*/
|
|
154
|
+
mergeContext(context) {
|
|
155
|
+
return {
|
|
156
|
+
url: "/",
|
|
157
|
+
...context
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create an island (default implementation)
|
|
162
|
+
* Override for framework-specific island behavior.
|
|
163
|
+
*/
|
|
164
|
+
createIsland(component, props, options) {
|
|
165
|
+
const id = this.generateId();
|
|
166
|
+
const componentName = typeof component === "string" ? component : "island-component";
|
|
167
|
+
return {
|
|
168
|
+
id,
|
|
169
|
+
component: componentName,
|
|
170
|
+
props: props ?? {},
|
|
171
|
+
placeholder: `<div data-island="${id}" data-component="${componentName}">Loading...</div>`,
|
|
172
|
+
options
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Serialize state for resumability
|
|
177
|
+
*/
|
|
178
|
+
serializeState(state) {
|
|
179
|
+
return this.serializeProps(state);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Resume from serialized state
|
|
183
|
+
*/
|
|
184
|
+
resumeFromState(serialized) {
|
|
185
|
+
return JSON.parse(serialized, this.jsonReviver);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* JSON reviver for deserialization
|
|
189
|
+
*/
|
|
190
|
+
jsonReviver(_key, value) {
|
|
191
|
+
if (value && typeof value === "object" && "__type" in value) {
|
|
192
|
+
const typed = value;
|
|
193
|
+
switch (typed.__type) {
|
|
194
|
+
case "Map":
|
|
195
|
+
return new Map(typed.data);
|
|
196
|
+
case "Set":
|
|
197
|
+
return new Set(typed.data);
|
|
198
|
+
case "Date":
|
|
199
|
+
return new Date(typed.data);
|
|
200
|
+
case "BigInt":
|
|
201
|
+
return BigInt(typed.data);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Initialize the adapter
|
|
208
|
+
*/
|
|
209
|
+
async init() {
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Clean up resources
|
|
213
|
+
*/
|
|
214
|
+
async dispose() {
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
function wrapV1Adapter(v1Adapter, tier = "tier-2") {
|
|
218
|
+
return {
|
|
219
|
+
id: v1Adapter.name.toLowerCase().replace(/\s+/g, "-"),
|
|
220
|
+
name: v1Adapter.name,
|
|
221
|
+
framework: v1Adapter.framework,
|
|
222
|
+
tier,
|
|
223
|
+
capabilities: {
|
|
224
|
+
streaming: false,
|
|
225
|
+
partialHydration: false,
|
|
226
|
+
islands: false,
|
|
227
|
+
resumable: false,
|
|
228
|
+
ssg: true,
|
|
229
|
+
csr: true,
|
|
230
|
+
serverComponents: false
|
|
231
|
+
},
|
|
232
|
+
renderToString: v1Adapter.renderToString.bind(v1Adapter),
|
|
233
|
+
getHydrationScript: v1Adapter.getHydrationScript.bind(v1Adapter),
|
|
234
|
+
getClientEntry: v1Adapter.getClientEntry.bind(v1Adapter),
|
|
235
|
+
transformForSSR: v1Adapter.transformForSSR?.bind(v1Adapter)
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function isV2Adapter(adapter) {
|
|
239
|
+
return adapter !== null && typeof adapter === "object" && "id" in adapter && "tier" in adapter && "capabilities" in adapter;
|
|
240
|
+
}
|
|
241
|
+
function hasCapability(adapter, capability) {
|
|
242
|
+
return adapter.capabilities[capability] === true;
|
|
243
|
+
}
|
|
244
|
+
function getCapabilities(adapter) {
|
|
245
|
+
return Object.entries(adapter.capabilities).filter(([, enabled]) => enabled).map(([capability]) => capability);
|
|
246
|
+
}
|
|
247
|
+
|
|
32
248
|
// src/core/registry.ts
|
|
33
249
|
var AdapterRegistry = class {
|
|
34
250
|
metadata = /* @__PURE__ */ new Map();
|
|
@@ -222,7 +438,7 @@ function registerBuiltinAdapters() {
|
|
|
222
438
|
tier: "tier-1",
|
|
223
439
|
capabilities: { streaming: true, partialHydration: true, serverComponents: true },
|
|
224
440
|
peerDependencies: ["react", "react-dom"],
|
|
225
|
-
loader: () => import(
|
|
441
|
+
loader: () => import("@flightdev/ui-react").then((m) => m.default())
|
|
226
442
|
});
|
|
227
443
|
adapterRegistry.register({
|
|
228
444
|
id: "vue",
|
|
@@ -231,7 +447,7 @@ function registerBuiltinAdapters() {
|
|
|
231
447
|
tier: "tier-1",
|
|
232
448
|
capabilities: { streaming: true, partialHydration: true },
|
|
233
449
|
peerDependencies: ["vue"],
|
|
234
|
-
loader: () => import(
|
|
450
|
+
loader: () => import("@flightdev/ui-vue").then((m) => m.default())
|
|
235
451
|
});
|
|
236
452
|
adapterRegistry.register({
|
|
237
453
|
id: "svelte",
|
|
@@ -240,7 +456,7 @@ function registerBuiltinAdapters() {
|
|
|
240
456
|
tier: "tier-1",
|
|
241
457
|
capabilities: { streaming: false, partialHydration: true },
|
|
242
458
|
peerDependencies: ["svelte"],
|
|
243
|
-
loader: () => import(
|
|
459
|
+
loader: () => import("@flightdev/ui-svelte").then((m) => m.default())
|
|
244
460
|
});
|
|
245
461
|
adapterRegistry.register({
|
|
246
462
|
id: "solid",
|
|
@@ -249,7 +465,7 @@ function registerBuiltinAdapters() {
|
|
|
249
465
|
tier: "tier-1",
|
|
250
466
|
capabilities: { streaming: true, partialHydration: true },
|
|
251
467
|
peerDependencies: ["solid-js"],
|
|
252
|
-
loader: () => import(
|
|
468
|
+
loader: () => import("@flightdev/ui-solid").then((m) => m.default())
|
|
253
469
|
});
|
|
254
470
|
adapterRegistry.register({
|
|
255
471
|
id: "angular",
|
|
@@ -258,7 +474,7 @@ function registerBuiltinAdapters() {
|
|
|
258
474
|
tier: "tier-1",
|
|
259
475
|
capabilities: { streaming: true, partialHydration: true },
|
|
260
476
|
peerDependencies: ["@angular/core", "@angular/platform-server", "@angular/platform-browser"],
|
|
261
|
-
loader: () => import(
|
|
477
|
+
loader: () => import("@flightdev/ui-angular").then((m) => m.default())
|
|
262
478
|
});
|
|
263
479
|
adapterRegistry.register({
|
|
264
480
|
id: "qwik",
|
|
@@ -267,7 +483,7 @@ function registerBuiltinAdapters() {
|
|
|
267
483
|
tier: "tier-1",
|
|
268
484
|
capabilities: { streaming: true, resumable: true, partialHydration: true },
|
|
269
485
|
peerDependencies: ["@builder.io/qwik"],
|
|
270
|
-
loader: () => import(
|
|
486
|
+
loader: () => import("@flightdev/ui-qwik").then((m) => m.default())
|
|
271
487
|
});
|
|
272
488
|
adapterRegistry.register({
|
|
273
489
|
id: "preact",
|
|
@@ -276,7 +492,7 @@ function registerBuiltinAdapters() {
|
|
|
276
492
|
tier: "tier-2",
|
|
277
493
|
capabilities: { streaming: false, partialHydration: true },
|
|
278
494
|
peerDependencies: ["preact"],
|
|
279
|
-
loader: () => import(
|
|
495
|
+
loader: () => import("@flightdev/ui-preact").then((m) => m.default())
|
|
280
496
|
});
|
|
281
497
|
adapterRegistry.register({
|
|
282
498
|
id: "lit",
|
|
@@ -285,7 +501,7 @@ function registerBuiltinAdapters() {
|
|
|
285
501
|
tier: "tier-2",
|
|
286
502
|
capabilities: { islands: true },
|
|
287
503
|
peerDependencies: ["lit"],
|
|
288
|
-
loader: () => import(
|
|
504
|
+
loader: () => import("@flightdev/ui-lit").then((m) => m.default())
|
|
289
505
|
});
|
|
290
506
|
adapterRegistry.register({
|
|
291
507
|
id: "marko",
|
|
@@ -294,7 +510,7 @@ function registerBuiltinAdapters() {
|
|
|
294
510
|
tier: "tier-2",
|
|
295
511
|
capabilities: { streaming: true, partialHydration: true, islands: true },
|
|
296
512
|
peerDependencies: ["marko"],
|
|
297
|
-
loader: () => import(
|
|
513
|
+
loader: () => import("@flightdev/ui-marko").then((m) => m.default())
|
|
298
514
|
});
|
|
299
515
|
adapterRegistry.register({
|
|
300
516
|
id: "stencil",
|
|
@@ -303,7 +519,7 @@ function registerBuiltinAdapters() {
|
|
|
303
519
|
tier: "tier-2",
|
|
304
520
|
capabilities: { islands: true },
|
|
305
521
|
peerDependencies: ["@stencil/core"],
|
|
306
|
-
loader: () => import(
|
|
522
|
+
loader: () => import("@flightdev/ui-stencil").then((m) => m.default())
|
|
307
523
|
});
|
|
308
524
|
adapterRegistry.register({
|
|
309
525
|
id: "mithril",
|
|
@@ -312,7 +528,7 @@ function registerBuiltinAdapters() {
|
|
|
312
528
|
tier: "tier-2",
|
|
313
529
|
capabilities: {},
|
|
314
530
|
peerDependencies: ["mithril"],
|
|
315
|
-
loader: () => import(
|
|
531
|
+
loader: () => import("@flightdev/ui-mithril").then((m) => m.default())
|
|
316
532
|
});
|
|
317
533
|
adapterRegistry.register({
|
|
318
534
|
id: "inferno",
|
|
@@ -321,7 +537,7 @@ function registerBuiltinAdapters() {
|
|
|
321
537
|
tier: "tier-2",
|
|
322
538
|
capabilities: { streaming: false },
|
|
323
539
|
peerDependencies: ["inferno"],
|
|
324
|
-
loader: () => import(
|
|
540
|
+
loader: () => import("@flightdev/ui-inferno").then((m) => m.default())
|
|
325
541
|
});
|
|
326
542
|
adapterRegistry.register({
|
|
327
543
|
id: "htmx",
|
|
@@ -330,7 +546,7 @@ function registerBuiltinAdapters() {
|
|
|
330
546
|
tier: "tier-3",
|
|
331
547
|
capabilities: {},
|
|
332
548
|
peerDependencies: [],
|
|
333
|
-
loader: () => import(
|
|
549
|
+
loader: () => import("@flightdev/ui-htmx").then((m) => m.default())
|
|
334
550
|
});
|
|
335
551
|
adapterRegistry.register({
|
|
336
552
|
id: "alpine",
|
|
@@ -339,7 +555,7 @@ function registerBuiltinAdapters() {
|
|
|
339
555
|
tier: "tier-3",
|
|
340
556
|
capabilities: {},
|
|
341
557
|
peerDependencies: [],
|
|
342
|
-
loader: () => import(
|
|
558
|
+
loader: () => import("@flightdev/ui-alpine").then((m) => m.default())
|
|
343
559
|
});
|
|
344
560
|
adapterRegistry.register({
|
|
345
561
|
id: "hotwire",
|
|
@@ -348,7 +564,7 @@ function registerBuiltinAdapters() {
|
|
|
348
564
|
tier: "tier-3",
|
|
349
565
|
capabilities: {},
|
|
350
566
|
peerDependencies: ["@hotwired/turbo"],
|
|
351
|
-
loader: () => import(
|
|
567
|
+
loader: () => import("@flightdev/ui-hotwire").then((m) => m.default())
|
|
352
568
|
});
|
|
353
569
|
adapterRegistry.register({
|
|
354
570
|
id: "stimulus",
|
|
@@ -357,7 +573,7 @@ function registerBuiltinAdapters() {
|
|
|
357
573
|
tier: "tier-3",
|
|
358
574
|
capabilities: {},
|
|
359
575
|
peerDependencies: ["@hotwired/stimulus"],
|
|
360
|
-
loader: () => import(
|
|
576
|
+
loader: () => import("@flightdev/ui-stimulus").then((m) => m.default())
|
|
361
577
|
});
|
|
362
578
|
adapterRegistry.register({
|
|
363
579
|
id: "petite-vue",
|
|
@@ -366,7 +582,7 @@ function registerBuiltinAdapters() {
|
|
|
366
582
|
tier: "tier-3",
|
|
367
583
|
capabilities: {},
|
|
368
584
|
peerDependencies: ["petite-vue"],
|
|
369
|
-
loader: () => import(
|
|
585
|
+
loader: () => import("@flightdev/ui-petite-vue").then((m) => m.default())
|
|
370
586
|
});
|
|
371
587
|
adapterRegistry.register({
|
|
372
588
|
id: "vanilla",
|
|
@@ -375,8 +591,19 @@ function registerBuiltinAdapters() {
|
|
|
375
591
|
tier: "tier-3",
|
|
376
592
|
capabilities: { islands: true },
|
|
377
593
|
peerDependencies: [],
|
|
378
|
-
loader: () => import(
|
|
594
|
+
loader: () => import("@flightdev/ui-vanilla").then((m) => m.default())
|
|
379
595
|
});
|
|
380
596
|
}
|
|
381
597
|
|
|
382
|
-
export {
|
|
598
|
+
export {
|
|
599
|
+
DEFAULT_CAPABILITIES,
|
|
600
|
+
TIER_INFO,
|
|
601
|
+
BaseUIAdapter,
|
|
602
|
+
wrapV1Adapter,
|
|
603
|
+
isV2Adapter,
|
|
604
|
+
hasCapability,
|
|
605
|
+
getCapabilities,
|
|
606
|
+
adapterRegistry,
|
|
607
|
+
registerBuiltinAdapters
|
|
608
|
+
};
|
|
609
|
+
//# sourceMappingURL=chunk-S4DTUQII.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/adapter.ts","../src/core/registry.ts"],"sourcesContent":["/**\r\n * @flightdev/ui - Core Type Definitions\r\n *\r\n * Universal type system for all UI framework adapters.\r\n * Supports SSR, streaming, islands architecture, and resumable hydration.\r\n *\r\n * @module @flightdev/ui/core/types\r\n * @version 2.0.0\r\n */\r\n\r\n// ============================================================================\r\n// Capability System\r\n// ============================================================================\r\n\r\n/**\r\n * Adapter capabilities flags.\r\n * Used for feature detection and optimization decisions.\r\n */\r\nexport interface AdapterCapabilities {\r\n /** Supports streaming SSR via renderToStream */\r\n streaming: boolean;\r\n\r\n /** Supports partial/selective hydration */\r\n partialHydration: boolean;\r\n\r\n /** Supports islands architecture */\r\n islands: boolean;\r\n\r\n /** Supports resumable hydration (Qwik-style serialization) */\r\n resumable: boolean;\r\n\r\n /** Supports Static Site Generation */\r\n ssg: boolean;\r\n\r\n /** Supports Client-Side Rendering only */\r\n csr: boolean;\r\n\r\n /** Supports Server Components (React Server Components, etc) */\r\n serverComponents: boolean;\r\n}\r\n\r\n/**\r\n * Default capabilities for adapters that don't specify their own\r\n */\r\nexport const DEFAULT_CAPABILITIES: AdapterCapabilities = {\r\n streaming: false,\r\n partialHydration: false,\r\n islands: false,\r\n resumable: false,\r\n ssg: true,\r\n csr: true,\r\n serverComponents: false,\r\n};\r\n\r\n// ============================================================================\r\n// Tier Classification\r\n// ============================================================================\r\n\r\n/**\r\n * Adapter tier classification.\r\n *\r\n * - tier-1: Full support, first-class citizens (React, Vue, Angular, Svelte, Solid, Qwik)\r\n * - tier-2: SSR + Hydration support (Preact, Lit, Marko, Stencil, Mithril, Inferno)\r\n * - tier-3: HTML-first, minimal JS (HTMX, Alpine, Hotwire, Stimulus, Web Components)\r\n */\r\nexport type AdapterTier = 'tier-1' | 'tier-2' | 'tier-3';\r\n\r\n/**\r\n * Tier metadata for documentation and tooling\r\n */\r\nexport interface TierInfo {\r\n tier: AdapterTier;\r\n name: string;\r\n description: string;\r\n features: string[];\r\n}\r\n\r\nexport const TIER_INFO: Record<AdapterTier, TierInfo> = {\r\n 'tier-1': {\r\n tier: 'tier-1',\r\n name: 'Full Support',\r\n description: 'Complete SSR, streaming, hydration, and advanced features',\r\n features: ['SSR', 'Streaming', 'Hydration', 'Islands', 'DevTools'],\r\n },\r\n 'tier-2': {\r\n tier: 'tier-2',\r\n name: 'Standard Support',\r\n description: 'SSR and hydration with framework-specific optimizations',\r\n features: ['SSR', 'Hydration', 'Partial Islands'],\r\n },\r\n 'tier-3': {\r\n tier: 'tier-3',\r\n name: 'HTML-First',\r\n description: 'Server-rendered HTML with minimal JavaScript enhancement',\r\n features: ['SSR', 'Progressive Enhancement'],\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Component & Rendering Types\r\n// ============================================================================\r\n\r\n/**\r\n * Universal component wrapper type\r\n */\r\nexport interface Component<P = Record<string, unknown>> {\r\n /** The actual component (React element, Vue component, HTML string, etc) */\r\n component: unknown;\r\n\r\n /** Props to pass to the component */\r\n props?: P;\r\n\r\n /** Slots/children content */\r\n children?: unknown;\r\n\r\n /** Component identifier for hydration */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Render context passed to adapters\r\n */\r\nexport interface RenderContext {\r\n /** Current request URL */\r\n url?: string;\r\n\r\n /** Request headers */\r\n headers?: Headers;\r\n\r\n /** Server-side cookies */\r\n cookies?: Map<string, string>;\r\n\r\n /** Locale for i18n */\r\n locale?: string;\r\n\r\n /** Custom context data */\r\n data?: Record<string, unknown>;\r\n\r\n /** AbortSignal for cancellation */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/**\r\n * Result of a render operation\r\n */\r\nexport interface RenderResult {\r\n /** The rendered HTML string */\r\n html: string;\r\n\r\n /** Head elements (meta, title, link, etc) */\r\n head?: string;\r\n\r\n /** Hydration data to pass to client */\r\n hydrationData?: Record<string, unknown>;\r\n\r\n /** CSS to inline in the document */\r\n css?: string;\r\n\r\n /** Scripts to inject */\r\n scripts?: string[];\r\n\r\n /** HTTP status code (for error pages, redirects) */\r\n status?: number;\r\n\r\n /** HTTP headers to set */\r\n headers?: Record<string, string>;\r\n\r\n /** Timing information for performance monitoring */\r\n timing?: RenderTiming;\r\n}\r\n\r\n/**\r\n * Render timing information\r\n */\r\nexport interface RenderTiming {\r\n /** Total render time in milliseconds */\r\n total: number;\r\n\r\n /** Time to first byte */\r\n ttfb?: number;\r\n\r\n /** Component render times */\r\n components?: Map<string, number>;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Types\r\n// ============================================================================\r\n\r\n/**\r\n * Streaming render options\r\n */\r\nexport interface StreamingOptions {\r\n /** Emit shell HTML before async content resolves */\r\n emitShellEarly?: boolean;\r\n\r\n /** Timeout for streaming (ms) */\r\n timeout?: number;\r\n\r\n /** Callback when shell is ready */\r\n onShellReady?: () => void;\r\n\r\n /** Callback when shell errors */\r\n onShellError?: (error: Error) => void;\r\n\r\n /** Callback when all content is ready */\r\n onAllReady?: () => void;\r\n\r\n /** Callback for each error during streaming */\r\n onError?: (error: Error, errorInfo?: unknown) => void;\r\n}\r\n\r\n/**\r\n * Streaming render result\r\n */\r\nexport interface StreamingRenderResult {\r\n /** The readable stream of HTML chunks */\r\n stream: ReadableStream<Uint8Array>;\r\n\r\n /** Promise that resolves when streaming is complete */\r\n done: Promise<void>;\r\n\r\n /** Abort the stream */\r\n abort: () => void;\r\n}\r\n\r\n// ============================================================================\r\n// Islands Architecture Types\r\n// ============================================================================\r\n\r\n/**\r\n * Island hydration strategy\r\n */\r\nexport type IslandHydrationStrategy =\r\n | 'load' // Hydrate immediately on page load\r\n | 'idle' // Hydrate when browser is idle\r\n | 'visible' // Hydrate when island becomes visible\r\n | 'media' // Hydrate based on media query\r\n | 'interaction' // Hydrate on first interaction\r\n | 'none'; // Never hydrate (static island)\r\n\r\n/**\r\n * Island configuration options\r\n */\r\nexport interface IslandOptions {\r\n /** Hydration strategy */\r\n hydrate?: IslandHydrationStrategy;\r\n\r\n /** For 'media' strategy: the media query */\r\n media?: string;\r\n\r\n /** For 'interaction' strategy: events to listen for */\r\n on?: string[];\r\n\r\n /** Island priority (higher = hydrate first) */\r\n priority?: number;\r\n\r\n /** Fallback content while loading */\r\n fallback?: string;\r\n}\r\n\r\n/**\r\n * Island definition\r\n */\r\nexport interface Island {\r\n /** Unique island identifier */\r\n id: string;\r\n\r\n /** The component to render */\r\n component: unknown;\r\n\r\n /** Component props */\r\n props?: Record<string, unknown>;\r\n\r\n /** Island options */\r\n options?: IslandOptions;\r\n\r\n /** Rendered HTML placeholder */\r\n placeholder?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Interface (V2)\r\n// ============================================================================\r\n\r\n/**\r\n * Universal UI Adapter Interface (Version 2)\r\n *\r\n * All UI framework adapters must implement this interface.\r\n * Optional methods are for advanced features (streaming, islands, etc).\r\n */\r\nexport interface UIAdapterV2 {\r\n // === Identification ===\r\n\r\n /** Unique adapter identifier (e.g., 'react', 'vue', 'angular') */\r\n readonly id: string;\r\n\r\n /** Human-readable adapter name */\r\n readonly name: string;\r\n\r\n /** Framework name */\r\n readonly framework: string;\r\n\r\n /** Framework version compatibility */\r\n readonly frameworkVersion?: string;\r\n\r\n /** Adapter tier classification */\r\n readonly tier: AdapterTier;\r\n\r\n /** Supported capabilities */\r\n readonly capabilities: AdapterCapabilities;\r\n\r\n // === Core Rendering (Required) ===\r\n\r\n /**\r\n * Render a component to an HTML string.\r\n * This is the primary SSR method.\r\n */\r\n renderToString(\r\n component: Component,\r\n context?: RenderContext\r\n ): Promise<RenderResult>;\r\n\r\n /**\r\n * Generate the hydration script for client-side hydration.\r\n */\r\n getHydrationScript(result: RenderResult): string;\r\n\r\n /**\r\n * Get the client-side entry point code.\r\n */\r\n getClientEntry(): string;\r\n\r\n // === Streaming SSR (Optional) ===\r\n\r\n /**\r\n * Render a component as a stream (for streaming SSR).\r\n * Only available if capabilities.streaming is true.\r\n */\r\n renderToStream?(\r\n component: Component,\r\n context?: RenderContext,\r\n options?: StreamingOptions\r\n ): StreamingRenderResult;\r\n\r\n // === Islands Architecture (Optional) ===\r\n\r\n /**\r\n * Create an island wrapper for partial hydration.\r\n * Only available if capabilities.islands is true.\r\n */\r\n createIsland?(\r\n component: unknown,\r\n props?: Record<string, unknown>,\r\n options?: IslandOptions\r\n ): Island;\r\n\r\n /**\r\n * Hydrate an island on the client.\r\n */\r\n hydrateIsland?(\r\n element: Element,\r\n island: Island\r\n ): void;\r\n\r\n // === Resumability (Optional) ===\r\n\r\n /**\r\n * Serialize component state for resumable hydration.\r\n * Only available if capabilities.resumable is true.\r\n */\r\n serializeState?(state: unknown): string;\r\n\r\n /**\r\n * Resume from serialized state.\r\n */\r\n resumeFromState?(serialized: string): unknown;\r\n\r\n // === Lifecycle (Optional) ===\r\n\r\n /**\r\n * Initialize the adapter (load dependencies, warm up caches, etc).\r\n */\r\n init?(): Promise<void>;\r\n\r\n /**\r\n * Clean up resources.\r\n */\r\n dispose?(): Promise<void>;\r\n\r\n // === Transform (Optional) ===\r\n\r\n /**\r\n * Transform a component for SSR if needed.\r\n */\r\n transformForSSR?(component: unknown): unknown;\r\n}\r\n\r\n// ============================================================================\r\n// Legacy Compatibility (V1 Adapter)\r\n// ============================================================================\r\n\r\n/**\r\n * Legacy V1 adapter interface for backward compatibility.\r\n * @deprecated Use UIAdapterV2 instead\r\n */\r\nexport interface UIAdapterV1 {\r\n readonly name: string;\r\n readonly framework: string;\r\n renderToString(component: Component): Promise<RenderResult>;\r\n getHydrationScript(result: RenderResult): string;\r\n getClientEntry(): string;\r\n transformForSSR?(component: unknown): unknown;\r\n}\r\n\r\n/**\r\n * Type alias for backward compatibility\r\n * @deprecated Use UIAdapterV2 instead\r\n */\r\nexport type UIAdapter = UIAdapterV1;\r\n\r\n// ============================================================================\r\n// Configuration Types\r\n// ============================================================================\r\n\r\n/**\r\n * UI configuration for Flight\r\n */\r\nexport interface UIConfig {\r\n /** The UI adapter to use */\r\n adapter: UIAdapterV2 | UIAdapterV1;\r\n\r\n /** Enable streaming SSR */\r\n streaming?: boolean;\r\n\r\n /** Hydration strategy */\r\n hydration?: 'full' | 'partial' | 'progressive' | 'none';\r\n\r\n /** Islands mode */\r\n islands?: boolean;\r\n\r\n /** Default island hydration strategy */\r\n defaultIslandStrategy?: IslandHydrationStrategy;\r\n}\r\n\r\n// ============================================================================\r\n// Utility Types\r\n// ============================================================================\r\n\r\n/**\r\n * Extract props type from a component\r\n */\r\nexport type ComponentProps<C> = C extends Component<infer P> ? P : never;\r\n\r\n/**\r\n * Check if adapter supports a capability\r\n */\r\nexport type HasCapability<\r\n A extends UIAdapterV2,\r\n C extends keyof AdapterCapabilities\r\n> = A['capabilities'][C] extends true ? true : false;\r\n","/**\r\n * @flightdev/ui - Base Adapter Class\r\n *\r\n * Abstract base class providing common functionality for all UI adapters.\r\n * Extend this class to create new framework adapters.\r\n *\r\n * @module @flightdev/ui/core/adapter\r\n * @version 2.0.0\r\n */\r\n\r\nimport type {\r\n UIAdapterV2,\r\n UIAdapterV1,\r\n AdapterTier,\r\n AdapterCapabilities,\r\n Component,\r\n RenderContext,\r\n RenderResult,\r\n StreamingOptions,\r\n StreamingRenderResult,\r\n Island,\r\n IslandOptions,\r\n DEFAULT_CAPABILITIES,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Base Adapter Class\r\n// ============================================================================\r\n\r\n/**\r\n * Abstract base class for UI adapters.\r\n *\r\n * Provides common functionality and sensible defaults.\r\n * Subclasses must implement the abstract methods.\r\n *\r\n * @example\r\n * ```typescript\r\n * class MyAdapter extends BaseUIAdapter {\r\n * readonly id = 'my-framework';\r\n * readonly name = 'My Framework';\r\n * readonly framework = 'my-framework';\r\n * readonly tier = 'tier-2';\r\n *\r\n * async renderToString(component: Component): Promise<RenderResult> {\r\n * // Implementation\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport abstract class BaseUIAdapter implements UIAdapterV2 {\r\n // === Abstract Properties (Must Override) ===\r\n\r\n abstract readonly id: string;\r\n abstract readonly name: string;\r\n abstract readonly framework: string;\r\n abstract readonly tier: AdapterTier;\r\n\r\n // === Default Capabilities (Override as needed) ===\r\n\r\n readonly capabilities: AdapterCapabilities = {\r\n streaming: false,\r\n partialHydration: false,\r\n islands: false,\r\n resumable: false,\r\n ssg: true,\r\n csr: true,\r\n serverComponents: false,\r\n };\r\n\r\n readonly frameworkVersion?: string;\r\n\r\n // === Abstract Methods (Must Implement) ===\r\n\r\n abstract renderToString(\r\n component: Component,\r\n context?: RenderContext\r\n ): Promise<RenderResult>;\r\n\r\n // === Default Implementations ===\r\n\r\n /**\r\n * Generate hydration script.\r\n * Override for framework-specific hydration.\r\n */\r\n getHydrationScript(result: RenderResult): string {\r\n const data = JSON.stringify(result.hydrationData ?? {});\r\n return `\r\nwindow.__FLIGHT_DATA__ = ${data};\r\nwindow.__FLIGHT_ADAPTER__ = '${this.id}';\r\nimport('/flight-client.js').then(m => m.hydrate?.());\r\n `.trim();\r\n }\r\n\r\n /**\r\n * Get client entry point code.\r\n * Override for framework-specific client initialization.\r\n */\r\n getClientEntry(): string {\r\n return `\r\n// ${this.name} Client Entry\r\n// Override getClientEntry() in your adapter for custom behavior\r\n\r\nexport function hydrate() {\r\n console.log('[Flight] Hydrating with ${this.name}');\r\n const data = window.__FLIGHT_DATA__;\r\n const App = window.__FLIGHT_APP__;\r\n \r\n if (App && typeof App.mount === 'function') {\r\n App.mount(document.getElementById('app'), data);\r\n }\r\n}\r\n `.trim();\r\n }\r\n\r\n // === Helper Methods (Available to all adapters) ===\r\n\r\n /**\r\n * Escape HTML entities to prevent XSS\r\n */\r\n protected escapeHtml(str: string): string {\r\n const htmlEscapes: Record<string, string> = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n };\r\n return str.replace(/[&<>\"']/g, (char) => htmlEscapes[char] ?? char);\r\n }\r\n\r\n /**\r\n * Serialize props to JSON for hydration\r\n */\r\n protected serializeProps(props: unknown): string {\r\n if (props === undefined || props === null) {\r\n return '{}';\r\n }\r\n try {\r\n return JSON.stringify(props, this.jsonReplacer);\r\n } catch {\r\n console.warn(`[${this.id}] Failed to serialize props`);\r\n return '{}';\r\n }\r\n }\r\n\r\n /**\r\n * JSON replacer for serialization\r\n */\r\n protected jsonReplacer(_key: string, value: unknown): unknown {\r\n // Handle special types\r\n if (value instanceof Map) {\r\n return { __type: 'Map', data: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', data: Array.from(value) };\r\n }\r\n if (value instanceof Date) {\r\n return { __type: 'Date', data: value.toISOString() };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', data: value.toString() };\r\n }\r\n // Skip functions\r\n if (typeof value === 'function') {\r\n return undefined;\r\n }\r\n return value;\r\n }\r\n\r\n /**\r\n * Create a hydration marker comment\r\n */\r\n protected createHydrationMarker(id: string, type: 'start' | 'end' = 'start'): string {\r\n return `<!--flight:${type}:${id}-->`;\r\n }\r\n\r\n /**\r\n * Wrap content with hydration markers\r\n */\r\n protected wrapWithMarkers(id: string, content: string): string {\r\n return `${this.createHydrationMarker(id, 'start')}${content}${this.createHydrationMarker(id, 'end')}`;\r\n }\r\n\r\n /**\r\n * Generate a unique component ID\r\n */\r\n protected generateId(): string {\r\n return `f${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n\r\n /**\r\n * Create timing information\r\n */\r\n protected createTiming(startTime: number): { total: number } {\r\n return { total: performance.now() - startTime };\r\n }\r\n\r\n /**\r\n * Merge render context with defaults\r\n */\r\n protected mergeContext(context?: RenderContext): RenderContext {\r\n return {\r\n url: '/',\r\n ...context,\r\n };\r\n }\r\n\r\n // === Optional Methods (Override if capability is enabled) ===\r\n\r\n /**\r\n * Render to stream (override if capabilities.streaming is true)\r\n */\r\n renderToStream?(\r\n _component: Component,\r\n _context?: RenderContext,\r\n _options?: StreamingOptions\r\n ): StreamingRenderResult;\r\n\r\n /**\r\n * Create an island (default implementation)\r\n * Override for framework-specific island behavior.\r\n */\r\n createIsland(\r\n component: unknown,\r\n props?: Record<string, unknown>,\r\n options?: IslandOptions\r\n ): Island {\r\n const id = this.generateId();\r\n const componentName = typeof component === 'string' ? component : 'island-component';\r\n\r\n return {\r\n id,\r\n component: componentName,\r\n props: props ?? {},\r\n placeholder: `<div data-island=\"${id}\" data-component=\"${componentName}\">Loading...</div>`,\r\n options,\r\n };\r\n }\r\n\r\n /**\r\n * Hydrate an island on the client\r\n */\r\n hydrateIsland?(_element: Element, _island: Island): void;\r\n\r\n /**\r\n * Serialize state for resumability\r\n */\r\n serializeState?(state: unknown): string {\r\n return this.serializeProps(state);\r\n }\r\n\r\n /**\r\n * Resume from serialized state\r\n */\r\n resumeFromState?(serialized: string): unknown {\r\n return JSON.parse(serialized, this.jsonReviver);\r\n }\r\n\r\n /**\r\n * JSON reviver for deserialization\r\n */\r\n protected jsonReviver(_key: string, value: unknown): unknown {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n const typed = value as { __type: string; data: unknown };\r\n switch (typed.__type) {\r\n case 'Map':\r\n return new Map(typed.data as [unknown, unknown][]);\r\n case 'Set':\r\n return new Set(typed.data as unknown[]);\r\n case 'Date':\r\n return new Date(typed.data as string);\r\n case 'BigInt':\r\n return BigInt(typed.data as string);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n /**\r\n * Initialize the adapter\r\n */\r\n async init(): Promise<void> {\r\n // Override for custom initialization\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n async dispose(): Promise<void> {\r\n // Override for custom cleanup\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// V1 to V2 Adapter Wrapper\r\n// ============================================================================\r\n\r\n/**\r\n * Wrap a V1 adapter to make it compatible with V2 interface.\r\n *\r\n * @example\r\n * ```typescript\r\n * const legacyAdapter = oldReact();\r\n * const v2Adapter = wrapV1Adapter(legacyAdapter, 'tier-1');\r\n * ```\r\n */\r\nexport function wrapV1Adapter(\r\n v1Adapter: UIAdapterV1,\r\n tier: AdapterTier = 'tier-2'\r\n): UIAdapterV2 {\r\n return {\r\n id: v1Adapter.name.toLowerCase().replace(/\\s+/g, '-'),\r\n name: v1Adapter.name,\r\n framework: v1Adapter.framework,\r\n tier,\r\n capabilities: {\r\n streaming: false,\r\n partialHydration: false,\r\n islands: false,\r\n resumable: false,\r\n ssg: true,\r\n csr: true,\r\n serverComponents: false,\r\n },\r\n renderToString: v1Adapter.renderToString.bind(v1Adapter),\r\n getHydrationScript: v1Adapter.getHydrationScript.bind(v1Adapter),\r\n getClientEntry: v1Adapter.getClientEntry.bind(v1Adapter),\r\n transformForSSR: v1Adapter.transformForSSR?.bind(v1Adapter),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an adapter is V2 compatible\r\n */\r\nexport function isV2Adapter(adapter: unknown): adapter is UIAdapterV2 {\r\n return (\r\n adapter !== null &&\r\n typeof adapter === 'object' &&\r\n 'id' in adapter &&\r\n 'tier' in adapter &&\r\n 'capabilities' in adapter\r\n );\r\n}\r\n\r\n/**\r\n * Check if an adapter supports a specific capability\r\n */\r\nexport function hasCapability(\r\n adapter: UIAdapterV2,\r\n capability: keyof AdapterCapabilities\r\n): boolean {\r\n return adapter.capabilities[capability] === true;\r\n}\r\n\r\n/**\r\n * Get all capabilities of an adapter as an array\r\n */\r\nexport function getCapabilities(adapter: UIAdapterV2): (keyof AdapterCapabilities)[] {\r\n return (Object.entries(adapter.capabilities) as [keyof AdapterCapabilities, boolean][])\r\n .filter(([, enabled]) => enabled)\r\n .map(([capability]) => capability);\r\n}\r\n","/**\r\n * @flightdev/ui - Adapter Registry\r\n *\r\n * Global registry for dynamic adapter loading and discovery.\r\n * Enables lazy loading of adapters to minimize bundle size.\r\n *\r\n * @module @flightdev/ui/core/registry\r\n * @version 2.0.0\r\n */\r\n\r\nimport type { UIAdapterV2, AdapterTier, AdapterCapabilities } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Lazy loader function for an adapter\r\n */\r\nexport type AdapterLoader = () => Promise<UIAdapterV2>;\r\n\r\n/**\r\n * Adapter metadata for registry\r\n */\r\nexport interface AdapterMetadata {\r\n /** Unique adapter ID */\r\n id: string;\r\n\r\n /** Human-readable name */\r\n name: string;\r\n\r\n /** Framework name */\r\n framework: string;\r\n\r\n /** Tier classification */\r\n tier: AdapterTier;\r\n\r\n /** Capability hints (may be incomplete until loaded) */\r\n capabilities?: Partial<AdapterCapabilities>;\r\n\r\n /** Peer dependencies required */\r\n peerDependencies?: string[];\r\n\r\n /** Lazy loader function */\r\n loader: AdapterLoader;\r\n}\r\n\r\n/**\r\n * Registry query options\r\n */\r\nexport interface RegistryQueryOptions {\r\n /** Filter by tier */\r\n tier?: AdapterTier;\r\n\r\n /** Filter by capability */\r\n capability?: keyof AdapterCapabilities;\r\n\r\n /** Filter by framework name pattern */\r\n framework?: string | RegExp;\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Registry Class\r\n// ============================================================================\r\n\r\n/**\r\n * Global adapter registry for dynamic loading and discovery.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { adapterRegistry } from '@flightdev/ui';\r\n *\r\n * // Register an adapter\r\n * adapterRegistry.register({\r\n * id: 'react',\r\n * name: 'React',\r\n * framework: 'react',\r\n * tier: 'tier-1',\r\n * loader: () => import('./adapters/tier-1/react.js').then(m => m.react()),\r\n * });\r\n *\r\n * // Get an adapter\r\n * const reactAdapter = await adapterRegistry.get('react');\r\n *\r\n * // List all adapters\r\n * const allAdapters = adapterRegistry.list();\r\n * ```\r\n */\r\nclass AdapterRegistry {\r\n private metadata = new Map<string, AdapterMetadata>();\r\n private instances = new Map<string, UIAdapterV2>();\r\n private loading = new Map<string, Promise<UIAdapterV2>>();\r\n\r\n /**\r\n * Register an adapter with the registry.\r\n */\r\n register(metadata: AdapterMetadata): void {\r\n if (this.metadata.has(metadata.id)) {\r\n console.warn(`[AdapterRegistry] Overwriting existing adapter: ${metadata.id}`);\r\n }\r\n this.metadata.set(metadata.id, metadata);\r\n }\r\n\r\n /**\r\n * Register multiple adapters at once.\r\n */\r\n registerAll(adapters: AdapterMetadata[]): void {\r\n for (const adapter of adapters) {\r\n this.register(adapter);\r\n }\r\n }\r\n\r\n /**\r\n * Unregister an adapter.\r\n */\r\n unregister(id: string): boolean {\r\n this.instances.delete(id);\r\n this.loading.delete(id);\r\n return this.metadata.delete(id);\r\n }\r\n\r\n /**\r\n * Check if an adapter is registered.\r\n */\r\n has(id: string): boolean {\r\n return this.metadata.has(id);\r\n }\r\n\r\n /**\r\n * Get an adapter by ID (lazy loads if not already loaded).\r\n */\r\n async get(id: string): Promise<UIAdapterV2 | undefined> {\r\n // Check if already loaded\r\n const existing = this.instances.get(id);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n // Check if currently loading\r\n const loadingPromise = this.loading.get(id);\r\n if (loadingPromise) {\r\n return loadingPromise;\r\n }\r\n\r\n // Check if registered\r\n const meta = this.metadata.get(id);\r\n if (!meta) {\r\n return undefined;\r\n }\r\n\r\n // Load the adapter\r\n const promise = this.loadAdapter(meta);\r\n this.loading.set(id, promise);\r\n\r\n try {\r\n const adapter = await promise;\r\n this.instances.set(id, adapter);\r\n this.loading.delete(id);\r\n return adapter;\r\n } catch (error) {\r\n this.loading.delete(id);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get an adapter synchronously (only if already loaded).\r\n */\r\n getSync(id: string): UIAdapterV2 | undefined {\r\n return this.instances.get(id);\r\n }\r\n\r\n /**\r\n * Get adapter metadata without loading.\r\n */\r\n getMetadata(id: string): AdapterMetadata | undefined {\r\n return this.metadata.get(id);\r\n }\r\n\r\n /**\r\n * List all registered adapter IDs.\r\n */\r\n list(): string[] {\r\n return Array.from(this.metadata.keys());\r\n }\r\n\r\n /**\r\n * List adapters matching query options.\r\n */\r\n query(options: RegistryQueryOptions): AdapterMetadata[] {\r\n const results: AdapterMetadata[] = [];\r\n\r\n for (const meta of this.metadata.values()) {\r\n // Filter by tier\r\n if (options.tier && meta.tier !== options.tier) {\r\n continue;\r\n }\r\n\r\n // Filter by capability\r\n if (options.capability && !meta.capabilities?.[options.capability]) {\r\n continue;\r\n }\r\n\r\n // Filter by framework\r\n if (options.framework) {\r\n if (typeof options.framework === 'string') {\r\n if (!meta.framework.includes(options.framework)) {\r\n continue;\r\n }\r\n } else if (!options.framework.test(meta.framework)) {\r\n continue;\r\n }\r\n }\r\n\r\n results.push(meta);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * List adapters by tier.\r\n */\r\n listByTier(tier: AdapterTier): string[] {\r\n return this.query({ tier }).map((m) => m.id);\r\n }\r\n\r\n /**\r\n * List adapters by capability.\r\n */\r\n listByCapability(capability: keyof AdapterCapabilities): string[] {\r\n return this.query({ capability }).map((m) => m.id);\r\n }\r\n\r\n /**\r\n * Preload adapters for faster access later.\r\n */\r\n async preload(ids: string[]): Promise<void> {\r\n await Promise.all(ids.map((id) => this.get(id)));\r\n }\r\n\r\n /**\r\n * Get all loaded adapters.\r\n */\r\n getLoaded(): Map<string, UIAdapterV2> {\r\n return new Map(this.instances);\r\n }\r\n\r\n /**\r\n * Clear all cached adapter instances (but keep registrations).\r\n */\r\n clearCache(): void {\r\n this.instances.clear();\r\n this.loading.clear();\r\n }\r\n\r\n /**\r\n * Clear everything (registrations and cache).\r\n */\r\n clear(): void {\r\n this.metadata.clear();\r\n this.instances.clear();\r\n this.loading.clear();\r\n }\r\n\r\n /**\r\n * Get registry statistics.\r\n */\r\n stats(): {\r\n registered: number;\r\n loaded: number;\r\n loading: number;\r\n byTier: Record<AdapterTier, number>;\r\n } {\r\n const byTier: Record<AdapterTier, number> = {\r\n 'tier-1': 0,\r\n 'tier-2': 0,\r\n 'tier-3': 0,\r\n };\r\n\r\n for (const meta of this.metadata.values()) {\r\n byTier[meta.tier]++;\r\n }\r\n\r\n return {\r\n registered: this.metadata.size,\r\n loaded: this.instances.size,\r\n loading: this.loading.size,\r\n byTier,\r\n };\r\n }\r\n\r\n /**\r\n * Load an adapter from metadata.\r\n */\r\n private async loadAdapter(meta: AdapterMetadata): Promise<UIAdapterV2> {\r\n try {\r\n const adapter = await meta.loader();\r\n\r\n // Initialize if needed\r\n if (adapter.init) {\r\n await adapter.init();\r\n }\r\n\r\n return adapter;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new Error(\r\n `[AdapterRegistry] Failed to load adapter '${meta.id}': ${message}\\n` +\r\n `Required peer dependencies: ${meta.peerDependencies?.join(', ') ?? 'none'}`\r\n );\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Global Registry Instance\r\n// ============================================================================\r\n\r\n/**\r\n * Global adapter registry instance.\r\n *\r\n * Use this to register and retrieve UI adapters.\r\n */\r\nexport const adapterRegistry = new AdapterRegistry();\r\n\r\n// ============================================================================\r\n// Built-in Adapter Registrations\r\n// ============================================================================\r\n\r\n/**\r\n * Register all built-in adapters.\r\n * Called automatically when the package is imported.\r\n */\r\nexport function registerBuiltinAdapters(): void {\r\n // Tier 1: Full Support\r\n adapterRegistry.register({\r\n id: 'react',\r\n name: 'React',\r\n framework: 'react',\r\n tier: 'tier-1',\r\n capabilities: { streaming: true, partialHydration: true, serverComponents: true },\r\n peerDependencies: ['react', 'react-dom'],\r\n loader: () => import('@flightdev/ui-react').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'vue',\r\n name: 'Vue',\r\n framework: 'vue',\r\n tier: 'tier-1',\r\n capabilities: { streaming: true, partialHydration: true },\r\n peerDependencies: ['vue'],\r\n loader: () => import('@flightdev/ui-vue').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'svelte',\r\n name: 'Svelte',\r\n framework: 'svelte',\r\n tier: 'tier-1',\r\n capabilities: { streaming: false, partialHydration: true },\r\n peerDependencies: ['svelte'],\r\n loader: () => import('@flightdev/ui-svelte').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'solid',\r\n name: 'Solid',\r\n framework: 'solid',\r\n tier: 'tier-1',\r\n capabilities: { streaming: true, partialHydration: true },\r\n peerDependencies: ['solid-js'],\r\n loader: () => import('@flightdev/ui-solid').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'angular',\r\n name: 'Angular',\r\n framework: 'angular',\r\n tier: 'tier-1',\r\n capabilities: { streaming: true, partialHydration: true },\r\n peerDependencies: ['@angular/core', '@angular/platform-server', '@angular/platform-browser'],\r\n loader: () => import('@flightdev/ui-angular').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'qwik',\r\n name: 'Qwik',\r\n framework: 'qwik',\r\n tier: 'tier-1',\r\n capabilities: { streaming: true, resumable: true, partialHydration: true },\r\n peerDependencies: ['@builder.io/qwik'],\r\n loader: () => import('@flightdev/ui-qwik').then((m) => m.default()),\r\n });\r\n\r\n // Tier 2: Standard Support\r\n adapterRegistry.register({\r\n id: 'preact',\r\n name: 'Preact',\r\n framework: 'preact',\r\n tier: 'tier-2',\r\n capabilities: { streaming: false, partialHydration: true },\r\n peerDependencies: ['preact'],\r\n loader: () => import('@flightdev/ui-preact').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'lit',\r\n name: 'Lit',\r\n framework: 'lit',\r\n tier: 'tier-2',\r\n capabilities: { islands: true },\r\n peerDependencies: ['lit'],\r\n loader: () => import('@flightdev/ui-lit').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'marko',\r\n name: 'Marko',\r\n framework: 'marko',\r\n tier: 'tier-2',\r\n capabilities: { streaming: true, partialHydration: true, islands: true },\r\n peerDependencies: ['marko'],\r\n loader: () => import('@flightdev/ui-marko').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'stencil',\r\n name: 'Stencil',\r\n framework: 'stencil',\r\n tier: 'tier-2',\r\n capabilities: { islands: true },\r\n peerDependencies: ['@stencil/core'],\r\n loader: () => import('@flightdev/ui-stencil').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'mithril',\r\n name: 'Mithril',\r\n framework: 'mithril',\r\n tier: 'tier-2',\r\n capabilities: {},\r\n peerDependencies: ['mithril'],\r\n loader: () => import('@flightdev/ui-mithril').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'inferno',\r\n name: 'Inferno',\r\n framework: 'inferno',\r\n tier: 'tier-2',\r\n capabilities: { streaming: false },\r\n peerDependencies: ['inferno'],\r\n loader: () => import('@flightdev/ui-inferno').then((m) => m.default()),\r\n });\r\n\r\n // Tier 3: HTML-First\r\n adapterRegistry.register({\r\n id: 'htmx',\r\n name: 'HTMX',\r\n framework: 'htmx',\r\n tier: 'tier-3',\r\n capabilities: {},\r\n peerDependencies: [],\r\n loader: () => import('@flightdev/ui-htmx').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'alpine',\r\n name: 'Alpine.js',\r\n framework: 'alpine',\r\n tier: 'tier-3',\r\n capabilities: {},\r\n peerDependencies: [],\r\n loader: () => import('@flightdev/ui-alpine').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'hotwire',\r\n name: 'Hotwire',\r\n framework: 'hotwire',\r\n tier: 'tier-3',\r\n capabilities: {},\r\n peerDependencies: ['@hotwired/turbo'],\r\n loader: () => import('@flightdev/ui-hotwire').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'stimulus',\r\n name: 'Stimulus',\r\n framework: 'stimulus',\r\n tier: 'tier-3',\r\n capabilities: {},\r\n peerDependencies: ['@hotwired/stimulus'],\r\n loader: () => import('@flightdev/ui-stimulus').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'petite-vue',\r\n name: 'Petite-vue',\r\n framework: 'petite-vue',\r\n tier: 'tier-3',\r\n capabilities: {},\r\n peerDependencies: ['petite-vue'],\r\n loader: () => import('@flightdev/ui-petite-vue').then((m) => m.default()),\r\n });\r\n\r\n adapterRegistry.register({\r\n id: 'vanilla',\r\n name: 'Vanilla Web Components',\r\n framework: 'vanilla',\r\n tier: 'tier-3',\r\n capabilities: { islands: true },\r\n peerDependencies: [],\r\n loader: () => import('@flightdev/ui-vanilla').then((m) => m.default()),\r\n });\r\n}\r\n"],"mappings":"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","names":[]}
|