@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.
Files changed (120) hide show
  1. package/README.md +283 -68
  2. package/dist/{chunk-XTDK7ME5.js → chunk-S4DTUQII.js} +246 -19
  3. package/dist/chunk-S4DTUQII.js.map +1 -0
  4. package/dist/core/index.d.ts +423 -3
  5. package/dist/core/index.js +23 -2
  6. package/dist/core/index.js.map +1 -0
  7. package/dist/index.d.ts +2 -3
  8. package/dist/index.js +29 -5
  9. package/dist/index.js.map +1 -0
  10. package/package.json +7 -183
  11. package/.turbo/turbo-build.log +0 -81
  12. package/.turbo/turbo-lint.log +0 -40
  13. package/.turbo/turbo-typecheck.log +0 -4
  14. package/TESTING.md +0 -124
  15. package/dist/adapter-MMD-iHNx.d.ts +0 -424
  16. package/dist/adapters/tier-1/angular.d.ts +0 -60
  17. package/dist/adapters/tier-1/angular.js +0 -2
  18. package/dist/adapters/tier-1/index.d.ts +0 -7
  19. package/dist/adapters/tier-1/index.js +0 -7
  20. package/dist/adapters/tier-1/qwik.d.ts +0 -55
  21. package/dist/adapters/tier-1/qwik.js +0 -2
  22. package/dist/adapters/tier-1/react.d.ts +0 -67
  23. package/dist/adapters/tier-1/react.js +0 -2
  24. package/dist/adapters/tier-1/solid.d.ts +0 -45
  25. package/dist/adapters/tier-1/solid.js +0 -2
  26. package/dist/adapters/tier-1/svelte.d.ts +0 -48
  27. package/dist/adapters/tier-1/svelte.js +0 -2
  28. package/dist/adapters/tier-1/vue.d.ts +0 -47
  29. package/dist/adapters/tier-1/vue.js +0 -2
  30. package/dist/adapters/tier-2/index.d.ts +0 -7
  31. package/dist/adapters/tier-2/index.js +0 -7
  32. package/dist/adapters/tier-2/inferno.d.ts +0 -31
  33. package/dist/adapters/tier-2/inferno.js +0 -2
  34. package/dist/adapters/tier-2/lit.d.ts +0 -34
  35. package/dist/adapters/tier-2/lit.js +0 -2
  36. package/dist/adapters/tier-2/marko.d.ts +0 -59
  37. package/dist/adapters/tier-2/marko.js +0 -2
  38. package/dist/adapters/tier-2/mithril.d.ts +0 -31
  39. package/dist/adapters/tier-2/mithril.js +0 -2
  40. package/dist/adapters/tier-2/preact.d.ts +0 -33
  41. package/dist/adapters/tier-2/preact.js +0 -2
  42. package/dist/adapters/tier-2/stencil.d.ts +0 -52
  43. package/dist/adapters/tier-2/stencil.js +0 -2
  44. package/dist/adapters/tier-3/alpine.d.ts +0 -73
  45. package/dist/adapters/tier-3/alpine.js +0 -2
  46. package/dist/adapters/tier-3/hotwire.d.ts +0 -71
  47. package/dist/adapters/tier-3/hotwire.js +0 -2
  48. package/dist/adapters/tier-3/htmx.d.ts +0 -88
  49. package/dist/adapters/tier-3/htmx.js +0 -2
  50. package/dist/adapters/tier-3/index.d.ts +0 -7
  51. package/dist/adapters/tier-3/index.js +0 -7
  52. package/dist/adapters/tier-3/petite-vue.d.ts +0 -56
  53. package/dist/adapters/tier-3/petite-vue.js +0 -2
  54. package/dist/adapters/tier-3/stimulus.d.ts +0 -63
  55. package/dist/adapters/tier-3/stimulus.js +0 -2
  56. package/dist/adapters/tier-3/vanilla.d.ts +0 -63
  57. package/dist/adapters/tier-3/vanilla.js +0 -2
  58. package/dist/chunk-2SNQ6PTM.js +0 -217
  59. package/dist/chunk-3D4XMIZI.js +0 -136
  60. package/dist/chunk-3HU6GSQ4.js +0 -125
  61. package/dist/chunk-4PZDNFL7.js +0 -148
  62. package/dist/chunk-5IBLFTYL.js +0 -114
  63. package/dist/chunk-64JZJ7OK.js +0 -142
  64. package/dist/chunk-7ZJI3QU2.js +0 -132
  65. package/dist/chunk-CE4FJHQJ.js +0 -133
  66. package/dist/chunk-DTCAUBH5.js +0 -87
  67. package/dist/chunk-NTASPOHG.js +0 -106
  68. package/dist/chunk-OI2AMQLG.js +0 -152
  69. package/dist/chunk-Q7HUE44H.js +0 -106
  70. package/dist/chunk-QH3LOWXU.js +0 -155
  71. package/dist/chunk-QIVAK6BH.js +0 -103
  72. package/dist/chunk-V34XPVGK.js +0 -103
  73. package/dist/chunk-VK7ZPMO7.js +0 -221
  74. package/dist/chunk-X6CNUW6T.js +0 -136
  75. package/dist/chunk-YFGSHW5S.js +0 -121
  76. package/dist/chunk-ZAJVSE7J.js +0 -90
  77. package/docs/ADAPTERS.md +0 -946
  78. package/docs/PATTERNS.md +0 -836
  79. package/src/adapters/tier-1/angular.ts +0 -223
  80. package/src/adapters/tier-1/index.ts +0 -12
  81. package/src/adapters/tier-1/qwik.ts +0 -177
  82. package/src/adapters/tier-1/react.ts +0 -330
  83. package/src/adapters/tier-1/solid.ts +0 -222
  84. package/src/adapters/tier-1/svelte.ts +0 -211
  85. package/src/adapters/tier-1/vue.ts +0 -234
  86. package/src/adapters/tier-2/index.ts +0 -12
  87. package/src/adapters/tier-2/inferno.ts +0 -149
  88. package/src/adapters/tier-2/lit.ts +0 -191
  89. package/src/adapters/tier-2/marko.ts +0 -199
  90. package/src/adapters/tier-2/mithril.ts +0 -152
  91. package/src/adapters/tier-2/preact.ts +0 -133
  92. package/src/adapters/tier-2/stencil.ts +0 -214
  93. package/src/adapters/tier-3/alpine.ts +0 -218
  94. package/src/adapters/tier-3/hotwire.ts +0 -254
  95. package/src/adapters/tier-3/htmx.ts +0 -263
  96. package/src/adapters/tier-3/index.ts +0 -12
  97. package/src/adapters/tier-3/petite-vue.ts +0 -163
  98. package/src/adapters/tier-3/stimulus.ts +0 -233
  99. package/src/adapters/tier-3/vanilla.ts +0 -252
  100. package/src/ambient.d.ts +0 -310
  101. package/src/core/adapter.ts +0 -366
  102. package/src/core/index.ts +0 -56
  103. package/src/core/registry.ts +0 -518
  104. package/src/core/types.ts +0 -461
  105. package/src/htmx.ts +0 -134
  106. package/src/index.ts +0 -263
  107. package/test/__mocks__/stencil-core.ts +0 -19
  108. package/test/__mocks__/stencil-hydrate.ts +0 -15
  109. package/test/adapters/tier-1.test.ts +0 -206
  110. package/test/adapters/tier-2.test.ts +0 -175
  111. package/test/adapters/tier-3.test.ts +0 -284
  112. package/test/contracts/adapter.contract.ts +0 -293
  113. package/test/core/core.test.ts +0 -310
  114. package/test/errors/error-handling.test.ts +0 -454
  115. package/test/integration/htmx.integration.test.ts +0 -246
  116. package/test/integration/react.integration.test.ts +0 -271
  117. package/test/integration/registry.integration.test.ts +0 -308
  118. package/tsconfig.json +0 -22
  119. package/tsup.config.ts +0 -93
  120. 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
