retrex-extensibles-core 2.0.0 → 2.0.2
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -958,7 +958,7 @@ var ThemeProvider = ({ type, children }) => {
|
|
|
958
958
|
setActiveTheme(template);
|
|
959
959
|
});
|
|
960
960
|
}, [type]);
|
|
961
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: { templateType: type, activeTheme, setActiveTheme }, children
|
|
961
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: { templateType: type, activeTheme, setActiveTheme }, children });
|
|
962
962
|
};
|
|
963
963
|
function useTheme() {
|
|
964
964
|
const ctx = (0, import_react.useContext)(ThemeContext);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/hooks/useSettings.ts","../src/core/hooks/useExtensibles.ts","../src/index.ts","../src/core/hooks/useModules.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTemplates.ts","../src/core/hooks/useEvents.ts","../src/core/hooks/useRoutes.ts","../src/core/hooks/useUtils.ts","../src/core/hooks/useTranslator.ts","../src/core/providers/ThemeProvider.tsx"],"sourcesContent":["// src/hooks/useSettings.ts\r\n\r\nimport path from 'node:path';\r\n\r\nimport { loadJSON, saveJSON } from './useExtensibles';\r\nimport type { ExtensiblePaths } from '../types'; // Adjust the import path as necessary\r\n\r\nlet extensiblePaths: ExtensiblePaths = {\r\n modules: './app/modules',\r\n templates: './app/resources/themes',\r\n services: './app/services',\r\n events: './app/events',\r\n langs: './public/langs',\r\n};\r\n\r\nconst isServer = typeof window === 'undefined';\r\n\r\n\r\nexport const useSettings = {\r\n getPaths(): ExtensiblePaths {\r\n if (isServer) {\r\n const json = loadJSON('./app/extensiblePaths.json');\r\n if (json) extensiblePaths = json;\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n langs: './langs'\r\n }\r\n // extensiblePaths = loadJSON(\"./app/extensiblePaths.json\");\r\n return extensiblePaths;\r\n },\r\n\r\n setPaths(paths: Partial<ExtensiblePaths>): void {\r\n if (isServer) {\r\n saveJSON('./app/extensiblePaths.json', {\r\n ...extensiblePaths,\r\n ...paths,\r\n });\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n ...paths,\r\n };\r\n },\r\n \r\n getKeyValue(key: string): string {\r\n return 'Coming Soon'\r\n },\r\n setKeyValue(key: string, value: string): void {\r\n return;\r\n },\r\n};\r\n","// src/hooks/useExtensibles.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { pathToFileURL } from 'url';\r\nimport type { TemplateType, ExtensibleMeta, ExtensiblePaths } from '../types';\r\n\r\nlet paths: ExtensiblePaths;\r\n\r\nexport function registerExtensibles(extensiblePaths: ExtensiblePaths) {\r\n paths = extensiblePaths;\r\n}\r\n\r\nexport function loadJSON(filePath: string): any {\r\n if (!fs.existsSync(filePath)) return null;\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\r\n}\r\n\r\nexport function saveJSON(filePath: string, data: any) {\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\r\n}\r\n\r\n// --- MODULES ---\r\n\r\nexport function getModules(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().modules)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().modules, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().modules, dir, 'module.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isModuleEnabled(name: string) {\r\n const modules = getModules();\r\n return modules.find((m) => m.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleModule(name: string, enabled: boolean) {\r\n const modules = getModules();\r\n const mod = modules.find((m) => m.lowerName === name.toLowerCase());\r\n if (!mod) throw new Error(`Module ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().modules, mod.lowerName, 'module.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onModuleEnabled(mod.name);\r\n else onModuleDisabled(mod.name);\r\n}\r\n\r\n// --- SERVICES ---\r\n\r\nexport function getServices(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().services) throw new Error('Services path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().services)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().services, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().services, dir, 'service.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isServiceEnabled(name: string) {\r\n const services = getServices();\r\n return services.find((s) => s.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleService(name: string, enabled: boolean) {\r\n const services = getServices();\r\n const svc = services.find((s) => s.lowerName === name.toLowerCase());\r\n if (!svc) throw new Error(`Service ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().services, svc.lowerName, 'service.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onServiceEnabled(svc.name);\r\n else onServiceDisabled(svc.name);\r\n}\r\n\r\n// --- TEMPLATES ---\r\n\r\n// Helper to get base path for a template type\r\nfunction getTemplateBasePath(type: TemplateType): string {\r\n if (!useSettings.getPaths().templates) throw new Error('Templates path not registered.');\r\n switch (type) {\r\n case 'admin-theme':\r\n case 'client-theme':\r\n return path.join(useSettings.getPaths().templates, 'themes');\r\n case 'portal':\r\n return path.join(useSettings.getPaths().templates, 'portals');\r\n case 'email':\r\n return path.join(useSettings.getPaths().templates, 'emails');\r\n default:\r\n throw new Error(`Unknown template type: ${type}`);\r\n }\r\n}\r\n\r\nexport function getTemplates(type: TemplateType): ExtensibleMeta[] {\r\n const basePath = getTemplateBasePath(type);\r\n if (!fs.existsSync(basePath)) return [];\r\n\r\n const dirs = fs\r\n .readdirSync(basePath)\r\n .filter((d: any) => fs.statSync(path.join(basePath, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(basePath, dir, 'template.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isTemplateActive(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n return templates.find((t) => t.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\n// Toggle templates: only 1 active per type allowed\r\nexport function toggleTemplate(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n\r\n templates.forEach((tpl) => {\r\n const metaPath = path.join(getTemplateBasePath(type), tpl.lowerName, 'template.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = tpl.lowerName === name.toLowerCase();\r\n saveJSON(metaPath, meta);\r\n });\r\n\r\n onTemplateSelect(type, name);\r\n}\r\n\r\n// --- EVENTS (replace with your event system integration) ---\r\n\r\nexport function onModuleEnabled(name: string) {\r\n console.log(`Module enabled: ${name}`);\r\n // emit event or custom logic here\r\n}\r\n\r\nexport function onModuleDisabled(name: string) {\r\n console.log(`Module disabled: ${name}`);\r\n}\r\n\r\nexport function onServiceEnabled(name: string) {\r\n console.log(`Service enabled: ${name}`);\r\n}\r\n\r\nexport function onServiceDisabled(name: string) {\r\n console.log(`Service disabled: ${name}`);\r\n}\r\n\r\nexport function onTemplateSelect(type: TemplateType, name: string) {\r\n console.log(`Template selected: type=${type}, name=${name}`);\r\n}\r\n\r\n// --- REGISTER HOOKS FOR MODULES ---\r\n\r\nexport async function registerEvents() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const eventsFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'events.server.js');\r\n if (fs.existsSync(eventsFile)) {\r\n const modEvents = await import(eventsFile);\r\n if (modEvents?.registerEvents) await modEvents.registerEvents();\r\n }\r\n }\r\n}\r\n\r\nexport async function registerMiddleware() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const middlewareFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'middleware.server.js');\r\n if (fs.existsSync(middlewareFile)) {\r\n const modMiddleware = await import(middlewareFile);\r\n if (modMiddleware?.registerMiddleware) await modMiddleware.registerMiddleware();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Registers routes given a path to routes folder (for pages and API routes)\r\n * @param routesFolderPath string - path to module/service routes folder\r\n */\r\nexport async function registerRoutes(routesFolderPath: string) {\r\n if (!fs.existsSync(routesFolderPath)) return;\r\n\r\n const routeFiles = fs.readdirSync(routesFolderPath).filter((f: any) => /\\.(js|ts|jsx|tsx)$/.test(f));\r\n for (const file of routeFiles) {\r\n const routeModule = await import(path.join(routesFolderPath, file));\r\n if (routeModule?.registerRoute) {\r\n await routeModule.registerRoute();\r\n }\r\n }\r\n}\r\n\r\nexport async function loadProviders() {\r\n const paths = useSettings.getPaths();\r\n\r\n const all = [\r\n { type: 'module', list: getModules(), basePath: paths.modules },\r\n { type: 'service', list: getServices(), basePath: paths.services },\r\n ];\r\n\r\n for (const { type, list, basePath } of all) {\r\n for (const item of list) {\r\n if (!item.enabled) continue;\r\n\r\n const metaPath = path.join(path.resolve(basePath), item.lowerName, `${type}.json`);\r\n const meta = loadJSON(metaPath);\r\n if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n for (const providerRelPath of meta.providers) {\r\n try {\r\n let providerAbsPath = path.join(path.resolve(basePath), item.lowerName, providerRelPath);\r\n\r\n // Try .js fallback if file is .ts or .tsx\r\n const ext = path.extname(providerAbsPath);\r\n if (ext === '.ts' || ext === '.tsx') {\r\n const jsPath = providerAbsPath.replace(/\\.(ts|tsx)$/, '.js');\r\n try {\r\n await fs.accessSync(jsPath); // Check if compiled JS file exists\r\n providerAbsPath = jsPath;\r\n } catch {\r\n throw new Error(`Compiled JS version not found for provider: ${providerRelPath}`);\r\n }\r\n }\r\n\r\n const providerUrl = pathToFileURL(providerAbsPath).href.toString();\r\n const providerModule = await import(providerUrl);\r\n\r\n if (typeof providerModule.default === 'function') {\r\n await providerModule.default();\r\n console.log(`[${type}] ✅ Provider loaded: ${providerRelPath}`);\r\n } else {\r\n console.warn(`[${type}] ⚠️ Provider ${providerRelPath} has no default export.`);\r\n }\r\n } catch (err) {\r\n console.error(`[${type}] ❌ Failed to load provider ${providerRelPath}:`, err);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n// export async function loadProviders() {\r\n// paths = {\r\n// modules: useSettings.getPaths().modules,\r\n// templates: useSettings.getPaths().templates,\r\n// services: useSettings.getPaths().services,\r\n// events: useSettings.getPaths().events,\r\n// }\r\n// const all = [\r\n// { type: 'module', list: getModules(), basePath: useSettings.getPaths().modules },\r\n// { type: 'service', list: getServices(), basePath: useSettings.getPaths().services },\r\n// ];\r\n\r\n// for (const { type, list, basePath } of all) {\r\n// for (const item of list) {\r\n// if (!item.enabled) continue;\r\n\r\n// const metaPath = path.join(basePath, item.lowerName, `${type}.json`);\r\n// const meta = loadJSON(metaPath);\r\n// if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n// for (const providerRelPath of meta.providers) {\r\n// try {\r\n// const providerPath = path.join(basePath, item.lowerName, providerRelPath);\r\n// const providerModule = await import(providerPath);\r\n// if (typeof providerModule.default === 'function') {\r\n// await providerModule.default(); // Call provider\r\n// console.log(`[${type}] Provider loaded: ${providerRelPath}`);\r\n// } else {\r\n// console.warn(`[${type}] Provider ${providerRelPath} has no default export.`);\r\n// }\r\n// } catch (err) {\r\n// console.error(`[${type}] Failed to load provider ${providerRelPath}:`, err);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// }\r\n","// src/index.ts\r\n\r\n// export * from './core/controller/EventController';\r\n// export * from './core/controller/MiddlewareController';\r\nexport * from './core/hooks/useExtensibles';\r\nexport * from './core/hooks/useSettings';\r\nexport * from './core/hooks/useModules';\r\nexport * from './core/hooks/useServices';\r\nexport * from './core/hooks/useTemplates';\r\nexport * from './core/hooks/useEvents';\r\nexport * from './core/hooks/useRoutes';\r\nexport * from './core/hooks/useUtils';\r\nexport * from './core/hooks/useTranslator';\r\n// export * as ThemeProvider from './core/providers/ThemeProvider';\r\nexport * from './core/providers/ThemeProvider';\r\nexport * from './core/types/index';\r\n","// src/hooks/useModules.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { ModuleMeta } from '../types'; // Adjust the import path as necessary\r\n\r\nexport const useModules = {\r\n allEnabled(): ModuleMeta[] {\r\n const modules = useModules.load();\r\n if (!modules || modules.length === 0) return [];\r\n // Filter out modules that are not enabled\r\n \r\n // Return only the enabled modules\r\n // This assumes that each module has an 'enabled' property\r\n // Adjust the property name if necessary\r\n if (!Array.isArray(modules)) return [];\r\n if (modules.length === 0) return [];\r\n if (!modules.every((mod) => mod && typeof mod.enabled === 'boolean')) {\r\n throw new Error('Invalid module format: each module must have an \"enabled\" boolean property');\r\n }\r\n if (modules.some((mod) => !mod.lowerName)) {\r\n throw new Error('Invalid module format: each module must have a \"lowerName\" property');\r\n }\r\n\r\n // Filter and return only enabled modules\r\n return modules.filter((mod) => mod.enabled);\r\n },\r\n load(): ModuleMeta[] {\r\n const modulesDir = useSettings.getPaths().modules;\r\n if (!fs.existsSync(modulesDir)) return [];\r\n\r\n const moduleFolders = fs.readdirSync(modulesDir);\r\n const modules: ModuleMeta[] = [];\r\n\r\n moduleFolders.forEach((folder) => {\r\n const modulePath = path.join(modulesDir, folder);\r\n const moduleJsonPath = path.join(modulePath, 'module.json');\r\n if (!fs.existsSync(moduleJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(moduleJsonPath, 'utf-8');\r\n const moduleData = JSON.parse(rawData) as ModuleMeta;\r\n modules.push(moduleData);\r\n } catch {\r\n // invalid json or read error, ignore\r\n }\r\n });\r\n\r\n return modules;\r\n },\r\n\r\n isEnabled(moduleName: string): boolean {\r\n const modules = useModules.load();\r\n const mod = modules.find((m) => m.lowerName === moduleName.toLowerCase());\r\n return mod ? mod.enabled : false;\r\n },\r\n\r\n toggle(moduleName: string): boolean {\r\n const modulesDir = useSettings.getPaths().modules;\r\n const modules = useModules.load();\r\n const modIndex = modules.findIndex((m) => m.lowerName === moduleName.toLowerCase());\r\n if (modIndex === -1) return false;\r\n\r\n const moduleMeta = modules[modIndex];\r\n moduleMeta.enabled = !moduleMeta.enabled;\r\n\r\n const moduleJsonPath = path.join(modulesDir, moduleMeta.lowerName, 'module.json');\r\n try {\r\n fs.writeFileSync(moduleJsonPath, JSON.stringify(moduleMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getModules(): ModuleMeta[] {\r\n return useModules.load();\r\n },\r\n};\r\n","// src/hooks/useServices.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport interface ServiceMeta {\r\n name: string;\r\n lowerName: string;\r\n version?: string;\r\n author?: string;\r\n icon?: string;\r\n description?: string;\r\n enabled: boolean;\r\n providers?: string[];\r\n serviceType?: string;\r\n}\r\n\r\nexport const useServices = {\r\n loadServices(): ServiceMeta[] {\r\n const servicesDir = useSettings.getPaths().services;\r\n if (!fs.existsSync(servicesDir)) return [];\r\n\r\n const serviceFolders = fs.readdirSync(servicesDir);\r\n const services: ServiceMeta[] = [];\r\n\r\n serviceFolders.forEach((folder) => {\r\n const servicePath = path.join(servicesDir, folder);\r\n const serviceJsonPath = path.join(servicePath, 'service.json');\r\n if (!fs.existsSync(serviceJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(serviceJsonPath, 'utf-8');\r\n const serviceData = JSON.parse(rawData) as ServiceMeta;\r\n services.push(serviceData);\r\n } catch {\r\n // ignore invalid json or errors\r\n }\r\n });\r\n\r\n return services;\r\n },\r\n\r\n isServiceEnabled(serviceName: string): boolean {\r\n const services = useServices.loadServices();\r\n const service = services.find((s) => s.lowerName === serviceName.toLowerCase());\r\n return service ? service.enabled : false;\r\n },\r\n\r\n toggleService(serviceName: string, enabled: boolean): boolean {\r\n const servicesDir = useSettings.getPaths().services;\r\n const services = useServices.loadServices();\r\n const index = services.findIndex((s) => s.lowerName === serviceName.toLowerCase());\r\n if (index === -1) return false;\r\n\r\n const serviceMeta = services[index];\r\n serviceMeta.enabled = enabled;\r\n\r\n const serviceJsonPath = path.join(servicesDir, serviceMeta.lowerName, 'service.json');\r\n try {\r\n fs.writeFileSync(serviceJsonPath, JSON.stringify(serviceMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getServices(): ServiceMeta[] {\r\n return useServices.loadServices();\r\n },\r\n};\r\n","// src/hooks/useTemplates.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport type { TemplateType, TemplateMeta, ThemeTypes } from '../types';\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst templates: TemplateMeta[] = [];\r\n\r\nexport const useTemplates = {\r\n loadTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n const templatesDir = useSettings.getPaths().templates;\r\n if (!fs.existsSync(templatesDir)) return [];\r\n\r\n const templateFolders = fs.readdirSync(templatesDir);\r\n\r\n templateFolders.forEach((folder) => {\r\n const templatePath = path.join(templatesDir, folder);\r\n const templateJsonPath = path.join(templatePath, 'template.json');\r\n if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n const templateData = JSON.parse(rawData) as TemplateMeta;\r\n\r\n if (templateType) {\r\n if (templateData.templateType === templateType) {\r\n templates.push(templateData);\r\n }\r\n } else {\r\n templates.push(templateData);\r\n }\r\n } catch {\r\n // ignore invalid JSON or errors\r\n }\r\n });\r\n\r\n return templates;\r\n },\r\n\r\n isTemplateActive(templateType: TemplateType, templateName: string): boolean {\r\n const templates = useTemplates.loadTemplates(templateType);\r\n const template = templates.find(\r\n (t) => t.lowerName === templateName.toLowerCase() && t.enabled\r\n );\r\n return !!template;\r\n },\r\n\r\n toggleTemplate(templateType: TemplateType, templateName: string): boolean {\r\n // Since only one template of each type can be enabled, disable others and enable this one\r\n const templatesDir = useSettings.getPaths().templates;\r\n const templates = useTemplates.loadTemplates(templateType);\r\n\r\n let toggled = false;\r\n\r\n templates.forEach((template) => {\r\n if (template.name.toLowerCase() === templateName.toLowerCase()) {\r\n if (!template.enabled) {\r\n template.enabled = true;\r\n toggled = true;\r\n }\r\n } else {\r\n if (template.enabled) {\r\n template.enabled = false;\r\n }\r\n }\r\n\r\n const templateJsonPath = path.join(templatesDir, template.lowerName, 'template.json');\r\n try {\r\n fs.writeFileSync(templateJsonPath, JSON.stringify(template, null, 2), 'utf-8');\r\n } catch {\r\n // ignore write errors\r\n }\r\n });\r\n\r\n return toggled;\r\n },\r\n\r\n // async getTemplates(templateType?: TemplateType): Promise<TemplateMeta[]> {\r\n // if (isServer) {\r\n // const fs = await import('node:fs');\r\n // const path = await import('node:path');\r\n // const templatesDir = useSettings.getPaths().templates;\r\n // if (!fs.existsSync(templatesDir)) return [];\r\n\r\n // const templateFolders = fs.readdirSync(templatesDir);\r\n // const templates: TemplateMeta[] = [];\r\n\r\n // templateFolders.forEach((folder) => {\r\n // const templatePath = path.join(templatesDir, folder);\r\n // const templateJsonPath = path.join(templatePath, 'template.json');\r\n // if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n // try {\r\n // const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n // const templateData = JSON.parse(rawData) as TemplateMeta;\r\n // if (!templateType || templateData.templateType === templateType) {\r\n // templates.push(templateData);\r\n // }\r\n // } catch {\r\n // // ignore invalid JSON\r\n // }\r\n // });\r\n\r\n // return templates;\r\n // } else {\r\n // // Browser: fetch from public assets\r\n // const types = ['admin', 'client', 'portal', 'email'];\r\n // let tType;\r\n // if (templateType?.includes('-theme')) {\r\n // tType = templateType.replace('-theme', '');\r\n // }\r\n // const typesToFetch = tType ? [tType] : types;\r\n\r\n // const all: TemplateMeta[] = [];\r\n // for (let type of typesToFetch) {\r\n // try {\r\n // const res = await fetch(`/templates/${type}/active.json`);\r\n // if (!res.ok) continue;\r\n // const meta = await res.json();\r\n // all.push(meta);\r\n // console.log(`Loaded active template for type: ${type}`, meta);\r\n // } catch (err) {\r\n // console.warn(`No active template found for type: ${type}`);\r\n // console.error(err);\r\n // }\r\n // }\r\n // return all;\r\n // }\r\n // },\r\n\r\n getTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n return useTemplates.loadTemplates(templateType);\r\n },\r\n\r\n async getActiveTemplate(type: ThemeTypes): Promise<TemplateMeta | null> {\r\n // const templates = useTemplates.loadTemplates(type);\r\n const template = templates.find(\r\n (t) => t.enabled && t.templateType === type\r\n );\r\n return template || null;\r\n }\r\n};\r\n","import fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport { Server as SocketIOServer, Socket } from 'socket.io';\r\nimport chalk from 'chalk';\r\nimport { useSettings } from './useSettings';\r\n\r\ninterface EventController {\r\n label: string;\r\n onRegister?: (io: SocketIOServer) => void;\r\n onEvent?: (socket: Socket, event: any) => void;\r\n}\r\n\r\nlet events: EventController[] = [];\r\nlet logPrefix: any;\r\n\r\nexport const useEvents = {\r\n setPrefix: (prefix: any) => {\r\n logPrefix = prefix;\r\n },\r\n register: async (io: SocketIOServer) => {\r\n const { modules, services, events: appEventsPath } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { type: 'module', root: modules },\r\n { type: 'service', root: services },\r\n { type: 'app', root: appEventsPath },\r\n ];\r\n\r\n for (const source of sources) {\r\n try {\r\n const dirs = await fs.readdir(source.root, { withFileTypes: true });\r\n\r\n for (const dir of dirs) {\r\n if (!dir.isDirectory()) continue;\r\n\r\n const basePath = path.join(source.root, dir.name);\r\n const eventsDir = source.type === 'app' ? basePath : path.join(basePath, 'events');\r\n\r\n let eventFiles: string[] = [];\r\n try {\r\n console.log(logPrefix + chalk.blue(`🔍 Searching for events in: ${eventsDir}`));\r\n eventFiles = await fs.readdir(eventsDir);\r\n console.log(logPrefix + chalk.blue(`🔍 Found events in: ${eventsDir}`));\r\n console.log(logPrefix + chalk.gray(`📂 Directory: ${eventsDir}`))\r\n console.log(logPrefix + chalk.gray(`📄 Files: ${eventFiles.join(', ')} [${eventFiles.length}]`));\r\n } catch {\r\n console.warn(logPrefix + chalk.gray(`⚠️ No events directory found: ${eventsDir}`));\r\n continue;\r\n }\r\n\r\n for (const file of eventFiles) {\r\n const fullPath = path.resolve(eventsDir, file);\r\n if (!file.endsWith('.ts') && !file.endsWith('.js')) continue;\r\n\r\n try {\r\n const imported = await import(pathToFileURL(fullPath).href);\r\n const controller: EventController = imported.default || imported[Object.keys(imported)[0]];\r\n\r\n if (!controller || (!controller.onRegister && !controller.onEvent)) {\r\n console.warn(logPrefix + chalk.yellow(`⚠️ Skipping non-controller file: ${file}`));\r\n continue;\r\n }\r\n\r\n const label = controller.label || file.replace(/\\.(ts|js)$/, '');\r\n\r\n if (controller.onRegister) {\r\n controller.onRegister(io);\r\n }\r\n\r\n events.push({\r\n label,\r\n onRegister: controller.onRegister,\r\n onEvent: controller.onEvent,\r\n });\r\n\r\n console.log(logPrefix + chalk.green(`✅ Registered event: ${label}`));\r\n\r\n if (controller.onEvent) {\r\n io.on('connection', (socket) => {\r\n socket.on(label, (data: any) => controller.onEvent!(socket, data));\r\n });\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to import event file: ${fullPath}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to load events from source: ${source.root}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n },\r\n\r\n load: async (io: SocketIOServer) => {\r\n await useEvents.register(io);\r\n },\r\n\r\n get: async (): Promise<EventController[]> => {\r\n if (events.length === 0) {\r\n console.warn(logPrefix + 'No events loaded yet. Did you call useEvents.load(io)?');\r\n }\r\n return events;\r\n }\r\n};\r\n","// packages/retrex-extensibles-core/useRoutes.ts\r\nimport { Application, Request, Response, NextFunction } from 'express';\r\nimport { pathToFileURL } from 'url';\r\n// import type { LoaderFunctionArgs, ActionFunctionArgs } from '@remix-run/node';\r\nimport path from 'node:path';\r\nimport chalk from 'chalk';\r\nimport fs from 'node:fs';\r\nimport { RouteDefinition } from '../types/index'; // Adjust the import path as necessary\r\nimport { useServices } from './useServices';\r\nimport { useSettings } from './useSettings';\r\n\r\n// Registry for dynamically added routes\r\nconst Prefix = chalk.white('[') + chalk.cyan('Routes Manager | Info') + chalk.white('] ');\r\nconst ErrorPrefix = chalk.white('[') + chalk.red('Routes Manager | Error') + chalk.white('] ');\r\nconst registeredRoutes: RouteDefinition[] = [];\r\nexport const routesManager = {\r\n /**\r\n * Register a dynamic route from a module/service.\r\n */\r\n registerRoute(def: RouteDefinition): void {\r\n registeredRoutes.push(def);\r\n },\r\n\r\n /**\r\n * Return all registered dynamic routes.\r\n */\r\n getRegisteredRoutes(): RouteDefinition[] {\r\n return registeredRoutes;\r\n },\r\n\r\n /**\r\n * Loads and mounts all registered dynamic routes into an Express app.\r\n */\r\n async mountRegisteredRoutes(app: Application, debug: boolean): Promise<{ success: boolean, message?: string }> {\r\n let fullSuccess = false;\r\n try {\r\n for (const route of registeredRoutes) {\r\n try {\r\n if (debug) {\r\n console.log(Prefix + chalk.cyan(`Mounting route: [Label: ${route.label} | Path: ${route.path} -> File: ${route.filePath}]`));\r\n }\r\n\r\n const routeFile = fs.existsSync(route.filePath);\r\n // fs.readdirSync(route.filePath); // Ensure the file exists\r\n if (routeFile) {\r\n if (debug) {\r\n console.warn(ErrorPrefix + chalk.yellow(`⚠️ No files found in route directory: ${route.filePath}`));\r\n }\r\n continue; // Skip empty directories\r\n }\r\n console.log(Prefix + chalk.green(`✓ Found route file: ${route.filePath}`));\r\n \r\n if (debug) {\r\n console.log(Prefix + chalk.green(`✓ Mounted route: ${route.label.toUpperCase()} ${route.path}`));\r\n }\r\n } catch (err: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + chalk.red(`Failed to mount route ${route.path}: ${err?.message}`));\r\n console.error(ErrorPrefix + chalk.red(`Route definition: ${JSON.stringify(route, null, 2)}`));\r\n console.error(ErrorPrefix + chalk.red(`File path: ${route.filePath}`));\r\n console.error(ErrorPrefix + chalk.red(`Error details: ${err}`));\r\n }\r\n fullSuccess = false;\r\n continue; // Skip this route if it fails\r\n }\r\n }\r\n if (fullSuccess) {\r\n return { success: true }\r\n }\r\n return { success: fullSuccess, message: 'Some routes failed to mount, check logs for details.' };\r\n } catch (error: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + 'Error mounting registered routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n console.error(ErrorPrefix + 'Registered routes:', JSON.stringify(registeredRoutes, null, 2));\r\n // Optionally rethrow the error if you want to stop the server startup \r\n // throw new Error(`Failed to mount registered routes: ${error.message}`);\r\n // Or you can just log it and continue\r\n console.error(ErrorPrefix + 'Continuing without mounting routes due to error.');\r\n }\r\n // Optionally, you can throw an error here if you want to stop the server startup\r\n return { success: fullSuccess, message: `Failed to mount dynamic routes: ${error.message}` };\r\n // throw new Error(`Failed to mount dynamic routes: ${error.message}`);\r\n }\r\n },\r\n\r\n async getMountedRoutes(): Promise<RouteDefinition[]> {\r\n try {\r\n return registeredRoutes;\r\n } catch (error: any) {\r\n console.error(ErrorPrefix + 'Error getting mounted routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n throw new Error(`Failed to get mounted routes: ${error.message}`);\r\n }\r\n }\r\n}\r\n","// packages/retrex-extensibles-core/hooks/useUtils.ts\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport fs from 'node:fs';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport const useUtils = {\r\n async loadThemeComponent(\r\n componentName: string,\r\n options: {\r\n theme: {\r\n name: string;\r\n type: 'admin' | 'client' | 'portal' | 'email';\r\n };\r\n search?: {\r\n themes?: boolean;\r\n modules?: boolean;\r\n services?: boolean;\r\n };\r\n }\r\n ): Promise<React.ComponentType<any> | null> {\r\n const { search = {}, theme } = options;\r\n const searchThemes = search.themes ?? true;\r\n const searchModules = search.modules ?? true;\r\n const searchServices = search.services ?? true;\r\n\r\n const possiblePaths: string[] = [];\r\n\r\n console.log(`Searching for component \"${componentName}\" in theme \"${theme.name}\" of type \"${theme.type}\"...`);\r\n\r\n try {\r\n if (searchThemes) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n \r\n if (searchModules) {\r\n const moduleDirs = await fs.readdirSync(useSettings.getPaths().modules);\r\n for (const mod of moduleDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n if (searchServices) {\r\n const serviceDirs = await fs.readdirSync(useSettings.getPaths().services);\r\n for (const svc of serviceDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n for (const filePath of possiblePaths) {\r\n if (await fs.existsSync(filePath)) {\r\n try {\r\n const mod = await import(pathToFileURL(filePath).toString());\r\n if (mod.default) return mod.default;\r\n } catch (err) {\r\n console.error(`Error loading component at ${filePath}:`, err);\r\n }\r\n }\r\n }\r\n \r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n return null;\r\n } catch (err) {\r\n console.error(`Error searching for component \"${componentName}\":`, err);\r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n console.warn(`Searched paths:`, possiblePaths);\r\n console.warn(`Ensure the component exists in the specified theme and type.`);\r\n console.warn(`If the component is in a module or service, ensure the theme structure is correct.`);\r\n console.warn(`If you are using a custom theme, module, or service, ensure it is properly configured and registered in the settings.`);\r\n return null;\r\n }\r\n }\r\n}\r\n","// useTranslation.ts\r\nimport merge from 'lodash.merge';\r\n\r\ntype LangPack = Record<string, any>;\r\ntype LangMap = Record<string, LangPack>;\r\n\r\nconst langs: Record<string, LangMap> = {};\r\nlet currentLang = 'en';\r\nlet isLoaded = false;\r\n\r\nexport const useTranslation = {\r\n async load(preloaded?: Record<string, LangMap>): Promise<void> {\r\n if (typeof window !== 'undefined') {\r\n // 🌐 Browser: expect SSR-preloaded translations or lazy fetch\r\n if (preloaded) {\r\n merge(langs, preloaded);\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // If no preloaded translations, fallback to fetch (on-demand)\r\n const lang = currentLang;\r\n const types = ['admin', 'client', 'portal', 'email']; // Customize as needed\r\n\r\n for (const type of types) {\r\n try {\r\n const res = await fetch(`/langs/${lang}/${type}.json`);\r\n if (res.ok) {\r\n const json = await res.json();\r\n langs[lang] ??= {};\r\n langs[lang][type] = merge(langs[lang][type] ?? {}, json);\r\n }\r\n } catch (err) {\r\n console.warn(`[useTranslation] Failed to fetch ${type}.json`, err);\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // 🖥️ Node/server-side: read from filesystem using useSettings\r\n const path = await import('node:path');\r\n const fs = await import('node:fs/promises');\r\n const { existsSync } = await import('node:fs');\r\n const { useSettings } = await import('./useSettings');\r\n const { langs: langsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { root: langsPath },\r\n { root: modules },\r\n { root: services },\r\n { root: templates },\r\n ];\r\n\r\n for (const source of sources) {\r\n if (!existsSync(source.root)) continue;\r\n\r\n const entries = await fs.readdir(source.root);\r\n for (const entry of entries) {\r\n const basePath = path.join(source.root, entry, 'langs');\r\n if (!existsSync(basePath)) continue;\r\n\r\n const langDirs = await fs.readdir(basePath);\r\n for (const langCode of langDirs) {\r\n const langPath = path.join(basePath, langCode);\r\n const stat = await fs.stat(langPath);\r\n if (!stat.isDirectory()) continue;\r\n\r\n const files = await fs.readdir(langPath);\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n const type = file.replace('.json', '');\r\n const content = JSON.parse(await fs.readFile(path.join(langPath, file), 'utf8'));\r\n\r\n langs[langCode] ??= {};\r\n langs[langCode][type] = merge(langs[langCode][type] ?? {}, content);\r\n }\r\n }\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n },\r\n\r\n useLang(langCode: string): void {\r\n if (!langs[langCode]) {\r\n console.warn(`[useTranslation] Language \"${langCode}\" not found`);\r\n return;\r\n }\r\n currentLang = langCode;\r\n },\r\n\r\n getLang(): string {\r\n return currentLang;\r\n },\r\n\r\n getLangMap(langCode?: string): LangMap {\r\n return langs[langCode ?? currentLang] || {};\r\n },\r\n\r\n getLangs(): string[] {\r\n return Object.keys(langs);\r\n },\r\n\r\n t(key: string, fallback = '', values: Record<string, string> = {}): string {\r\n const [namespace, ...rest] = key.split('.');\r\n const langPack = langs[currentLang]?.[namespace];\r\n\r\n if (!langPack) return fallback;\r\n\r\n let result: any = langPack;\r\n for (const part of rest) {\r\n result = result?.[part];\r\n if (result === undefined) return fallback;\r\n }\r\n\r\n if (typeof result !== 'string') return fallback;\r\n\r\n return Object.entries(values).reduce(\r\n (text, [k, v]) => text.replace(new RegExp(`{${k}}`, 'g'), v),\r\n result\r\n );\r\n },\r\n\r\n reset() {\r\n Object.keys(langs).forEach((k) => delete langs[k]);\r\n isLoaded = false;\r\n },\r\n\r\n getAll() {\r\n return langs;\r\n },\r\n\r\n isReady() {\r\n return isLoaded;\r\n }\r\n};\r\n\r\n\r\n\r\n// import path from 'node:path';\r\n// import fs from 'node:fs/promises';\r\n// import { existsSync } from 'node:fs';\r\n// import { useSettings } from './useSettings';\r\n// import merge from 'lodash.merge';\r\n\r\n// type LangPack = Record<string, any>;\r\n// type LangMap = Record<string, LangPack>;\r\n\r\n// const langs: Record<string, LangMap> = {};\r\n// let currentLang = 'en';\r\n\r\n// export const useTranslation = {\r\n// /**\r\n// * Load all language files from the core, services, modules, and templates.\r\n// */\r\n// async load(): Promise<void> {\r\n// const { langs: rootLangsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n// const sources = [\r\n// { label: 'root', path: rootLangsPath },\r\n// { label: 'modules', path: modules },\r\n// { label: 'services', path: services },\r\n// { label: 'templates', path: templates },\r\n// ];\r\n\r\n// for (const source of sources) {\r\n// if (!existsSync(source.path)) continue;\r\n\r\n// const entries = await fs.readdir(source.path);\r\n// for (const entry of entries) {\r\n// const fullPath = path.join(source.path, entry, 'langs');\r\n// if (!existsSync(fullPath)) continue;\r\n\r\n// const langDirs = await fs.readdir(fullPath);\r\n// for (const langCode of langDirs) {\r\n// const langPath = path.join(fullPath, langCode);\r\n// const stat = await fs.stat(langPath);\r\n// if (!stat.isDirectory()) continue;\r\n\r\n// const files = await fs.readdir(langPath);\r\n// for (const file of files) {\r\n// if (!file.endsWith('.json')) continue;\r\n\r\n// const namespace = file.replace('.json', '');\r\n// const filePath = path.join(langPath, file);\r\n// const content = JSON.parse(await fs.readFile(filePath, 'utf8'));\r\n\r\n// langs[langCode] ??= {};\r\n// langs[langCode][namespace] = merge(langs[langCode][namespace] ?? {}, content);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// },\r\n\r\n// /**\r\n// * Change the active language code\r\n// */\r\n// useLang(langCode: string): void {\r\n// if (!langs[langCode]) {\r\n// console.warn(`[useTranslation] Language \"${langCode}\" not loaded or missing`);\r\n// return;\r\n// }\r\n// currentLang = langCode;\r\n// },\r\n\r\n// /**\r\n// * Return the active language code\r\n// */\r\n// getLang(): string {\r\n// return currentLang;\r\n// },\r\n\r\n// /**\r\n// * Return the full translation map of a specific language\r\n// */\r\n// getLangMap(langCode?: string): LangMap {\r\n// return langs[langCode ?? currentLang] || {};\r\n// },\r\n\r\n// /**\r\n// * Return the list of loaded languages\r\n// */\r\n// getLangs(): string[] {\r\n// return Object.keys(langs);\r\n// },\r\n\r\n// /**\r\n// * Translate a key from a namespace\r\n// * Example: t('admin.dashboard.title')\r\n// */\r\n// // t(key: string, fallback: string = '', values: Record<string, string> = {}): string {\r\n// // const raw = /* same logic as above to get the string */;\r\n// // return Object.entries(values).reduce((acc, [k, v]) => acc.replaceAll(`{${k}}`, v), raw);\r\n// // }\r\n// t(key: string, fallback: string = ''): string {\r\n// const [namespace, ...parts] = key.split('.');\r\n// const lang = langs[currentLang] ?? {};\r\n// const scope = lang[namespace];\r\n\r\n// if (!scope) return fallback;\r\n\r\n// let value = scope;\r\n// for (const part of parts) {\r\n// value = value?.[part];\r\n// if (value === undefined) return fallback;\r\n// }\r\n\r\n// return typeof value === 'string' ? value : fallback;\r\n// },\r\n\r\n// /**\r\n// * Clear translations (used in dev hot reload or test environments)\r\n// */\r\n// reset(): void {\r\n// Object.keys(langs).forEach((lang) => delete langs[lang]);\r\n// }\r\n// };\r\n","// src/providers/ThemeProvider.tsx\r\nimport React, { createContext, useContext, useEffect, useState } from 'react';\r\nimport type { TemplateMeta, TemplateType, ThemeTypes } from '../types';\r\nimport { useTemplates } from '../hooks/useTemplates';\r\n\r\ninterface ThemeContextProps {\r\n templateType: TemplateType;\r\n activeTheme: TemplateMeta | null;\r\n setActiveTheme: (theme: TemplateMeta) => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextProps | null>(null);\r\n\r\nexport const ThemeProvider: React.FC<{\r\n type: TemplateType;\r\n children: React.ReactNode;\r\n}> = ({ type, children }) => {\r\n const [activeTheme, setActiveTheme] = useState<TemplateMeta | null>(null);\r\n let tType: string;\r\n useEffect(() => {\r\n if (type.includes('-theme')) {\r\n tType = type.replace('-theme', '');\r\n } else {\r\n tType = type;\r\n }\r\n useTemplates.getActiveTemplate(tType as ThemeTypes).then((template) => {\r\n setActiveTheme(template);\r\n });\r\n }, [type]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ templateType: type, activeTheme, setActiveTheme }}>\r\n {!activeTheme ? (\r\n <div>Loading theme...</div>\r\n ) :\r\n children\r\n }\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n\r\nexport function useTheme() {\r\n const ctx = useContext(ThemeContext);\r\n if (!ctx) throw new Error('useTheme must be used inside a ThemeProvider');\r\n return ctx;\r\n}\r\n"],"mappings":"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","names":["paths","extensiblePaths","fs","path","templates","paths","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","fs","path","templates","import_node_path","import_url","fs","path","chalk","import_chalk","import_node_fs","chalk","fs","import_node_path","import_url","import_node_fs","path","fs","merge","path","fs","useSettings","templates"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/hooks/useSettings.ts","../src/core/hooks/useExtensibles.ts","../src/index.ts","../src/core/hooks/useModules.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTemplates.ts","../src/core/hooks/useEvents.ts","../src/core/hooks/useRoutes.ts","../src/core/hooks/useUtils.ts","../src/core/hooks/useTranslator.ts","../src/core/providers/ThemeProvider.tsx"],"sourcesContent":["// src/hooks/useSettings.ts\r\n\r\nimport path from 'node:path';\r\n\r\nimport { loadJSON, saveJSON } from './useExtensibles';\r\nimport type { ExtensiblePaths } from '../types'; // Adjust the import path as necessary\r\n\r\nlet extensiblePaths: ExtensiblePaths = {\r\n modules: './app/modules',\r\n templates: './app/resources/themes',\r\n services: './app/services',\r\n events: './app/events',\r\n langs: './public/langs',\r\n};\r\n\r\nconst isServer = typeof window === 'undefined';\r\n\r\n\r\nexport const useSettings = {\r\n getPaths(): ExtensiblePaths {\r\n if (isServer) {\r\n const json = loadJSON('./app/extensiblePaths.json');\r\n if (json) extensiblePaths = json;\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n langs: './langs'\r\n }\r\n // extensiblePaths = loadJSON(\"./app/extensiblePaths.json\");\r\n return extensiblePaths;\r\n },\r\n\r\n setPaths(paths: Partial<ExtensiblePaths>): void {\r\n if (isServer) {\r\n saveJSON('./app/extensiblePaths.json', {\r\n ...extensiblePaths,\r\n ...paths,\r\n });\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n ...paths,\r\n };\r\n },\r\n \r\n getKeyValue(key: string): string {\r\n return 'Coming Soon'\r\n },\r\n setKeyValue(key: string, value: string): void {\r\n return;\r\n },\r\n};\r\n","// src/hooks/useExtensibles.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { pathToFileURL } from 'url';\r\nimport type { TemplateType, ExtensibleMeta, ExtensiblePaths } from '../types';\r\n\r\nlet paths: ExtensiblePaths;\r\n\r\nexport function registerExtensibles(extensiblePaths: ExtensiblePaths) {\r\n paths = extensiblePaths;\r\n}\r\n\r\nexport function loadJSON(filePath: string): any {\r\n if (!fs.existsSync(filePath)) return null;\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\r\n}\r\n\r\nexport function saveJSON(filePath: string, data: any) {\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\r\n}\r\n\r\n// --- MODULES ---\r\n\r\nexport function getModules(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().modules)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().modules, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().modules, dir, 'module.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isModuleEnabled(name: string) {\r\n const modules = getModules();\r\n return modules.find((m) => m.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleModule(name: string, enabled: boolean) {\r\n const modules = getModules();\r\n const mod = modules.find((m) => m.lowerName === name.toLowerCase());\r\n if (!mod) throw new Error(`Module ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().modules, mod.lowerName, 'module.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onModuleEnabled(mod.name);\r\n else onModuleDisabled(mod.name);\r\n}\r\n\r\n// --- SERVICES ---\r\n\r\nexport function getServices(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().services) throw new Error('Services path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().services)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().services, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().services, dir, 'service.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isServiceEnabled(name: string) {\r\n const services = getServices();\r\n return services.find((s) => s.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleService(name: string, enabled: boolean) {\r\n const services = getServices();\r\n const svc = services.find((s) => s.lowerName === name.toLowerCase());\r\n if (!svc) throw new Error(`Service ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().services, svc.lowerName, 'service.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onServiceEnabled(svc.name);\r\n else onServiceDisabled(svc.name);\r\n}\r\n\r\n// --- TEMPLATES ---\r\n\r\n// Helper to get base path for a template type\r\nfunction getTemplateBasePath(type: TemplateType): string {\r\n if (!useSettings.getPaths().templates) throw new Error('Templates path not registered.');\r\n switch (type) {\r\n case 'admin-theme':\r\n case 'client-theme':\r\n return path.join(useSettings.getPaths().templates, 'themes');\r\n case 'portal':\r\n return path.join(useSettings.getPaths().templates, 'portals');\r\n case 'email':\r\n return path.join(useSettings.getPaths().templates, 'emails');\r\n default:\r\n throw new Error(`Unknown template type: ${type}`);\r\n }\r\n}\r\n\r\nexport function getTemplates(type: TemplateType): ExtensibleMeta[] {\r\n const basePath = getTemplateBasePath(type);\r\n if (!fs.existsSync(basePath)) return [];\r\n\r\n const dirs = fs\r\n .readdirSync(basePath)\r\n .filter((d: any) => fs.statSync(path.join(basePath, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(basePath, dir, 'template.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isTemplateActive(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n return templates.find((t) => t.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\n// Toggle templates: only 1 active per type allowed\r\nexport function toggleTemplate(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n\r\n templates.forEach((tpl) => {\r\n const metaPath = path.join(getTemplateBasePath(type), tpl.lowerName, 'template.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = tpl.lowerName === name.toLowerCase();\r\n saveJSON(metaPath, meta);\r\n });\r\n\r\n onTemplateSelect(type, name);\r\n}\r\n\r\n// --- EVENTS (replace with your event system integration) ---\r\n\r\nexport function onModuleEnabled(name: string) {\r\n console.log(`Module enabled: ${name}`);\r\n // emit event or custom logic here\r\n}\r\n\r\nexport function onModuleDisabled(name: string) {\r\n console.log(`Module disabled: ${name}`);\r\n}\r\n\r\nexport function onServiceEnabled(name: string) {\r\n console.log(`Service enabled: ${name}`);\r\n}\r\n\r\nexport function onServiceDisabled(name: string) {\r\n console.log(`Service disabled: ${name}`);\r\n}\r\n\r\nexport function onTemplateSelect(type: TemplateType, name: string) {\r\n console.log(`Template selected: type=${type}, name=${name}`);\r\n}\r\n\r\n// --- REGISTER HOOKS FOR MODULES ---\r\n\r\nexport async function registerEvents() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const eventsFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'events.server.js');\r\n if (fs.existsSync(eventsFile)) {\r\n const modEvents = await import(eventsFile);\r\n if (modEvents?.registerEvents) await modEvents.registerEvents();\r\n }\r\n }\r\n}\r\n\r\nexport async function registerMiddleware() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const middlewareFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'middleware.server.js');\r\n if (fs.existsSync(middlewareFile)) {\r\n const modMiddleware = await import(middlewareFile);\r\n if (modMiddleware?.registerMiddleware) await modMiddleware.registerMiddleware();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Registers routes given a path to routes folder (for pages and API routes)\r\n * @param routesFolderPath string - path to module/service routes folder\r\n */\r\nexport async function registerRoutes(routesFolderPath: string) {\r\n if (!fs.existsSync(routesFolderPath)) return;\r\n\r\n const routeFiles = fs.readdirSync(routesFolderPath).filter((f: any) => /\\.(js|ts|jsx|tsx)$/.test(f));\r\n for (const file of routeFiles) {\r\n const routeModule = await import(path.join(routesFolderPath, file));\r\n if (routeModule?.registerRoute) {\r\n await routeModule.registerRoute();\r\n }\r\n }\r\n}\r\n\r\nexport async function loadProviders() {\r\n const paths = useSettings.getPaths();\r\n\r\n const all = [\r\n { type: 'module', list: getModules(), basePath: paths.modules },\r\n { type: 'service', list: getServices(), basePath: paths.services },\r\n ];\r\n\r\n for (const { type, list, basePath } of all) {\r\n for (const item of list) {\r\n if (!item.enabled) continue;\r\n\r\n const metaPath = path.join(path.resolve(basePath), item.lowerName, `${type}.json`);\r\n const meta = loadJSON(metaPath);\r\n if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n for (const providerRelPath of meta.providers) {\r\n try {\r\n let providerAbsPath = path.join(path.resolve(basePath), item.lowerName, providerRelPath);\r\n\r\n // Try .js fallback if file is .ts or .tsx\r\n const ext = path.extname(providerAbsPath);\r\n if (ext === '.ts' || ext === '.tsx') {\r\n const jsPath = providerAbsPath.replace(/\\.(ts|tsx)$/, '.js');\r\n try {\r\n await fs.accessSync(jsPath); // Check if compiled JS file exists\r\n providerAbsPath = jsPath;\r\n } catch {\r\n throw new Error(`Compiled JS version not found for provider: ${providerRelPath}`);\r\n }\r\n }\r\n\r\n const providerUrl = pathToFileURL(providerAbsPath).href.toString();\r\n const providerModule = await import(providerUrl);\r\n\r\n if (typeof providerModule.default === 'function') {\r\n await providerModule.default();\r\n console.log(`[${type}] ✅ Provider loaded: ${providerRelPath}`);\r\n } else {\r\n console.warn(`[${type}] ⚠️ Provider ${providerRelPath} has no default export.`);\r\n }\r\n } catch (err) {\r\n console.error(`[${type}] ❌ Failed to load provider ${providerRelPath}:`, err);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n// export async function loadProviders() {\r\n// paths = {\r\n// modules: useSettings.getPaths().modules,\r\n// templates: useSettings.getPaths().templates,\r\n// services: useSettings.getPaths().services,\r\n// events: useSettings.getPaths().events,\r\n// }\r\n// const all = [\r\n// { type: 'module', list: getModules(), basePath: useSettings.getPaths().modules },\r\n// { type: 'service', list: getServices(), basePath: useSettings.getPaths().services },\r\n// ];\r\n\r\n// for (const { type, list, basePath } of all) {\r\n// for (const item of list) {\r\n// if (!item.enabled) continue;\r\n\r\n// const metaPath = path.join(basePath, item.lowerName, `${type}.json`);\r\n// const meta = loadJSON(metaPath);\r\n// if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n// for (const providerRelPath of meta.providers) {\r\n// try {\r\n// const providerPath = path.join(basePath, item.lowerName, providerRelPath);\r\n// const providerModule = await import(providerPath);\r\n// if (typeof providerModule.default === 'function') {\r\n// await providerModule.default(); // Call provider\r\n// console.log(`[${type}] Provider loaded: ${providerRelPath}`);\r\n// } else {\r\n// console.warn(`[${type}] Provider ${providerRelPath} has no default export.`);\r\n// }\r\n// } catch (err) {\r\n// console.error(`[${type}] Failed to load provider ${providerRelPath}:`, err);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// }\r\n","// src/index.ts\r\n\r\n// export * from './core/controller/EventController';\r\n// export * from './core/controller/MiddlewareController';\r\nexport * from './core/hooks/useExtensibles';\r\nexport * from './core/hooks/useSettings';\r\nexport * from './core/hooks/useModules';\r\nexport * from './core/hooks/useServices';\r\nexport * from './core/hooks/useTemplates';\r\nexport * from './core/hooks/useEvents';\r\nexport * from './core/hooks/useRoutes';\r\nexport * from './core/hooks/useUtils';\r\nexport * from './core/hooks/useTranslator';\r\n// export * as ThemeProvider from './core/providers/ThemeProvider';\r\nexport * from './core/providers/ThemeProvider';\r\nexport * from './core/types/index';\r\n","// src/hooks/useModules.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { ModuleMeta } from '../types'; // Adjust the import path as necessary\r\n\r\nexport const useModules = {\r\n allEnabled(): ModuleMeta[] {\r\n const modules = useModules.load();\r\n if (!modules || modules.length === 0) return [];\r\n // Filter out modules that are not enabled\r\n \r\n // Return only the enabled modules\r\n // This assumes that each module has an 'enabled' property\r\n // Adjust the property name if necessary\r\n if (!Array.isArray(modules)) return [];\r\n if (modules.length === 0) return [];\r\n if (!modules.every((mod) => mod && typeof mod.enabled === 'boolean')) {\r\n throw new Error('Invalid module format: each module must have an \"enabled\" boolean property');\r\n }\r\n if (modules.some((mod) => !mod.lowerName)) {\r\n throw new Error('Invalid module format: each module must have a \"lowerName\" property');\r\n }\r\n\r\n // Filter and return only enabled modules\r\n return modules.filter((mod) => mod.enabled);\r\n },\r\n load(): ModuleMeta[] {\r\n const modulesDir = useSettings.getPaths().modules;\r\n if (!fs.existsSync(modulesDir)) return [];\r\n\r\n const moduleFolders = fs.readdirSync(modulesDir);\r\n const modules: ModuleMeta[] = [];\r\n\r\n moduleFolders.forEach((folder) => {\r\n const modulePath = path.join(modulesDir, folder);\r\n const moduleJsonPath = path.join(modulePath, 'module.json');\r\n if (!fs.existsSync(moduleJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(moduleJsonPath, 'utf-8');\r\n const moduleData = JSON.parse(rawData) as ModuleMeta;\r\n modules.push(moduleData);\r\n } catch {\r\n // invalid json or read error, ignore\r\n }\r\n });\r\n\r\n return modules;\r\n },\r\n\r\n isEnabled(moduleName: string): boolean {\r\n const modules = useModules.load();\r\n const mod = modules.find((m) => m.lowerName === moduleName.toLowerCase());\r\n return mod ? mod.enabled : false;\r\n },\r\n\r\n toggle(moduleName: string): boolean {\r\n const modulesDir = useSettings.getPaths().modules;\r\n const modules = useModules.load();\r\n const modIndex = modules.findIndex((m) => m.lowerName === moduleName.toLowerCase());\r\n if (modIndex === -1) return false;\r\n\r\n const moduleMeta = modules[modIndex];\r\n moduleMeta.enabled = !moduleMeta.enabled;\r\n\r\n const moduleJsonPath = path.join(modulesDir, moduleMeta.lowerName, 'module.json');\r\n try {\r\n fs.writeFileSync(moduleJsonPath, JSON.stringify(moduleMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getModules(): ModuleMeta[] {\r\n return useModules.load();\r\n },\r\n};\r\n","// src/hooks/useServices.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport interface ServiceMeta {\r\n name: string;\r\n lowerName: string;\r\n version?: string;\r\n author?: string;\r\n icon?: string;\r\n description?: string;\r\n enabled: boolean;\r\n providers?: string[];\r\n serviceType?: string;\r\n}\r\n\r\nexport const useServices = {\r\n loadServices(): ServiceMeta[] {\r\n const servicesDir = useSettings.getPaths().services;\r\n if (!fs.existsSync(servicesDir)) return [];\r\n\r\n const serviceFolders = fs.readdirSync(servicesDir);\r\n const services: ServiceMeta[] = [];\r\n\r\n serviceFolders.forEach((folder) => {\r\n const servicePath = path.join(servicesDir, folder);\r\n const serviceJsonPath = path.join(servicePath, 'service.json');\r\n if (!fs.existsSync(serviceJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(serviceJsonPath, 'utf-8');\r\n const serviceData = JSON.parse(rawData) as ServiceMeta;\r\n services.push(serviceData);\r\n } catch {\r\n // ignore invalid json or errors\r\n }\r\n });\r\n\r\n return services;\r\n },\r\n\r\n isServiceEnabled(serviceName: string): boolean {\r\n const services = useServices.loadServices();\r\n const service = services.find((s) => s.lowerName === serviceName.toLowerCase());\r\n return service ? service.enabled : false;\r\n },\r\n\r\n toggleService(serviceName: string, enabled: boolean): boolean {\r\n const servicesDir = useSettings.getPaths().services;\r\n const services = useServices.loadServices();\r\n const index = services.findIndex((s) => s.lowerName === serviceName.toLowerCase());\r\n if (index === -1) return false;\r\n\r\n const serviceMeta = services[index];\r\n serviceMeta.enabled = enabled;\r\n\r\n const serviceJsonPath = path.join(servicesDir, serviceMeta.lowerName, 'service.json');\r\n try {\r\n fs.writeFileSync(serviceJsonPath, JSON.stringify(serviceMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getServices(): ServiceMeta[] {\r\n return useServices.loadServices();\r\n },\r\n};\r\n","// src/hooks/useTemplates.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport type { TemplateType, TemplateMeta, ThemeTypes } from '../types';\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst templates: TemplateMeta[] = [];\r\n\r\nexport const useTemplates = {\r\n loadTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n const templatesDir = useSettings.getPaths().templates;\r\n if (!fs.existsSync(templatesDir)) return [];\r\n\r\n const templateFolders = fs.readdirSync(templatesDir);\r\n\r\n templateFolders.forEach((folder) => {\r\n const templatePath = path.join(templatesDir, folder);\r\n const templateJsonPath = path.join(templatePath, 'template.json');\r\n if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n const templateData = JSON.parse(rawData) as TemplateMeta;\r\n\r\n if (templateType) {\r\n if (templateData.templateType === templateType) {\r\n templates.push(templateData);\r\n }\r\n } else {\r\n templates.push(templateData);\r\n }\r\n } catch {\r\n // ignore invalid JSON or errors\r\n }\r\n });\r\n\r\n return templates;\r\n },\r\n\r\n isTemplateActive(templateType: TemplateType, templateName: string): boolean {\r\n const templates = useTemplates.loadTemplates(templateType);\r\n const template = templates.find(\r\n (t) => t.lowerName === templateName.toLowerCase() && t.enabled\r\n );\r\n return !!template;\r\n },\r\n\r\n toggleTemplate(templateType: TemplateType, templateName: string): boolean {\r\n // Since only one template of each type can be enabled, disable others and enable this one\r\n const templatesDir = useSettings.getPaths().templates;\r\n const templates = useTemplates.loadTemplates(templateType);\r\n\r\n let toggled = false;\r\n\r\n templates.forEach((template) => {\r\n if (template.name.toLowerCase() === templateName.toLowerCase()) {\r\n if (!template.enabled) {\r\n template.enabled = true;\r\n toggled = true;\r\n }\r\n } else {\r\n if (template.enabled) {\r\n template.enabled = false;\r\n }\r\n }\r\n\r\n const templateJsonPath = path.join(templatesDir, template.lowerName, 'template.json');\r\n try {\r\n fs.writeFileSync(templateJsonPath, JSON.stringify(template, null, 2), 'utf-8');\r\n } catch {\r\n // ignore write errors\r\n }\r\n });\r\n\r\n return toggled;\r\n },\r\n\r\n // async getTemplates(templateType?: TemplateType): Promise<TemplateMeta[]> {\r\n // if (isServer) {\r\n // const fs = await import('node:fs');\r\n // const path = await import('node:path');\r\n // const templatesDir = useSettings.getPaths().templates;\r\n // if (!fs.existsSync(templatesDir)) return [];\r\n\r\n // const templateFolders = fs.readdirSync(templatesDir);\r\n // const templates: TemplateMeta[] = [];\r\n\r\n // templateFolders.forEach((folder) => {\r\n // const templatePath = path.join(templatesDir, folder);\r\n // const templateJsonPath = path.join(templatePath, 'template.json');\r\n // if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n // try {\r\n // const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n // const templateData = JSON.parse(rawData) as TemplateMeta;\r\n // if (!templateType || templateData.templateType === templateType) {\r\n // templates.push(templateData);\r\n // }\r\n // } catch {\r\n // // ignore invalid JSON\r\n // }\r\n // });\r\n\r\n // return templates;\r\n // } else {\r\n // // Browser: fetch from public assets\r\n // const types = ['admin', 'client', 'portal', 'email'];\r\n // let tType;\r\n // if (templateType?.includes('-theme')) {\r\n // tType = templateType.replace('-theme', '');\r\n // }\r\n // const typesToFetch = tType ? [tType] : types;\r\n\r\n // const all: TemplateMeta[] = [];\r\n // for (let type of typesToFetch) {\r\n // try {\r\n // const res = await fetch(`/templates/${type}/active.json`);\r\n // if (!res.ok) continue;\r\n // const meta = await res.json();\r\n // all.push(meta);\r\n // console.log(`Loaded active template for type: ${type}`, meta);\r\n // } catch (err) {\r\n // console.warn(`No active template found for type: ${type}`);\r\n // console.error(err);\r\n // }\r\n // }\r\n // return all;\r\n // }\r\n // },\r\n\r\n getTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n return useTemplates.loadTemplates(templateType);\r\n },\r\n\r\n async getActiveTemplate(type: ThemeTypes): Promise<TemplateMeta | null> {\r\n // const templates = useTemplates.loadTemplates(type);\r\n const template = templates.find(\r\n (t) => t.enabled && t.templateType === type\r\n );\r\n return template || null;\r\n }\r\n};\r\n","import fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport { Server as SocketIOServer, Socket } from 'socket.io';\r\nimport chalk from 'chalk';\r\nimport { useSettings } from './useSettings';\r\n\r\ninterface EventController {\r\n label: string;\r\n onRegister?: (io: SocketIOServer) => void;\r\n onEvent?: (socket: Socket, event: any) => void;\r\n}\r\n\r\nlet events: EventController[] = [];\r\nlet logPrefix: any;\r\n\r\nexport const useEvents = {\r\n setPrefix: (prefix: any) => {\r\n logPrefix = prefix;\r\n },\r\n register: async (io: SocketIOServer) => {\r\n const { modules, services, events: appEventsPath } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { type: 'module', root: modules },\r\n { type: 'service', root: services },\r\n { type: 'app', root: appEventsPath },\r\n ];\r\n\r\n for (const source of sources) {\r\n try {\r\n const dirs = await fs.readdir(source.root, { withFileTypes: true });\r\n\r\n for (const dir of dirs) {\r\n if (!dir.isDirectory()) continue;\r\n\r\n const basePath = path.join(source.root, dir.name);\r\n const eventsDir = source.type === 'app' ? basePath : path.join(basePath, 'events');\r\n\r\n let eventFiles: string[] = [];\r\n try {\r\n console.log(logPrefix + chalk.blue(`🔍 Searching for events in: ${eventsDir}`));\r\n eventFiles = await fs.readdir(eventsDir);\r\n console.log(logPrefix + chalk.blue(`🔍 Found events in: ${eventsDir}`));\r\n console.log(logPrefix + chalk.gray(`📂 Directory: ${eventsDir}`))\r\n console.log(logPrefix + chalk.gray(`📄 Files: ${eventFiles.join(', ')} [${eventFiles.length}]`));\r\n } catch {\r\n console.warn(logPrefix + chalk.gray(`⚠️ No events directory found: ${eventsDir}`));\r\n continue;\r\n }\r\n\r\n for (const file of eventFiles) {\r\n const fullPath = path.resolve(eventsDir, file);\r\n if (!file.endsWith('.ts') && !file.endsWith('.js')) continue;\r\n\r\n try {\r\n const imported = await import(pathToFileURL(fullPath).href);\r\n const controller: EventController = imported.default || imported[Object.keys(imported)[0]];\r\n\r\n if (!controller || (!controller.onRegister && !controller.onEvent)) {\r\n console.warn(logPrefix + chalk.yellow(`⚠️ Skipping non-controller file: ${file}`));\r\n continue;\r\n }\r\n\r\n const label = controller.label || file.replace(/\\.(ts|js)$/, '');\r\n\r\n if (controller.onRegister) {\r\n controller.onRegister(io);\r\n }\r\n\r\n events.push({\r\n label,\r\n onRegister: controller.onRegister,\r\n onEvent: controller.onEvent,\r\n });\r\n\r\n console.log(logPrefix + chalk.green(`✅ Registered event: ${label}`));\r\n\r\n if (controller.onEvent) {\r\n io.on('connection', (socket) => {\r\n socket.on(label, (data: any) => controller.onEvent!(socket, data));\r\n });\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to import event file: ${fullPath}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to load events from source: ${source.root}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n },\r\n\r\n load: async (io: SocketIOServer) => {\r\n await useEvents.register(io);\r\n },\r\n\r\n get: async (): Promise<EventController[]> => {\r\n if (events.length === 0) {\r\n console.warn(logPrefix + 'No events loaded yet. Did you call useEvents.load(io)?');\r\n }\r\n return events;\r\n }\r\n};\r\n","// packages/retrex-extensibles-core/useRoutes.ts\r\nimport { Application, Request, Response, NextFunction } from 'express';\r\nimport { pathToFileURL } from 'url';\r\n// import type { LoaderFunctionArgs, ActionFunctionArgs } from '@remix-run/node';\r\nimport path from 'node:path';\r\nimport chalk from 'chalk';\r\nimport fs from 'node:fs';\r\nimport { RouteDefinition } from '../types/index'; // Adjust the import path as necessary\r\nimport { useServices } from './useServices';\r\nimport { useSettings } from './useSettings';\r\n\r\n// Registry for dynamically added routes\r\nconst Prefix = chalk.white('[') + chalk.cyan('Routes Manager | Info') + chalk.white('] ');\r\nconst ErrorPrefix = chalk.white('[') + chalk.red('Routes Manager | Error') + chalk.white('] ');\r\nconst registeredRoutes: RouteDefinition[] = [];\r\nexport const routesManager = {\r\n /**\r\n * Register a dynamic route from a module/service.\r\n */\r\n registerRoute(def: RouteDefinition): void {\r\n registeredRoutes.push(def);\r\n },\r\n\r\n /**\r\n * Return all registered dynamic routes.\r\n */\r\n getRegisteredRoutes(): RouteDefinition[] {\r\n return registeredRoutes;\r\n },\r\n\r\n /**\r\n * Loads and mounts all registered dynamic routes into an Express app.\r\n */\r\n async mountRegisteredRoutes(app: Application, debug: boolean): Promise<{ success: boolean, message?: string }> {\r\n let fullSuccess = false;\r\n try {\r\n for (const route of registeredRoutes) {\r\n try {\r\n if (debug) {\r\n console.log(Prefix + chalk.cyan(`Mounting route: [Label: ${route.label} | Path: ${route.path} -> File: ${route.filePath}]`));\r\n }\r\n\r\n const routeFile = fs.existsSync(route.filePath);\r\n // fs.readdirSync(route.filePath); // Ensure the file exists\r\n if (routeFile) {\r\n if (debug) {\r\n console.warn(ErrorPrefix + chalk.yellow(`⚠️ No files found in route directory: ${route.filePath}`));\r\n }\r\n continue; // Skip empty directories\r\n }\r\n console.log(Prefix + chalk.green(`✓ Found route file: ${route.filePath}`));\r\n \r\n if (debug) {\r\n console.log(Prefix + chalk.green(`✓ Mounted route: ${route.label.toUpperCase()} ${route.path}`));\r\n }\r\n } catch (err: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + chalk.red(`Failed to mount route ${route.path}: ${err?.message}`));\r\n console.error(ErrorPrefix + chalk.red(`Route definition: ${JSON.stringify(route, null, 2)}`));\r\n console.error(ErrorPrefix + chalk.red(`File path: ${route.filePath}`));\r\n console.error(ErrorPrefix + chalk.red(`Error details: ${err}`));\r\n }\r\n fullSuccess = false;\r\n continue; // Skip this route if it fails\r\n }\r\n }\r\n if (fullSuccess) {\r\n return { success: true }\r\n }\r\n return { success: fullSuccess, message: 'Some routes failed to mount, check logs for details.' };\r\n } catch (error: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + 'Error mounting registered routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n console.error(ErrorPrefix + 'Registered routes:', JSON.stringify(registeredRoutes, null, 2));\r\n // Optionally rethrow the error if you want to stop the server startup \r\n // throw new Error(`Failed to mount registered routes: ${error.message}`);\r\n // Or you can just log it and continue\r\n console.error(ErrorPrefix + 'Continuing without mounting routes due to error.');\r\n }\r\n // Optionally, you can throw an error here if you want to stop the server startup\r\n return { success: fullSuccess, message: `Failed to mount dynamic routes: ${error.message}` };\r\n // throw new Error(`Failed to mount dynamic routes: ${error.message}`);\r\n }\r\n },\r\n\r\n async getMountedRoutes(): Promise<RouteDefinition[]> {\r\n try {\r\n return registeredRoutes;\r\n } catch (error: any) {\r\n console.error(ErrorPrefix + 'Error getting mounted routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n throw new Error(`Failed to get mounted routes: ${error.message}`);\r\n }\r\n }\r\n}\r\n","// packages/retrex-extensibles-core/hooks/useUtils.ts\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport fs from 'node:fs';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport const useUtils = {\r\n async loadThemeComponent(\r\n componentName: string,\r\n options: {\r\n theme: {\r\n name: string;\r\n type: 'admin' | 'client' | 'portal' | 'email';\r\n };\r\n search?: {\r\n themes?: boolean;\r\n modules?: boolean;\r\n services?: boolean;\r\n };\r\n }\r\n ): Promise<React.ComponentType<any> | null> {\r\n const { search = {}, theme } = options;\r\n const searchThemes = search.themes ?? true;\r\n const searchModules = search.modules ?? true;\r\n const searchServices = search.services ?? true;\r\n\r\n const possiblePaths: string[] = [];\r\n\r\n console.log(`Searching for component \"${componentName}\" in theme \"${theme.name}\" of type \"${theme.type}\"...`);\r\n\r\n try {\r\n if (searchThemes) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n \r\n if (searchModules) {\r\n const moduleDirs = await fs.readdirSync(useSettings.getPaths().modules);\r\n for (const mod of moduleDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n if (searchServices) {\r\n const serviceDirs = await fs.readdirSync(useSettings.getPaths().services);\r\n for (const svc of serviceDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n for (const filePath of possiblePaths) {\r\n if (await fs.existsSync(filePath)) {\r\n try {\r\n const mod = await import(pathToFileURL(filePath).toString());\r\n if (mod.default) return mod.default;\r\n } catch (err) {\r\n console.error(`Error loading component at ${filePath}:`, err);\r\n }\r\n }\r\n }\r\n \r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n return null;\r\n } catch (err) {\r\n console.error(`Error searching for component \"${componentName}\":`, err);\r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n console.warn(`Searched paths:`, possiblePaths);\r\n console.warn(`Ensure the component exists in the specified theme and type.`);\r\n console.warn(`If the component is in a module or service, ensure the theme structure is correct.`);\r\n console.warn(`If you are using a custom theme, module, or service, ensure it is properly configured and registered in the settings.`);\r\n return null;\r\n }\r\n }\r\n}\r\n","// useTranslation.ts\r\nimport merge from 'lodash.merge';\r\n\r\ntype LangPack = Record<string, any>;\r\ntype LangMap = Record<string, LangPack>;\r\n\r\nconst langs: Record<string, LangMap> = {};\r\nlet currentLang = 'en';\r\nlet isLoaded = false;\r\n\r\nexport const useTranslation = {\r\n async load(preloaded?: Record<string, LangMap>): Promise<void> {\r\n if (typeof window !== 'undefined') {\r\n // 🌐 Browser: expect SSR-preloaded translations or lazy fetch\r\n if (preloaded) {\r\n merge(langs, preloaded);\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // If no preloaded translations, fallback to fetch (on-demand)\r\n const lang = currentLang;\r\n const types = ['admin', 'client', 'portal', 'email']; // Customize as needed\r\n\r\n for (const type of types) {\r\n try {\r\n const res = await fetch(`/langs/${lang}/${type}.json`);\r\n if (res.ok) {\r\n const json = await res.json();\r\n langs[lang] ??= {};\r\n langs[lang][type] = merge(langs[lang][type] ?? {}, json);\r\n }\r\n } catch (err) {\r\n console.warn(`[useTranslation] Failed to fetch ${type}.json`, err);\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // 🖥️ Node/server-side: read from filesystem using useSettings\r\n const path = await import('node:path');\r\n const fs = await import('node:fs/promises');\r\n const { existsSync } = await import('node:fs');\r\n const { useSettings } = await import('./useSettings');\r\n const { langs: langsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { root: langsPath },\r\n { root: modules },\r\n { root: services },\r\n { root: templates },\r\n ];\r\n\r\n for (const source of sources) {\r\n if (!existsSync(source.root)) continue;\r\n\r\n const entries = await fs.readdir(source.root);\r\n for (const entry of entries) {\r\n const basePath = path.join(source.root, entry, 'langs');\r\n if (!existsSync(basePath)) continue;\r\n\r\n const langDirs = await fs.readdir(basePath);\r\n for (const langCode of langDirs) {\r\n const langPath = path.join(basePath, langCode);\r\n const stat = await fs.stat(langPath);\r\n if (!stat.isDirectory()) continue;\r\n\r\n const files = await fs.readdir(langPath);\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n const type = file.replace('.json', '');\r\n const content = JSON.parse(await fs.readFile(path.join(langPath, file), 'utf8'));\r\n\r\n langs[langCode] ??= {};\r\n langs[langCode][type] = merge(langs[langCode][type] ?? {}, content);\r\n }\r\n }\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n },\r\n\r\n useLang(langCode: string): void {\r\n if (!langs[langCode]) {\r\n console.warn(`[useTranslation] Language \"${langCode}\" not found`);\r\n return;\r\n }\r\n currentLang = langCode;\r\n },\r\n\r\n getLang(): string {\r\n return currentLang;\r\n },\r\n\r\n getLangMap(langCode?: string): LangMap {\r\n return langs[langCode ?? currentLang] || {};\r\n },\r\n\r\n getLangs(): string[] {\r\n return Object.keys(langs);\r\n },\r\n\r\n t(key: string, fallback = '', values: Record<string, string> = {}): string {\r\n const [namespace, ...rest] = key.split('.');\r\n const langPack = langs[currentLang]?.[namespace];\r\n\r\n if (!langPack) return fallback;\r\n\r\n let result: any = langPack;\r\n for (const part of rest) {\r\n result = result?.[part];\r\n if (result === undefined) return fallback;\r\n }\r\n\r\n if (typeof result !== 'string') return fallback;\r\n\r\n return Object.entries(values).reduce(\r\n (text, [k, v]) => text.replace(new RegExp(`{${k}}`, 'g'), v),\r\n result\r\n );\r\n },\r\n\r\n reset() {\r\n Object.keys(langs).forEach((k) => delete langs[k]);\r\n isLoaded = false;\r\n },\r\n\r\n getAll() {\r\n return langs;\r\n },\r\n\r\n isReady() {\r\n return isLoaded;\r\n }\r\n};\r\n\r\n\r\n\r\n// import path from 'node:path';\r\n// import fs from 'node:fs/promises';\r\n// import { existsSync } from 'node:fs';\r\n// import { useSettings } from './useSettings';\r\n// import merge from 'lodash.merge';\r\n\r\n// type LangPack = Record<string, any>;\r\n// type LangMap = Record<string, LangPack>;\r\n\r\n// const langs: Record<string, LangMap> = {};\r\n// let currentLang = 'en';\r\n\r\n// export const useTranslation = {\r\n// /**\r\n// * Load all language files from the core, services, modules, and templates.\r\n// */\r\n// async load(): Promise<void> {\r\n// const { langs: rootLangsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n// const sources = [\r\n// { label: 'root', path: rootLangsPath },\r\n// { label: 'modules', path: modules },\r\n// { label: 'services', path: services },\r\n// { label: 'templates', path: templates },\r\n// ];\r\n\r\n// for (const source of sources) {\r\n// if (!existsSync(source.path)) continue;\r\n\r\n// const entries = await fs.readdir(source.path);\r\n// for (const entry of entries) {\r\n// const fullPath = path.join(source.path, entry, 'langs');\r\n// if (!existsSync(fullPath)) continue;\r\n\r\n// const langDirs = await fs.readdir(fullPath);\r\n// for (const langCode of langDirs) {\r\n// const langPath = path.join(fullPath, langCode);\r\n// const stat = await fs.stat(langPath);\r\n// if (!stat.isDirectory()) continue;\r\n\r\n// const files = await fs.readdir(langPath);\r\n// for (const file of files) {\r\n// if (!file.endsWith('.json')) continue;\r\n\r\n// const namespace = file.replace('.json', '');\r\n// const filePath = path.join(langPath, file);\r\n// const content = JSON.parse(await fs.readFile(filePath, 'utf8'));\r\n\r\n// langs[langCode] ??= {};\r\n// langs[langCode][namespace] = merge(langs[langCode][namespace] ?? {}, content);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// },\r\n\r\n// /**\r\n// * Change the active language code\r\n// */\r\n// useLang(langCode: string): void {\r\n// if (!langs[langCode]) {\r\n// console.warn(`[useTranslation] Language \"${langCode}\" not loaded or missing`);\r\n// return;\r\n// }\r\n// currentLang = langCode;\r\n// },\r\n\r\n// /**\r\n// * Return the active language code\r\n// */\r\n// getLang(): string {\r\n// return currentLang;\r\n// },\r\n\r\n// /**\r\n// * Return the full translation map of a specific language\r\n// */\r\n// getLangMap(langCode?: string): LangMap {\r\n// return langs[langCode ?? currentLang] || {};\r\n// },\r\n\r\n// /**\r\n// * Return the list of loaded languages\r\n// */\r\n// getLangs(): string[] {\r\n// return Object.keys(langs);\r\n// },\r\n\r\n// /**\r\n// * Translate a key from a namespace\r\n// * Example: t('admin.dashboard.title')\r\n// */\r\n// // t(key: string, fallback: string = '', values: Record<string, string> = {}): string {\r\n// // const raw = /* same logic as above to get the string */;\r\n// // return Object.entries(values).reduce((acc, [k, v]) => acc.replaceAll(`{${k}}`, v), raw);\r\n// // }\r\n// t(key: string, fallback: string = ''): string {\r\n// const [namespace, ...parts] = key.split('.');\r\n// const lang = langs[currentLang] ?? {};\r\n// const scope = lang[namespace];\r\n\r\n// if (!scope) return fallback;\r\n\r\n// let value = scope;\r\n// for (const part of parts) {\r\n// value = value?.[part];\r\n// if (value === undefined) return fallback;\r\n// }\r\n\r\n// return typeof value === 'string' ? value : fallback;\r\n// },\r\n\r\n// /**\r\n// * Clear translations (used in dev hot reload or test environments)\r\n// */\r\n// reset(): void {\r\n// Object.keys(langs).forEach((lang) => delete langs[lang]);\r\n// }\r\n// };\r\n","// src/providers/ThemeProvider.tsx\r\nimport React, { createContext, useContext, useEffect, useState } from 'react';\r\nimport type { TemplateMeta, TemplateType, ThemeTypes } from '../types';\r\nimport { useTemplates } from '../hooks/useTemplates';\r\n\r\ninterface ThemeContextProps {\r\n templateType: TemplateType;\r\n activeTheme: TemplateMeta | null;\r\n setActiveTheme: (theme: TemplateMeta) => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextProps | null>(null);\r\n\r\nexport const ThemeProvider: React.FC<{\r\n type: TemplateType;\r\n children: React.ReactNode;\r\n}> = ({ type, children }) => {\r\n const [activeTheme, setActiveTheme] = useState<TemplateMeta | null>(null);\r\n let tType: string;\r\n useEffect(() => {\r\n if (type.includes('-theme')) {\r\n tType = type.replace('-theme', '');\r\n } else {\r\n tType = type;\r\n }\r\n useTemplates.getActiveTemplate(tType as ThemeTypes).then((template) => {\r\n setActiveTheme(template);\r\n // console.log('Active theme set:', template);\r\n });\r\n }, [type]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ templateType: type, activeTheme, setActiveTheme }}>\r\n {/* {!activeTheme ? (\r\n <div>Loading theme...</div>\r\n ) :\r\n } */}\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n\r\nexport function useTheme() {\r\n const ctx = useContext(ThemeContext);\r\n if (!ctx) throw new Error('useTheme must be used inside a ThemeProvider');\r\n return ctx;\r\n}\r\n"],"mappings":"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","names":["paths","extensiblePaths","fs","path","templates","paths","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","fs","path","templates","import_node_path","import_url","fs","path","chalk","import_chalk","import_node_fs","chalk","fs","import_node_path","import_url","import_node_fs","path","fs","merge","path","fs","useSettings","templates"]}
|
package/dist/index.js
CHANGED
|
@@ -901,7 +901,7 @@ var ThemeProvider = ({ type, children }) => {
|
|
|
901
901
|
setActiveTheme(template);
|
|
902
902
|
});
|
|
903
903
|
}, [type]);
|
|
904
|
-
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { templateType: type, activeTheme, setActiveTheme }, children
|
|
904
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { templateType: type, activeTheme, setActiveTheme }, children });
|
|
905
905
|
};
|
|
906
906
|
function useTheme() {
|
|
907
907
|
const ctx = useContext(ThemeContext);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/hooks/useSettings.ts","../src/core/hooks/useExtensibles.ts","../src/index.ts","../src/core/hooks/useModules.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTemplates.ts","../src/core/hooks/useEvents.ts","../src/core/hooks/useRoutes.ts","../src/core/hooks/useUtils.ts","../src/core/hooks/useTranslator.ts","../src/core/providers/ThemeProvider.tsx"],"sourcesContent":["// src/hooks/useSettings.ts\r\n\r\nimport path from 'node:path';\r\n\r\nimport { loadJSON, saveJSON } from './useExtensibles';\r\nimport type { ExtensiblePaths } from '../types'; // Adjust the import path as necessary\r\n\r\nlet extensiblePaths: ExtensiblePaths = {\r\n modules: './app/modules',\r\n templates: './app/resources/themes',\r\n services: './app/services',\r\n events: './app/events',\r\n langs: './public/langs',\r\n};\r\n\r\nconst isServer = typeof window === 'undefined';\r\n\r\n\r\nexport const useSettings = {\r\n getPaths(): ExtensiblePaths {\r\n if (isServer) {\r\n const json = loadJSON('./app/extensiblePaths.json');\r\n if (json) extensiblePaths = json;\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n langs: './langs'\r\n }\r\n // extensiblePaths = loadJSON(\"./app/extensiblePaths.json\");\r\n return extensiblePaths;\r\n },\r\n\r\n setPaths(paths: Partial<ExtensiblePaths>): void {\r\n if (isServer) {\r\n saveJSON('./app/extensiblePaths.json', {\r\n ...extensiblePaths,\r\n ...paths,\r\n });\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n ...paths,\r\n };\r\n },\r\n \r\n getKeyValue(key: string): string {\r\n return 'Coming Soon'\r\n },\r\n setKeyValue(key: string, value: string): void {\r\n return;\r\n },\r\n};\r\n","// src/hooks/useExtensibles.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { pathToFileURL } from 'url';\r\nimport type { TemplateType, ExtensibleMeta, ExtensiblePaths } from '../types';\r\n\r\nlet paths: ExtensiblePaths;\r\n\r\nexport function registerExtensibles(extensiblePaths: ExtensiblePaths) {\r\n paths = extensiblePaths;\r\n}\r\n\r\nexport function loadJSON(filePath: string): any {\r\n if (!fs.existsSync(filePath)) return null;\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\r\n}\r\n\r\nexport function saveJSON(filePath: string, data: any) {\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\r\n}\r\n\r\n// --- MODULES ---\r\n\r\nexport function getModules(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().modules)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().modules, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().modules, dir, 'module.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isModuleEnabled(name: string) {\r\n const modules = getModules();\r\n return modules.find((m) => m.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleModule(name: string, enabled: boolean) {\r\n const modules = getModules();\r\n const mod = modules.find((m) => m.lowerName === name.toLowerCase());\r\n if (!mod) throw new Error(`Module ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().modules, mod.lowerName, 'module.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onModuleEnabled(mod.name);\r\n else onModuleDisabled(mod.name);\r\n}\r\n\r\n// --- SERVICES ---\r\n\r\nexport function getServices(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().services) throw new Error('Services path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().services)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().services, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().services, dir, 'service.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isServiceEnabled(name: string) {\r\n const services = getServices();\r\n return services.find((s) => s.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleService(name: string, enabled: boolean) {\r\n const services = getServices();\r\n const svc = services.find((s) => s.lowerName === name.toLowerCase());\r\n if (!svc) throw new Error(`Service ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().services, svc.lowerName, 'service.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onServiceEnabled(svc.name);\r\n else onServiceDisabled(svc.name);\r\n}\r\n\r\n// --- TEMPLATES ---\r\n\r\n// Helper to get base path for a template type\r\nfunction getTemplateBasePath(type: TemplateType): string {\r\n if (!useSettings.getPaths().templates) throw new Error('Templates path not registered.');\r\n switch (type) {\r\n case 'admin-theme':\r\n case 'client-theme':\r\n return path.join(useSettings.getPaths().templates, 'themes');\r\n case 'portal':\r\n return path.join(useSettings.getPaths().templates, 'portals');\r\n case 'email':\r\n return path.join(useSettings.getPaths().templates, 'emails');\r\n default:\r\n throw new Error(`Unknown template type: ${type}`);\r\n }\r\n}\r\n\r\nexport function getTemplates(type: TemplateType): ExtensibleMeta[] {\r\n const basePath = getTemplateBasePath(type);\r\n if (!fs.existsSync(basePath)) return [];\r\n\r\n const dirs = fs\r\n .readdirSync(basePath)\r\n .filter((d: any) => fs.statSync(path.join(basePath, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(basePath, dir, 'template.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isTemplateActive(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n return templates.find((t) => t.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\n// Toggle templates: only 1 active per type allowed\r\nexport function toggleTemplate(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n\r\n templates.forEach((tpl) => {\r\n const metaPath = path.join(getTemplateBasePath(type), tpl.lowerName, 'template.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = tpl.lowerName === name.toLowerCase();\r\n saveJSON(metaPath, meta);\r\n });\r\n\r\n onTemplateSelect(type, name);\r\n}\r\n\r\n// --- EVENTS (replace with your event system integration) ---\r\n\r\nexport function onModuleEnabled(name: string) {\r\n console.log(`Module enabled: ${name}`);\r\n // emit event or custom logic here\r\n}\r\n\r\nexport function onModuleDisabled(name: string) {\r\n console.log(`Module disabled: ${name}`);\r\n}\r\n\r\nexport function onServiceEnabled(name: string) {\r\n console.log(`Service enabled: ${name}`);\r\n}\r\n\r\nexport function onServiceDisabled(name: string) {\r\n console.log(`Service disabled: ${name}`);\r\n}\r\n\r\nexport function onTemplateSelect(type: TemplateType, name: string) {\r\n console.log(`Template selected: type=${type}, name=${name}`);\r\n}\r\n\r\n// --- REGISTER HOOKS FOR MODULES ---\r\n\r\nexport async function registerEvents() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const eventsFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'events.server.js');\r\n if (fs.existsSync(eventsFile)) {\r\n const modEvents = await import(eventsFile);\r\n if (modEvents?.registerEvents) await modEvents.registerEvents();\r\n }\r\n }\r\n}\r\n\r\nexport async function registerMiddleware() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const middlewareFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'middleware.server.js');\r\n if (fs.existsSync(middlewareFile)) {\r\n const modMiddleware = await import(middlewareFile);\r\n if (modMiddleware?.registerMiddleware) await modMiddleware.registerMiddleware();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Registers routes given a path to routes folder (for pages and API routes)\r\n * @param routesFolderPath string - path to module/service routes folder\r\n */\r\nexport async function registerRoutes(routesFolderPath: string) {\r\n if (!fs.existsSync(routesFolderPath)) return;\r\n\r\n const routeFiles = fs.readdirSync(routesFolderPath).filter((f: any) => /\\.(js|ts|jsx|tsx)$/.test(f));\r\n for (const file of routeFiles) {\r\n const routeModule = await import(path.join(routesFolderPath, file));\r\n if (routeModule?.registerRoute) {\r\n await routeModule.registerRoute();\r\n }\r\n }\r\n}\r\n\r\nexport async function loadProviders() {\r\n const paths = useSettings.getPaths();\r\n\r\n const all = [\r\n { type: 'module', list: getModules(), basePath: paths.modules },\r\n { type: 'service', list: getServices(), basePath: paths.services },\r\n ];\r\n\r\n for (const { type, list, basePath } of all) {\r\n for (const item of list) {\r\n if (!item.enabled) continue;\r\n\r\n const metaPath = path.join(path.resolve(basePath), item.lowerName, `${type}.json`);\r\n const meta = loadJSON(metaPath);\r\n if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n for (const providerRelPath of meta.providers) {\r\n try {\r\n let providerAbsPath = path.join(path.resolve(basePath), item.lowerName, providerRelPath);\r\n\r\n // Try .js fallback if file is .ts or .tsx\r\n const ext = path.extname(providerAbsPath);\r\n if (ext === '.ts' || ext === '.tsx') {\r\n const jsPath = providerAbsPath.replace(/\\.(ts|tsx)$/, '.js');\r\n try {\r\n await fs.accessSync(jsPath); // Check if compiled JS file exists\r\n providerAbsPath = jsPath;\r\n } catch {\r\n throw new Error(`Compiled JS version not found for provider: ${providerRelPath}`);\r\n }\r\n }\r\n\r\n const providerUrl = pathToFileURL(providerAbsPath).href.toString();\r\n const providerModule = await import(providerUrl);\r\n\r\n if (typeof providerModule.default === 'function') {\r\n await providerModule.default();\r\n console.log(`[${type}] ✅ Provider loaded: ${providerRelPath}`);\r\n } else {\r\n console.warn(`[${type}] ⚠️ Provider ${providerRelPath} has no default export.`);\r\n }\r\n } catch (err) {\r\n console.error(`[${type}] ❌ Failed to load provider ${providerRelPath}:`, err);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n// export async function loadProviders() {\r\n// paths = {\r\n// modules: useSettings.getPaths().modules,\r\n// templates: useSettings.getPaths().templates,\r\n// services: useSettings.getPaths().services,\r\n// events: useSettings.getPaths().events,\r\n// }\r\n// const all = [\r\n// { type: 'module', list: getModules(), basePath: useSettings.getPaths().modules },\r\n// { type: 'service', list: getServices(), basePath: useSettings.getPaths().services },\r\n// ];\r\n\r\n// for (const { type, list, basePath } of all) {\r\n// for (const item of list) {\r\n// if (!item.enabled) continue;\r\n\r\n// const metaPath = path.join(basePath, item.lowerName, `${type}.json`);\r\n// const meta = loadJSON(metaPath);\r\n// if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n// for (const providerRelPath of meta.providers) {\r\n// try {\r\n// const providerPath = path.join(basePath, item.lowerName, providerRelPath);\r\n// const providerModule = await import(providerPath);\r\n// if (typeof providerModule.default === 'function') {\r\n// await providerModule.default(); // Call provider\r\n// console.log(`[${type}] Provider loaded: ${providerRelPath}`);\r\n// } else {\r\n// console.warn(`[${type}] Provider ${providerRelPath} has no default export.`);\r\n// }\r\n// } catch (err) {\r\n// console.error(`[${type}] Failed to load provider ${providerRelPath}:`, err);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// }\r\n","// src/index.ts\r\n\r\n// export * from './core/controller/EventController';\r\n// export * from './core/controller/MiddlewareController';\r\nexport * from './core/hooks/useExtensibles';\r\nexport * from './core/hooks/useSettings';\r\nexport * from './core/hooks/useModules';\r\nexport * from './core/hooks/useServices';\r\nexport * from './core/hooks/useTemplates';\r\nexport * from './core/hooks/useEvents';\r\nexport * from './core/hooks/useRoutes';\r\nexport * from './core/hooks/useUtils';\r\nexport * from './core/hooks/useTranslator';\r\n// export * as ThemeProvider from './core/providers/ThemeProvider';\r\nexport * from './core/providers/ThemeProvider';\r\nexport * from './core/types/index';\r\n","// src/hooks/useModules.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { ModuleMeta } from '../types'; // Adjust the import path as necessary\r\n\r\nexport const useModules = {\r\n allEnabled(): ModuleMeta[] {\r\n const modules = useModules.load();\r\n if (!modules || modules.length === 0) return [];\r\n // Filter out modules that are not enabled\r\n \r\n // Return only the enabled modules\r\n // This assumes that each module has an 'enabled' property\r\n // Adjust the property name if necessary\r\n if (!Array.isArray(modules)) return [];\r\n if (modules.length === 0) return [];\r\n if (!modules.every((mod) => mod && typeof mod.enabled === 'boolean')) {\r\n throw new Error('Invalid module format: each module must have an \"enabled\" boolean property');\r\n }\r\n if (modules.some((mod) => !mod.lowerName)) {\r\n throw new Error('Invalid module format: each module must have a \"lowerName\" property');\r\n }\r\n\r\n // Filter and return only enabled modules\r\n return modules.filter((mod) => mod.enabled);\r\n },\r\n load(): ModuleMeta[] {\r\n const modulesDir = useSettings.getPaths().modules;\r\n if (!fs.existsSync(modulesDir)) return [];\r\n\r\n const moduleFolders = fs.readdirSync(modulesDir);\r\n const modules: ModuleMeta[] = [];\r\n\r\n moduleFolders.forEach((folder) => {\r\n const modulePath = path.join(modulesDir, folder);\r\n const moduleJsonPath = path.join(modulePath, 'module.json');\r\n if (!fs.existsSync(moduleJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(moduleJsonPath, 'utf-8');\r\n const moduleData = JSON.parse(rawData) as ModuleMeta;\r\n modules.push(moduleData);\r\n } catch {\r\n // invalid json or read error, ignore\r\n }\r\n });\r\n\r\n return modules;\r\n },\r\n\r\n isEnabled(moduleName: string): boolean {\r\n const modules = useModules.load();\r\n const mod = modules.find((m) => m.lowerName === moduleName.toLowerCase());\r\n return mod ? mod.enabled : false;\r\n },\r\n\r\n toggle(moduleName: string): boolean {\r\n const modulesDir = useSettings.getPaths().modules;\r\n const modules = useModules.load();\r\n const modIndex = modules.findIndex((m) => m.lowerName === moduleName.toLowerCase());\r\n if (modIndex === -1) return false;\r\n\r\n const moduleMeta = modules[modIndex];\r\n moduleMeta.enabled = !moduleMeta.enabled;\r\n\r\n const moduleJsonPath = path.join(modulesDir, moduleMeta.lowerName, 'module.json');\r\n try {\r\n fs.writeFileSync(moduleJsonPath, JSON.stringify(moduleMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getModules(): ModuleMeta[] {\r\n return useModules.load();\r\n },\r\n};\r\n","// src/hooks/useServices.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport interface ServiceMeta {\r\n name: string;\r\n lowerName: string;\r\n version?: string;\r\n author?: string;\r\n icon?: string;\r\n description?: string;\r\n enabled: boolean;\r\n providers?: string[];\r\n serviceType?: string;\r\n}\r\n\r\nexport const useServices = {\r\n loadServices(): ServiceMeta[] {\r\n const servicesDir = useSettings.getPaths().services;\r\n if (!fs.existsSync(servicesDir)) return [];\r\n\r\n const serviceFolders = fs.readdirSync(servicesDir);\r\n const services: ServiceMeta[] = [];\r\n\r\n serviceFolders.forEach((folder) => {\r\n const servicePath = path.join(servicesDir, folder);\r\n const serviceJsonPath = path.join(servicePath, 'service.json');\r\n if (!fs.existsSync(serviceJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(serviceJsonPath, 'utf-8');\r\n const serviceData = JSON.parse(rawData) as ServiceMeta;\r\n services.push(serviceData);\r\n } catch {\r\n // ignore invalid json or errors\r\n }\r\n });\r\n\r\n return services;\r\n },\r\n\r\n isServiceEnabled(serviceName: string): boolean {\r\n const services = useServices.loadServices();\r\n const service = services.find((s) => s.lowerName === serviceName.toLowerCase());\r\n return service ? service.enabled : false;\r\n },\r\n\r\n toggleService(serviceName: string, enabled: boolean): boolean {\r\n const servicesDir = useSettings.getPaths().services;\r\n const services = useServices.loadServices();\r\n const index = services.findIndex((s) => s.lowerName === serviceName.toLowerCase());\r\n if (index === -1) return false;\r\n\r\n const serviceMeta = services[index];\r\n serviceMeta.enabled = enabled;\r\n\r\n const serviceJsonPath = path.join(servicesDir, serviceMeta.lowerName, 'service.json');\r\n try {\r\n fs.writeFileSync(serviceJsonPath, JSON.stringify(serviceMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getServices(): ServiceMeta[] {\r\n return useServices.loadServices();\r\n },\r\n};\r\n","// src/hooks/useTemplates.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport type { TemplateType, TemplateMeta, ThemeTypes } from '../types';\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst templates: TemplateMeta[] = [];\r\n\r\nexport const useTemplates = {\r\n loadTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n const templatesDir = useSettings.getPaths().templates;\r\n if (!fs.existsSync(templatesDir)) return [];\r\n\r\n const templateFolders = fs.readdirSync(templatesDir);\r\n\r\n templateFolders.forEach((folder) => {\r\n const templatePath = path.join(templatesDir, folder);\r\n const templateJsonPath = path.join(templatePath, 'template.json');\r\n if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n const templateData = JSON.parse(rawData) as TemplateMeta;\r\n\r\n if (templateType) {\r\n if (templateData.templateType === templateType) {\r\n templates.push(templateData);\r\n }\r\n } else {\r\n templates.push(templateData);\r\n }\r\n } catch {\r\n // ignore invalid JSON or errors\r\n }\r\n });\r\n\r\n return templates;\r\n },\r\n\r\n isTemplateActive(templateType: TemplateType, templateName: string): boolean {\r\n const templates = useTemplates.loadTemplates(templateType);\r\n const template = templates.find(\r\n (t) => t.lowerName === templateName.toLowerCase() && t.enabled\r\n );\r\n return !!template;\r\n },\r\n\r\n toggleTemplate(templateType: TemplateType, templateName: string): boolean {\r\n // Since only one template of each type can be enabled, disable others and enable this one\r\n const templatesDir = useSettings.getPaths().templates;\r\n const templates = useTemplates.loadTemplates(templateType);\r\n\r\n let toggled = false;\r\n\r\n templates.forEach((template) => {\r\n if (template.name.toLowerCase() === templateName.toLowerCase()) {\r\n if (!template.enabled) {\r\n template.enabled = true;\r\n toggled = true;\r\n }\r\n } else {\r\n if (template.enabled) {\r\n template.enabled = false;\r\n }\r\n }\r\n\r\n const templateJsonPath = path.join(templatesDir, template.lowerName, 'template.json');\r\n try {\r\n fs.writeFileSync(templateJsonPath, JSON.stringify(template, null, 2), 'utf-8');\r\n } catch {\r\n // ignore write errors\r\n }\r\n });\r\n\r\n return toggled;\r\n },\r\n\r\n // async getTemplates(templateType?: TemplateType): Promise<TemplateMeta[]> {\r\n // if (isServer) {\r\n // const fs = await import('node:fs');\r\n // const path = await import('node:path');\r\n // const templatesDir = useSettings.getPaths().templates;\r\n // if (!fs.existsSync(templatesDir)) return [];\r\n\r\n // const templateFolders = fs.readdirSync(templatesDir);\r\n // const templates: TemplateMeta[] = [];\r\n\r\n // templateFolders.forEach((folder) => {\r\n // const templatePath = path.join(templatesDir, folder);\r\n // const templateJsonPath = path.join(templatePath, 'template.json');\r\n // if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n // try {\r\n // const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n // const templateData = JSON.parse(rawData) as TemplateMeta;\r\n // if (!templateType || templateData.templateType === templateType) {\r\n // templates.push(templateData);\r\n // }\r\n // } catch {\r\n // // ignore invalid JSON\r\n // }\r\n // });\r\n\r\n // return templates;\r\n // } else {\r\n // // Browser: fetch from public assets\r\n // const types = ['admin', 'client', 'portal', 'email'];\r\n // let tType;\r\n // if (templateType?.includes('-theme')) {\r\n // tType = templateType.replace('-theme', '');\r\n // }\r\n // const typesToFetch = tType ? [tType] : types;\r\n\r\n // const all: TemplateMeta[] = [];\r\n // for (let type of typesToFetch) {\r\n // try {\r\n // const res = await fetch(`/templates/${type}/active.json`);\r\n // if (!res.ok) continue;\r\n // const meta = await res.json();\r\n // all.push(meta);\r\n // console.log(`Loaded active template for type: ${type}`, meta);\r\n // } catch (err) {\r\n // console.warn(`No active template found for type: ${type}`);\r\n // console.error(err);\r\n // }\r\n // }\r\n // return all;\r\n // }\r\n // },\r\n\r\n getTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n return useTemplates.loadTemplates(templateType);\r\n },\r\n\r\n async getActiveTemplate(type: ThemeTypes): Promise<TemplateMeta | null> {\r\n // const templates = useTemplates.loadTemplates(type);\r\n const template = templates.find(\r\n (t) => t.enabled && t.templateType === type\r\n );\r\n return template || null;\r\n }\r\n};\r\n","import fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport { Server as SocketIOServer, Socket } from 'socket.io';\r\nimport chalk from 'chalk';\r\nimport { useSettings } from './useSettings';\r\n\r\ninterface EventController {\r\n label: string;\r\n onRegister?: (io: SocketIOServer) => void;\r\n onEvent?: (socket: Socket, event: any) => void;\r\n}\r\n\r\nlet events: EventController[] = [];\r\nlet logPrefix: any;\r\n\r\nexport const useEvents = {\r\n setPrefix: (prefix: any) => {\r\n logPrefix = prefix;\r\n },\r\n register: async (io: SocketIOServer) => {\r\n const { modules, services, events: appEventsPath } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { type: 'module', root: modules },\r\n { type: 'service', root: services },\r\n { type: 'app', root: appEventsPath },\r\n ];\r\n\r\n for (const source of sources) {\r\n try {\r\n const dirs = await fs.readdir(source.root, { withFileTypes: true });\r\n\r\n for (const dir of dirs) {\r\n if (!dir.isDirectory()) continue;\r\n\r\n const basePath = path.join(source.root, dir.name);\r\n const eventsDir = source.type === 'app' ? basePath : path.join(basePath, 'events');\r\n\r\n let eventFiles: string[] = [];\r\n try {\r\n console.log(logPrefix + chalk.blue(`🔍 Searching for events in: ${eventsDir}`));\r\n eventFiles = await fs.readdir(eventsDir);\r\n console.log(logPrefix + chalk.blue(`🔍 Found events in: ${eventsDir}`));\r\n console.log(logPrefix + chalk.gray(`📂 Directory: ${eventsDir}`))\r\n console.log(logPrefix + chalk.gray(`📄 Files: ${eventFiles.join(', ')} [${eventFiles.length}]`));\r\n } catch {\r\n console.warn(logPrefix + chalk.gray(`⚠️ No events directory found: ${eventsDir}`));\r\n continue;\r\n }\r\n\r\n for (const file of eventFiles) {\r\n const fullPath = path.resolve(eventsDir, file);\r\n if (!file.endsWith('.ts') && !file.endsWith('.js')) continue;\r\n\r\n try {\r\n const imported = await import(pathToFileURL(fullPath).href);\r\n const controller: EventController = imported.default || imported[Object.keys(imported)[0]];\r\n\r\n if (!controller || (!controller.onRegister && !controller.onEvent)) {\r\n console.warn(logPrefix + chalk.yellow(`⚠️ Skipping non-controller file: ${file}`));\r\n continue;\r\n }\r\n\r\n const label = controller.label || file.replace(/\\.(ts|js)$/, '');\r\n\r\n if (controller.onRegister) {\r\n controller.onRegister(io);\r\n }\r\n\r\n events.push({\r\n label,\r\n onRegister: controller.onRegister,\r\n onEvent: controller.onEvent,\r\n });\r\n\r\n console.log(logPrefix + chalk.green(`✅ Registered event: ${label}`));\r\n\r\n if (controller.onEvent) {\r\n io.on('connection', (socket) => {\r\n socket.on(label, (data: any) => controller.onEvent!(socket, data));\r\n });\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to import event file: ${fullPath}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to load events from source: ${source.root}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n },\r\n\r\n load: async (io: SocketIOServer) => {\r\n await useEvents.register(io);\r\n },\r\n\r\n get: async (): Promise<EventController[]> => {\r\n if (events.length === 0) {\r\n console.warn(logPrefix + 'No events loaded yet. Did you call useEvents.load(io)?');\r\n }\r\n return events;\r\n }\r\n};\r\n","// packages/retrex-extensibles-core/useRoutes.ts\r\nimport { Application, Request, Response, NextFunction } from 'express';\r\nimport { pathToFileURL } from 'url';\r\n// import type { LoaderFunctionArgs, ActionFunctionArgs } from '@remix-run/node';\r\nimport path from 'node:path';\r\nimport chalk from 'chalk';\r\nimport fs from 'node:fs';\r\nimport { RouteDefinition } from '../types/index'; // Adjust the import path as necessary\r\nimport { useServices } from './useServices';\r\nimport { useSettings } from './useSettings';\r\n\r\n// Registry for dynamically added routes\r\nconst Prefix = chalk.white('[') + chalk.cyan('Routes Manager | Info') + chalk.white('] ');\r\nconst ErrorPrefix = chalk.white('[') + chalk.red('Routes Manager | Error') + chalk.white('] ');\r\nconst registeredRoutes: RouteDefinition[] = [];\r\nexport const routesManager = {\r\n /**\r\n * Register a dynamic route from a module/service.\r\n */\r\n registerRoute(def: RouteDefinition): void {\r\n registeredRoutes.push(def);\r\n },\r\n\r\n /**\r\n * Return all registered dynamic routes.\r\n */\r\n getRegisteredRoutes(): RouteDefinition[] {\r\n return registeredRoutes;\r\n },\r\n\r\n /**\r\n * Loads and mounts all registered dynamic routes into an Express app.\r\n */\r\n async mountRegisteredRoutes(app: Application, debug: boolean): Promise<{ success: boolean, message?: string }> {\r\n let fullSuccess = false;\r\n try {\r\n for (const route of registeredRoutes) {\r\n try {\r\n if (debug) {\r\n console.log(Prefix + chalk.cyan(`Mounting route: [Label: ${route.label} | Path: ${route.path} -> File: ${route.filePath}]`));\r\n }\r\n\r\n const routeFile = fs.existsSync(route.filePath);\r\n // fs.readdirSync(route.filePath); // Ensure the file exists\r\n if (routeFile) {\r\n if (debug) {\r\n console.warn(ErrorPrefix + chalk.yellow(`⚠️ No files found in route directory: ${route.filePath}`));\r\n }\r\n continue; // Skip empty directories\r\n }\r\n console.log(Prefix + chalk.green(`✓ Found route file: ${route.filePath}`));\r\n \r\n if (debug) {\r\n console.log(Prefix + chalk.green(`✓ Mounted route: ${route.label.toUpperCase()} ${route.path}`));\r\n }\r\n } catch (err: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + chalk.red(`Failed to mount route ${route.path}: ${err?.message}`));\r\n console.error(ErrorPrefix + chalk.red(`Route definition: ${JSON.stringify(route, null, 2)}`));\r\n console.error(ErrorPrefix + chalk.red(`File path: ${route.filePath}`));\r\n console.error(ErrorPrefix + chalk.red(`Error details: ${err}`));\r\n }\r\n fullSuccess = false;\r\n continue; // Skip this route if it fails\r\n }\r\n }\r\n if (fullSuccess) {\r\n return { success: true }\r\n }\r\n return { success: fullSuccess, message: 'Some routes failed to mount, check logs for details.' };\r\n } catch (error: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + 'Error mounting registered routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n console.error(ErrorPrefix + 'Registered routes:', JSON.stringify(registeredRoutes, null, 2));\r\n // Optionally rethrow the error if you want to stop the server startup \r\n // throw new Error(`Failed to mount registered routes: ${error.message}`);\r\n // Or you can just log it and continue\r\n console.error(ErrorPrefix + 'Continuing without mounting routes due to error.');\r\n }\r\n // Optionally, you can throw an error here if you want to stop the server startup\r\n return { success: fullSuccess, message: `Failed to mount dynamic routes: ${error.message}` };\r\n // throw new Error(`Failed to mount dynamic routes: ${error.message}`);\r\n }\r\n },\r\n\r\n async getMountedRoutes(): Promise<RouteDefinition[]> {\r\n try {\r\n return registeredRoutes;\r\n } catch (error: any) {\r\n console.error(ErrorPrefix + 'Error getting mounted routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n throw new Error(`Failed to get mounted routes: ${error.message}`);\r\n }\r\n }\r\n}\r\n","// packages/retrex-extensibles-core/hooks/useUtils.ts\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport fs from 'node:fs';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport const useUtils = {\r\n async loadThemeComponent(\r\n componentName: string,\r\n options: {\r\n theme: {\r\n name: string;\r\n type: 'admin' | 'client' | 'portal' | 'email';\r\n };\r\n search?: {\r\n themes?: boolean;\r\n modules?: boolean;\r\n services?: boolean;\r\n };\r\n }\r\n ): Promise<React.ComponentType<any> | null> {\r\n const { search = {}, theme } = options;\r\n const searchThemes = search.themes ?? true;\r\n const searchModules = search.modules ?? true;\r\n const searchServices = search.services ?? true;\r\n\r\n const possiblePaths: string[] = [];\r\n\r\n console.log(`Searching for component \"${componentName}\" in theme \"${theme.name}\" of type \"${theme.type}\"...`);\r\n\r\n try {\r\n if (searchThemes) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n \r\n if (searchModules) {\r\n const moduleDirs = await fs.readdirSync(useSettings.getPaths().modules);\r\n for (const mod of moduleDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n if (searchServices) {\r\n const serviceDirs = await fs.readdirSync(useSettings.getPaths().services);\r\n for (const svc of serviceDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n for (const filePath of possiblePaths) {\r\n if (await fs.existsSync(filePath)) {\r\n try {\r\n const mod = await import(pathToFileURL(filePath).toString());\r\n if (mod.default) return mod.default;\r\n } catch (err) {\r\n console.error(`Error loading component at ${filePath}:`, err);\r\n }\r\n }\r\n }\r\n \r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n return null;\r\n } catch (err) {\r\n console.error(`Error searching for component \"${componentName}\":`, err);\r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n console.warn(`Searched paths:`, possiblePaths);\r\n console.warn(`Ensure the component exists in the specified theme and type.`);\r\n console.warn(`If the component is in a module or service, ensure the theme structure is correct.`);\r\n console.warn(`If you are using a custom theme, module, or service, ensure it is properly configured and registered in the settings.`);\r\n return null;\r\n }\r\n }\r\n}\r\n","// useTranslation.ts\r\nimport merge from 'lodash.merge';\r\n\r\ntype LangPack = Record<string, any>;\r\ntype LangMap = Record<string, LangPack>;\r\n\r\nconst langs: Record<string, LangMap> = {};\r\nlet currentLang = 'en';\r\nlet isLoaded = false;\r\n\r\nexport const useTranslation = {\r\n async load(preloaded?: Record<string, LangMap>): Promise<void> {\r\n if (typeof window !== 'undefined') {\r\n // 🌐 Browser: expect SSR-preloaded translations or lazy fetch\r\n if (preloaded) {\r\n merge(langs, preloaded);\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // If no preloaded translations, fallback to fetch (on-demand)\r\n const lang = currentLang;\r\n const types = ['admin', 'client', 'portal', 'email']; // Customize as needed\r\n\r\n for (const type of types) {\r\n try {\r\n const res = await fetch(`/langs/${lang}/${type}.json`);\r\n if (res.ok) {\r\n const json = await res.json();\r\n langs[lang] ??= {};\r\n langs[lang][type] = merge(langs[lang][type] ?? {}, json);\r\n }\r\n } catch (err) {\r\n console.warn(`[useTranslation] Failed to fetch ${type}.json`, err);\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // 🖥️ Node/server-side: read from filesystem using useSettings\r\n const path = await import('node:path');\r\n const fs = await import('node:fs/promises');\r\n const { existsSync } = await import('node:fs');\r\n const { useSettings } = await import('./useSettings');\r\n const { langs: langsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { root: langsPath },\r\n { root: modules },\r\n { root: services },\r\n { root: templates },\r\n ];\r\n\r\n for (const source of sources) {\r\n if (!existsSync(source.root)) continue;\r\n\r\n const entries = await fs.readdir(source.root);\r\n for (const entry of entries) {\r\n const basePath = path.join(source.root, entry, 'langs');\r\n if (!existsSync(basePath)) continue;\r\n\r\n const langDirs = await fs.readdir(basePath);\r\n for (const langCode of langDirs) {\r\n const langPath = path.join(basePath, langCode);\r\n const stat = await fs.stat(langPath);\r\n if (!stat.isDirectory()) continue;\r\n\r\n const files = await fs.readdir(langPath);\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n const type = file.replace('.json', '');\r\n const content = JSON.parse(await fs.readFile(path.join(langPath, file), 'utf8'));\r\n\r\n langs[langCode] ??= {};\r\n langs[langCode][type] = merge(langs[langCode][type] ?? {}, content);\r\n }\r\n }\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n },\r\n\r\n useLang(langCode: string): void {\r\n if (!langs[langCode]) {\r\n console.warn(`[useTranslation] Language \"${langCode}\" not found`);\r\n return;\r\n }\r\n currentLang = langCode;\r\n },\r\n\r\n getLang(): string {\r\n return currentLang;\r\n },\r\n\r\n getLangMap(langCode?: string): LangMap {\r\n return langs[langCode ?? currentLang] || {};\r\n },\r\n\r\n getLangs(): string[] {\r\n return Object.keys(langs);\r\n },\r\n\r\n t(key: string, fallback = '', values: Record<string, string> = {}): string {\r\n const [namespace, ...rest] = key.split('.');\r\n const langPack = langs[currentLang]?.[namespace];\r\n\r\n if (!langPack) return fallback;\r\n\r\n let result: any = langPack;\r\n for (const part of rest) {\r\n result = result?.[part];\r\n if (result === undefined) return fallback;\r\n }\r\n\r\n if (typeof result !== 'string') return fallback;\r\n\r\n return Object.entries(values).reduce(\r\n (text, [k, v]) => text.replace(new RegExp(`{${k}}`, 'g'), v),\r\n result\r\n );\r\n },\r\n\r\n reset() {\r\n Object.keys(langs).forEach((k) => delete langs[k]);\r\n isLoaded = false;\r\n },\r\n\r\n getAll() {\r\n return langs;\r\n },\r\n\r\n isReady() {\r\n return isLoaded;\r\n }\r\n};\r\n\r\n\r\n\r\n// import path from 'node:path';\r\n// import fs from 'node:fs/promises';\r\n// import { existsSync } from 'node:fs';\r\n// import { useSettings } from './useSettings';\r\n// import merge from 'lodash.merge';\r\n\r\n// type LangPack = Record<string, any>;\r\n// type LangMap = Record<string, LangPack>;\r\n\r\n// const langs: Record<string, LangMap> = {};\r\n// let currentLang = 'en';\r\n\r\n// export const useTranslation = {\r\n// /**\r\n// * Load all language files from the core, services, modules, and templates.\r\n// */\r\n// async load(): Promise<void> {\r\n// const { langs: rootLangsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n// const sources = [\r\n// { label: 'root', path: rootLangsPath },\r\n// { label: 'modules', path: modules },\r\n// { label: 'services', path: services },\r\n// { label: 'templates', path: templates },\r\n// ];\r\n\r\n// for (const source of sources) {\r\n// if (!existsSync(source.path)) continue;\r\n\r\n// const entries = await fs.readdir(source.path);\r\n// for (const entry of entries) {\r\n// const fullPath = path.join(source.path, entry, 'langs');\r\n// if (!existsSync(fullPath)) continue;\r\n\r\n// const langDirs = await fs.readdir(fullPath);\r\n// for (const langCode of langDirs) {\r\n// const langPath = path.join(fullPath, langCode);\r\n// const stat = await fs.stat(langPath);\r\n// if (!stat.isDirectory()) continue;\r\n\r\n// const files = await fs.readdir(langPath);\r\n// for (const file of files) {\r\n// if (!file.endsWith('.json')) continue;\r\n\r\n// const namespace = file.replace('.json', '');\r\n// const filePath = path.join(langPath, file);\r\n// const content = JSON.parse(await fs.readFile(filePath, 'utf8'));\r\n\r\n// langs[langCode] ??= {};\r\n// langs[langCode][namespace] = merge(langs[langCode][namespace] ?? {}, content);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// },\r\n\r\n// /**\r\n// * Change the active language code\r\n// */\r\n// useLang(langCode: string): void {\r\n// if (!langs[langCode]) {\r\n// console.warn(`[useTranslation] Language \"${langCode}\" not loaded or missing`);\r\n// return;\r\n// }\r\n// currentLang = langCode;\r\n// },\r\n\r\n// /**\r\n// * Return the active language code\r\n// */\r\n// getLang(): string {\r\n// return currentLang;\r\n// },\r\n\r\n// /**\r\n// * Return the full translation map of a specific language\r\n// */\r\n// getLangMap(langCode?: string): LangMap {\r\n// return langs[langCode ?? currentLang] || {};\r\n// },\r\n\r\n// /**\r\n// * Return the list of loaded languages\r\n// */\r\n// getLangs(): string[] {\r\n// return Object.keys(langs);\r\n// },\r\n\r\n// /**\r\n// * Translate a key from a namespace\r\n// * Example: t('admin.dashboard.title')\r\n// */\r\n// // t(key: string, fallback: string = '', values: Record<string, string> = {}): string {\r\n// // const raw = /* same logic as above to get the string */;\r\n// // return Object.entries(values).reduce((acc, [k, v]) => acc.replaceAll(`{${k}}`, v), raw);\r\n// // }\r\n// t(key: string, fallback: string = ''): string {\r\n// const [namespace, ...parts] = key.split('.');\r\n// const lang = langs[currentLang] ?? {};\r\n// const scope = lang[namespace];\r\n\r\n// if (!scope) return fallback;\r\n\r\n// let value = scope;\r\n// for (const part of parts) {\r\n// value = value?.[part];\r\n// if (value === undefined) return fallback;\r\n// }\r\n\r\n// return typeof value === 'string' ? value : fallback;\r\n// },\r\n\r\n// /**\r\n// * Clear translations (used in dev hot reload or test environments)\r\n// */\r\n// reset(): void {\r\n// Object.keys(langs).forEach((lang) => delete langs[lang]);\r\n// }\r\n// };\r\n","// src/providers/ThemeProvider.tsx\r\nimport React, { createContext, useContext, useEffect, useState } from 'react';\r\nimport type { TemplateMeta, TemplateType, ThemeTypes } from '../types';\r\nimport { useTemplates } from '../hooks/useTemplates';\r\n\r\ninterface ThemeContextProps {\r\n templateType: TemplateType;\r\n activeTheme: TemplateMeta | null;\r\n setActiveTheme: (theme: TemplateMeta) => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextProps | null>(null);\r\n\r\nexport const ThemeProvider: React.FC<{\r\n type: TemplateType;\r\n children: React.ReactNode;\r\n}> = ({ type, children }) => {\r\n const [activeTheme, setActiveTheme] = useState<TemplateMeta | null>(null);\r\n let tType: string;\r\n useEffect(() => {\r\n if (type.includes('-theme')) {\r\n tType = type.replace('-theme', '');\r\n } else {\r\n tType = type;\r\n }\r\n useTemplates.getActiveTemplate(tType as ThemeTypes).then((template) => {\r\n setActiveTheme(template);\r\n });\r\n }, [type]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ templateType: type, activeTheme, setActiveTheme }}>\r\n {!activeTheme ? (\r\n <div>Loading theme...</div>\r\n ) :\r\n children\r\n }\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n\r\nexport function useTheme() {\r\n const ctx = useContext(ThemeContext);\r\n if (!ctx) throw new Error('useTheme must be used inside a ThemeProvider');\r\n return ctx;\r\n}\r\n"],"mappings":"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","names":["paths","extensiblePaths","templates","paths","fs","path","fs","path","fs","path","fs","path","templates","fs","path","pathToFileURL","chalk","fs","path","pathToFileURL","fs","path","fs","useSettings","templates"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/hooks/useSettings.ts","../src/core/hooks/useExtensibles.ts","../src/index.ts","../src/core/hooks/useModules.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTemplates.ts","../src/core/hooks/useEvents.ts","../src/core/hooks/useRoutes.ts","../src/core/hooks/useUtils.ts","../src/core/hooks/useTranslator.ts","../src/core/providers/ThemeProvider.tsx"],"sourcesContent":["// src/hooks/useSettings.ts\r\n\r\nimport path from 'node:path';\r\n\r\nimport { loadJSON, saveJSON } from './useExtensibles';\r\nimport type { ExtensiblePaths } from '../types'; // Adjust the import path as necessary\r\n\r\nlet extensiblePaths: ExtensiblePaths = {\r\n modules: './app/modules',\r\n templates: './app/resources/themes',\r\n services: './app/services',\r\n events: './app/events',\r\n langs: './public/langs',\r\n};\r\n\r\nconst isServer = typeof window === 'undefined';\r\n\r\n\r\nexport const useSettings = {\r\n getPaths(): ExtensiblePaths {\r\n if (isServer) {\r\n const json = loadJSON('./app/extensiblePaths.json');\r\n if (json) extensiblePaths = json;\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n langs: './langs'\r\n }\r\n // extensiblePaths = loadJSON(\"./app/extensiblePaths.json\");\r\n return extensiblePaths;\r\n },\r\n\r\n setPaths(paths: Partial<ExtensiblePaths>): void {\r\n if (isServer) {\r\n saveJSON('./app/extensiblePaths.json', {\r\n ...extensiblePaths,\r\n ...paths,\r\n });\r\n }\r\n\r\n extensiblePaths = {\r\n ...extensiblePaths,\r\n ...paths,\r\n };\r\n },\r\n \r\n getKeyValue(key: string): string {\r\n return 'Coming Soon'\r\n },\r\n setKeyValue(key: string, value: string): void {\r\n return;\r\n },\r\n};\r\n","// src/hooks/useExtensibles.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { pathToFileURL } from 'url';\r\nimport type { TemplateType, ExtensibleMeta, ExtensiblePaths } from '../types';\r\n\r\nlet paths: ExtensiblePaths;\r\n\r\nexport function registerExtensibles(extensiblePaths: ExtensiblePaths) {\r\n paths = extensiblePaths;\r\n}\r\n\r\nexport function loadJSON(filePath: string): any {\r\n if (!fs.existsSync(filePath)) return null;\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\r\n}\r\n\r\nexport function saveJSON(filePath: string, data: any) {\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\r\n}\r\n\r\n// --- MODULES ---\r\n\r\nexport function getModules(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().modules)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().modules, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().modules, dir, 'module.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isModuleEnabled(name: string) {\r\n const modules = getModules();\r\n return modules.find((m) => m.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleModule(name: string, enabled: boolean) {\r\n const modules = getModules();\r\n const mod = modules.find((m) => m.lowerName === name.toLowerCase());\r\n if (!mod) throw new Error(`Module ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().modules, mod.lowerName, 'module.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onModuleEnabled(mod.name);\r\n else onModuleDisabled(mod.name);\r\n}\r\n\r\n// --- SERVICES ---\r\n\r\nexport function getServices(): ExtensibleMeta[] {\r\n if (!useSettings.getPaths().services) throw new Error('Services path not registered.');\r\n\r\n const dirs = fs\r\n .readdirSync(useSettings.getPaths().services)\r\n .filter((d: any) => fs.statSync(path.join(useSettings.getPaths().services, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(useSettings.getPaths().services, dir, 'service.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: meta.lowerName || dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isServiceEnabled(name: string) {\r\n const services = getServices();\r\n return services.find((s) => s.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\nexport function toggleService(name: string, enabled: boolean) {\r\n const services = getServices();\r\n const svc = services.find((s) => s.lowerName === name.toLowerCase());\r\n if (!svc) throw new Error(`Service ${name} not found`);\r\n\r\n const metaPath = path.join(useSettings.getPaths().services, svc.lowerName, 'service.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = enabled;\r\n saveJSON(metaPath, meta);\r\n\r\n if (enabled) onServiceEnabled(svc.name);\r\n else onServiceDisabled(svc.name);\r\n}\r\n\r\n// --- TEMPLATES ---\r\n\r\n// Helper to get base path for a template type\r\nfunction getTemplateBasePath(type: TemplateType): string {\r\n if (!useSettings.getPaths().templates) throw new Error('Templates path not registered.');\r\n switch (type) {\r\n case 'admin-theme':\r\n case 'client-theme':\r\n return path.join(useSettings.getPaths().templates, 'themes');\r\n case 'portal':\r\n return path.join(useSettings.getPaths().templates, 'portals');\r\n case 'email':\r\n return path.join(useSettings.getPaths().templates, 'emails');\r\n default:\r\n throw new Error(`Unknown template type: ${type}`);\r\n }\r\n}\r\n\r\nexport function getTemplates(type: TemplateType): ExtensibleMeta[] {\r\n const basePath = getTemplateBasePath(type);\r\n if (!fs.existsSync(basePath)) return [];\r\n\r\n const dirs = fs\r\n .readdirSync(basePath)\r\n .filter((d: any) => fs.statSync(path.join(basePath, d)).isDirectory());\r\n\r\n return dirs.map((dir: any) => {\r\n const meta = loadJSON(path.join(basePath, dir, 'template.json')) || {};\r\n return {\r\n name: meta.name || dir,\r\n lowerName: dir.toLowerCase(),\r\n version: meta.version,\r\n description: meta.description,\r\n author: meta.author,\r\n icon: meta.icon,\r\n enabled: meta.enabled ?? false,\r\n };\r\n });\r\n}\r\n\r\nexport function isTemplateActive(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n return templates.find((t) => t.lowerName === name.toLowerCase())?.enabled ?? false;\r\n}\r\n\r\n// Toggle templates: only 1 active per type allowed\r\nexport function toggleTemplate(type: TemplateType, name: string) {\r\n const templates = getTemplates(type);\r\n\r\n templates.forEach((tpl) => {\r\n const metaPath = path.join(getTemplateBasePath(type), tpl.lowerName, 'template.json');\r\n const meta = loadJSON(metaPath) || {};\r\n meta.enabled = tpl.lowerName === name.toLowerCase();\r\n saveJSON(metaPath, meta);\r\n });\r\n\r\n onTemplateSelect(type, name);\r\n}\r\n\r\n// --- EVENTS (replace with your event system integration) ---\r\n\r\nexport function onModuleEnabled(name: string) {\r\n console.log(`Module enabled: ${name}`);\r\n // emit event or custom logic here\r\n}\r\n\r\nexport function onModuleDisabled(name: string) {\r\n console.log(`Module disabled: ${name}`);\r\n}\r\n\r\nexport function onServiceEnabled(name: string) {\r\n console.log(`Service enabled: ${name}`);\r\n}\r\n\r\nexport function onServiceDisabled(name: string) {\r\n console.log(`Service disabled: ${name}`);\r\n}\r\n\r\nexport function onTemplateSelect(type: TemplateType, name: string) {\r\n console.log(`Template selected: type=${type}, name=${name}`);\r\n}\r\n\r\n// --- REGISTER HOOKS FOR MODULES ---\r\n\r\nexport async function registerEvents() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const eventsFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'events.server.js');\r\n if (fs.existsSync(eventsFile)) {\r\n const modEvents = await import(eventsFile);\r\n if (modEvents?.registerEvents) await modEvents.registerEvents();\r\n }\r\n }\r\n}\r\n\r\nexport async function registerMiddleware() {\r\n if (!useSettings.getPaths().modules) throw new Error('Modules path not registered.');\r\n const modules = getModules().filter((m) => m.enabled);\r\n for (const mod of modules) {\r\n const middlewareFile = path.join(useSettings.getPaths().modules, mod.lowerName, 'middleware.server.js');\r\n if (fs.existsSync(middlewareFile)) {\r\n const modMiddleware = await import(middlewareFile);\r\n if (modMiddleware?.registerMiddleware) await modMiddleware.registerMiddleware();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Registers routes given a path to routes folder (for pages and API routes)\r\n * @param routesFolderPath string - path to module/service routes folder\r\n */\r\nexport async function registerRoutes(routesFolderPath: string) {\r\n if (!fs.existsSync(routesFolderPath)) return;\r\n\r\n const routeFiles = fs.readdirSync(routesFolderPath).filter((f: any) => /\\.(js|ts|jsx|tsx)$/.test(f));\r\n for (const file of routeFiles) {\r\n const routeModule = await import(path.join(routesFolderPath, file));\r\n if (routeModule?.registerRoute) {\r\n await routeModule.registerRoute();\r\n }\r\n }\r\n}\r\n\r\nexport async function loadProviders() {\r\n const paths = useSettings.getPaths();\r\n\r\n const all = [\r\n { type: 'module', list: getModules(), basePath: paths.modules },\r\n { type: 'service', list: getServices(), basePath: paths.services },\r\n ];\r\n\r\n for (const { type, list, basePath } of all) {\r\n for (const item of list) {\r\n if (!item.enabled) continue;\r\n\r\n const metaPath = path.join(path.resolve(basePath), item.lowerName, `${type}.json`);\r\n const meta = loadJSON(metaPath);\r\n if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n for (const providerRelPath of meta.providers) {\r\n try {\r\n let providerAbsPath = path.join(path.resolve(basePath), item.lowerName, providerRelPath);\r\n\r\n // Try .js fallback if file is .ts or .tsx\r\n const ext = path.extname(providerAbsPath);\r\n if (ext === '.ts' || ext === '.tsx') {\r\n const jsPath = providerAbsPath.replace(/\\.(ts|tsx)$/, '.js');\r\n try {\r\n await fs.accessSync(jsPath); // Check if compiled JS file exists\r\n providerAbsPath = jsPath;\r\n } catch {\r\n throw new Error(`Compiled JS version not found for provider: ${providerRelPath}`);\r\n }\r\n }\r\n\r\n const providerUrl = pathToFileURL(providerAbsPath).href.toString();\r\n const providerModule = await import(providerUrl);\r\n\r\n if (typeof providerModule.default === 'function') {\r\n await providerModule.default();\r\n console.log(`[${type}] ✅ Provider loaded: ${providerRelPath}`);\r\n } else {\r\n console.warn(`[${type}] ⚠️ Provider ${providerRelPath} has no default export.`);\r\n }\r\n } catch (err) {\r\n console.error(`[${type}] ❌ Failed to load provider ${providerRelPath}:`, err);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n// export async function loadProviders() {\r\n// paths = {\r\n// modules: useSettings.getPaths().modules,\r\n// templates: useSettings.getPaths().templates,\r\n// services: useSettings.getPaths().services,\r\n// events: useSettings.getPaths().events,\r\n// }\r\n// const all = [\r\n// { type: 'module', list: getModules(), basePath: useSettings.getPaths().modules },\r\n// { type: 'service', list: getServices(), basePath: useSettings.getPaths().services },\r\n// ];\r\n\r\n// for (const { type, list, basePath } of all) {\r\n// for (const item of list) {\r\n// if (!item.enabled) continue;\r\n\r\n// const metaPath = path.join(basePath, item.lowerName, `${type}.json`);\r\n// const meta = loadJSON(metaPath);\r\n// if (!meta?.providers || !Array.isArray(meta.providers)) continue;\r\n\r\n// for (const providerRelPath of meta.providers) {\r\n// try {\r\n// const providerPath = path.join(basePath, item.lowerName, providerRelPath);\r\n// const providerModule = await import(providerPath);\r\n// if (typeof providerModule.default === 'function') {\r\n// await providerModule.default(); // Call provider\r\n// console.log(`[${type}] Provider loaded: ${providerRelPath}`);\r\n// } else {\r\n// console.warn(`[${type}] Provider ${providerRelPath} has no default export.`);\r\n// }\r\n// } catch (err) {\r\n// console.error(`[${type}] Failed to load provider ${providerRelPath}:`, err);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// }\r\n","// src/index.ts\r\n\r\n// export * from './core/controller/EventController';\r\n// export * from './core/controller/MiddlewareController';\r\nexport * from './core/hooks/useExtensibles';\r\nexport * from './core/hooks/useSettings';\r\nexport * from './core/hooks/useModules';\r\nexport * from './core/hooks/useServices';\r\nexport * from './core/hooks/useTemplates';\r\nexport * from './core/hooks/useEvents';\r\nexport * from './core/hooks/useRoutes';\r\nexport * from './core/hooks/useUtils';\r\nexport * from './core/hooks/useTranslator';\r\n// export * as ThemeProvider from './core/providers/ThemeProvider';\r\nexport * from './core/providers/ThemeProvider';\r\nexport * from './core/types/index';\r\n","// src/hooks/useModules.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport { ModuleMeta } from '../types'; // Adjust the import path as necessary\r\n\r\nexport const useModules = {\r\n allEnabled(): ModuleMeta[] {\r\n const modules = useModules.load();\r\n if (!modules || modules.length === 0) return [];\r\n // Filter out modules that are not enabled\r\n \r\n // Return only the enabled modules\r\n // This assumes that each module has an 'enabled' property\r\n // Adjust the property name if necessary\r\n if (!Array.isArray(modules)) return [];\r\n if (modules.length === 0) return [];\r\n if (!modules.every((mod) => mod && typeof mod.enabled === 'boolean')) {\r\n throw new Error('Invalid module format: each module must have an \"enabled\" boolean property');\r\n }\r\n if (modules.some((mod) => !mod.lowerName)) {\r\n throw new Error('Invalid module format: each module must have a \"lowerName\" property');\r\n }\r\n\r\n // Filter and return only enabled modules\r\n return modules.filter((mod) => mod.enabled);\r\n },\r\n load(): ModuleMeta[] {\r\n const modulesDir = useSettings.getPaths().modules;\r\n if (!fs.existsSync(modulesDir)) return [];\r\n\r\n const moduleFolders = fs.readdirSync(modulesDir);\r\n const modules: ModuleMeta[] = [];\r\n\r\n moduleFolders.forEach((folder) => {\r\n const modulePath = path.join(modulesDir, folder);\r\n const moduleJsonPath = path.join(modulePath, 'module.json');\r\n if (!fs.existsSync(moduleJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(moduleJsonPath, 'utf-8');\r\n const moduleData = JSON.parse(rawData) as ModuleMeta;\r\n modules.push(moduleData);\r\n } catch {\r\n // invalid json or read error, ignore\r\n }\r\n });\r\n\r\n return modules;\r\n },\r\n\r\n isEnabled(moduleName: string): boolean {\r\n const modules = useModules.load();\r\n const mod = modules.find((m) => m.lowerName === moduleName.toLowerCase());\r\n return mod ? mod.enabled : false;\r\n },\r\n\r\n toggle(moduleName: string): boolean {\r\n const modulesDir = useSettings.getPaths().modules;\r\n const modules = useModules.load();\r\n const modIndex = modules.findIndex((m) => m.lowerName === moduleName.toLowerCase());\r\n if (modIndex === -1) return false;\r\n\r\n const moduleMeta = modules[modIndex];\r\n moduleMeta.enabled = !moduleMeta.enabled;\r\n\r\n const moduleJsonPath = path.join(modulesDir, moduleMeta.lowerName, 'module.json');\r\n try {\r\n fs.writeFileSync(moduleJsonPath, JSON.stringify(moduleMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getModules(): ModuleMeta[] {\r\n return useModules.load();\r\n },\r\n};\r\n","// src/hooks/useServices.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport interface ServiceMeta {\r\n name: string;\r\n lowerName: string;\r\n version?: string;\r\n author?: string;\r\n icon?: string;\r\n description?: string;\r\n enabled: boolean;\r\n providers?: string[];\r\n serviceType?: string;\r\n}\r\n\r\nexport const useServices = {\r\n loadServices(): ServiceMeta[] {\r\n const servicesDir = useSettings.getPaths().services;\r\n if (!fs.existsSync(servicesDir)) return [];\r\n\r\n const serviceFolders = fs.readdirSync(servicesDir);\r\n const services: ServiceMeta[] = [];\r\n\r\n serviceFolders.forEach((folder) => {\r\n const servicePath = path.join(servicesDir, folder);\r\n const serviceJsonPath = path.join(servicePath, 'service.json');\r\n if (!fs.existsSync(serviceJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(serviceJsonPath, 'utf-8');\r\n const serviceData = JSON.parse(rawData) as ServiceMeta;\r\n services.push(serviceData);\r\n } catch {\r\n // ignore invalid json or errors\r\n }\r\n });\r\n\r\n return services;\r\n },\r\n\r\n isServiceEnabled(serviceName: string): boolean {\r\n const services = useServices.loadServices();\r\n const service = services.find((s) => s.lowerName === serviceName.toLowerCase());\r\n return service ? service.enabled : false;\r\n },\r\n\r\n toggleService(serviceName: string, enabled: boolean): boolean {\r\n const servicesDir = useSettings.getPaths().services;\r\n const services = useServices.loadServices();\r\n const index = services.findIndex((s) => s.lowerName === serviceName.toLowerCase());\r\n if (index === -1) return false;\r\n\r\n const serviceMeta = services[index];\r\n serviceMeta.enabled = enabled;\r\n\r\n const serviceJsonPath = path.join(servicesDir, serviceMeta.lowerName, 'service.json');\r\n try {\r\n fs.writeFileSync(serviceJsonPath, JSON.stringify(serviceMeta, null, 2), 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n\r\n getServices(): ServiceMeta[] {\r\n return useServices.loadServices();\r\n },\r\n};\r\n","// src/hooks/useTemplates.ts\r\n\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { useSettings } from './useSettings';\r\nimport type { TemplateType, TemplateMeta, ThemeTypes } from '../types';\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst templates: TemplateMeta[] = [];\r\n\r\nexport const useTemplates = {\r\n loadTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n const templatesDir = useSettings.getPaths().templates;\r\n if (!fs.existsSync(templatesDir)) return [];\r\n\r\n const templateFolders = fs.readdirSync(templatesDir);\r\n\r\n templateFolders.forEach((folder) => {\r\n const templatePath = path.join(templatesDir, folder);\r\n const templateJsonPath = path.join(templatePath, 'template.json');\r\n if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n try {\r\n const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n const templateData = JSON.parse(rawData) as TemplateMeta;\r\n\r\n if (templateType) {\r\n if (templateData.templateType === templateType) {\r\n templates.push(templateData);\r\n }\r\n } else {\r\n templates.push(templateData);\r\n }\r\n } catch {\r\n // ignore invalid JSON or errors\r\n }\r\n });\r\n\r\n return templates;\r\n },\r\n\r\n isTemplateActive(templateType: TemplateType, templateName: string): boolean {\r\n const templates = useTemplates.loadTemplates(templateType);\r\n const template = templates.find(\r\n (t) => t.lowerName === templateName.toLowerCase() && t.enabled\r\n );\r\n return !!template;\r\n },\r\n\r\n toggleTemplate(templateType: TemplateType, templateName: string): boolean {\r\n // Since only one template of each type can be enabled, disable others and enable this one\r\n const templatesDir = useSettings.getPaths().templates;\r\n const templates = useTemplates.loadTemplates(templateType);\r\n\r\n let toggled = false;\r\n\r\n templates.forEach((template) => {\r\n if (template.name.toLowerCase() === templateName.toLowerCase()) {\r\n if (!template.enabled) {\r\n template.enabled = true;\r\n toggled = true;\r\n }\r\n } else {\r\n if (template.enabled) {\r\n template.enabled = false;\r\n }\r\n }\r\n\r\n const templateJsonPath = path.join(templatesDir, template.lowerName, 'template.json');\r\n try {\r\n fs.writeFileSync(templateJsonPath, JSON.stringify(template, null, 2), 'utf-8');\r\n } catch {\r\n // ignore write errors\r\n }\r\n });\r\n\r\n return toggled;\r\n },\r\n\r\n // async getTemplates(templateType?: TemplateType): Promise<TemplateMeta[]> {\r\n // if (isServer) {\r\n // const fs = await import('node:fs');\r\n // const path = await import('node:path');\r\n // const templatesDir = useSettings.getPaths().templates;\r\n // if (!fs.existsSync(templatesDir)) return [];\r\n\r\n // const templateFolders = fs.readdirSync(templatesDir);\r\n // const templates: TemplateMeta[] = [];\r\n\r\n // templateFolders.forEach((folder) => {\r\n // const templatePath = path.join(templatesDir, folder);\r\n // const templateJsonPath = path.join(templatePath, 'template.json');\r\n // if (!fs.existsSync(templateJsonPath)) return;\r\n\r\n // try {\r\n // const rawData = fs.readFileSync(templateJsonPath, 'utf-8');\r\n // const templateData = JSON.parse(rawData) as TemplateMeta;\r\n // if (!templateType || templateData.templateType === templateType) {\r\n // templates.push(templateData);\r\n // }\r\n // } catch {\r\n // // ignore invalid JSON\r\n // }\r\n // });\r\n\r\n // return templates;\r\n // } else {\r\n // // Browser: fetch from public assets\r\n // const types = ['admin', 'client', 'portal', 'email'];\r\n // let tType;\r\n // if (templateType?.includes('-theme')) {\r\n // tType = templateType.replace('-theme', '');\r\n // }\r\n // const typesToFetch = tType ? [tType] : types;\r\n\r\n // const all: TemplateMeta[] = [];\r\n // for (let type of typesToFetch) {\r\n // try {\r\n // const res = await fetch(`/templates/${type}/active.json`);\r\n // if (!res.ok) continue;\r\n // const meta = await res.json();\r\n // all.push(meta);\r\n // console.log(`Loaded active template for type: ${type}`, meta);\r\n // } catch (err) {\r\n // console.warn(`No active template found for type: ${type}`);\r\n // console.error(err);\r\n // }\r\n // }\r\n // return all;\r\n // }\r\n // },\r\n\r\n getTemplates(templateType?: TemplateType): TemplateMeta[] {\r\n return useTemplates.loadTemplates(templateType);\r\n },\r\n\r\n async getActiveTemplate(type: ThemeTypes): Promise<TemplateMeta | null> {\r\n // const templates = useTemplates.loadTemplates(type);\r\n const template = templates.find(\r\n (t) => t.enabled && t.templateType === type\r\n );\r\n return template || null;\r\n }\r\n};\r\n","import fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport { Server as SocketIOServer, Socket } from 'socket.io';\r\nimport chalk from 'chalk';\r\nimport { useSettings } from './useSettings';\r\n\r\ninterface EventController {\r\n label: string;\r\n onRegister?: (io: SocketIOServer) => void;\r\n onEvent?: (socket: Socket, event: any) => void;\r\n}\r\n\r\nlet events: EventController[] = [];\r\nlet logPrefix: any;\r\n\r\nexport const useEvents = {\r\n setPrefix: (prefix: any) => {\r\n logPrefix = prefix;\r\n },\r\n register: async (io: SocketIOServer) => {\r\n const { modules, services, events: appEventsPath } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { type: 'module', root: modules },\r\n { type: 'service', root: services },\r\n { type: 'app', root: appEventsPath },\r\n ];\r\n\r\n for (const source of sources) {\r\n try {\r\n const dirs = await fs.readdir(source.root, { withFileTypes: true });\r\n\r\n for (const dir of dirs) {\r\n if (!dir.isDirectory()) continue;\r\n\r\n const basePath = path.join(source.root, dir.name);\r\n const eventsDir = source.type === 'app' ? basePath : path.join(basePath, 'events');\r\n\r\n let eventFiles: string[] = [];\r\n try {\r\n console.log(logPrefix + chalk.blue(`🔍 Searching for events in: ${eventsDir}`));\r\n eventFiles = await fs.readdir(eventsDir);\r\n console.log(logPrefix + chalk.blue(`🔍 Found events in: ${eventsDir}`));\r\n console.log(logPrefix + chalk.gray(`📂 Directory: ${eventsDir}`))\r\n console.log(logPrefix + chalk.gray(`📄 Files: ${eventFiles.join(', ')} [${eventFiles.length}]`));\r\n } catch {\r\n console.warn(logPrefix + chalk.gray(`⚠️ No events directory found: ${eventsDir}`));\r\n continue;\r\n }\r\n\r\n for (const file of eventFiles) {\r\n const fullPath = path.resolve(eventsDir, file);\r\n if (!file.endsWith('.ts') && !file.endsWith('.js')) continue;\r\n\r\n try {\r\n const imported = await import(pathToFileURL(fullPath).href);\r\n const controller: EventController = imported.default || imported[Object.keys(imported)[0]];\r\n\r\n if (!controller || (!controller.onRegister && !controller.onEvent)) {\r\n console.warn(logPrefix + chalk.yellow(`⚠️ Skipping non-controller file: ${file}`));\r\n continue;\r\n }\r\n\r\n const label = controller.label || file.replace(/\\.(ts|js)$/, '');\r\n\r\n if (controller.onRegister) {\r\n controller.onRegister(io);\r\n }\r\n\r\n events.push({\r\n label,\r\n onRegister: controller.onRegister,\r\n onEvent: controller.onEvent,\r\n });\r\n\r\n console.log(logPrefix + chalk.green(`✅ Registered event: ${label}`));\r\n\r\n if (controller.onEvent) {\r\n io.on('connection', (socket) => {\r\n socket.on(label, (data: any) => controller.onEvent!(socket, data));\r\n });\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to import event file: ${fullPath}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(logPrefix + chalk.red(`❌ Failed to load events from source: ${source.root}`));\r\n console.error(logPrefix + err);\r\n }\r\n }\r\n },\r\n\r\n load: async (io: SocketIOServer) => {\r\n await useEvents.register(io);\r\n },\r\n\r\n get: async (): Promise<EventController[]> => {\r\n if (events.length === 0) {\r\n console.warn(logPrefix + 'No events loaded yet. Did you call useEvents.load(io)?');\r\n }\r\n return events;\r\n }\r\n};\r\n","// packages/retrex-extensibles-core/useRoutes.ts\r\nimport { Application, Request, Response, NextFunction } from 'express';\r\nimport { pathToFileURL } from 'url';\r\n// import type { LoaderFunctionArgs, ActionFunctionArgs } from '@remix-run/node';\r\nimport path from 'node:path';\r\nimport chalk from 'chalk';\r\nimport fs from 'node:fs';\r\nimport { RouteDefinition } from '../types/index'; // Adjust the import path as necessary\r\nimport { useServices } from './useServices';\r\nimport { useSettings } from './useSettings';\r\n\r\n// Registry for dynamically added routes\r\nconst Prefix = chalk.white('[') + chalk.cyan('Routes Manager | Info') + chalk.white('] ');\r\nconst ErrorPrefix = chalk.white('[') + chalk.red('Routes Manager | Error') + chalk.white('] ');\r\nconst registeredRoutes: RouteDefinition[] = [];\r\nexport const routesManager = {\r\n /**\r\n * Register a dynamic route from a module/service.\r\n */\r\n registerRoute(def: RouteDefinition): void {\r\n registeredRoutes.push(def);\r\n },\r\n\r\n /**\r\n * Return all registered dynamic routes.\r\n */\r\n getRegisteredRoutes(): RouteDefinition[] {\r\n return registeredRoutes;\r\n },\r\n\r\n /**\r\n * Loads and mounts all registered dynamic routes into an Express app.\r\n */\r\n async mountRegisteredRoutes(app: Application, debug: boolean): Promise<{ success: boolean, message?: string }> {\r\n let fullSuccess = false;\r\n try {\r\n for (const route of registeredRoutes) {\r\n try {\r\n if (debug) {\r\n console.log(Prefix + chalk.cyan(`Mounting route: [Label: ${route.label} | Path: ${route.path} -> File: ${route.filePath}]`));\r\n }\r\n\r\n const routeFile = fs.existsSync(route.filePath);\r\n // fs.readdirSync(route.filePath); // Ensure the file exists\r\n if (routeFile) {\r\n if (debug) {\r\n console.warn(ErrorPrefix + chalk.yellow(`⚠️ No files found in route directory: ${route.filePath}`));\r\n }\r\n continue; // Skip empty directories\r\n }\r\n console.log(Prefix + chalk.green(`✓ Found route file: ${route.filePath}`));\r\n \r\n if (debug) {\r\n console.log(Prefix + chalk.green(`✓ Mounted route: ${route.label.toUpperCase()} ${route.path}`));\r\n }\r\n } catch (err: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + chalk.red(`Failed to mount route ${route.path}: ${err?.message}`));\r\n console.error(ErrorPrefix + chalk.red(`Route definition: ${JSON.stringify(route, null, 2)}`));\r\n console.error(ErrorPrefix + chalk.red(`File path: ${route.filePath}`));\r\n console.error(ErrorPrefix + chalk.red(`Error details: ${err}`));\r\n }\r\n fullSuccess = false;\r\n continue; // Skip this route if it fails\r\n }\r\n }\r\n if (fullSuccess) {\r\n return { success: true }\r\n }\r\n return { success: fullSuccess, message: 'Some routes failed to mount, check logs for details.' };\r\n } catch (error: any) {\r\n if (debug) {\r\n console.error(ErrorPrefix + 'Error mounting registered routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n console.error(ErrorPrefix + 'Registered routes:', JSON.stringify(registeredRoutes, null, 2));\r\n // Optionally rethrow the error if you want to stop the server startup \r\n // throw new Error(`Failed to mount registered routes: ${error.message}`);\r\n // Or you can just log it and continue\r\n console.error(ErrorPrefix + 'Continuing without mounting routes due to error.');\r\n }\r\n // Optionally, you can throw an error here if you want to stop the server startup\r\n return { success: fullSuccess, message: `Failed to mount dynamic routes: ${error.message}` };\r\n // throw new Error(`Failed to mount dynamic routes: ${error.message}`);\r\n }\r\n },\r\n\r\n async getMountedRoutes(): Promise<RouteDefinition[]> {\r\n try {\r\n return registeredRoutes;\r\n } catch (error: any) {\r\n console.error(ErrorPrefix + 'Error getting mounted routes:', error.message);\r\n console.error(ErrorPrefix + 'Stack trace:', error.stack);\r\n throw new Error(`Failed to get mounted routes: ${error.message}`);\r\n }\r\n }\r\n}\r\n","// packages/retrex-extensibles-core/hooks/useUtils.ts\r\nimport path from 'node:path';\r\nimport { pathToFileURL } from 'url';\r\nimport fs from 'node:fs';\r\nimport { useSettings } from './useSettings';\r\n\r\nexport const useUtils = {\r\n async loadThemeComponent(\r\n componentName: string,\r\n options: {\r\n theme: {\r\n name: string;\r\n type: 'admin' | 'client' | 'portal' | 'email';\r\n };\r\n search?: {\r\n themes?: boolean;\r\n modules?: boolean;\r\n services?: boolean;\r\n };\r\n }\r\n ): Promise<React.ComponentType<any> | null> {\r\n const { search = {}, theme } = options;\r\n const searchThemes = search.themes ?? true;\r\n const searchModules = search.modules ?? true;\r\n const searchServices = search.services ?? true;\r\n\r\n const possiblePaths: string[] = [];\r\n\r\n console.log(`Searching for component \"${componentName}\" in theme \"${theme.name}\" of type \"${theme.type}\"...`);\r\n\r\n try {\r\n if (searchThemes) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'resources',\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n \r\n if (searchModules) {\r\n const moduleDirs = await fs.readdirSync(useSettings.getPaths().modules);\r\n for (const mod of moduleDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'modules',\r\n mod,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n if (searchServices) {\r\n const serviceDirs = await fs.readdirSync(useSettings.getPaths().services);\r\n for (const svc of serviceDirs) {\r\n possiblePaths.push(\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'routes',\r\n `${componentName}.tsx`\r\n ),\r\n path.resolve(\r\n 'services',\r\n svc,\r\n 'themes',\r\n theme.type,\r\n theme.name,\r\n 'components',\r\n `${componentName}.tsx`\r\n )\r\n );\r\n }\r\n }\r\n \r\n for (const filePath of possiblePaths) {\r\n if (await fs.existsSync(filePath)) {\r\n try {\r\n const mod = await import(pathToFileURL(filePath).toString());\r\n if (mod.default) return mod.default;\r\n } catch (err) {\r\n console.error(`Error loading component at ${filePath}:`, err);\r\n }\r\n }\r\n }\r\n \r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n return null;\r\n } catch (err) {\r\n console.error(`Error searching for component \"${componentName}\":`, err);\r\n console.warn(`Component \"${componentName}\" not found in theme \"${theme.name}\" of type \"${theme.type}\".`);\r\n console.warn(`Searched paths:`, possiblePaths);\r\n console.warn(`Ensure the component exists in the specified theme and type.`);\r\n console.warn(`If the component is in a module or service, ensure the theme structure is correct.`);\r\n console.warn(`If you are using a custom theme, module, or service, ensure it is properly configured and registered in the settings.`);\r\n return null;\r\n }\r\n }\r\n}\r\n","// useTranslation.ts\r\nimport merge from 'lodash.merge';\r\n\r\ntype LangPack = Record<string, any>;\r\ntype LangMap = Record<string, LangPack>;\r\n\r\nconst langs: Record<string, LangMap> = {};\r\nlet currentLang = 'en';\r\nlet isLoaded = false;\r\n\r\nexport const useTranslation = {\r\n async load(preloaded?: Record<string, LangMap>): Promise<void> {\r\n if (typeof window !== 'undefined') {\r\n // 🌐 Browser: expect SSR-preloaded translations or lazy fetch\r\n if (preloaded) {\r\n merge(langs, preloaded);\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // If no preloaded translations, fallback to fetch (on-demand)\r\n const lang = currentLang;\r\n const types = ['admin', 'client', 'portal', 'email']; // Customize as needed\r\n\r\n for (const type of types) {\r\n try {\r\n const res = await fetch(`/langs/${lang}/${type}.json`);\r\n if (res.ok) {\r\n const json = await res.json();\r\n langs[lang] ??= {};\r\n langs[lang][type] = merge(langs[lang][type] ?? {}, json);\r\n }\r\n } catch (err) {\r\n console.warn(`[useTranslation] Failed to fetch ${type}.json`, err);\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n return;\r\n }\r\n\r\n // 🖥️ Node/server-side: read from filesystem using useSettings\r\n const path = await import('node:path');\r\n const fs = await import('node:fs/promises');\r\n const { existsSync } = await import('node:fs');\r\n const { useSettings } = await import('./useSettings');\r\n const { langs: langsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n const sources = [\r\n { root: langsPath },\r\n { root: modules },\r\n { root: services },\r\n { root: templates },\r\n ];\r\n\r\n for (const source of sources) {\r\n if (!existsSync(source.root)) continue;\r\n\r\n const entries = await fs.readdir(source.root);\r\n for (const entry of entries) {\r\n const basePath = path.join(source.root, entry, 'langs');\r\n if (!existsSync(basePath)) continue;\r\n\r\n const langDirs = await fs.readdir(basePath);\r\n for (const langCode of langDirs) {\r\n const langPath = path.join(basePath, langCode);\r\n const stat = await fs.stat(langPath);\r\n if (!stat.isDirectory()) continue;\r\n\r\n const files = await fs.readdir(langPath);\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n const type = file.replace('.json', '');\r\n const content = JSON.parse(await fs.readFile(path.join(langPath, file), 'utf8'));\r\n\r\n langs[langCode] ??= {};\r\n langs[langCode][type] = merge(langs[langCode][type] ?? {}, content);\r\n }\r\n }\r\n }\r\n }\r\n\r\n isLoaded = true;\r\n },\r\n\r\n useLang(langCode: string): void {\r\n if (!langs[langCode]) {\r\n console.warn(`[useTranslation] Language \"${langCode}\" not found`);\r\n return;\r\n }\r\n currentLang = langCode;\r\n },\r\n\r\n getLang(): string {\r\n return currentLang;\r\n },\r\n\r\n getLangMap(langCode?: string): LangMap {\r\n return langs[langCode ?? currentLang] || {};\r\n },\r\n\r\n getLangs(): string[] {\r\n return Object.keys(langs);\r\n },\r\n\r\n t(key: string, fallback = '', values: Record<string, string> = {}): string {\r\n const [namespace, ...rest] = key.split('.');\r\n const langPack = langs[currentLang]?.[namespace];\r\n\r\n if (!langPack) return fallback;\r\n\r\n let result: any = langPack;\r\n for (const part of rest) {\r\n result = result?.[part];\r\n if (result === undefined) return fallback;\r\n }\r\n\r\n if (typeof result !== 'string') return fallback;\r\n\r\n return Object.entries(values).reduce(\r\n (text, [k, v]) => text.replace(new RegExp(`{${k}}`, 'g'), v),\r\n result\r\n );\r\n },\r\n\r\n reset() {\r\n Object.keys(langs).forEach((k) => delete langs[k]);\r\n isLoaded = false;\r\n },\r\n\r\n getAll() {\r\n return langs;\r\n },\r\n\r\n isReady() {\r\n return isLoaded;\r\n }\r\n};\r\n\r\n\r\n\r\n// import path from 'node:path';\r\n// import fs from 'node:fs/promises';\r\n// import { existsSync } from 'node:fs';\r\n// import { useSettings } from './useSettings';\r\n// import merge from 'lodash.merge';\r\n\r\n// type LangPack = Record<string, any>;\r\n// type LangMap = Record<string, LangPack>;\r\n\r\n// const langs: Record<string, LangMap> = {};\r\n// let currentLang = 'en';\r\n\r\n// export const useTranslation = {\r\n// /**\r\n// * Load all language files from the core, services, modules, and templates.\r\n// */\r\n// async load(): Promise<void> {\r\n// const { langs: rootLangsPath, modules, services, templates } = useSettings.getPaths();\r\n\r\n// const sources = [\r\n// { label: 'root', path: rootLangsPath },\r\n// { label: 'modules', path: modules },\r\n// { label: 'services', path: services },\r\n// { label: 'templates', path: templates },\r\n// ];\r\n\r\n// for (const source of sources) {\r\n// if (!existsSync(source.path)) continue;\r\n\r\n// const entries = await fs.readdir(source.path);\r\n// for (const entry of entries) {\r\n// const fullPath = path.join(source.path, entry, 'langs');\r\n// if (!existsSync(fullPath)) continue;\r\n\r\n// const langDirs = await fs.readdir(fullPath);\r\n// for (const langCode of langDirs) {\r\n// const langPath = path.join(fullPath, langCode);\r\n// const stat = await fs.stat(langPath);\r\n// if (!stat.isDirectory()) continue;\r\n\r\n// const files = await fs.readdir(langPath);\r\n// for (const file of files) {\r\n// if (!file.endsWith('.json')) continue;\r\n\r\n// const namespace = file.replace('.json', '');\r\n// const filePath = path.join(langPath, file);\r\n// const content = JSON.parse(await fs.readFile(filePath, 'utf8'));\r\n\r\n// langs[langCode] ??= {};\r\n// langs[langCode][namespace] = merge(langs[langCode][namespace] ?? {}, content);\r\n// }\r\n// }\r\n// }\r\n// }\r\n// },\r\n\r\n// /**\r\n// * Change the active language code\r\n// */\r\n// useLang(langCode: string): void {\r\n// if (!langs[langCode]) {\r\n// console.warn(`[useTranslation] Language \"${langCode}\" not loaded or missing`);\r\n// return;\r\n// }\r\n// currentLang = langCode;\r\n// },\r\n\r\n// /**\r\n// * Return the active language code\r\n// */\r\n// getLang(): string {\r\n// return currentLang;\r\n// },\r\n\r\n// /**\r\n// * Return the full translation map of a specific language\r\n// */\r\n// getLangMap(langCode?: string): LangMap {\r\n// return langs[langCode ?? currentLang] || {};\r\n// },\r\n\r\n// /**\r\n// * Return the list of loaded languages\r\n// */\r\n// getLangs(): string[] {\r\n// return Object.keys(langs);\r\n// },\r\n\r\n// /**\r\n// * Translate a key from a namespace\r\n// * Example: t('admin.dashboard.title')\r\n// */\r\n// // t(key: string, fallback: string = '', values: Record<string, string> = {}): string {\r\n// // const raw = /* same logic as above to get the string */;\r\n// // return Object.entries(values).reduce((acc, [k, v]) => acc.replaceAll(`{${k}}`, v), raw);\r\n// // }\r\n// t(key: string, fallback: string = ''): string {\r\n// const [namespace, ...parts] = key.split('.');\r\n// const lang = langs[currentLang] ?? {};\r\n// const scope = lang[namespace];\r\n\r\n// if (!scope) return fallback;\r\n\r\n// let value = scope;\r\n// for (const part of parts) {\r\n// value = value?.[part];\r\n// if (value === undefined) return fallback;\r\n// }\r\n\r\n// return typeof value === 'string' ? value : fallback;\r\n// },\r\n\r\n// /**\r\n// * Clear translations (used in dev hot reload or test environments)\r\n// */\r\n// reset(): void {\r\n// Object.keys(langs).forEach((lang) => delete langs[lang]);\r\n// }\r\n// };\r\n","// src/providers/ThemeProvider.tsx\r\nimport React, { createContext, useContext, useEffect, useState } from 'react';\r\nimport type { TemplateMeta, TemplateType, ThemeTypes } from '../types';\r\nimport { useTemplates } from '../hooks/useTemplates';\r\n\r\ninterface ThemeContextProps {\r\n templateType: TemplateType;\r\n activeTheme: TemplateMeta | null;\r\n setActiveTheme: (theme: TemplateMeta) => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextProps | null>(null);\r\n\r\nexport const ThemeProvider: React.FC<{\r\n type: TemplateType;\r\n children: React.ReactNode;\r\n}> = ({ type, children }) => {\r\n const [activeTheme, setActiveTheme] = useState<TemplateMeta | null>(null);\r\n let tType: string;\r\n useEffect(() => {\r\n if (type.includes('-theme')) {\r\n tType = type.replace('-theme', '');\r\n } else {\r\n tType = type;\r\n }\r\n useTemplates.getActiveTemplate(tType as ThemeTypes).then((template) => {\r\n setActiveTheme(template);\r\n // console.log('Active theme set:', template);\r\n });\r\n }, [type]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ templateType: type, activeTheme, setActiveTheme }}>\r\n {/* {!activeTheme ? (\r\n <div>Loading theme...</div>\r\n ) :\r\n } */}\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n\r\nexport function useTheme() {\r\n const ctx = useContext(ThemeContext);\r\n if (!ctx) throw new Error('useTheme must be used inside a ThemeProvider');\r\n return ctx;\r\n}\r\n"],"mappings":"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","names":["paths","extensiblePaths","templates","paths","fs","path","fs","path","fs","path","fs","path","templates","fs","path","pathToFileURL","chalk","fs","path","pathToFileURL","fs","path","fs","useSettings","templates"]}
|