@useavalon/avalon 0.1.11 → 0.1.13
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 +54 -54
- package/mod.ts +302 -302
- package/package.json +49 -26
- package/src/build/integration-bundler-plugin.ts +116 -116
- package/src/build/integration-config.ts +168 -168
- package/src/build/integration-detection-plugin.ts +117 -117
- package/src/build/integration-resolver-plugin.ts +90 -90
- package/src/build/island-manifest.ts +269 -269
- package/src/build/island-types-generator.ts +476 -476
- package/src/build/mdx-island-transform.ts +464 -464
- package/src/build/mdx-plugin.ts +98 -98
- package/src/build/page-island-transform.ts +598 -598
- package/src/build/prop-extractors/index.ts +21 -21
- package/src/build/prop-extractors/lit.ts +140 -140
- package/src/build/prop-extractors/qwik.ts +16 -16
- package/src/build/prop-extractors/solid.ts +125 -125
- package/src/build/prop-extractors/svelte.ts +194 -194
- package/src/build/prop-extractors/vue.ts +111 -111
- package/src/build/sidecar-file-manager.ts +104 -104
- package/src/build/sidecar-renderer.ts +30 -30
- package/src/client/adapters/index.ts +21 -13
- package/src/client/components.ts +35 -35
- package/src/client/css-hmr-handler.ts +344 -344
- package/src/client/framework-adapter.ts +462 -462
- package/src/client/hmr-coordinator.ts +396 -396
- package/src/client/hmr-error-overlay.js +533 -533
- package/src/client/main.js +824 -816
- package/src/client/types/framework-runtime.d.ts +68 -68
- package/src/client/types/vite-hmr.d.ts +46 -46
- package/src/client/types/vite-virtual-modules.d.ts +70 -60
- package/src/components/Image.tsx +123 -123
- package/src/components/IslandErrorBoundary.tsx +145 -145
- package/src/components/LayoutDataErrorBoundary.tsx +141 -141
- package/src/components/LayoutErrorBoundary.tsx +127 -127
- package/src/components/PersistentIsland.tsx +52 -52
- package/src/components/StreamingErrorBoundary.tsx +233 -233
- package/src/components/StreamingLayout.tsx +538 -538
- package/src/core/components/component-analyzer.ts +192 -192
- package/src/core/components/component-detection.ts +508 -508
- package/src/core/components/enhanced-framework-detector.ts +500 -500
- package/src/core/components/framework-registry.ts +563 -563
- package/src/core/content/mdx-processor.ts +46 -46
- package/src/core/integrations/index.ts +19 -19
- package/src/core/integrations/loader.ts +125 -125
- package/src/core/integrations/registry.ts +175 -175
- package/src/core/islands/island-persistence.ts +325 -325
- package/src/core/islands/island-state-serializer.ts +258 -258
- package/src/core/islands/persistent-island-context.tsx +80 -80
- package/src/core/islands/use-persistent-state.ts +68 -68
- package/src/core/layout/enhanced-layout-resolver.ts +322 -322
- package/src/core/layout/layout-cache-manager.ts +485 -485
- package/src/core/layout/layout-composer.ts +357 -357
- package/src/core/layout/layout-data-loader.ts +516 -516
- package/src/core/layout/layout-discovery.ts +243 -243
- package/src/core/layout/layout-matcher.ts +299 -299
- package/src/core/layout/layout-types.ts +110 -110
- package/src/core/modules/framework-module-resolver.ts +273 -273
- package/src/islands/component-analysis.ts +213 -213
- package/src/islands/css-utils.ts +565 -565
- package/src/islands/discovery/index.ts +80 -80
- package/src/islands/discovery/registry.ts +340 -340
- package/src/islands/discovery/resolver.ts +477 -477
- package/src/islands/discovery/scanner.ts +386 -386
- package/src/islands/discovery/types.ts +117 -117
- package/src/islands/discovery/validator.ts +544 -544
- package/src/islands/discovery/watcher.ts +368 -368
- package/src/islands/framework-detection.ts +428 -428
- package/src/islands/integration-loader.ts +490 -490
- package/src/islands/island.tsx +565 -565
- package/src/islands/render-cache.ts +550 -550
- package/src/islands/types.ts +80 -80
- package/src/islands/universal-css-collector.ts +157 -157
- package/src/islands/universal-head-collector.ts +137 -137
- package/src/layout-system.d.ts +592 -592
- package/src/layout-system.ts +218 -218
- package/src/middleware/discovery.ts +268 -268
- package/src/middleware/executor.ts +315 -315
- package/src/middleware/index.ts +76 -76
- package/src/middleware/types.ts +99 -99
- package/src/nitro/build-config.ts +575 -575
- package/src/nitro/config.ts +483 -483
- package/src/nitro/error-handler.ts +636 -636
- package/src/nitro/index.ts +173 -173
- package/src/nitro/island-manifest.ts +584 -584
- package/src/nitro/middleware-adapter.ts +260 -260
- package/src/nitro/renderer.ts +1471 -1471
- package/src/nitro/route-discovery.ts +439 -439
- package/src/nitro/types.ts +321 -321
- package/src/render/collect-css.ts +198 -198
- package/src/render/error-pages.ts +79 -79
- package/src/render/isolated-ssr-renderer.ts +654 -654
- package/src/render/ssr.ts +1030 -1030
- package/src/schemas/api.ts +30 -30
- package/src/schemas/core.ts +64 -64
- package/src/schemas/index.ts +212 -212
- package/src/schemas/layout.ts +279 -279
- package/src/schemas/routing/index.ts +38 -38
- package/src/schemas/routing.ts +376 -376
- package/src/types/as-island.ts +20 -20
- package/src/types/image.d.ts +106 -106
- package/src/types/index.d.ts +22 -22
- package/src/types/island-jsx.d.ts +33 -33
- package/src/types/island-prop.d.ts +20 -20
- package/src/types/layout.ts +285 -285
- package/src/types/mdx.d.ts +6 -6
- package/src/types/routing.ts +555 -555
- package/src/types/types.ts +5 -5
- package/src/types/urlpattern.d.ts +49 -49
- package/src/types/vite-env.d.ts +11 -11
- package/src/utils/dev-logger.ts +299 -299
- package/src/utils/fs.ts +151 -151
- package/src/vite-plugin/auto-discover.ts +551 -551
- package/src/vite-plugin/config.ts +266 -266
- package/src/vite-plugin/errors.ts +127 -127
- package/src/vite-plugin/image-optimization.ts +156 -156
- package/src/vite-plugin/integration-activator.ts +126 -126
- package/src/vite-plugin/island-sidecar-plugin.ts +176 -176
- package/src/vite-plugin/module-discovery.ts +189 -189
- package/src/vite-plugin/nitro-integration.ts +1354 -1354
- package/src/vite-plugin/plugin.ts +403 -409
- package/src/vite-plugin/types.ts +327 -327
- package/src/vite-plugin/validation.ts +228 -228
- package/src/client/adapters/index.js +0 -12
- package/src/client/adapters/lit-adapter.js +0 -467
- package/src/client/adapters/lit-adapter.ts +0 -654
- package/src/client/adapters/preact-adapter.js +0 -223
- package/src/client/adapters/preact-adapter.ts +0 -331
- package/src/client/adapters/qwik-adapter.js +0 -259
- package/src/client/adapters/qwik-adapter.ts +0 -345
- package/src/client/adapters/react-adapter.js +0 -220
- package/src/client/adapters/react-adapter.ts +0 -353
- package/src/client/adapters/solid-adapter.js +0 -295
- package/src/client/adapters/solid-adapter.ts +0 -451
- package/src/client/adapters/svelte-adapter.js +0 -368
- package/src/client/adapters/svelte-adapter.ts +0 -524
- package/src/client/adapters/vue-adapter.js +0 -278
- package/src/client/adapters/vue-adapter.ts +0 -467
- package/src/client/components.js +0 -23
- package/src/client/css-hmr-handler.js +0 -263
- package/src/client/framework-adapter.js +0 -283
- package/src/client/hmr-coordinator.js +0 -274
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { extname } from 'node:path';
|
|
2
|
-
import { readFile } from 'node:fs/promises';
|
|
3
|
-
import { h } from 'preact';
|
|
4
|
-
import { marked } from 'marked';
|
|
5
|
-
import type { RoutePageModule } from '../../schemas/routing.ts';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Server-side MDX processor for handling MDX files in the routing system
|
|
9
|
-
*/
|
|
10
|
-
export class MDXProcessor {
|
|
11
|
-
/**
|
|
12
|
-
* Process an MDX file and return a valid page module
|
|
13
|
-
*/
|
|
14
|
-
async processMDXFile(filePath: string): Promise<RoutePageModule> {
|
|
15
|
-
try {
|
|
16
|
-
// Read the MDX file content
|
|
17
|
-
const content = await readFile(filePath, 'utf-8');
|
|
18
|
-
|
|
19
|
-
// Process markdown content using marked library
|
|
20
|
-
const component = () => {
|
|
21
|
-
const htmlContent = marked(content);
|
|
22
|
-
return h('div', {
|
|
23
|
-
dangerouslySetInnerHTML: { __html: htmlContent },
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// Return a module-like object that matches RoutePageModule interface
|
|
28
|
-
return {
|
|
29
|
-
default: component,
|
|
30
|
-
// Add any other required exports
|
|
31
|
-
};
|
|
32
|
-
} catch (error) {
|
|
33
|
-
throw new Error(
|
|
34
|
-
`Failed to process MDX file ${filePath}: ${error instanceof Error ? error.message : String(error)}`
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Check if a file is an MDX file
|
|
41
|
-
*/
|
|
42
|
-
static isMDXFile(filePath: string): boolean {
|
|
43
|
-
const ext = extname(filePath);
|
|
44
|
-
return ext === '.mdx' || ext === '.md';
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
import { extname } from 'node:path';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { h } from 'preact';
|
|
4
|
+
import { marked } from 'marked';
|
|
5
|
+
import type { RoutePageModule } from '../../schemas/routing.ts';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Server-side MDX processor for handling MDX files in the routing system
|
|
9
|
+
*/
|
|
10
|
+
export class MDXProcessor {
|
|
11
|
+
/**
|
|
12
|
+
* Process an MDX file and return a valid page module
|
|
13
|
+
*/
|
|
14
|
+
async processMDXFile(filePath: string): Promise<RoutePageModule> {
|
|
15
|
+
try {
|
|
16
|
+
// Read the MDX file content
|
|
17
|
+
const content = await readFile(filePath, 'utf-8');
|
|
18
|
+
|
|
19
|
+
// Process markdown content using marked library
|
|
20
|
+
const component = () => {
|
|
21
|
+
const htmlContent = marked(content);
|
|
22
|
+
return h('div', {
|
|
23
|
+
dangerouslySetInnerHTML: { __html: htmlContent },
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Return a module-like object that matches RoutePageModule interface
|
|
28
|
+
return {
|
|
29
|
+
default: component,
|
|
30
|
+
// Add any other required exports
|
|
31
|
+
};
|
|
32
|
+
} catch (error) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
`Failed to process MDX file ${filePath}: ${error instanceof Error ? error.message : String(error)}`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Check if a file is an MDX file
|
|
41
|
+
*/
|
|
42
|
+
static isMDXFile(filePath: string): boolean {
|
|
43
|
+
const ext = extname(filePath);
|
|
44
|
+
return ext === '.mdx' || ext === '.md';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration system exports
|
|
3
|
-
* Central export point for all integration-related functionality
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Registry
|
|
7
|
-
export { IntegrationRegistry, registry } from "./registry.ts";
|
|
8
|
-
|
|
9
|
-
// Loader
|
|
10
|
-
export {
|
|
11
|
-
loadIntegration,
|
|
12
|
-
detectAndLoadIntegration,
|
|
13
|
-
detectFrameworkFromPath,
|
|
14
|
-
detectFrameworkFromContent,
|
|
15
|
-
preloadIntegrations,
|
|
16
|
-
getLoadedIntegrations,
|
|
17
|
-
clearIntegrationCache,
|
|
18
|
-
isIntegrationLoaded,
|
|
19
|
-
} from "./loader.ts";
|
|
1
|
+
/**
|
|
2
|
+
* Integration system exports
|
|
3
|
+
* Central export point for all integration-related functionality
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Registry
|
|
7
|
+
export { IntegrationRegistry, registry } from "./registry.ts";
|
|
8
|
+
|
|
9
|
+
// Loader
|
|
10
|
+
export {
|
|
11
|
+
loadIntegration,
|
|
12
|
+
detectAndLoadIntegration,
|
|
13
|
+
detectFrameworkFromPath,
|
|
14
|
+
detectFrameworkFromContent,
|
|
15
|
+
preloadIntegrations,
|
|
16
|
+
getLoadedIntegrations,
|
|
17
|
+
clearIntegrationCache,
|
|
18
|
+
isIntegrationLoaded,
|
|
19
|
+
} from "./loader.ts";
|
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
import { registry } from "./registry.ts";
|
|
2
|
-
import type { Integration } from "@useavalon/core";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Cache for loaded integrations to avoid repeated dynamic imports
|
|
6
|
-
*/
|
|
7
|
-
const integrationCache = new Map<string, Integration>();
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Load an integration by name, using cache if available
|
|
11
|
-
*/
|
|
12
|
-
export async function loadIntegration(framework: string): Promise<Integration> {
|
|
13
|
-
// Check cache first
|
|
14
|
-
if (integrationCache.has(framework)) {
|
|
15
|
-
return integrationCache.get(framework)!;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Load from registry (which handles dynamic imports)
|
|
19
|
-
const integration = await registry.load(framework);
|
|
20
|
-
|
|
21
|
-
// Cache the loaded integration
|
|
22
|
-
integrationCache.set(framework, integration);
|
|
23
|
-
|
|
24
|
-
return integration;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Detect framework from file path and load the appropriate integration
|
|
29
|
-
*/
|
|
30
|
-
export async function detectAndLoadIntegration(src: string): Promise<Integration> {
|
|
31
|
-
const framework = detectFrameworkFromPath(src);
|
|
32
|
-
return await loadIntegration(framework);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Detect framework from file path based on extension and naming conventions
|
|
37
|
-
*/
|
|
38
|
-
export function detectFrameworkFromPath(src: string): string {
|
|
39
|
-
// Vue files
|
|
40
|
-
if (src.endsWith(".vue")) {
|
|
41
|
-
return "vue";
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Svelte files
|
|
45
|
-
if (src.endsWith(".svelte")) {
|
|
46
|
-
return "svelte";
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Solid files (convention: .solid.tsx or .solid.jsx)
|
|
50
|
-
if (src.includes(".solid.")) {
|
|
51
|
-
return "solid";
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Qwik files (convention: .qwik.tsx or .qwik.jsx)
|
|
55
|
-
if (src.includes(".qwik.")) {
|
|
56
|
-
return "qwik";
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Default to Preact for .tsx and .jsx files
|
|
60
|
-
return "preact";
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Detect framework from file content by analyzing imports and patterns
|
|
65
|
-
*/
|
|
66
|
-
export function detectFrameworkFromContent(
|
|
67
|
-
src: string,
|
|
68
|
-
content?: string
|
|
69
|
-
): string {
|
|
70
|
-
// First try path-based detection
|
|
71
|
-
const pathFramework = detectFrameworkFromPath(src);
|
|
72
|
-
|
|
73
|
-
// If we have a definitive answer from path, use it
|
|
74
|
-
if (pathFramework !== "preact" || !content) {
|
|
75
|
-
return pathFramework;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// For .tsx/.jsx files, analyze content to distinguish between Preact and Solid
|
|
79
|
-
if (content.includes("solid-js")) {
|
|
80
|
-
return "solid";
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (content.includes("@builder.io/qwik")) {
|
|
84
|
-
return "qwik";
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (content.includes("preact")) {
|
|
88
|
-
return "preact";
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Default to Preact
|
|
92
|
-
return "preact";
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Preload integrations for the given frameworks
|
|
97
|
-
* Useful for warming up the cache during build or startup
|
|
98
|
-
*/
|
|
99
|
-
export async function preloadIntegrations(frameworks: string[]): Promise<void> {
|
|
100
|
-
await Promise.all(
|
|
101
|
-
frameworks.map(framework => loadIntegration(framework))
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Get all currently loaded integrations
|
|
107
|
-
*/
|
|
108
|
-
export function getLoadedIntegrations(): Integration[] {
|
|
109
|
-
return Array.from(integrationCache.values());
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Clear the integration cache
|
|
114
|
-
* Useful for testing or hot module replacement
|
|
115
|
-
*/
|
|
116
|
-
export function clearIntegrationCache(): void {
|
|
117
|
-
integrationCache.clear();
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Check if an integration is loaded in cache
|
|
122
|
-
*/
|
|
123
|
-
export function isIntegrationLoaded(framework: string): boolean {
|
|
124
|
-
return integrationCache.has(framework);
|
|
125
|
-
}
|
|
1
|
+
import { registry } from "./registry.ts";
|
|
2
|
+
import type { Integration } from "@useavalon/core";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Cache for loaded integrations to avoid repeated dynamic imports
|
|
6
|
+
*/
|
|
7
|
+
const integrationCache = new Map<string, Integration>();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load an integration by name, using cache if available
|
|
11
|
+
*/
|
|
12
|
+
export async function loadIntegration(framework: string): Promise<Integration> {
|
|
13
|
+
// Check cache first
|
|
14
|
+
if (integrationCache.has(framework)) {
|
|
15
|
+
return integrationCache.get(framework)!;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Load from registry (which handles dynamic imports)
|
|
19
|
+
const integration = await registry.load(framework);
|
|
20
|
+
|
|
21
|
+
// Cache the loaded integration
|
|
22
|
+
integrationCache.set(framework, integration);
|
|
23
|
+
|
|
24
|
+
return integration;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Detect framework from file path and load the appropriate integration
|
|
29
|
+
*/
|
|
30
|
+
export async function detectAndLoadIntegration(src: string): Promise<Integration> {
|
|
31
|
+
const framework = detectFrameworkFromPath(src);
|
|
32
|
+
return await loadIntegration(framework);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Detect framework from file path based on extension and naming conventions
|
|
37
|
+
*/
|
|
38
|
+
export function detectFrameworkFromPath(src: string): string {
|
|
39
|
+
// Vue files
|
|
40
|
+
if (src.endsWith(".vue")) {
|
|
41
|
+
return "vue";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Svelte files
|
|
45
|
+
if (src.endsWith(".svelte")) {
|
|
46
|
+
return "svelte";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Solid files (convention: .solid.tsx or .solid.jsx)
|
|
50
|
+
if (src.includes(".solid.")) {
|
|
51
|
+
return "solid";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Qwik files (convention: .qwik.tsx or .qwik.jsx)
|
|
55
|
+
if (src.includes(".qwik.")) {
|
|
56
|
+
return "qwik";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Default to Preact for .tsx and .jsx files
|
|
60
|
+
return "preact";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Detect framework from file content by analyzing imports and patterns
|
|
65
|
+
*/
|
|
66
|
+
export function detectFrameworkFromContent(
|
|
67
|
+
src: string,
|
|
68
|
+
content?: string
|
|
69
|
+
): string {
|
|
70
|
+
// First try path-based detection
|
|
71
|
+
const pathFramework = detectFrameworkFromPath(src);
|
|
72
|
+
|
|
73
|
+
// If we have a definitive answer from path, use it
|
|
74
|
+
if (pathFramework !== "preact" || !content) {
|
|
75
|
+
return pathFramework;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// For .tsx/.jsx files, analyze content to distinguish between Preact and Solid
|
|
79
|
+
if (content.includes("solid-js")) {
|
|
80
|
+
return "solid";
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (content.includes("@builder.io/qwik")) {
|
|
84
|
+
return "qwik";
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (content.includes("preact")) {
|
|
88
|
+
return "preact";
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Default to Preact
|
|
92
|
+
return "preact";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Preload integrations for the given frameworks
|
|
97
|
+
* Useful for warming up the cache during build or startup
|
|
98
|
+
*/
|
|
99
|
+
export async function preloadIntegrations(frameworks: string[]): Promise<void> {
|
|
100
|
+
await Promise.all(
|
|
101
|
+
frameworks.map(framework => loadIntegration(framework))
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get all currently loaded integrations
|
|
107
|
+
*/
|
|
108
|
+
export function getLoadedIntegrations(): Integration[] {
|
|
109
|
+
return Array.from(integrationCache.values());
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Clear the integration cache
|
|
114
|
+
* Useful for testing or hot module replacement
|
|
115
|
+
*/
|
|
116
|
+
export function clearIntegrationCache(): void {
|
|
117
|
+
integrationCache.clear();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Check if an integration is loaded in cache
|
|
122
|
+
*/
|
|
123
|
+
export function isIntegrationLoaded(framework: string): boolean {
|
|
124
|
+
return integrationCache.has(framework);
|
|
125
|
+
}
|