@kosdev-code/kos-ui-plugin 2.1.1 → 2.1.3
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/documentation-generator-BVDETA08.js +1523 -0
- package/documentation-generator-BVDETA08.js.map +1 -0
- package/documentation-generator-CTsesVKL.cjs +266 -0
- package/documentation-generator-CTsesVKL.cjs.map +1 -0
- package/index.cjs +16 -16
- package/index.cjs.map +1 -1
- package/index.js +433 -413
- package/index.js.map +1 -1
- package/lib/hooks/use-extension-component.d.ts +5 -0
- package/lib/hooks/use-extension-component.d.ts.map +1 -1
- package/lib/utils/extension-points/extension-point-schemas.d.ts +8 -8
- package/lib/utils/extension-points/json-extension-parser.d.ts +68 -0
- package/lib/utils/extension-points/json-extension-parser.d.ts.map +1 -0
- package/lib/utils/extension-points/type-generator.d.ts +43 -0
- package/lib/utils/extension-points/type-generator.d.ts.map +1 -0
- package/lib/utils/plugin-system/plugin-extension-manager.d.ts.map +1 -1
- package/package.json +2 -2
- package/types/global.d.ts +15 -1
- package/utils.cjs +1 -1
- package/utils.cjs.map +1 -1
- package/utils.js +60 -80
- package/utils.js.map +1 -1
- package/documentation-generator-B8FuhDjB.js +0 -1271
- package/documentation-generator-B8FuhDjB.js.map +0 -1
- package/documentation-generator-E9tFyId_.cjs +0 -266
- package/documentation-generator-E9tFyId_.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"documentation-generator-E9tFyId_.cjs","sources":["../../../../node_modules/@nx/react/mf/dynamic-federation.js","../../../../node_modules/@nx/react/mf/index.js","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-schema.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-validation.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/plugin-system/plugin-extension-registry.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-registry.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/processors/contribution-reducer.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/plugin-system/plugin-extension-manager.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/processors/initialize-plugins.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/plugin-system/resolve-best-extension.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-schemas.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/discovery/plugin-discovery-service.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/discovery/documentation-generator.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadRemoteModule = exports.setRemoteDefinitions = exports.setRemoteUrlResolver = void 0;\nlet remoteUrlDefinitions;\nlet resolveRemoteUrl;\nconst remoteModuleMap = new Map();\nconst remoteContainerMap = new Map();\nlet initialSharingScopeCreated = false;\nfunction setRemoteUrlResolver(_resolveRemoteUrl) {\n resolveRemoteUrl = _resolveRemoteUrl;\n}\nexports.setRemoteUrlResolver = setRemoteUrlResolver;\nfunction setRemoteDefinitions(definitions) {\n remoteUrlDefinitions = definitions;\n}\nexports.setRemoteDefinitions = setRemoteDefinitions;\nasync function loadRemoteModule(remoteName, moduleName) {\n const remoteModuleKey = `${remoteName}:${moduleName}`;\n if (remoteModuleMap.has(remoteModuleKey)) {\n return remoteModuleMap.get(remoteModuleKey);\n }\n const container = remoteContainerMap.has(remoteName)\n ? remoteContainerMap.get(remoteName)\n : await loadRemoteContainer(remoteName);\n const factory = await container.get(moduleName);\n const Module = factory();\n remoteModuleMap.set(remoteModuleKey, Module);\n return Module;\n}\nexports.loadRemoteModule = loadRemoteModule;\nconst fetchRemoteModule = (url, remoteName) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.type = 'text/javascript';\n script.async = true;\n script.onload = () => {\n const proxy = {\n get: (request) => window[remoteName].get(request),\n init: (arg) => {\n try {\n window[remoteName].init(arg);\n }\n catch (e) {\n console.error(`Failed to initialize remote ${remoteName}`, e);\n reject(e);\n }\n },\n };\n resolve(proxy);\n };\n script.onerror = () => reject(new Error(`Remote ${remoteName} not found`));\n document.head.appendChild(script);\n });\n};\nasync function loadRemoteContainer(remoteName) {\n if (!resolveRemoteUrl && !remoteUrlDefinitions) {\n throw new Error('Call setRemoteDefinitions or setRemoteUrlResolver to allow Dynamic Federation to find the remote apps correctly.');\n }\n if (!initialSharingScopeCreated) {\n initialSharingScopeCreated = true;\n await __webpack_init_sharing__('default');\n }\n const remoteUrl = remoteUrlDefinitions\n ? remoteUrlDefinitions[remoteName]\n : await resolveRemoteUrl(remoteName);\n let containerUrl = remoteUrl;\n if (!remoteUrl.endsWith('.mjs') && !remoteUrl.endsWith('.js')) {\n containerUrl = `${remoteUrl}${remoteUrl.endsWith('/') ? '' : '/'}remoteEntry.js`;\n }\n const container = await fetchRemoteModule(containerUrl, remoteName);\n await container.init(__webpack_share_scopes__.default);\n remoteContainerMap.set(remoteName, container);\n return container;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setRemoteUrlResolver = exports.setRemoteDefinitions = exports.loadRemoteModule = void 0;\nvar dynamic_federation_1 = require(\"./dynamic-federation\");\nObject.defineProperty(exports, \"loadRemoteModule\", { enumerable: true, get: function () { return dynamic_federation_1.loadRemoteModule; } });\nObject.defineProperty(exports, \"setRemoteDefinitions\", { enumerable: true, get: function () { return dynamic_federation_1.setRemoteDefinitions; } });\nObject.defineProperty(exports, \"setRemoteUrlResolver\", { enumerable: true, get: function () { return dynamic_federation_1.setRemoteUrlResolver; } });\n","/**\n * Schema utilities for extension points\n */\n\nimport type { z } from \"zod\";\nimport type { SchemaFieldInfo } from \"./extension-point-types\";\n\n/**\n * Extract field information from a Zod schema for documentation purposes\n * Returns field information that is safe to display in Plugin Explorer\n */\nexport function extractSchemaFieldInfo(schema: z.ZodSchema): SchemaFieldInfo[] {\n try {\n // Check if schema is a ZodObject by checking for shape property\n if (\"shape\" in schema) {\n const objectSchema = schema as z.ZodObject<any>;\n const fields: SchemaFieldInfo[] = [];\n\n for (const [fieldName, fieldSchema] of Object.entries(\n objectSchema.shape\n )) {\n const zodField = fieldSchema as z.ZodTypeAny;\n const fieldInfo: SchemaFieldInfo = {\n name: fieldName,\n required: !zodField.isOptional(),\n };\n\n // Extract description if available\n if (zodField._def && zodField._def.description) {\n fieldInfo.description = zodField._def.description;\n }\n\n // Extract type information\n if (zodField._def) {\n // Get the base type name (handles optional types)\n let typeName = zodField._def.typeName || \"unknown\";\n if (typeName === \"ZodOptional\" && zodField._def.innerType) {\n typeName = zodField._def.innerType._def?.typeName || \"unknown\";\n }\n // Simplify type names for display\n fieldInfo.type = typeName.replace(\"Zod\", \"\").toLowerCase();\n }\n\n fields.push(fieldInfo);\n }\n\n return fields;\n }\n\n // For other schema types, we can't safely extract fields\n return [];\n } catch (error) {\n console.warn(\"Failed to extract schema field info:\", error);\n return [];\n }\n}\n","/**\n * Validation utilities for extension points\n */\n\nimport type { ValidationContext } from \"./extension-point-types\";\n\n/**\n * Implementation of ValidationContext for collecting validation issues\n */\nexport class ValidationContextImpl implements ValidationContext {\n private issues: { type: \"error\" | \"warning\" | \"info\"; message: string }[] =\n [];\n\n addError(message: string): void {\n this.issues.push({ type: \"error\", message });\n }\n\n addWarning(message: string): void {\n this.issues.push({ type: \"warning\", message });\n }\n\n addInfo(message: string): void {\n this.issues.push({ type: \"info\", message });\n }\n\n hasErrors(): boolean {\n return this.issues.some((issue) => issue.type === \"error\");\n }\n\n hasIssues(): boolean {\n return this.issues.length > 0;\n }\n\n getIssues(): { type: \"error\" | \"warning\" | \"info\"; message: string }[] {\n return [...this.issues];\n }\n}\n\n/**\n * Validation results cache\n * Stores validation results by plugin ID to avoid re-running validation\n */\nexport class ValidationResultsCache {\n private cache: Map<\n string,\n { type: \"error\" | \"warning\" | \"info\"; message: string }[]\n > = new Map();\n\n set(\n pluginId: string,\n results: { type: \"error\" | \"warning\" | \"info\"; message: string }[]\n ) {\n this.cache.set(pluginId, results);\n }\n\n get(\n pluginId: string\n ): { type: \"error\" | \"warning\" | \"info\"; message: string }[] {\n return this.cache.get(pluginId) || [];\n }\n\n clear() {\n this.cache.clear();\n }\n}\n\n// Create singleton validation cache\nexport const validationCache = new ValidationResultsCache();\n\n/**\n * Get validation results for a plugin from the cache\n * Returns validation results that were stored during plugin processing\n */\nexport function getValidationResults(\n pluginId: string\n): { type: \"error\" | \"warning\" | \"info\"; message: string }[] {\n return validationCache.get(pluginId);\n}\n","// plugin-extension-registry.ts\n\nimport type {\n PluginExtensionsType,\n ProcessedContributions,\n} from \"../../../types/plugins\";\n\nexport type ExtensionReducer = (\n extensions: PluginExtensionsType,\n contributions: ProcessedContributions,\n experiences: any\n) => PluginExtensionsType;\n\nconst extensionPointRegistry: ExtensionReducer[] = [];\n\nexport function registerExtensionReducer(reducer: ExtensionReducer) {\n extensionPointRegistry.push(reducer);\n}\n\nexport function applyExtensionReducers(\n base: PluginExtensionsType,\n contributions: ProcessedContributions,\n experiences: any\n): PluginExtensionsType {\n return extensionPointRegistry.reduce(\n (acc, reducer) => reducer(acc, contributions, experiences),\n base\n );\n}\n","/**\n * Registry management for extension points\n */\n\nimport type {\n BasePluginExtension,\n PluginExtensionsType,\n ProcessedContributions,\n} from \"../../../types/plugins\";\nimport { extractSchemaFieldInfo } from \"./extension-point-schema\";\nimport type {\n ExtensionPointConfig,\n ExtensionPointDefinition,\n TransformContext,\n} from \"./extension-point-types\";\nimport {\n ValidationContextImpl,\n validationCache,\n} from \"./extension-point-validation\";\nimport { registerExtensionReducer } from \"../plugin-system/plugin-extension-registry\";\n\n/**\n * Registry for simplified extension points\n * Keeps track of all extension points defined via this API\n */\nexport class SimplifiedExtensionPointRegistry {\n private extensionPoints: Map<string, ExtensionPointDefinition> = new Map();\n\n define<TData = any, TProcessed = TData, TProps = any>(\n config: ExtensionPointConfig<TData, TProcessed, TProps>\n ): ExtensionPointDefinition<TData, TProcessed, TProps> {\n // Check if already defined\n if (this.extensionPoints.has(config.id)) {\n console.warn(`Extension point ${config.id} is already defined`);\n return this.extensionPoints.get(config.id) as ExtensionPointDefinition<\n TData,\n TProcessed,\n TProps\n >;\n }\n\n // Create the definition\n const definition: ExtensionPointDefinition<TData, TProcessed, TProps> = {\n config,\n id: config.id,\n isRegistered: false,\n getExtensions: (extensions: PluginExtensionsType) =>\n (extensions[config.id] || {}) as Record<\n string,\n BasePluginExtension & { data: TProcessed }\n >,\n register: () => {\n if (definition.isRegistered) {\n console.warn(`Extension point ${config.id} is already registered`);\n return;\n }\n\n // Create and register the reducer\n const reducer = this.createReducer(config);\n registerExtensionReducer(reducer);\n\n definition.isRegistered = true;\n },\n };\n\n // Add schema field extraction if schema is provided\n if (config.schema) {\n definition.getSchemaFieldInfo = () =>\n extractSchemaFieldInfo(config.schema!);\n }\n\n // Component creation is handled at runtime via useExtensionComponent hook or createExtensionComponent factory\n\n // Store the definition\n this.extensionPoints.set(config.id, definition);\n\n return definition;\n }\n\n private createReducer<TData = any, TProcessed = TData>(\n config: ExtensionPointConfig<TData, TProcessed>\n ) {\n return (\n extensions: PluginExtensionsType,\n contributions: ProcessedContributions,\n experiences: any\n ): PluginExtensionsType => {\n // Check if contributions exist for this extension point\n const contributionData = (contributions as any)[config.contributionKey];\n if (!contributionData || typeof contributionData !== \"object\") {\n return extensions;\n }\n\n // Process each contribution\n Object.entries(contributionData).forEach(\n ([key, rawData]: [string, any]) => {\n // Skip if no data\n if (!rawData) return;\n\n // Create transform context\n const context: TransformContext = {\n remote: rawData.remote || \"\",\n sectionId: rawData.sectionId || key,\n experiences,\n contributions,\n };\n\n // Validate if validator provided\n if (config.validate) {\n const validationContext = new ValidationContextImpl();\n const validationResult = config.validate(\n rawData,\n validationContext\n );\n\n // Handle skip result\n if (validationResult === \"skip\") {\n validationCache.set(key, [\n {\n type: \"warning\",\n message: \"Plugin marked to skip processing\",\n },\n ]);\n return; // Skip processing this contribution\n }\n\n // Store validation issues in cache\n if (validationContext.hasIssues()) {\n const issues = validationContext.getIssues().map((issue) => {\n return {\n ...issue,\n message: `Extension point validation: ${issue.message}`,\n };\n });\n\n validationCache.set(key, issues);\n\n if (validationContext.hasErrors()) {\n console.error(\n `Validation failed for ${config.id} contribution \"${key}\":`,\n issues\n .filter((i) => i.type === \"error\")\n .map((i) => i.message)\n .join(\", \")\n );\n return; // Skip processing on errors\n }\n } else {\n // Clear any previous validation errors for successful validation\n validationCache.set(key, []);\n }\n }\n\n // Transform data if transformer provided\n const processedData = config.transform\n ? config.transform(rawData, context)\n : rawData;\n\n // Initialize extension point if needed\n if (!extensions[config.id]) {\n extensions[config.id] = {};\n }\n\n // Create the base extension\n const extension: BasePluginExtension = {\n id: key,\n type: config.contributionKey,\n data: processedData,\n remote: context.remote,\n sectionId: context.sectionId,\n };\n\n // Add rank if rankable\n if (config.isRankable && typeof rawData.rank === \"number\") {\n extension.rank = rawData.rank;\n }\n\n // Copy component-related properties to root level for useDynamicComponent compatibility\n if (processedData && typeof processedData === \"object\") {\n // Copy component properties from processed data to extension root\n if (\"component\" in processedData) {\n (extension as any).component = processedData.component;\n }\n if (\"view\" in processedData) {\n (extension as any).view = processedData.view;\n }\n if (\"location\" in processedData) {\n (extension as any).location = processedData.location;\n }\n }\n\n // Store the extension\n extensions[config.id][key] = extension;\n\n // Handle view-based extensions if configured\n if (config.hasView && config.relatedPoints?.view) {\n const experienceId = rawData.experienceId;\n const view = experiences?.[experienceId];\n\n if (view) {\n // Initialize view extension point if needed\n if (!extensions[config.relatedPoints.view]) {\n extensions[config.relatedPoints.view] = {};\n }\n\n // Create view extension\n extensions[config.relatedPoints.view][key] = {\n id: key,\n type: `${config.contributionKey}.view`,\n data: view,\n remote: context.remote,\n sectionId: context.sectionId,\n };\n }\n }\n\n // Handle definition extension point if configured\n if (config.relatedPoints?.definition) {\n // Initialize definition extension point if needed\n if (!extensions[config.relatedPoints.definition]) {\n extensions[config.relatedPoints.definition] = {};\n }\n\n // Create definition extension\n extensions[config.relatedPoints.definition][key] = {\n id: key,\n type: `${config.contributionKey}.definition`,\n data: processedData,\n remote: context.remote,\n sectionId: context.sectionId,\n };\n }\n }\n );\n\n return extensions;\n };\n }\n\n /**\n * Get all registered extension points (for discovery/documentation)\n */\n getAllExtensionPoints(): ExtensionPointDefinition[] {\n return Array.from(this.extensionPoints.values()).filter(\n (definition) => definition.isRegistered\n );\n }\n\n /**\n * Get all defined extension points (registered and unregistered)\n */\n getAllDefinedExtensionPoints(): ExtensionPointDefinition[] {\n return Array.from(this.extensionPoints.values());\n }\n\n /**\n * Get a specific extension point definition\n */\n getExtensionPoint(id: string): ExtensionPointDefinition | undefined {\n return this.extensionPoints.get(id);\n }\n\n /**\n * Check if an extension point is registered\n */\n hasExtensionPoint(id: string): boolean {\n return this.extensionPoints.has(id);\n }\n}\n\n// Create singleton registry instance\nexport const registry = new SimplifiedExtensionPointRegistry();\n\n/**\n * Get the simplified extension point registry\n * Useful for discovery tools and documentation generation\n */\nexport function getExtensionPointRegistry(): SimplifiedExtensionPointRegistry {\n return registry;\n}\n","import type { DynamicRemotes } from \"../../../types/global\";\nimport type { ProcessedContributions } from \"../../../types/plugins\";\nimport { getExtensionPointRegistry } from \"../extension-points/extension-point-registry\";\n\nexport const contributionReducer =\n (remotes: DynamicRemotes) => (acc: ProcessedContributions, key: string) => {\n const remote = remotes[key].remote;\n const sectionId = key;\n\n const experiences = remotes[key].contributes?.experiences;\n Object.keys(experiences).forEach((key) => {\n const experience = experiences[key];\n acc.experiences[key] = {\n ...experience,\n remote,\n sectionId,\n };\n });\n\n // Process contributions for simplified extension points\n const registry = getExtensionPointRegistry();\n const extensionPoints = registry.getAllExtensionPoints();\n\n extensionPoints.forEach((extensionPoint) => {\n const { contributionKey } = extensionPoint.config;\n\n // Check if this remote has contributions for this extension point\n const contributions = remotes[key].contributes?.[contributionKey];\n if (!contributions) return;\n\n // Initialize the contribution storage if needed\n if (!acc[contributionKey]) {\n acc[contributionKey] = {};\n }\n\n // Process each contribution\n if (Array.isArray(contributions)) {\n // Handle array-based contributions\n contributions.forEach((contribution) => {\n if (contribution && contribution.id) {\n acc[contributionKey][contribution.id] = {\n ...contribution,\n remote,\n sectionId,\n };\n }\n });\n } else if (typeof contributions === \"object\") {\n // Handle object-based contributions\n Object.entries(contributions).forEach(([contribId, contribution]) => {\n acc[contributionKey][contribId] = {\n ...(contribution as Record<string, any>),\n id: contribId,\n remote,\n sectionId,\n };\n });\n }\n });\n\n return acc;\n };\n","// plugin-extension-manager.ts\n\nimport { loadRemoteModule } from \"@nx/react/mf\";\nimport type { DynamicRemotes } from \"../../../types/global\";\nimport type {\n PluginExtension,\n PluginExtensionsType,\n ProcessedContributions,\n} from \"../../../types/plugins\";\n\nimport { contributionReducer } from \"../processors/contribution-reducer\";\nimport { applyExtensionReducers } from \"./plugin-extension-registry\";\n\ninterface PluginsType {\n remotes?: DynamicRemotes;\n extensions?: PluginExtensionsType;\n extensionPoints?: Record<string, PluginExtension[]>;\n getExtensions: (extensionPointId: string) => PluginExtension[];\n}\n\nexport async function initPluginManager(\n remotesOverride?: DynamicRemotes\n): Promise<PluginsType> {\n const remotes = remotesOverride ?? window.KosPlugins.__dynamicRemotes;\n\n if (window.KosPlugins.extensions) {\n const extensionPoints = window.KosPlugins.extensions;\n return {\n extensionPoints,\n getExtensions: (extensionPointId: string) =>\n extensionPoints[extensionPointId] || [],\n remotes,\n extensions: window.KosPlugins.__extensions,\n };\n }\n\n const extensions =\n window.KosPlugins.__extensions ?? (await loadExtensions(remotes));\n\n const extensionPoints: Record<string, PluginExtension[]> = {};\n if (extensions) {\n for (const extensionPointId of Object.keys(extensions)) {\n extensionPoints[extensionPointId] = Object.values(\n extensions[extensionPointId] || {}\n );\n }\n }\n\n window.KosPlugins.extensions = extensionPoints;\n\n const getExtensions = (extensionPointId: string) =>\n extensionPoints[extensionPointId] || [];\n\n return { extensionPoints, getExtensions, remotes, extensions };\n}\n\nconst DEFAULT_CONTRIBUTIONS: ProcessedContributions = {\n controlPourDefinitions: {},\n experiences: {},\n};\n\nexport function getContributions(\n remotes?: DynamicRemotes\n): ProcessedContributions {\n if (!remotes) {\n return DEFAULT_CONTRIBUTIONS;\n }\n return Object.keys(remotes).reduce(contributionReducer(remotes), {\n ...DEFAULT_CONTRIBUTIONS,\n });\n}\n\nexport async function loadExtensions(remotes?: DynamicRemotes) {\n if (!remotes) {\n window.KosPlugins = window.KosPlugins || {};\n return {};\n }\n\n // First pass: Load all InitPlugin modules to register custom extension points\n // This ensures that any extension points defined by plugins are available\n // before we process contributions in the second pass\n for (const remote of Object.values(remotes)) {\n if (remote.init) {\n try {\n const InitPlugin = await loadRemoteModule(\n remote.remote,\n \"./InitPlugin\"\n );\n if (InitPlugin.default) {\n const initPlugin = new InitPlugin.default();\n initPlugin?.register();\n }\n } catch (error) {\n console.warn(`Failed to load InitPlugin from ${remote.remote}:`, error);\n }\n }\n }\n\n // Second pass: Now process contributions with full knowledge of all extension points\n const contributions = getContributions(remotes);\n const experiences = contributions.experiences;\n\n const baseExtensions: PluginExtensionsType = {};\n const reducedExtensions = applyExtensionReducers(\n baseExtensions,\n contributions,\n experiences\n );\n\n const descriptorBasedExtensions = Object.keys(remotes).reduce((acc, key) => {\n const extensions = remotes[key].extensions ?? [];\n for (const ext of extensions) {\n acc[ext.extensionPointId] = acc[ext.extensionPointId] || {};\n acc[ext.extensionPointId][ext.id] = {\n id: ext.id,\n type: ext.type,\n component: ext.component,\n remote: remotes[key].remote,\n sectionId: key,\n data: ext,\n };\n }\n\n return acc;\n }, reducedExtensions);\n\n window.KosPlugins = window.KosPlugins || {};\n window.KosPlugins.__extensions = descriptorBasedExtensions;\n return descriptorBasedExtensions;\n}\n\nexport async function getExtensions(extensionPointId: string) {\n const { getExtensions } = await initPluginManager();\n return getExtensions(extensionPointId);\n}\n","import { setRemoteDefinitions } from \"@nx/react/mf\";\nimport type { Contributions, DynamicRemotes } from \"../../../types/global\";\nimport type {\n PluginExtension,\n PluginExtensionsType,\n} from \"../../../types/plugins\";\nimport \"../plugin-system/plugin-extension-registry-init\";\n\ndeclare interface KosPluginsType {\n __dynamicRemotes: DynamicRemotes;\n __extensions?: PluginExtensionsType;\n extensions?: Record<string, PluginExtension[]>;\n}\ndeclare global {\n interface Window {\n KosPlugins: KosPluginsType;\n }\n}\n\nexport interface Extensions {\n extensionPointId: string;\n id: string;\n component: string;\n}\n\nexport interface Descriptor {\n id: string;\n baseUrl: string;\n descriptor: {\n id: string;\n extensions: Extensions[];\n contributes: Contributions;\n };\n}\n\ninterface KosPluginsProps {\n pluginBaseUrl?: string;\n pluginApiPath?: string;\n pluginContext?: {\n context: string;\n group: string;\n };\n overrides?: Record<string, string>;\n}\n\n/**\n * Parses the query string from the URL or a provided string and returns an object\n * representing the key-value pairs in the query string.\n *\n * @param query - An optional query string to parse. If not provided, the function\n * will use the current window's `location.search` string.\n * The query string should not include the leading \"?\" character.\n *\n * @returns An object where each key is a parameter name from the query string,\n * and each value is the corresponding decoded parameter value.\n *\n * @example\n * // Assuming the URL is: https://example.com/?name=John&age=30\n * getQueryParams();\n * // Returns: { name: \"John\", age: \"30\" }\n *\n * @example\n * getQueryParams(\"foo=bar&baz=qux\");\n * // Returns: { foo: \"bar\", baz: \"qux\" }\n */\nexport const getQueryParams = (query = null) =>\n (query || window.location.search.replace(\"?\", \"\"))\n\n // get array of KeyValue pairs\n .split(\"&\")\n\n // Decode values\n .map((pair) => {\n const [key, val] = pair.split(\"=\");\n\n return [key, decodeURIComponent(val || \"\")];\n })\n\n // array to object\n .reduce((result, [key, val]) => {\n result[key] = val;\n return result;\n }, {});\n\nconst getDefaultHost = () => {\n const defaultHost = window.location.origin;\n const params = getQueryParams();\n const hostUrl = (params as any)?.host;\n const result = hostUrl || defaultHost;\n return result;\n};\n// eslint-disable-next-line no-restricted-globals\n\n/**\n * Initializes KOS plugins by fetching plugin metadata and configuring dynamic remotes.\n *\n * @param props - Optional properties to configure the plugin initialization.\n * @param props.pluginBaseUrl - The base URL for the plugins. Defaults to the result of `getDefaultHost()`.\n * @param props.pluginApiPath - The API path to fetch plugin metadata. Defaults to `\"/api/app/kosdev.ddk/ncui/plugins\"`.\n * @param props.overrides - An object containing overrides for plugin base URLs, keyed by plugin ID.\n * @param props.pluginContext - An optional context object that specifies the plugin context and group.\n * If provided, the function will fetch plugins from the UI plugins endpoint. Otherwise,\n * it will fetch from the DDK pluging endpoint.\n *\n * @returns A promise that resolves to a record of remote definitions, where the keys are remote IDs\n * and the values are the corresponding base paths for the remote entries.\n *\n * @remarks\n * - This function fetches plugin metadata from the specified API endpoint and processes the data\n * to configure dynamic remotes for the KOS plugin system.\n * - If a plugin does not have a descriptor, an error is logged to the console.\n * - The remote definitions are also set using the `setRemoteDefinitions` function.\n *\n * @throws Will throw an error if the fetch request fails or if the response cannot be parsed as JSON.\n */\nexport const initializeKosPlugins = async (props?: KosPluginsProps) => {\n const defaultHost = getDefaultHost();\n const data = props ?? {};\n const {\n pluginBaseUrl = defaultHost,\n pluginApiPath = \"/api/app/kosdev.ddk/ncui/plugins\",\n overrides = {},\n pluginContext,\n } = data;\n\n const useUiPlugins = !!pluginContext;\n\n const url = useUiPlugins\n ? `${pluginBaseUrl}/api/kos/ui/plugins/context/${pluginContext.context}`\n : `${pluginBaseUrl}${pluginApiPath}`;\n\n console.log(\n `initialize-plugins: Using Plugin Framework: ${useUiPlugins}: Fetching plugins from ${url}`\n );\n const plugins = await fetch(url);\n const remotes = await plugins.json();\n\n const pluginData = useUiPlugins\n ? remotes.data?.groups?.[pluginContext.group] ?? []\n : remotes.data ?? [];\n\n const allRemotes = pluginData?.reduce((acc, item) => {\n const baseUrl =\n overrides?.[item.id] ?? useUiPlugins\n ? `${pluginBaseUrl}${item.path}`\n : `${pluginBaseUrl}${item.baseUrl}`;\n if (item.descriptor) {\n acc[item.id] = {\n basePath: `${baseUrl}remoteEntry.js`,\n extensions: item.descriptor.extensions,\n contributes: item.descriptor.contributes,\n remote: item.descriptor.id,\n init: !!item.descriptor.init,\n };\n } else {\n console.error(\n `initialize-plugins: Plugin ${item.id} does not have a descriptor`\n );\n }\n return acc;\n }, {} as DynamicRemotes);\n window.KosPlugins = window.KosPlugins || {};\n window.KosPlugins.__dynamicRemotes = allRemotes;\n const definitions = Object.keys(allRemotes).reduce((acc, item) => {\n const remote = allRemotes[item].remote;\n acc[remote] = allRemotes[item].basePath;\n return acc;\n }, {} as Record<string, string>);\n setRemoteDefinitions(definitions);\n return definitions;\n};\n","import type { PluginExtension } from \"../../../types/plugins\";\n\n/**\n * Resolves the best plugin extension for a given extension point.\n *\n * @param extensions A map of plugin extensions keyed by module/plugin ID\n * @param module Optional module ID to resolve\n * @param exact If true, only returns a plugin if the given `module` matches exactly. If false (default), falls back to the best-ranked plugin if no match is found.\n * @returns The resolved PluginExtension or null\n */\nexport function resolveBestExtension<T extends PluginExtension>(\n extensions: Record<string, T> | undefined,\n module?: string,\n exact = false\n): T | null {\n if (!extensions || Object.keys(extensions).length === 0) {\n return null;\n }\n\n // Exact mode: must match the module ID\n if (exact) {\n return module && extensions[module] ? extensions[module] : null;\n }\n\n // Prefer exact match if available\n if (module && extensions[module]) {\n return extensions[module];\n }\n\n // Fallback: pick the best-ranked plugin\n const sorted = Object.values(extensions)\n .filter((ext) => typeof ext.id === \"string\")\n .sort((a, b) => {\n const aRank = typeof a.rank === \"number\" ? a.rank : Infinity;\n const bRank = typeof b.rank === \"number\" ? b.rank : Infinity;\n\n if (aRank === bRank) {\n const aId = a.id ?? \"\";\n const bId = b.id ?? \"\";\n return aId.localeCompare(bId);\n }\n\n return aRank - bRank;\n });\n\n return sorted[0] ?? null;\n}\n","/**\n * Common Zod schemas and validation helpers for extension points\n *\n * Provides reusable base schemas and validation functions to reduce\n * duplication across extension point definitions.\n */\n\nimport { z } from \"zod\";\nimport type { ValidationContext } from \"./define-extension-point\";\n\n/**\n * Base schema for view-based DDK extension points\n * Contains common fields that all DDK extension points share\n */\nexport const BaseViewExtensionSchema = z.object({\n id: z\n .string()\n .min(1, \"ID is required\")\n .describe(\"Unique identifier for this extension\"),\n title: z\n .string()\n .min(1, \"Title is required\")\n .describe(\"Display title shown in the interface\"),\n namespace: z\n .string()\n .min(1, \"Namespace is required\")\n .describe(\"Namespace for organizing related extensions\"),\n experienceId: z\n .string()\n .min(1, \"Experience ID is required\")\n .describe(\"Reference to the UI component experience for rendering\"),\n});\n\n/**\n * Base schema with optional ranking support\n */\nexport const RankableViewExtensionSchema = BaseViewExtensionSchema.extend({\n rank: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe(\"Optional ranking for ordering (higher = preferred)\"),\n});\n\n/**\n * Performs standard Zod validation and adds errors to the validation context\n *\n * @param schema The Zod schema to validate against\n * @param data The data to validate\n * @param context The validation context to add errors to\n * @returns true if validation passed, false if errors were added\n */\nexport function validateWithSchema<T>(\n schema: z.ZodSchema<T>,\n data: unknown,\n context: ValidationContext\n): boolean {\n const result = schema.safeParse(data);\n if (!result.success) {\n result.error.errors.forEach((error) => {\n context.addError(`${error.path.join(\".\")}: ${error.message}`);\n });\n return false;\n }\n return true;\n}\n\n/**\n * Common validation for descriptor fields that should use dot notation\n *\n * @param descriptorField The name of the descriptor field (e.g., \"setupDescriptor\", \"cuiDescriptor\")\n * @param descriptorValue The value of the descriptor field\n * @param context The validation context to add warnings to\n */\nexport function validateDescriptorFormat(\n descriptorField: string,\n descriptorValue: string | undefined,\n context: ValidationContext\n): void {\n if (descriptorValue && !descriptorValue.includes(\".\")) {\n context.addWarning(\n `${descriptorField} '${descriptorValue}' should typically include dot notation (e.g., 'category.item')`\n );\n }\n}\n\n/**\n * Common validation for rank values to ensure they're reasonable\n *\n * @param rank The rank value to validate\n * @param context The validation context to add warnings to\n * @param maxReasonableRank The maximum reasonable rank value (default 1000)\n */\nexport function validateRank(\n rank: number | undefined,\n context: ValidationContext,\n maxReasonableRank = 1000\n): void {\n if (rank !== undefined && rank > maxReasonableRank) {\n context.addWarning(\n `Rank ${rank} seems unusually high - consider using lower values for better ordering`\n );\n }\n}\n\n/**\n * Helper to create extension-specific schemas by extending the base\n * and adding custom fields\n *\n * @param additionalFields Additional fields specific to this extension point\n * @param options Options for schema creation\n * @returns Extended schema with base fields and additional fields\n */\nexport function createExtensionSchema<T extends z.ZodRawShape>(\n additionalFields: T,\n options: { rankable?: boolean } = {}\n): z.ZodObject<\n z.objectUtil.extendShape<\n | (typeof BaseViewExtensionSchema)[\"shape\"]\n | (typeof RankableViewExtensionSchema)[\"shape\"],\n T\n >\n> {\n const baseSchema = options.rankable\n ? RankableViewExtensionSchema\n : BaseViewExtensionSchema;\n return baseSchema.extend(additionalFields);\n}\n\n/**\n * Type-safe validation for rankable extensions\n * Only validates rank if the data has a rank property\n */\nexport function validateRankIfPresent(\n data: unknown,\n context: ValidationContext,\n maxReasonableRank = 1000\n): void {\n if (typeof data === \"object\" && data !== null && \"rank\" in data) {\n const typedData = data as { rank?: number };\n validateRank(typedData.rank, context, maxReasonableRank);\n }\n}\n\n/**\n * Type helper for inferring types from extension schemas\n */\nexport type InferExtensionSchema<T extends z.ZodTypeAny> = z.infer<T>;\n","/**\n * Plugin Discovery Service\n *\n * Pure business logic for discovering and analyzing plugins and extension points.\n * No UI dependencies - can be used by CLI tools, tests, or any consumer.\n */\n\nimport type {\n PluginExtension,\n PluginExtensionsType,\n} from \"../../../types/plugins\";\nimport { getExtensionPointRegistry } from \"../extension-points/extension-point-registry\";\n\nexport interface ExtensionPointInfo {\n id: string;\n displayName?: string;\n description?: string;\n source: \"simplified\" | \"legacy\";\n metadata?: {\n category?: string;\n tags?: string[];\n since?: string;\n deprecated?: boolean;\n owner?: string;\n };\n pluginCount: number;\n plugins: PluginExtension[];\n}\n\nexport interface PluginHealthStats {\n totalExtensionPoints: number;\n extensionPointsWithPlugins: number;\n totalPlugins: number;\n simplifiedExtensionPoints: number;\n legacyExtensionPoints: number;\n deprecatedExtensionPoints: number;\n}\n\nexport interface PluginDiscoveryOptions {\n includeLegacyExtensions?: boolean;\n includeEmptyExtensionPoints?: boolean;\n}\n\nexport interface PluginDescriptorValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n missingRequired: string[];\n suggestions: string[];\n}\n\nexport interface CompatibilityCheckResult {\n isCompatible: boolean;\n issues: string[];\n missingExtensionPoints: string[];\n incompatibleTypes: string[];\n suggestions: string[];\n}\n\nexport interface PluginDescriptor {\n id: string;\n init?: boolean;\n contributes?: {\n [key: string]: any[];\n };\n}\n\n/**\n * Plugin Discovery Service - Core business logic for plugin analysis\n */\nexport class PluginDiscoveryService {\n /**\n * Get all extension points with their plugin information\n */\n static getExtensionPoints(\n extensions: PluginExtensionsType | undefined,\n options: PluginDiscoveryOptions = {}\n ): ExtensionPointInfo[] {\n const {\n includeLegacyExtensions = true,\n includeEmptyExtensionPoints = true,\n } = options;\n const registry = getExtensionPointRegistry();\n const simplifiedExtensionPoints = registry.getAllExtensionPoints();\n const result: ExtensionPointInfo[] = [];\n\n // Add simplified extension points\n simplifiedExtensionPoints.forEach((point) => {\n const plugins = Object.values(extensions?.[point.id] || {});\n\n if (!includeEmptyExtensionPoints && plugins.length === 0) {\n return;\n }\n\n result.push({\n id: point.id,\n displayName: point.config.displayName,\n description: point.config.description,\n source: \"simplified\",\n metadata: point.config.metadata,\n pluginCount: plugins.length,\n plugins,\n });\n });\n\n // Add legacy extension points (if enabled)\n if (includeLegacyExtensions && extensions) {\n Object.entries(extensions).forEach(([extensionId, extensionPlugins]) => {\n // Skip if already added as simplified extension point\n if (result.some((item) => item.id === extensionId)) {\n return;\n }\n\n const plugins = Object.values(extensionPlugins || {});\n\n if (!includeEmptyExtensionPoints && plugins.length === 0) {\n return;\n }\n\n result.push({\n id: extensionId,\n source: \"legacy\",\n pluginCount: plugins.length,\n plugins,\n });\n });\n }\n\n return result.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Filter extension points based on search criteria\n */\n static filterExtensionPoints(\n extensionPoints: ExtensionPointInfo[],\n searchTerm: string\n ): ExtensionPointInfo[] {\n if (!searchTerm.trim()) {\n return extensionPoints;\n }\n\n const term = searchTerm.toLowerCase();\n return extensionPoints.filter(\n (point) =>\n point.id.toLowerCase().includes(term) ||\n point.displayName?.toLowerCase().includes(term) ||\n point.description?.toLowerCase().includes(term) ||\n point.metadata?.category?.toLowerCase().includes(term) ||\n point.metadata?.tags?.some((tag) => tag.toLowerCase().includes(term))\n );\n }\n\n /**\n * Calculate health statistics for the plugin system\n */\n static calculateHealthStats(\n extensionPoints: ExtensionPointInfo[]\n ): PluginHealthStats {\n const totalExtensionPoints = extensionPoints.length;\n const extensionPointsWithPlugins = extensionPoints.filter(\n (point) => point.pluginCount > 0\n ).length;\n const totalPlugins = extensionPoints.reduce(\n (sum, point) => sum + point.pluginCount,\n 0\n );\n const simplifiedExtensionPoints = extensionPoints.filter(\n (point) => point.source === \"simplified\"\n ).length;\n const legacyExtensionPoints = extensionPoints.filter(\n (point) => point.source === \"legacy\"\n ).length;\n const deprecatedExtensionPoints = extensionPoints.filter(\n (point) => point.metadata?.deprecated\n ).length;\n\n return {\n totalExtensionPoints,\n extensionPointsWithPlugins,\n totalPlugins,\n simplifiedExtensionPoints,\n legacyExtensionPoints,\n deprecatedExtensionPoints,\n };\n }\n\n /**\n * Analyze a specific plugin for health and capabilities\n */\n static analyzePlugin(plugin: PluginExtension): {\n hasComponent: boolean;\n hasRank: boolean;\n healthStatus: \"healthy\" | \"warning\" | \"error\";\n capabilities: string[];\n } {\n const hasComponent = !!(plugin as any).component;\n const hasRank = typeof (plugin as any).rank === \"number\";\n const rank = (plugin as any).rank || 0;\n const capabilities: string[] = [];\n\n // Add meaningful capabilities for developers\n if (hasComponent) {\n capabilities.push(\"UI Component\");\n } else {\n capabilities.push(\"Background Service\");\n }\n\n if (hasRank) capabilities.push(`Rank: ${rank}`);\n\n // Add more meaningful plugin characteristics\n if ((plugin as any).namespace) {\n const namespace = (plugin as any).namespace;\n if (namespace.includes(\"kos\") || namespace.includes(\"ddk\")) {\n capabilities.push(\"First-party\");\n } else {\n capabilities.push(\"Third-party\");\n }\n }\n\n // Check for modal mode (CUI plugins)\n if ((plugin as any).modalMode) {\n capabilities.push(`Modal: ${(plugin as any).modalMode}`);\n }\n\n // Simple health analysis - could be more sophisticated\n let healthStatus: \"healthy\" | \"warning\" | \"error\" = \"healthy\";\n\n if (!plugin.remote) {\n healthStatus = \"warning\";\n }\n\n // Could add more health checks:\n // - Check if module actually loads\n // - Validate plugin descriptor schema\n // - Check for required properties\n\n return {\n hasComponent,\n hasRank,\n healthStatus,\n capabilities,\n };\n }\n\n /**\n * Get extension point by ID with detailed information\n */\n static getExtensionPointById(\n extensionPoints: ExtensionPointInfo[],\n id: string\n ): ExtensionPointInfo | undefined {\n return extensionPoints.find((point) => point.id === id);\n }\n\n /**\n * Validate if an extension point ID follows conventions\n */\n static validateExtensionPointId(id: string): {\n isValid: boolean;\n issues: string[];\n suggestions: string[];\n } {\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n // Check basic format\n if (!id.includes(\".\")) {\n issues.push(\n \"Extension point ID should contain at least one dot (namespace.feature)\"\n );\n suggestions.push('Use format like \"ddk.myFeature\" or \"app.myFeature\"');\n }\n\n // Check namespace conventions\n const parts = id.split(\".\");\n if (parts.length < 2) {\n issues.push(\n \"Extension point ID should have at least 2 parts (namespace.feature)\"\n );\n }\n\n const namespace = parts[0];\n if (\n namespace &&\n ![\"ddk\", \"cui\", \"app\"].includes(namespace) &&\n !namespace.endsWith(\"app\")\n ) {\n suggestions.push(\n \"Consider using standard namespaces: ddk, cui, or [appname]app\"\n );\n }\n\n // Check for camelCase in parts\n const hasCamelCase = parts.some((part) => /[A-Z]/.test(part));\n if (hasCamelCase) {\n issues.push(\"Extension point ID parts should be lowercase\");\n suggestions.push(\n 'Use kebab-case or dot notation: \"my.feature\" not \"my.myFeature\"'\n );\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n suggestions,\n };\n }\n\n /**\n * Validate a plugin descriptor structure and content\n */\n static validatePluginDescriptor(\n descriptor: PluginDescriptor\n ): PluginDescriptorValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const missingRequired: string[] = [];\n const suggestions: string[] = [];\n\n // Required fields validation\n if (!descriptor.id) {\n missingRequired.push(\"id\");\n errors.push(\"Plugin descriptor must have an 'id' field\");\n } else {\n // Validate ID format (informational only)\n if (!descriptor.id.match(/^[a-z0-9-]+$/)) {\n suggestions.push(\n \"Plugin ID convention: use lowercase letters, numbers, and hyphens (e.g., 'my-awesome-plugin')\"\n );\n }\n }\n\n // Contributions validation\n if (!descriptor.contributes) {\n warnings.push(\n \"Plugin has no contributions - it won't extend any functionality\"\n );\n suggestions.push(\"Add a 'contributes' section with plugin contributions\");\n } else {\n const contributionKeys = Object.keys(descriptor.contributes);\n if (contributionKeys.length === 0) {\n warnings.push(\"Plugin contributes section is empty\");\n }\n\n // Validate each contribution type\n contributionKeys.forEach((key) => {\n const contributions = descriptor.contributes![key];\n if (!Array.isArray(contributions)) {\n errors.push(`Contribution '${key}' must be an array`);\n return;\n }\n\n contributions.forEach((contrib, index) => {\n if (!contrib.id) {\n errors.push(\n `Contribution ${key}[${index}] missing required 'id' field`\n );\n }\n\n // Validate view contributions\n if (key === \"experiences\" && contrib.component && !contrib.location) {\n errors.push(\n `Experience '${contrib.id}' has component but no location`\n );\n suggestions.push(\n \"Add 'location' field pointing to the component file\"\n );\n }\n\n // Validate common required fields based on contribution type\n if ([\"cui\", \"utilities\", \"settings\", \"setup\"].includes(key)) {\n if (!contrib.title) {\n warnings.push(\n `${key} contribution '${contrib.id}' missing 'title' field`\n );\n }\n if (!contrib.namespace) {\n warnings.push(\n `${key} contribution '${contrib.id}' missing 'namespace' field`\n );\n }\n if (!contrib.experienceId) {\n errors.push(\n `${key} contribution '${contrib.id}' missing required 'experienceId' field`\n );\n }\n }\n });\n });\n }\n\n // Init flag validation\n if (descriptor.init !== undefined && typeof descriptor.init !== \"boolean\") {\n errors.push(\"'init' field must be a boolean value\");\n }\n\n return {\n isValid: errors.length === 0 && missingRequired.length === 0,\n errors,\n warnings,\n missingRequired,\n suggestions,\n };\n }\n\n /**\n * Check compatibility between plugin contributions and available extension points\n */\n static checkPluginCompatibility(\n pluginDescriptor: PluginDescriptor,\n availableExtensionPoints: ExtensionPointInfo[]\n ): CompatibilityCheckResult {\n const issues: string[] = [];\n const missingExtensionPoints: string[] = [];\n const incompatibleTypes: string[] = [];\n const suggestions: string[] = [];\n\n if (!pluginDescriptor.contributes) {\n return {\n isCompatible: true,\n issues: [\"Plugin has no contributions to check\"],\n missingExtensionPoints: [],\n incompatibleTypes: [],\n suggestions: [],\n };\n }\n\n const registry = getExtensionPointRegistry();\n const availableIds = new Set(\n availableExtensionPoints.map((point) => point.id)\n );\n\n // Check each contribution type\n Object.entries(pluginDescriptor.contributes).forEach(\n ([contributionKey, contributions]) => {\n // Map contribution keys to expected extension point IDs\n const expectedExtensionPoints =\n this.getExpectedExtensionPoints(contributionKey);\n\n expectedExtensionPoints.forEach((extensionPointId) => {\n if (!availableIds.has(extensionPointId)) {\n missingExtensionPoints.push(extensionPointId);\n issues.push(\n `Extension point '${extensionPointId}' not available for '${contributionKey}' contributions`\n );\n suggestions.push(\n `Ensure the extension point '${extensionPointId}' is registered`\n );\n }\n });\n\n // Check simplified extension point compatibility\n const simplifiedPoints = registry.getAllExtensionPoints();\n const matchingPoint = simplifiedPoints.find(\n (point) => point.config.contributionKey === contributionKey\n );\n\n if (matchingPoint && contributions.length > 0) {\n // Validate contribution structure matches extension point expectations\n contributions.forEach((contrib: any, index) => {\n if (\n matchingPoint.config.isRankable &&\n typeof contrib.rank !== \"number\"\n ) {\n issues.push(\n `${contributionKey}[${index}]: Extension point '${matchingPoint.id}' expects 'rank' property`\n );\n suggestions.push(\n \"Add 'rank' property with numeric value for ordering\"\n );\n }\n\n if (matchingPoint.config.hasView && !contrib.experienceId) {\n issues.push(\n `${contributionKey}[${index}]: Extension point '${matchingPoint.id}' expects 'experienceId' for view-based contributions`\n );\n suggestions.push(\n \"Add 'experienceId' property linking to an experience definition\"\n );\n }\n });\n }\n }\n );\n\n return {\n isCompatible: issues.length === 0,\n issues,\n missingExtensionPoints,\n incompatibleTypes,\n suggestions,\n };\n }\n\n /**\n * Map contribution keys to their expected extension point IDs\n */\n private static getExpectedExtensionPoints(contributionKey: string): string[] {\n // Known mappings from existing system\n const mappings: Record<string, string[]> = {\n cui: [\"ddk.cui\", \"ddk.cui.view\", \"ddk.cui.settings.config\"],\n utilities: [\"ddk.utility\", \"ddk.utility.view\", \"ddk.utilities\"],\n setup: [\"ddk.setup\", \"ddk.setup.view\"],\n settings: [\"ddk.settings\", \"ddk.settings.view\"],\n troubleActions: [\"ddk.troubleAction\", \"ddk.troubleAction.view\"],\n navViews: [\"ddk.nav\", \"ddk.nav.view\"],\n controlPour: [\"ddk.controlPour\", \"ddk.controlPour.view\"],\n experiences: [], // Experiences don't directly map to extension points\n views: [], // Views are mapped by their extension point ID keys\n };\n\n return mappings[contributionKey] || [];\n }\n\n /**\n * Get comprehensive plugin analysis including validation and compatibility\n */\n static analyzePluginDescriptor(\n descriptor: PluginDescriptor,\n availableExtensionPoints: ExtensionPointInfo[]\n ): {\n validation: PluginDescriptorValidationResult;\n compatibility: CompatibilityCheckResult;\n recommendations: string[];\n } {\n const validation = this.validatePluginDescriptor(descriptor);\n const compatibility = this.checkPluginCompatibility(\n descriptor,\n availableExtensionPoints\n );\n const recommendations: string[] = [];\n\n // Generate recommendations based on analysis\n if (validation.warnings.length > 0) {\n recommendations.push(\n \"Address validation warnings to improve plugin quality\"\n );\n }\n\n if (!compatibility.isCompatible) {\n recommendations.push(\n \"Resolve compatibility issues before deploying plugin\"\n );\n }\n\n if (\n descriptor.contributes &&\n Object.keys(descriptor.contributes).length === 1\n ) {\n recommendations.push(\n \"Consider adding more contribution types to increase plugin value\"\n );\n }\n\n return {\n validation,\n compatibility,\n recommendations,\n };\n }\n}\n","/**\n * Documentation Generator Service\n *\n * Auto-generates markdown documentation from registered extension points,\n * including usage examples and TypeScript definitions.\n */\n\nimport type {\n PluginExtension,\n PluginExtensionsType,\n} from \"../../../types/plugins\";\nimport { getExtensionPointRegistry } from \"../extension-points/extension-point-registry\";\nimport type { SchemaFieldInfo } from \"../extension-points/extension-point-types\";\nimport type { ExtensionPointInfo } from \"./plugin-discovery-service\";\nimport { PluginDiscoveryService } from \"./plugin-discovery-service\";\n\nexport interface DocumentationOptions {\n includeUsageExamples?: boolean;\n includeTypeDefinitions?: boolean;\n includeLegacyExtensions?: boolean;\n includePluginHealth?: boolean;\n format?: \"markdown\" | \"html\";\n}\n\nexport interface GeneratedDocumentation {\n content: string;\n metadata: {\n generatedAt: string;\n totalExtensionPoints: number;\n totalPlugins: number;\n simplifiedExtensionPoints: number;\n legacyExtensionPoints: number;\n };\n}\n\n/**\n * Documentation Generator - Creates comprehensive documentation from extension points\n */\nexport class DocumentationGenerator {\n /**\n * Generate complete documentation for all extension points\n */\n static generateFullDocumentation(\n extensions: PluginExtensionsType | undefined,\n options: DocumentationOptions = {}\n ): GeneratedDocumentation {\n const {\n includeUsageExamples = true,\n includeTypeDefinitions = true,\n includeLegacyExtensions = true,\n includePluginHealth = true,\n } = options;\n\n const extensionPoints = PluginDiscoveryService.getExtensionPoints(\n extensions,\n {\n includeLegacyExtensions,\n includeEmptyExtensionPoints: true,\n }\n );\n\n const healthStats =\n PluginDiscoveryService.calculateHealthStats(extensionPoints);\n\n let content = this.generateHeader(healthStats);\n content += this.generateTableOfContents(extensionPoints);\n content += this.generateOverviewSection(extensionPoints, healthStats);\n\n // Generate documentation for each extension point\n extensionPoints.forEach((point) => {\n content += this.generateExtensionPointSection(point, {\n includeUsageExamples,\n includePluginHealth,\n });\n });\n\n if (includeTypeDefinitions) {\n content += this.generateTypeDefinitionsSection(extensionPoints);\n }\n\n content += this.generateContributionGuide();\n content += this.generateTroubleshootingSection();\n\n return {\n content,\n metadata: {\n generatedAt: new Date().toISOString(),\n totalExtensionPoints: healthStats.totalExtensionPoints,\n totalPlugins: healthStats.totalPlugins,\n simplifiedExtensionPoints: healthStats.simplifiedExtensionPoints,\n legacyExtensionPoints: healthStats.legacyExtensionPoints,\n },\n };\n }\n\n /**\n * Generate documentation header with metadata\n */\n private static generateHeader(healthStats: any): string {\n return `# KOS Plugin Extension Points Reference\n\n**Generated**: ${new Date().toLocaleString()}\n\n## System Overview\n\n- **Total Extension Points**: ${healthStats.totalExtensionPoints}\n- **Extension Points with Plugins**: ${healthStats.extensionPointsWithPlugins}\n- **Total Active Plugins**: ${healthStats.totalPlugins}\n- **Simplified Extension Points**: ${healthStats.simplifiedExtensionPoints}\n- **Legacy Extension Points**: ${healthStats.legacyExtensionPoints}\n\n---\n\n`;\n }\n\n /**\n * Generate table of contents\n */\n private static generateTableOfContents(\n extensionPoints: ExtensionPointInfo[]\n ): string {\n let toc = \"## Table of Contents\\n\\n\";\n\n toc += \"- [Overview](#overview)\\n\";\n toc += \"- [Extension Points](#extension-points)\\n\";\n\n extensionPoints.forEach((point) => {\n const anchor = point.id.toLowerCase().replace(/\\./g, \"\");\n\n toc += ` - [${point.id}](#${anchor}) (${point.pluginCount} plugins)\\n`;\n });\n\n toc += \"- [Type Definitions](#type-definitions)\\n\";\n toc += \"- [Contribution Guide](#contribution-guide)\\n\";\n toc += \"- [Troubleshooting](#troubleshooting)\\n\\n\";\n\n return toc;\n }\n\n /**\n * Generate overview section with health statistics\n */\n private static generateOverviewSection(\n _extensionPoints: ExtensionPointInfo[],\n healthStats: any\n ): string {\n let overview = \"## Overview\\n\\n\";\n\n overview +=\n \"This document provides a comprehensive reference for all available extension points in the KOS plugin system. \";\n overview +=\n \"Extension points allow plugins to contribute functionality to the application.\\n\\n\";\n\n overview += \"### Extension Point Types\\n\\n\";\n overview +=\n \"- **✨ Simplified Extension Points**: Use the new simplified API from `defineExtensionPoint`\\n\";\n overview +=\n \"- **📚 Legacy Extension Points**: Use the traditional reducer-based system\\n\\n\";\n\n if (healthStats.deprecatedExtensionPoints > 0) {\n overview += `### ⚠️ Deprecated Extension Points\\n\\n`;\n overview += `${healthStats.deprecatedExtensionPoints} extension points are marked as deprecated. `;\n overview += `Consider migrating to newer alternatives.\\n\\n`;\n }\n\n return overview + \"---\\n\\n\";\n }\n\n /**\n * Generate documentation section for a single extension point\n */\n private static generateExtensionPointSection(\n extensionPoint: ExtensionPointInfo,\n options: { includeUsageExamples?: boolean; includePluginHealth?: boolean }\n ): string {\n const { includeUsageExamples = true, includePluginHealth = true } = options;\n\n let section = `## ${extensionPoint.source === \"simplified\" ? \"✨\" : \"📚\"} ${\n extensionPoint.id\n }\\n\\n`;\n\n // Basic information\n if (extensionPoint.displayName) {\n section += `**Display Name**: ${extensionPoint.displayName}\\n\\n`;\n }\n\n if (extensionPoint.description) {\n section += `**Description**: ${extensionPoint.description}\\n\\n`;\n }\n\n section += `**Source**: ${extensionPoint.source}\\n`;\n section += `**Active Plugins**: ${extensionPoint.pluginCount}\\n\\n`;\n\n // Metadata\n if (extensionPoint.metadata) {\n section += \"### Metadata\\n\\n\";\n const metadata = extensionPoint.metadata;\n\n if (metadata.category)\n section += `- **Category**: ${metadata.category}\\n`;\n if (metadata.owner) section += `- **Owner**: ${metadata.owner}\\n`;\n if (metadata.since) section += `- **Since**: ${metadata.since}\\n`;\n if (metadata.tags?.length)\n section += `- **Tags**: ${metadata.tags.join(\", \")}\\n`;\n if (metadata.deprecated) section += `- **⚠️ Status**: Deprecated\\n`;\n\n section += \"\\n\";\n }\n\n // Usage examples\n if (includeUsageExamples) {\n section += this.generateUsageExamples(extensionPoint);\n }\n\n // Plugin list\n if (extensionPoint.plugins.length > 0) {\n section += this.generatePluginList(\n extensionPoint.plugins,\n includePluginHealth\n );\n } else {\n section +=\n \"### Plugins\\n\\nNo plugins currently registered for this extension point.\\n\\n\";\n }\n\n // Schema fields (if available)\n section += this.generateSchemaFieldsSection(extensionPoint);\n\n // Contribution structure\n section += this.generateContributionStructure(extensionPoint);\n\n return section + \"---\\n\\n\";\n }\n\n /**\n * Generate usage examples for an extension point\n */\n static generateUsageExamples(extensionPoint: ExtensionPointInfo): string {\n let examples = \"### Usage Examples\\n\\n\";\n\n if (extensionPoint.source === \"simplified\") {\n examples += \"#### Using Simplified API\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `// Import the extension point\\n`;\n examples += `import { ${this.getExtensionPointImportName(\n extensionPoint.id\n )} } from './extension-points';\\n\\n`;\n examples += `// Use extension component hook\\n`;\n examples += `import { useExtensionComponent } from '@kosdev-code/kos-ui-plugin';\\n\\n`;\n examples += `const Component = useExtensionComponent(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n\\n`;\n examples += `if (Component) {\\n`;\n examples += ` return (\\n`;\n examples += ` <Component \\n`;\n examples += ` customProp=\"value\"\\n`;\n examples += ` onComplete={handleComplete}\\n`;\n examples += ` />\\n`;\n examples += ` );\\n`;\n examples += `}\\n\\n`;\n examples += `// Or use with dynamic component\\n`;\n examples += `const [Component] = useDynamicComponent({\\n`;\n examples += ` extension: ${this.getExtensionPointImportName(\n extensionPoint.id\n )}.id\\n`;\n examples += `});\\n`;\n examples += \"```\\n\\n\";\n\n examples += \"#### Using Typed Hooks\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `// Get all extensions with type safety\\n`;\n examples += `const extensions = useExtensions(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n\\n`;\n examples += `// Get best extension\\n`;\n examples += `const bestExtension = useBest(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n\\n`;\n examples += `// Check availability\\n`;\n examples += `const hasExtensions = useHasExtensions(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n`;\n examples += \"```\\n\\n\";\n }\n\n examples += \"#### Using DynamicComponent\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `import { DynamicComponent } from '@kosdev-code/kos-ui-plugin';\\n`;\n examples += `import { ${this.getExtensionPointImportName(\n extensionPoint.id\n )} } from './extension-points';\\n\\n`;\n examples += `<DynamicComponent\\n`;\n examples += ` extension={${this.getExtensionPointImportName(\n extensionPoint.id\n )}.id}\\n`;\n examples += ` props={{ customData: \"value\" }}\\n`;\n examples += ` fallback={<div>Loading...</div>}\\n`;\n examples += `/>\\n`;\n examples += \"```\\n\\n\";\n\n examples += \"#### Using Context\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `import { useKosPluginsContext } from '@kosdev-code/kos-ui-plugin';\\n`;\n examples += `import { ${this.getExtensionPointImportName(\n extensionPoint.id\n )} } from './extension-points';\\n\\n`;\n examples += `const { getExtensions } = useKosPluginsContext();\\n`;\n examples += `const extensions = getExtensions(${this.getExtensionPointImportName(\n extensionPoint.id\n )}.id);\\n`;\n examples += \"```\\n\\n\";\n\n return examples;\n }\n\n /**\n * Generate plugin list with health information\n */\n private static generatePluginList(\n plugins: PluginExtension[],\n includeHealth: boolean\n ): string {\n let list = \"### Active Plugins\\n\\n\";\n\n plugins.forEach((plugin) => {\n list += `#### ${plugin.id}\\n\\n`;\n\n if (plugin.remote) {\n list += `- **Remote**: ${plugin.remote}\\n`;\n }\n\n if (plugin.sectionId) {\n list += `- **Section**: ${plugin.sectionId}\\n`;\n }\n\n if ((plugin as any).rank !== undefined) {\n list += `- **Rank**: ${(plugin as any).rank}\\n`;\n }\n\n if (includeHealth) {\n const analysis = PluginDiscoveryService.analyzePlugin(plugin);\n list += `- **Health**: ${this.getHealthEmoji(analysis.healthStatus)} ${\n analysis.healthStatus\n }\\n`;\n\n if (analysis.capabilities.length > 0) {\n list += `- **Capabilities**: ${analysis.capabilities.join(\", \")}\\n`;\n }\n }\n\n list += \"\\n\";\n });\n\n return list;\n }\n\n /**\n * Generate schema fields documentation\n */\n private static generateSchemaFieldsSection(\n extensionPoint: ExtensionPointInfo\n ): string {\n // Only generate for simplified extension points with schemas\n if (extensionPoint.source !== \"simplified\") {\n return \"\";\n }\n\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n\n if (!point?.getSchemaFieldInfo) {\n return \"\";\n }\n\n const fieldInfo = point.getSchemaFieldInfo();\n if (fieldInfo.length === 0) {\n return \"\";\n }\n\n let section = \"### Schema Fields\\n\\n\";\n section +=\n \"The following fields are defined in the schema for this extension point:\\n\\n\";\n section += \"| Field | Type | Required | Description |\\n\";\n section += \"|-------|------|----------|-------------|\\n\";\n\n fieldInfo.forEach((field) => {\n const name = field.name;\n const type = field.type || \"unknown\";\n const required = field.required ? \"✅\" : \"⭕\";\n const description = field.description || \"-\";\n\n section += `| \\`${name}\\` | ${type} | ${required} | ${description} |\\n`;\n });\n\n section += \"\\n\";\n\n return section;\n }\n\n /**\n * Generate contribution structure documentation\n */\n private static generateContributionStructure(\n extensionPoint: ExtensionPointInfo\n ): string {\n let structure = \"### Contribution Structure\\n\\n\";\n\n structure +=\n \"To contribute to this extension point, add the following to your plugin descriptor:\\n\\n\";\n structure += \"```json\\n\";\n structure += `{\\n`;\n structure += ` \"id\": \"your-plugin-id\",\\n`;\n structure += ` \"contributes\": {\\n`;\n\n // Try to infer contribution key from extension point ID or metadata\n const contributionKey = this.inferContributionKey(extensionPoint);\n\n structure += ` \"${contributionKey}\": [\\n`;\n structure += ` {\\n`;\n\n // Get schema fields if available (for simplified extension points)\n const schemaFields = this.getSchemaFieldsForContribution(extensionPoint);\n\n if (schemaFields.length > 0) {\n // Use schema-defined fields for the example\n const fieldExamples: string[] = [];\n\n schemaFields.forEach((field) => {\n let value: string;\n\n // Generate appropriate example values based on field type and name\n if (field.name === \"id\") {\n value = '\"your-contribution-id\"';\n } else if (field.name === \"title\") {\n value = '\"Your Contribution Title\"';\n } else if (field.name === \"namespace\") {\n value = '\"your-namespace\"';\n } else if (field.name === \"experienceId\") {\n value = '\"your-experience-id\"';\n } else if (field.name === \"dashboardKey\") {\n value = '\"your-dashboard-key\"';\n } else if (field.name === \"rank\") {\n value = \"10\";\n } else if (field.type === \"string\") {\n value = `\"your-${field.name}\"`;\n } else if (field.type === \"number\") {\n value = \"0\";\n } else if (field.type === \"boolean\") {\n value = \"false\";\n } else {\n value = `\"your-${field.name}\"`;\n }\n\n // Only include required fields and important optional ones\n if (\n field.required ||\n [\"experienceId\", \"rank\", \"dashboardKey\"].includes(field.name)\n ) {\n fieldExamples.push(` \"${field.name}\": ${value}`);\n }\n });\n\n structure += fieldExamples.join(\",\\n\");\n } else {\n // Fallback to old logic for legacy extension points\n structure += ` \"id\": \"your-contribution-id\",\\n`;\n structure += ` \"title\": \"Your Contribution Title\",\\n`;\n structure += ` \"namespace\": \"your-namespace\"`;\n\n // Add common fields based on patterns\n if (this.isViewBasedExtensionPoint(extensionPoint)) {\n structure += `,\\n \"experienceId\": \"your-experience-id\"`;\n }\n\n if (this.isRankableExtensionPoint(extensionPoint)) {\n structure += `,\\n \"rank\": 10`;\n }\n\n // Add specific fields based on extension point type\n const specificFields = this.getSpecificFields(extensionPoint);\n if (specificFields.length > 0) {\n structure += `,\\n ${specificFields.join(\",\\n \")}`;\n }\n }\n\n structure += `\\n }\\n`;\n structure += ` ]`;\n\n // Only add experiences section if it's a view-based extension point\n const hasExperienceId =\n schemaFields.some((f) => f.name === \"experienceId\") ||\n this.isViewBasedExtensionPoint(extensionPoint);\n\n if (hasExperienceId) {\n structure += `,\\n \"experiences\": {\\n`;\n structure += ` \"your-experience-id\": {\\n`;\n structure += ` \"id\": \"your-experience-id\",\\n`;\n structure += ` \"component\": \"YourComponent\",\\n`;\n structure += ` \"location\": \"./src/components/YourComponent.tsx\"\\n`;\n structure += ` }\\n`;\n structure += ` }`;\n }\n\n structure += `\\n }\\n`;\n structure += `}\\n`;\n structure += \"```\\n\\n\";\n\n return structure;\n }\n\n /**\n * Generate TypeScript definitions section\n */\n private static generateTypeDefinitionsSection(\n extensionPoints: ExtensionPointInfo[]\n ): string {\n let section = \"## Type Definitions\\n\\n\";\n\n section += \"### Extension Point Types\\n\\n\";\n section += \"```typescript\\n\";\n\n extensionPoints.forEach((point) => {\n if (point.source === \"simplified\") {\n section += `// ${point.id}\\n`;\n section += `interface ${this.getExtensionPointTypeName(point.id)} {\\n`;\n section += ` id: \"${point.id}\";\\n`;\n section += ` displayName?: \"${point.displayName || \"\"}\";\\n`;\n section += ` description?: \"${point.description || \"\"}\";\\n`;\n section += `}\\n\\n`;\n }\n });\n\n section += \"```\\n\\n\";\n\n section += \"### Plugin Contribution Types\\n\\n\";\n section += \"```typescript\\n\";\n section += \"interface BaseContribution {\\n\";\n section += \" id: string;\\n\";\n section += \" title: string;\\n\";\n section += \" namespace: string;\\n\";\n section += \"}\\n\\n\";\n section += \"interface ViewBasedContribution extends BaseContribution {\\n\";\n section += \" experienceId: string;\\n\";\n section += \"}\\n\\n\";\n section += \"interface RankableContribution extends BaseContribution {\\n\";\n section += \" rank: number;\\n\";\n section += \"}\\n\";\n section += \"```\\n\\n\";\n\n return section;\n }\n\n /**\n * Generate contribution guide\n */\n private static generateContributionGuide(): string {\n return `## Contribution Guide\n\n### Creating a Plugin\n\n1. **Create Plugin Project**\n \\`\\`\\`bash\n kosui plugin-project --name my-plugin\n \\`\\`\\`\n\n2. **Add Components**\n \\`\\`\\`bash\n kosui component --name MyComponent --pluginType utility --project my-plugin\n \\`\\`\\`\n\n3. **Update Plugin Descriptor**\n Add contributions to your \\`kosdev-plugin.json\\` file following the structure examples above.\n\n4. **Test Integration**\n Use the Plugin Explorer (Ctrl+Shift+P) to validate your plugin registration.\n\n### Best Practices\n\n- **Use descriptive IDs**: Plugin and contribution IDs should be clear and unique\n- **Follow naming conventions**: Use kebab-case for IDs, PascalCase for components\n- **Provide meaningful titles**: Titles are shown to users in the interface\n- **Set appropriate ranks**: Higher numbers = higher priority for rankable contributions\n- **Include proper metadata**: Namespace helps organize plugins by owner\n\n### Validation\n\nUse the Plugin Discovery Service to validate your plugin descriptor:\n\n\\`\\`\\`typescript\nimport { PluginDiscoveryService } from '@kosdev-code/kos-ui-plugin';\n\nconst validation = PluginDiscoveryService.validatePluginDescriptor(yourDescriptor);\nconsole.log(validation.errors); // Check for errors\nconsole.log(validation.warnings); // Check for warnings\n\\`\\`\\`\n\n`;\n }\n\n /**\n * Generate troubleshooting section\n */\n private static generateTroubleshootingSection(): string {\n return `## Troubleshooting\n\n### Common Issues\n\n**Plugin not appearing in extension point**\n- Check plugin descriptor syntax\n- Verify contribution key matches extension point requirements\n- Ensure experienceId references exist in experiences section\n\n**Component fails to load**\n- Verify component path in experience location\n- Check module federation configuration\n- Use Plugin Explorer to see detailed error messages\n\n**Type errors with simplified extension points**\n- Ensure extension point is properly imported\n- Check that component props match expected interface\n- Verify extension point is registered before use\n\n### Debugging Tools\n\n**Plugin Explorer**\n- Press Ctrl+Shift+P in development mode\n- View all extension points and their plugins\n- See plugin health status and capabilities\n- Test component rendering with error boundaries\n\n**Validation Service**\n- Use \\`PluginDiscoveryService.validatePluginDescriptor()\\`\n- Check \\`PluginDiscoveryService.checkPluginCompatibility()\\`\n- Run \\`PluginDiscoveryService.analyzePluginDescriptor()\\` for full analysis\n\n**Browser DevTools**\n- Check \\`window.KosPlugins.extensions\\` for runtime state\n- Look for module federation errors in Network tab\n- Use React DevTools to inspect component loading\n\n---\n\n*Generated by KOS Plugin Documentation Generator*\n`;\n }\n\n // Helper methods\n private static getExtensionPointImportName(id: string): string {\n // Check if there's an explicit export name in metadata\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(id);\n\n if (point?.config.metadata?.exportName) {\n return point.config.metadata.exportName;\n }\n\n // Fallback: Convert ID to PascalCase and handle hyphens properly\n const parts = id.split(\".\");\n\n // Skip the namespace part (usually first part like \"ddk\")\n // Focus on the meaningful parts (e.g., \"dashboard.pump-detail\")\n const meaningfulParts = parts.length > 1 ? parts.slice(1) : parts;\n\n return (\n meaningfulParts\n .map((part) =>\n // Handle hyphenated parts (e.g., \"pump-detail\" -> \"PumpDetail\")\n part\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\")\n )\n .join(\"\") + \"Extension\"\n );\n }\n\n private static getExtensionPointTypeName(id: string): string {\n return this.getExtensionPointImportName(id) + \"Type\";\n }\n\n private static getHealthEmoji(status: string): string {\n switch (status) {\n case \"healthy\":\n return \"✅\";\n case \"warning\":\n return \"⚠️\";\n case \"error\":\n return \"❌\";\n default:\n return \"❓\";\n }\n }\n\n private static inferContributionKey(\n extensionPoint: ExtensionPointInfo\n ): string {\n // Try to get from simplified extension point registry\n if (extensionPoint.source === \"simplified\") {\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n if (point?.config.contributionKey) {\n return point.config.contributionKey;\n }\n }\n\n // Fallback to ID-based inference\n const parts = extensionPoint.id.split(\".\");\n const lastPart = parts[parts.length - 1];\n\n // Common mappings\n const mappings: Record<string, string> = {\n cui: \"cui\",\n utility: \"utilities\",\n utilities: \"utilities\",\n setup: \"setupStep\",\n settings: \"settings\",\n nav: \"navViews\",\n troubleAction: \"troubleActions\",\n controlPour: \"controlPour\",\n };\n\n return mappings[lastPart] || lastPart + \"s\";\n }\n\n private static isViewBasedExtensionPoint(\n extensionPoint: ExtensionPointInfo\n ): boolean {\n if (extensionPoint.source === \"simplified\") {\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n return point?.config.hasView || false;\n }\n\n // Heuristic for legacy extension points\n return extensionPoint.plugins.some(\n (plugin) => (plugin as any).experienceId\n );\n }\n\n private static isRankableExtensionPoint(\n extensionPoint: ExtensionPointInfo\n ): boolean {\n if (extensionPoint.source === \"simplified\") {\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n return point?.config.isRankable || false;\n }\n\n // Heuristic for legacy extension points\n return extensionPoint.plugins.some(\n (plugin) => typeof (plugin as any).rank === \"number\"\n );\n }\n\n /**\n * Get schema fields for contribution structure generation\n */\n private static getSchemaFieldsForContribution(\n extensionPoint: ExtensionPointInfo\n ): SchemaFieldInfo[] {\n // Only get schema for simplified extension points\n if (extensionPoint.source !== \"simplified\") {\n return [];\n }\n\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n\n if (!point?.getSchemaFieldInfo) {\n return [];\n }\n\n return point.getSchemaFieldInfo();\n }\n\n private static getSpecificFields(\n extensionPoint: ExtensionPointInfo\n ): string[] {\n const fields: string[] = [];\n const contributionKey = this.inferContributionKey(extensionPoint);\n\n // Add specific fields based on contribution type\n switch (contributionKey) {\n case \"utilities\":\n fields.push('\"utilDescriptor\": \"your-util-descriptor\"');\n break;\n case \"setupStep\":\n fields.push('\"setupDescriptor\": \"your-setup-descriptor\"');\n break;\n case \"settings\":\n fields.push('\"settingsGroup\": \"your-settings-group\"');\n break;\n case \"navViews\":\n fields.push('\"navDescriptor\": \"your-nav-descriptor\"');\n break;\n case \"troubleActions\":\n fields.push('\"troubleType\": \"your-trouble-type\"');\n break;\n case \"cui\":\n fields.push('\"cuiDescriptor\": \"your-cui-descriptor\"');\n break;\n }\n\n return fields;\n }\n}\n"],"names":["dynamicFederation","remoteUrlDefinitions","resolveRemoteUrl","remoteModuleMap","remoteContainerMap","initialSharingScopeCreated","setRemoteUrlResolver","_resolveRemoteUrl","setRemoteDefinitions","definitions","loadRemoteModule","remoteName","moduleName","remoteModuleKey","Module","loadRemoteContainer","fetchRemoteModule","url","resolve","reject","script","request","arg","e","remoteUrl","containerUrl","container","exports","dynamic_federation_1","require$$0","extractSchemaFieldInfo","schema","objectSchema","fields","fieldName","fieldSchema","zodField","fieldInfo","typeName","_a","error","ValidationContextImpl","__publicField","message","issue","ValidationResultsCache","pluginId","results","validationCache","getValidationResults","extensionPointRegistry","registerExtensionReducer","reducer","applyExtensionReducers","base","contributions","experiences","acc","SimplifiedExtensionPointRegistry","config","definition","extensions","contributionData","key","rawData","context","validationContext","issues","i","processedData","extension","experienceId","view","_b","id","registry","getExtensionPointRegistry","contributionReducer","remotes","remote","sectionId","experience","extensionPoint","contributionKey","contribution","contribId","initPluginManager","remotesOverride","extensionPoints","extensionPointId","loadExtensions","DEFAULT_CONTRIBUTIONS","getContributions","InitPlugin","initPlugin","reducedExtensions","descriptorBasedExtensions","ext","getExtensions","getQueryParams","query","pair","val","result","getDefaultHost","defaultHost","params","initializeKosPlugins","props","data","pluginBaseUrl","pluginApiPath","overrides","pluginContext","useUiPlugins","pluginData","allRemotes","item","baseUrl","resolveBestExtension","module","exact","a","b","aRank","bRank","aId","bId","BaseViewExtensionSchema","z","RankableViewExtensionSchema","validateWithSchema","validateDescriptorFormat","descriptorField","descriptorValue","validateRank","rank","maxReasonableRank","createExtensionSchema","additionalFields","options","validateRankIfPresent","PluginDiscoveryService","includeLegacyExtensions","includeEmptyExtensionPoints","simplifiedExtensionPoints","point","plugins","extensionId","extensionPlugins","searchTerm","term","_d","_c","_f","_e","tag","totalExtensionPoints","extensionPointsWithPlugins","totalPlugins","sum","legacyExtensionPoints","deprecatedExtensionPoints","plugin","hasComponent","hasRank","capabilities","namespace","healthStatus","suggestions","parts","part","descriptor","errors","warnings","missingRequired","contributionKeys","contrib","index","pluginDescriptor","availableExtensionPoints","missingExtensionPoints","incompatibleTypes","availableIds","matchingPoint","validation","compatibility","recommendations","DocumentationGenerator","includeUsageExamples","includeTypeDefinitions","includePluginHealth","healthStats","content","toc","anchor","_extensionPoints","overview","section","metadata","examples","includeHealth","list","analysis","field","name","type","required","description","structure","schemaFields","fieldExamples","value","specificFields","f","word","status","lastPart"],"mappings":"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","x_google_ignoreList":[0,1]}
|