@sonicjs-cms/core 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CJYFSKH7.js → chunk-2MXF4RYZ.js} +3 -3
- package/dist/{chunk-CJYFSKH7.js.map → chunk-2MXF4RYZ.js.map} +1 -1
- package/dist/{chunk-MNFY6DWY.cjs → chunk-56GUBLJE.cjs} +7 -7
- package/dist/{chunk-MNFY6DWY.cjs.map → chunk-56GUBLJE.cjs.map} +1 -1
- package/dist/{chunk-IIBRG5S5.cjs → chunk-6BVLPACH.cjs} +408 -2
- package/dist/chunk-6BVLPACH.cjs.map +1 -0
- package/dist/{chunk-RCA6R6VE.cjs → chunk-ASAEJ4B7.cjs} +315 -162
- package/dist/chunk-ASAEJ4B7.cjs.map +1 -0
- package/dist/{chunk-IT2TC4ZD.cjs → chunk-B2ASV5RD.cjs} +13 -7
- package/dist/chunk-B2ASV5RD.cjs.map +1 -0
- package/dist/{chunk-IZWNIUJI.js → chunk-BUU2US2Z.js} +3 -3
- package/dist/{chunk-IZWNIUJI.js.map → chunk-BUU2US2Z.js.map} +1 -1
- package/dist/{chunk-ZMVWMJ3S.cjs → chunk-DE5YTNCD.cjs} +9 -2
- package/dist/chunk-DE5YTNCD.cjs.map +1 -0
- package/dist/{chunk-4TTMQQC7.js → chunk-GKRGDJGG.js} +10 -4
- package/dist/chunk-GKRGDJGG.js.map +1 -0
- package/dist/{chunk-6O3RJV3C.js → chunk-H55AYIRI.js} +9 -2
- package/dist/chunk-H55AYIRI.js.map +1 -0
- package/dist/{chunk-JTNUM7JE.js → chunk-JTQBNSZX.js} +187 -34
- package/dist/chunk-JTQBNSZX.js.map +1 -0
- package/dist/{chunk-64APW3DW.cjs → chunk-LFAQUR7P.cjs} +9 -2
- package/dist/chunk-LFAQUR7P.cjs.map +1 -0
- package/dist/{chunk-27AOVQTR.js → chunk-NMLFKXWW.js} +402 -3
- package/dist/chunk-NMLFKXWW.js.map +1 -0
- package/dist/{chunk-EKPLKUZT.cjs → chunk-QLPFENZ2.cjs} +3 -3
- package/dist/{chunk-EKPLKUZT.cjs.map → chunk-QLPFENZ2.cjs.map} +1 -1
- package/dist/{chunk-KYGRJCZM.cjs → chunk-QTFKZBLC.cjs} +3 -2
- package/dist/chunk-QTFKZBLC.cjs.map +1 -0
- package/dist/{chunk-LOUJRBXV.js → chunk-QXOZI5Q2.js} +3 -2
- package/dist/chunk-QXOZI5Q2.js.map +1 -0
- package/dist/{chunk-7JMMLHPQ.js → chunk-VJCLJH3X.js} +9 -2
- package/dist/chunk-VJCLJH3X.js.map +1 -0
- package/dist/index.cjs +751 -152
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +125 -5
- package/dist/index.d.ts +125 -5
- package/dist/index.js +582 -15
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +29 -29
- package/dist/middleware.js +3 -3
- package/dist/migrations-UFVJTPVT.js +4 -0
- package/dist/{migrations-N2C2VPJU.js.map → migrations-UFVJTPVT.js.map} +1 -1
- package/dist/migrations-VNYOSUNE.cjs +13 -0
- package/dist/{migrations-ONIAY6GK.cjs.map → migrations-VNYOSUNE.cjs.map} +1 -1
- package/dist/{plugin-0Xogrln-.d.cts → plugin-DDYetMF-.d.cts} +1 -0
- package/dist/{plugin-0Xogrln-.d.ts → plugin-DDYetMF-.d.ts} +1 -0
- package/dist/{plugin-bootstrap-fpG98Otb.d.cts → plugin-bootstrap-DCXpeQVb.d.cts} +229 -1
- package/dist/{plugin-bootstrap-WmpvYM5w.d.ts → plugin-bootstrap-DXBAYaqM.d.ts} +229 -1
- package/dist/{plugin-manager-GcIeb226.d.cts → plugin-manager-BoM3Q7o7.d.cts} +1 -1
- package/dist/{plugin-manager-Clf2gXwj.d.ts → plugin-manager-Efx9RyDX.d.ts} +1 -1
- package/dist/plugins.cjs +10 -10
- package/dist/plugins.d.cts +2 -2
- package/dist/plugins.d.ts +2 -2
- package/dist/plugins.js +2 -2
- package/dist/routes.cjs +29 -29
- package/dist/routes.js +6 -6
- package/dist/services.cjs +60 -32
- package/dist/services.d.cts +1 -1
- package/dist/services.d.ts +1 -1
- package/dist/services.js +3 -3
- package/dist/types.cjs +2 -2
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utils.cjs +11 -11
- package/dist/utils.js +1 -1
- package/migrations/033_form_content_integration.sql +19 -0
- package/package.json +1 -1
- package/dist/chunk-27AOVQTR.js.map +0 -1
- package/dist/chunk-4TTMQQC7.js.map +0 -1
- package/dist/chunk-64APW3DW.cjs.map +0 -1
- package/dist/chunk-6O3RJV3C.js.map +0 -1
- package/dist/chunk-7JMMLHPQ.js.map +0 -1
- package/dist/chunk-IIBRG5S5.cjs.map +0 -1
- package/dist/chunk-IT2TC4ZD.cjs.map +0 -1
- package/dist/chunk-JTNUM7JE.js.map +0 -1
- package/dist/chunk-KYGRJCZM.cjs.map +0 -1
- package/dist/chunk-LOUJRBXV.js.map +0 -1
- package/dist/chunk-RCA6R6VE.cjs.map +0 -1
- package/dist/chunk-ZMVWMJ3S.cjs.map +0 -1
- package/dist/migrations-N2C2VPJU.js +0 -4
- package/dist/migrations-ONIAY6GK.cjs +0 -13
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/plugin.ts"],"names":[],"mappings":";;;AAsXO,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEnB,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA,EACf,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA;AAAA,EAGb,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,YAAA,EAAc,cAAA;AAAA,EACd,YAAA,EAAc,cAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,UAAA,EAAY,YAAA;AAAA,EACZ,OAAA,EAAS;AACX","file":"chunk-KYGRJCZM.cjs","sourcesContent":["/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise<void>\n uninstall?: (context: PluginContext) => Promise<void>\n activate?: (context: PluginContext) => Promise<void>\n deactivate?: (context: PluginContext) => Promise<void>\n configure?: (config: PluginConfig) => Promise<void>\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise<any>\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise<any>\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise<any>\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise<void>\n /** Unregister a plugin */\n unregister(name: string): Promise<void>\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise<void>\n /** Deactivate a plugin */\n deactivate(name: string): Promise<void>\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map<string, PluginStatus>\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise<void>\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise<void>\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise<void>\n /** Uninstall a plugin */\n uninstall(name: string): Promise<void>\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise<boolean>\n /** Get current user */\n getCurrentUser(context: Context): Promise<any>\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise<any>\n /** Create new content */\n create(data: any): Promise<any>\n /** Update content */\n update(id: string, data: any): Promise<any>\n /** Delete content */\n delete(id: string): Promise<void>\n /** Search content */\n search(query: string, options?: any): Promise<any[]>\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise<any>\n /** Get media by ID */\n getById(id: string): Promise<any>\n /** Delete media */\n delete(id: string): Promise<void>\n /** Transform image */\n transform(id: string, options: any): Promise<string>\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/plugin.ts"],"names":[],"mappings":";AAsXO,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEnB,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA,EACf,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA;AAAA,EAGb,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,YAAA,EAAc,cAAA;AAAA,EACd,YAAA,EAAc,cAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,UAAA,EAAY,YAAA;AAAA,EACZ,OAAA,EAAS;AACX","file":"chunk-LOUJRBXV.js","sourcesContent":["/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise<void>\n uninstall?: (context: PluginContext) => Promise<void>\n activate?: (context: PluginContext) => Promise<void>\n deactivate?: (context: PluginContext) => Promise<void>\n configure?: (config: PluginConfig) => Promise<void>\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise<any>\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise<any>\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise<any>\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise<void>\n /** Unregister a plugin */\n unregister(name: string): Promise<void>\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise<void>\n /** Deactivate a plugin */\n deactivate(name: string): Promise<void>\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map<string, PluginStatus>\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise<void>\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise<void>\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise<void>\n /** Uninstall a plugin */\n uninstall(name: string): Promise<void>\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise<boolean>\n /** Get current user */\n getCurrentUser(context: Context): Promise<any>\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise<any>\n /** Create new content */\n create(data: any): Promise<any>\n /** Update content */\n update(id: string, data: any): Promise<any>\n /** Delete content */\n delete(id: string): Promise<void>\n /** Search content */\n search(query: string, options?: any): Promise<any[]>\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise<any>\n /** Get media by ID */\n getById(id: string): Promise<any>\n /** Delete media */\n delete(id: string): Promise<void>\n /** Transform image */\n transform(id: string, options: any): Promise<string>\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]"]}
|