{"version":3,"file":"registry.mjs","sources":["../../../src/lib/feature/registry.ts"],"sourcesContent":["/**\n * @file Feature Registry\n * @description Dynamic feature registration and route generation\n */\n\nimport type { RouteObject } from 'react-router-dom';\nimport type { FeatureRegistry, FeatureRegistryEntry } from './types';\n\n/**\n * Global feature registry\n */\nconst featureRegistry: FeatureRegistry = new Map();\n\n/**\n * Register a feature in the global registry\n * @param feature - Feature entry to register\n */\nexport function registerFeature(feature: FeatureRegistryEntry): void {\n  const { metadata } = feature.config;\n\n  if (featureRegistry.has(metadata.id)) {\n    console.warn(`Feature \"${metadata.id}\" is already registered. Overwriting...`);\n  }\n\n  featureRegistry.set(metadata.id, feature);\n}\n\n/**\n * Unregister a feature from the registry\n * @param featureId - ID of the feature to unregister\n */\nexport function unregisterFeature(featureId: string): boolean {\n  return featureRegistry.delete(featureId);\n}\n\n/**\n * Get a registered feature by ID\n * @param featureId - ID of the feature to retrieve\n */\nexport function getFeature(featureId: string): FeatureRegistryEntry | undefined {\n  return featureRegistry.get(featureId);\n}\n\n/**\n * Get all registered features\n */\nexport function getAllFeatures(): FeatureRegistryEntry[] {\n  return Array.from(featureRegistry.values());\n}\n\n/**\n * Get all registered feature IDs\n */\nexport function getFeatureIds(): string[] {\n  return Array.from(featureRegistry.keys());\n}\n\n/**\n * Check if a feature is registered\n * @param featureId - ID of the feature to check\n */\nexport function isFeatureRegistered(featureId: string): boolean {\n  return featureRegistry.has(featureId);\n}\n\n/**\n * Generate route configuration for a feature\n * @param feature - Feature entry to generate routes for\n */\nfunction generateFeatureRoute(feature: FeatureRegistryEntry): RouteObject {\n  const { config, component: FeatureComponent } = feature;\n  const { metadata, tabs } = config;\n\n  const baseRoute: RouteObject = {\n    path: metadata.id,\n    Component: FeatureComponent,\n  };\n\n  // If feature has tabs, generate child routes\n  if (tabs !== undefined && tabs !== null && tabs.length > 0) {\n    baseRoute.children = tabs.map((tab) => ({\n      path: tab.path?.replace(`/${metadata.id}/`, '') ?? tab.id,\n      Component: FeatureComponent,\n    }));\n  }\n\n  return baseRoute;\n}\n\n/**\n * Get route objects for all registered features\n * Sorted by feature order\n */\nexport function getFeatureRoutes(): RouteObject[] {\n  const features = getAllFeatures();\n\n  // Sort by order (lower = first)\n  const sortedFeatures = features.sort((a, b) => {\n    const orderA = a.config.metadata.order ?? 999;\n    const orderB = b.config.metadata.order ?? 999;\n    return orderA - orderB;\n  });\n\n  return sortedFeatures.map(generateFeatureRoute);\n}\n\n/**\n * Get navigation items for all registered features\n * Useful for building dynamic navigation menus\n */\nexport function getFeatureNavItems(): Array<{\n  id: string;\n  name: string;\n  path: string;\n  icon?: string;\n  order: number;\n}> {\n  const features = getAllFeatures();\n\n  return features\n    .map((feature) => {\n      const navItem: {\n        id: string;\n        name: string;\n        path: string;\n        icon?: string;\n        order: number;\n      } = {\n        id: feature.config.metadata.id,\n        name: feature.config.metadata.name,\n        path: `/${feature.config.metadata.id}`,\n        order: feature.config.metadata.order ?? 999,\n      };\n\n      if (feature.config.metadata.icon !== undefined) {\n        navItem.icon = feature.config.metadata.icon;\n      }\n\n      return navItem;\n    })\n    .sort((a, b) => a.order - b.order);\n}\n\n/**\n * Initialize multiple features at once\n * @param features - Array of features to register\n */\nexport function initializeFeatures(features: FeatureRegistryEntry[]): void {\n  features.forEach(registerFeature);\n}\n\n/**\n * Clear all registered features\n * Useful for testing or app reset\n */\nexport function clearFeatureRegistry(): void {\n  featureRegistry.clear();\n}\n\n/**\n * Get feature count\n */\nexport function getFeatureCount(): number {\n  return featureRegistry.size;\n}\n"],"names":["featureRegistry","registerFeature","feature","metadata","unregisterFeature","featureId","getFeature","getAllFeatures","getFeatureIds","isFeatureRegistered","generateFeatureRoute","config","FeatureComponent","tabs","baseRoute","tab","getFeatureRoutes","a","b","orderA","orderB","getFeatureNavItems","navItem","initializeFeatures","features","clearFeatureRegistry","getFeatureCount"],"mappings":"AAWA,MAAMA,wBAAuC,IAAA;AAMtC,SAASC,EAAgBC,GAAqC;AACnE,QAAM,EAAE,UAAAC,MAAaD,EAAQ;AAE7B,EAAIF,EAAgB,IAAIG,EAAS,EAAE,KACjC,QAAQ,KAAK,YAAYA,EAAS,EAAE,yCAAyC,GAG/EH,EAAgB,IAAIG,EAAS,IAAID,CAAO;AAC1C;AAMO,SAASE,EAAkBC,GAA4B;AAC5D,SAAOL,EAAgB,OAAOK,CAAS;AACzC;AAMO,SAASC,EAAWD,GAAqD;AAC9E,SAAOL,EAAgB,IAAIK,CAAS;AACtC;AAKO,SAASE,IAAyC;AACvD,SAAO,MAAM,KAAKP,EAAgB,OAAA,CAAQ;AAC5C;AAKO,SAASQ,IAA0B;AACxC,SAAO,MAAM,KAAKR,EAAgB,KAAA,CAAM;AAC1C;AAMO,SAASS,EAAoBJ,GAA4B;AAC9D,SAAOL,EAAgB,IAAIK,CAAS;AACtC;AAMA,SAASK,EAAqBR,GAA4C;AACxE,QAAM,EAAE,QAAAS,GAAQ,WAAWC,EAAA,IAAqBV,GAC1C,EAAE,UAAAC,GAAU,MAAAU,EAAA,IAASF,GAErBG,IAAyB;AAAA,IAC7B,MAAMX,EAAS;AAAA,IACf,WAAWS;AAAA,EAAA;AAIb,SAA0BC,KAAS,QAAQA,EAAK,SAAS,MACvDC,EAAU,WAAWD,EAAK,IAAI,CAACE,OAAS;AAAA,IACtC,MAAMA,EAAI,MAAM,QAAQ,IAAIZ,EAAS,EAAE,KAAK,EAAE,KAAKY,EAAI;AAAA,IACvD,WAAWH;AAAA,EAAA,EACX,IAGGE;AACT;AAMO,SAASE,IAAkC;AAUhD,SATiBT,EAAA,EAGe,KAAK,CAACU,GAAGC,MAAM;AAC7C,UAAMC,IAASF,EAAE,OAAO,SAAS,SAAS,KACpCG,IAASF,EAAE,OAAO,SAAS,SAAS;AAC1C,WAAOC,IAASC;AAAA,EAClB,CAAC,EAEqB,IAAIV,CAAoB;AAChD;AAMO,SAASW,IAMb;AAGD,SAFiBd,EAAA,EAGd,IAAI,CAACL,MAAY;AAChB,UAAMoB,IAMF;AAAA,MACF,IAAIpB,EAAQ,OAAO,SAAS;AAAA,MAC5B,MAAMA,EAAQ,OAAO,SAAS;AAAA,MAC9B,MAAM,IAAIA,EAAQ,OAAO,SAAS,EAAE;AAAA,MACpC,OAAOA,EAAQ,OAAO,SAAS,SAAS;AAAA,IAAA;AAG1C,WAAIA,EAAQ,OAAO,SAAS,SAAS,WACnCoB,EAAQ,OAAOpB,EAAQ,OAAO,SAAS,OAGlCoB;AAAA,EACT,CAAC,EACA,KAAK,CAACL,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK;AACrC;AAMO,SAASK,EAAmBC,GAAwC;AACzE,EAAAA,EAAS,QAAQvB,CAAe;AAClC;AAMO,SAASwB,IAA6B;AAC3C,EAAAzB,EAAgB,MAAA;AAClB;AAKO,SAAS0B,IAA0B;AACxC,SAAO1B,EAAgB;AACzB;"}