+ "<": "&lt;",
86
+ ">": "&gt;",
87
+ '"': "&quot;",
88
+ "'": "&#39;"
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('./adapters/tier-1/react.js').then((m) => m.default())
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('./adapters/tier-1/vue.js').then((m) => m.default())
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('./adapters/tier-1/svelte.js').then((m) => m.default())
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('./adapters/tier-1/solid.js').then((m) => m.default())
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('./adapters/tier-1/angular.js').then((m) => m.default())
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('./adapters/tier-1/qwik.js').then((m) => m.default())
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('./adapters/tier-2/preact.js').then((m) => m.default())
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('./adapters/tier-2/lit.js').then((m) => m.default())
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('./adapters/tier-2/marko.js').then((m) => m.default())
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('./adapters/tier-2/stencil.js').then((m) => m.default())
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('./adapters/tier-2/mithril.js').then((m) => m.default())
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('./adapters/tier-2/inferno.js').then((m) => m.default())
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('./adapters/tier-3/htmx.js').then((m) => m.default())
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('./adapters/tier-3/alpine.js').then((m) => m.default())
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('./adapters/tier-3/hotwire.js').then((m) => m.default())
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('./adapters/tier-3/stimulus.js').then((m) => m.default())
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('./adapters/tier-3/petite-vue.js').then((m) => m.default())
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('./adapters/tier-3/vanilla.js').then((m) => m.default())
594
+ loader: () => import("@flightdev/ui-vanilla").then((m) => m.default())
379
595
  });
380
596
  }
381
597
 
382
- export { DEFAULT_CAPABILITIES, TIER_INFO, adapterRegistry, registerBuiltinAdapters };
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 '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\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":[]}