@sonicjs-cms/core 2.5.0 → 2.7.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.
Files changed (92) hide show
  1. package/dist/{app-Db0AfT5F.d.cts → app-DV27cjPy.d.cts} +1 -1
  2. package/dist/{app-Db0AfT5F.d.ts → app-DV27cjPy.d.ts} +1 -1
  3. package/dist/{chunk-YIXSSJWD.cjs → chunk-AYPF6C4D.cjs} +5 -5
  4. package/dist/{chunk-YIXSSJWD.cjs.map → chunk-AYPF6C4D.cjs.map} +1 -1
  5. package/dist/chunk-CLIH2T74.js +403 -0
  6. package/dist/chunk-CLIH2T74.js.map +1 -0
  7. package/dist/{chunk-BHNDALCA.js → chunk-DNHJS6RN.js} +6 -4
  8. package/dist/chunk-DNHJS6RN.js.map +1 -0
  9. package/dist/{chunk-YYV3XQOQ.cjs → chunk-E2BXLXPW.cjs} +7 -7
  10. package/dist/{chunk-YYV3XQOQ.cjs.map → chunk-E2BXLXPW.cjs.map} +1 -1
  11. package/dist/{chunk-AZLU3ROK.cjs → chunk-EHSZ6TAN.cjs} +11 -4
  12. package/dist/chunk-EHSZ6TAN.cjs.map +1 -0
  13. package/dist/{chunk-3YUHXWSG.js → chunk-F332TENF.js} +3 -3
  14. package/dist/{chunk-3YUHXWSG.js.map → chunk-F332TENF.js.map} +1 -1
  15. package/dist/{chunk-V5LBQN3I.js → chunk-GRN3GHUG.js} +11 -4
  16. package/dist/chunk-GRN3GHUG.js.map +1 -0
  17. package/dist/{chunk-UAQL2VWX.cjs → chunk-J7F3NPAP.cjs} +2436 -707
  18. package/dist/chunk-J7F3NPAP.cjs.map +1 -0
  19. package/dist/{chunk-VEL7QRYI.js → chunk-L2IDZI7F.js} +9 -2
  20. package/dist/chunk-L2IDZI7F.js.map +1 -0
  21. package/dist/{chunk-ILZ3DP4I.cjs → chunk-MPT5PA6U.cjs} +24 -2
  22. package/dist/chunk-MPT5PA6U.cjs.map +1 -0
  23. package/dist/{chunk-ZWV3EBZ7.cjs → chunk-MYB5RY7H.cjs} +6 -4
  24. package/dist/chunk-MYB5RY7H.cjs.map +1 -0
  25. package/dist/{chunk-OJZ45OJD.js → chunk-UISZ2MBW.js} +2272 -544
  26. package/dist/chunk-UISZ2MBW.js.map +1 -0
  27. package/dist/{chunk-AVPUX57O.js → chunk-V3KVSEG6.js} +3 -3
  28. package/dist/{chunk-AVPUX57O.js.map → chunk-V3KVSEG6.js.map} +1 -1
  29. package/dist/{chunk-TJTWRO4G.js → chunk-Y3EWJQ4D.js} +4 -4
  30. package/dist/{chunk-TJTWRO4G.js.map → chunk-Y3EWJQ4D.js.map} +1 -1
  31. package/dist/{chunk-LWG2MWDA.cjs → chunk-Y72M3MVX.cjs} +4 -4
  32. package/dist/{chunk-LWG2MWDA.cjs.map → chunk-Y72M3MVX.cjs.map} +1 -1
  33. package/dist/{chunk-SGAG6FD3.js → chunk-YFJJU26H.js} +24 -2
  34. package/dist/chunk-YFJJU26H.js.map +1 -0
  35. package/dist/chunk-YHW27CBV.cjs +406 -0
  36. package/dist/chunk-YHW27CBV.cjs.map +1 -0
  37. package/dist/{chunk-I4V3VZWF.cjs → chunk-YRFAQ6MI.cjs} +9 -2
  38. package/dist/chunk-YRFAQ6MI.cjs.map +1 -0
  39. package/dist/{collection-config-B6gMPunn.d.cts → collection-config-BF95LgQb.d.cts} +1 -1
  40. package/dist/{collection-config-B6gMPunn.d.ts → collection-config-BF95LgQb.d.ts} +1 -1
  41. package/dist/index.cjs +4098 -424
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +503 -8
  44. package/dist/index.d.ts +503 -8
  45. package/dist/index.js +4008 -341
  46. package/dist/index.js.map +1 -1
  47. package/dist/middleware.cjs +24 -24
  48. package/dist/middleware.d.cts +1 -1
  49. package/dist/middleware.d.ts +1 -1
  50. package/dist/middleware.js +3 -3
  51. package/dist/migrations-LEMFV2ND.cjs +13 -0
  52. package/dist/{migrations-NIEUFG44.cjs.map → migrations-LEMFV2ND.cjs.map} +1 -1
  53. package/dist/migrations-RKQES6XY.js +4 -0
  54. package/dist/{migrations-TGZKJKV4.js.map → migrations-RKQES6XY.js.map} +1 -1
  55. package/dist/{plugin-bootstrap-dYhD9fQR.d.ts → plugin-bootstrap-CB-xaBfK.d.ts} +2 -2
  56. package/dist/{plugin-bootstrap-SHsdjE6X.d.cts → plugin-bootstrap-U-cw9jn3.d.cts} +2 -2
  57. package/dist/plugins.cjs +11 -11
  58. package/dist/plugins.js +2 -2
  59. package/dist/routes.cjs +27 -27
  60. package/dist/routes.d.cts +1 -1
  61. package/dist/routes.d.ts +1 -1
  62. package/dist/routes.js +7 -7
  63. package/dist/services.cjs +16 -16
  64. package/dist/services.d.cts +2 -2
  65. package/dist/services.d.ts +2 -2
  66. package/dist/services.js +2 -2
  67. package/dist/templates.cjs +17 -17
  68. package/dist/templates.js +2 -2
  69. package/dist/types.d.cts +1 -1
  70. package/dist/types.d.ts +1 -1
  71. package/dist/utils.cjs +14 -14
  72. package/dist/utils.d.cts +1 -1
  73. package/dist/utils.d.ts +1 -1
  74. package/dist/utils.js +1 -1
  75. package/migrations/029_ai_search_plugin.sql +45 -0
  76. package/package.json +4 -2
  77. package/dist/chunk-AI2JJIJX.cjs +0 -211
  78. package/dist/chunk-AI2JJIJX.cjs.map +0 -1
  79. package/dist/chunk-AZLU3ROK.cjs.map +0 -1
  80. package/dist/chunk-BHNDALCA.js.map +0 -1
  81. package/dist/chunk-I4V3VZWF.cjs.map +0 -1
  82. package/dist/chunk-ILZ3DP4I.cjs.map +0 -1
  83. package/dist/chunk-OJZ45OJD.js.map +0 -1
  84. package/dist/chunk-QDBNW7KQ.js +0 -209
  85. package/dist/chunk-QDBNW7KQ.js.map +0 -1
  86. package/dist/chunk-SGAG6FD3.js.map +0 -1
  87. package/dist/chunk-UAQL2VWX.cjs.map +0 -1
  88. package/dist/chunk-V5LBQN3I.js.map +0 -1
  89. package/dist/chunk-VEL7QRYI.js.map +0 -1
  90. package/dist/chunk-ZWV3EBZ7.cjs.map +0 -1
  91. package/dist/migrations-NIEUFG44.cjs +0 -13
  92. package/dist/migrations-TGZKJKV4.js +0 -4
@@ -681,6 +681,28 @@ var PluginBootstrapService = class {
681
681
  toolbar: "full",
682
682
  placeholder: "Start writing your content..."
683
683
  }
684
+ },
685
+ {
686
+ id: "ai-search",
687
+ name: "ai-search-plugin",
688
+ display_name: "AI Search",
689
+ description: "Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.",
690
+ version: "1.0.0",
691
+ author: "SonicJS Team",
692
+ category: "search",
693
+ icon: "\u{1F50D}",
694
+ permissions: ["settings:write", "admin:access", "content:read"],
695
+ dependencies: [],
696
+ settings: {
697
+ enabled: false,
698
+ ai_mode_enabled: true,
699
+ selected_collections: [],
700
+ dismissed_collections: [],
701
+ autocomplete_enabled: true,
702
+ cache_duration: 1,
703
+ results_limit: 20,
704
+ index_media: false
705
+ }
684
706
  }
685
707
  ];
686
708
  /**
@@ -793,5 +815,5 @@ var PluginBootstrapService = class {
793
815
  };
794
816
 
795
817
  export { PluginBootstrapService, PluginService, cleanupRemovedCollections, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, registerCollections, syncCollection, syncCollections, validateCollectionConfig };
796
- //# sourceMappingURL=chunk-SGAG6FD3.js.map
797
- //# sourceMappingURL=chunk-SGAG6FD3.js.map
818
+ //# sourceMappingURL=chunk-YFJJU26H.js.map
819
+ //# sourceMappingURL=chunk-YFJJU26H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/plugin-service.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-YFJJU26H.js","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise<CollectionConfig[]> {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise<CollectionConfig | null> {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise<string[]> {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise<CollectionSyncResult[]> {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise<CollectionSyncResult> {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise<boolean> {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise<string[]> {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise<string[]> {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise<PluginData[]> {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise<void> {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise<PluginData | null> {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise<PluginData | null> {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise<PluginStats> {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial<PluginData>): Promise<PluginData> {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise<void> {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise<void> {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise<any[]> {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise<void> {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise<void> {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise<any[]> {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise<any[]> {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise<void> {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise<void> {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise<void> {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins that should always be available in the system\n */\n private readonly CORE_PLUGINS: CorePlugin[] = [\n {\n id: \"core-auth\",\n name: \"core-auth\",\n display_name: \"Authentication System\",\n description: \"Core authentication and user management system\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"security\",\n icon: \"🔐\",\n permissions: [\"manage:users\", \"manage:roles\", \"manage:permissions\"],\n dependencies: [],\n settings: {\n requiredFields: {\n email: { required: true, minLength: 5, label: \"Email\", type: \"email\" },\n password: { required: true, minLength: 8, label: \"Password\", type: \"password\" },\n username: { required: true, minLength: 3, label: \"Username\", type: \"text\" },\n firstName: { required: true, minLength: 1, label: \"First Name\", type: \"text\" },\n lastName: { required: true, minLength: 1, label: \"Last Name\", type: \"text\" },\n },\n validation: {\n emailFormat: true,\n allowDuplicateUsernames: false,\n passwordRequirements: {\n requireUppercase: false,\n requireLowercase: false,\n requireNumbers: false,\n requireSpecialChars: false,\n },\n },\n registration: {\n enabled: true,\n requireEmailVerification: false,\n defaultRole: \"viewer\",\n },\n },\n },\n {\n id: \"core-media\",\n name: \"core-media\",\n display_name: \"Media Manager\",\n description: \"Core media upload and management system\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"media\",\n icon: \"📸\",\n permissions: [\"manage:media\", \"upload:files\"],\n dependencies: [],\n settings: {},\n },\n {\n id: \"database-tools\",\n name: \"database-tools\",\n display_name: \"Database Tools\",\n description:\n \"Database management tools including truncate, backup, and validation\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"system\",\n icon: \"🗄️\",\n permissions: [\"manage:database\", \"admin\"],\n dependencies: [],\n settings: {\n enableTruncate: true,\n enableBackup: true,\n enableValidation: true,\n requireConfirmation: true,\n },\n },\n {\n id: \"seed-data\",\n name: \"seed-data\",\n display_name: \"Seed Data\",\n description:\n \"Generate realistic example users and content for testing and development\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"development\",\n icon: \"🌱\",\n permissions: [\"admin\"],\n dependencies: [],\n settings: {\n userCount: 20,\n contentCount: 200,\n defaultPassword: \"password123\",\n },\n },\n {\n id: \"core-cache\",\n name: \"core-cache\",\n display_name: \"Cache System\",\n description:\n \"Three-tiered caching system with memory, KV, and database layers\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"performance\",\n icon: \"⚡\",\n permissions: [\"manage:cache\", \"view:stats\"],\n dependencies: [],\n settings: {\n enableMemoryCache: true,\n enableKVCache: true,\n enableDatabaseCache: true,\n defaultTTL: 3600,\n },\n },\n {\n id: \"workflow-plugin\",\n name: \"workflow-plugin\",\n display_name: \"Workflow Management\",\n description:\n \"Content workflow management with approval chains, scheduling, and automation\",\n version: \"1.0.0-beta.1\",\n author: \"SonicJS Team\",\n category: \"content\",\n icon: \"🔄\",\n permissions: [\"manage:workflows\", \"view:workflows\", \"transition:content\"],\n dependencies: [\"content-plugin\"],\n settings: {\n enableApprovalChains: true,\n enableScheduling: true,\n enableAutomation: true,\n enableNotifications: true,\n },\n },\n {\n id: \"easy-mdx\",\n name: \"easy-mdx\",\n display_name: \"EasyMDE Editor\",\n description: \"Lightweight markdown editor with live preview for richtext fields\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"editor\",\n icon: \"✍️\",\n permissions: [],\n dependencies: [],\n settings: {\n defaultHeight: 400,\n toolbar: \"full\",\n placeholder: \"Start writing your content...\",\n },\n },\n {\n id: \"ai-search\",\n name: \"ai-search-plugin\",\n display_name: \"AI Search\",\n description: \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n version: \"1.0.0\",\n author: \"SonicJS Team\",\n category: \"search\",\n icon: \"🔍\",\n permissions: [\"settings:write\", \"admin:access\", \"content:read\"],\n dependencies: [],\n settings: {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n },\n },\n ];\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise<void> {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise<void> {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n // This preserves the activation state across server restarts\n // Core plugins (with core- prefix) are activated on first install in the else block below\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate core plugins immediately after installation\n if (plugin.name.startsWith(\"core-\")) {\n console.log(\n `[PluginBootstrap] Activating newly installed core plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise<void> {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET \n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise<boolean> {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]}
@@ -0,0 +1,406 @@
1
+ 'use strict';
2
+
3
+ var hono = require('hono');
4
+ var zod = require('zod');
5
+
6
+ // src/plugins/sdk/plugin-builder.ts
7
+ var PluginBuilder = class _PluginBuilder {
8
+ plugin;
9
+ constructor(options) {
10
+ this.plugin = {
11
+ name: options.name,
12
+ version: options.version,
13
+ description: options.description,
14
+ author: options.author,
15
+ dependencies: options.dependencies,
16
+ routes: [],
17
+ middleware: [],
18
+ models: [],
19
+ services: [],
20
+ adminPages: [],
21
+ adminComponents: [],
22
+ menuItems: [],
23
+ hooks: []
24
+ };
25
+ }
26
+ /**
27
+ * Create a new plugin builder
28
+ */
29
+ static create(options) {
30
+ return new _PluginBuilder(options);
31
+ }
32
+ /**
33
+ * Add metadata to the plugin
34
+ */
35
+ metadata(metadata) {
36
+ Object.assign(this.plugin, metadata);
37
+ return this;
38
+ }
39
+ /**
40
+ * Add routes to plugin
41
+ */
42
+ addRoutes(routes) {
43
+ this.plugin.routes = [...this.plugin.routes || [], ...routes];
44
+ return this;
45
+ }
46
+ /**
47
+ * Add a single route to plugin
48
+ */
49
+ addRoute(path, handler, options) {
50
+ const route = {
51
+ path,
52
+ handler,
53
+ ...options
54
+ };
55
+ this.plugin.routes = [...this.plugin.routes || [], route];
56
+ return this;
57
+ }
58
+ /**
59
+ * Add middleware to plugin
60
+ */
61
+ addMiddleware(middleware) {
62
+ this.plugin.middleware = [...this.plugin.middleware || [], ...middleware];
63
+ return this;
64
+ }
65
+ /**
66
+ * Add a single middleware to plugin
67
+ */
68
+ addSingleMiddleware(name, handler, options) {
69
+ const middleware = {
70
+ name,
71
+ handler,
72
+ ...options
73
+ };
74
+ this.plugin.middleware = [...this.plugin.middleware || [], middleware];
75
+ return this;
76
+ }
77
+ /**
78
+ * Add models to plugin
79
+ */
80
+ addModels(models) {
81
+ this.plugin.models = [...this.plugin.models || [], ...models];
82
+ return this;
83
+ }
84
+ /**
85
+ * Add a single model to plugin
86
+ */
87
+ addModel(name, options) {
88
+ const model = {
89
+ name,
90
+ ...options
91
+ };
92
+ this.plugin.models = [...this.plugin.models || [], model];
93
+ return this;
94
+ }
95
+ /**
96
+ * Add services to plugin
97
+ */
98
+ addServices(services) {
99
+ this.plugin.services = [...this.plugin.services || [], ...services];
100
+ return this;
101
+ }
102
+ /**
103
+ * Add a single service to plugin
104
+ */
105
+ addService(name, implementation, options) {
106
+ const service = {
107
+ name,
108
+ implementation,
109
+ ...options
110
+ };
111
+ this.plugin.services = [...this.plugin.services || [], service];
112
+ return this;
113
+ }
114
+ /**
115
+ * Add admin pages to plugin
116
+ */
117
+ addAdminPages(pages) {
118
+ this.plugin.adminPages = [...this.plugin.adminPages || [], ...pages];
119
+ return this;
120
+ }
121
+ /**
122
+ * Add a single admin page to plugin
123
+ */
124
+ addAdminPage(path, title, component, options) {
125
+ const page = {
126
+ path,
127
+ title,
128
+ component,
129
+ ...options
130
+ };
131
+ this.plugin.adminPages = [...this.plugin.adminPages || [], page];
132
+ return this;
133
+ }
134
+ /**
135
+ * Add admin components to plugin
136
+ */
137
+ addComponents(components) {
138
+ this.plugin.adminComponents = [...this.plugin.adminComponents || [], ...components];
139
+ return this;
140
+ }
141
+ /**
142
+ * Add a single admin component to plugin
143
+ */
144
+ addComponent(name, template, options) {
145
+ const component = {
146
+ name,
147
+ template,
148
+ ...options
149
+ };
150
+ this.plugin.adminComponents = [...this.plugin.adminComponents || [], component];
151
+ return this;
152
+ }
153
+ /**
154
+ * Add menu items to plugin
155
+ */
156
+ addMenuItems(items) {
157
+ this.plugin.menuItems = [...this.plugin.menuItems || [], ...items];
158
+ return this;
159
+ }
160
+ /**
161
+ * Add a single menu item to plugin
162
+ */
163
+ addMenuItem(label, path, options) {
164
+ const menuItem = {
165
+ label,
166
+ path,
167
+ ...options
168
+ };
169
+ this.plugin.menuItems = [...this.plugin.menuItems || [], menuItem];
170
+ return this;
171
+ }
172
+ /**
173
+ * Add hooks to plugin
174
+ */
175
+ addHooks(hooks) {
176
+ this.plugin.hooks = [...this.plugin.hooks || [], ...hooks];
177
+ return this;
178
+ }
179
+ /**
180
+ * Add a single hook to plugin
181
+ */
182
+ addHook(name, handler, options) {
183
+ const hook = {
184
+ name,
185
+ handler,
186
+ ...options
187
+ };
188
+ this.plugin.hooks = [...this.plugin.hooks || [], hook];
189
+ return this;
190
+ }
191
+ /**
192
+ * Add lifecycle hooks
193
+ */
194
+ lifecycle(hooks) {
195
+ Object.assign(this.plugin, hooks);
196
+ return this;
197
+ }
198
+ /**
199
+ * Build the plugin
200
+ */
201
+ build() {
202
+ if (!this.plugin.name || !this.plugin.version) {
203
+ throw new Error("Plugin name and version are required");
204
+ }
205
+ return this.plugin;
206
+ }
207
+ };
208
+ var PluginHelpers = class {
209
+ /**
210
+ * Create a REST API route for a model.
211
+ *
212
+ * @experimental This method returns placeholder routes. Full implementation coming soon.
213
+ */
214
+ static createModelAPI(modelName, options) {
215
+ const app = new hono.Hono();
216
+ options?.basePath || `/${modelName.toLowerCase()}`;
217
+ app.get("/", async (c) => {
218
+ return c.json({ message: `List ${modelName} items` });
219
+ });
220
+ app.get("/:id", async (c) => {
221
+ const id = c.req.param("id");
222
+ return c.json({ message: `Get ${modelName} with ID: ${id}` });
223
+ });
224
+ app.post("/", async (c) => {
225
+ return c.json({ message: `Create new ${modelName}` });
226
+ });
227
+ app.put("/:id", async (c) => {
228
+ const id = c.req.param("id");
229
+ return c.json({ message: `Update ${modelName} with ID: ${id}` });
230
+ });
231
+ app.delete("/:id", async (c) => {
232
+ const id = c.req.param("id");
233
+ return c.json({ message: `Delete ${modelName} with ID: ${id}` });
234
+ });
235
+ return app;
236
+ }
237
+ /**
238
+ * Create an admin CRUD interface for a model.
239
+ *
240
+ * @experimental This method generates basic admin page structures. Full implementation coming soon.
241
+ */
242
+ static createAdminInterface(modelName, options) {
243
+ const basePath = `/admin/${modelName.toLowerCase()}`;
244
+ const displayName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
245
+ const pages = [
246
+ {
247
+ path: basePath,
248
+ title: `${displayName} List`,
249
+ component: `${modelName}List`,
250
+ permissions: options?.permissions,
251
+ icon: options?.icon
252
+ },
253
+ {
254
+ path: `${basePath}/new`,
255
+ title: `New ${displayName}`,
256
+ component: `${modelName}Form`,
257
+ permissions: options?.permissions
258
+ },
259
+ {
260
+ path: `${basePath}/:id`,
261
+ title: `Edit ${displayName}`,
262
+ component: `${modelName}Form`,
263
+ permissions: options?.permissions
264
+ }
265
+ ];
266
+ const menuItems = [
267
+ {
268
+ label: displayName,
269
+ path: basePath,
270
+ icon: options?.icon,
271
+ permissions: options?.permissions
272
+ }
273
+ ];
274
+ return { pages, menuItems };
275
+ }
276
+ /**
277
+ * Create a database migration for a model
278
+ */
279
+ static createMigration(tableName, fields) {
280
+ const columns = fields.map((field) => {
281
+ let definition = `${field.name} ${field.type}`;
282
+ if (field.primaryKey) definition += " PRIMARY KEY";
283
+ if (field.unique) definition += " UNIQUE";
284
+ if (!field.nullable && !field.primaryKey) definition += " NOT NULL";
285
+ if (field.defaultValue) definition += ` DEFAULT ${field.defaultValue}`;
286
+ return definition;
287
+ }).join(",\n ");
288
+ return `
289
+ CREATE TABLE IF NOT EXISTS ${tableName} (
290
+ ${columns},
291
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
292
+ updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
293
+ );
294
+
295
+ CREATE TRIGGER IF NOT EXISTS ${tableName}_updated_at
296
+ AFTER UPDATE ON ${tableName}
297
+ BEGIN
298
+ UPDATE ${tableName} SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;
299
+ END;
300
+ `.trim();
301
+ }
302
+ /**
303
+ * Create a Zod schema for a model
304
+ */
305
+ static createSchema(fields) {
306
+ const shape = {};
307
+ const applyValidation = (field, schema) => {
308
+ if (field.validation) {
309
+ if (field.type === "string" && field.validation.min) {
310
+ schema = schema.min(field.validation.min);
311
+ }
312
+ if (field.type === "string" && field.validation.max) {
313
+ schema = schema.max(field.validation.max);
314
+ }
315
+ if (field.type === "string" && field.validation.email) {
316
+ schema = schema.email();
317
+ }
318
+ if (field.type === "string" && field.validation.url) {
319
+ schema = schema.url();
320
+ }
321
+ }
322
+ return schema;
323
+ };
324
+ const buildSchema = (field) => {
325
+ let schema;
326
+ switch (field.type) {
327
+ case "string":
328
+ schema = zod.z.string();
329
+ break;
330
+ case "number":
331
+ schema = zod.z.number();
332
+ break;
333
+ case "boolean":
334
+ schema = zod.z.boolean();
335
+ break;
336
+ case "date":
337
+ schema = zod.z.date();
338
+ break;
339
+ case "array":
340
+ if (field.items?.blocks && typeof field.items.blocks === "object") {
341
+ const discriminator = typeof field.items.discriminator === "string" && field.items.discriminator ? field.items.discriminator : "blockType";
342
+ const blockSchemas = Object.entries(field.items.blocks).map(([blockName, blockDef]) => {
343
+ const properties = blockDef?.properties && typeof blockDef.properties === "object" ? blockDef.properties : {};
344
+ const blockShape = {
345
+ [discriminator]: zod.z.literal(blockName)
346
+ };
347
+ Object.entries(properties).forEach(([propertyName, propertyConfigRaw]) => {
348
+ const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === "object" ? propertyConfigRaw : {};
349
+ const propertySchema = buildSchema({
350
+ ...propertyConfig,
351
+ optional: propertyConfig.required === false
352
+ });
353
+ blockShape[propertyName] = propertySchema;
354
+ });
355
+ return zod.z.object(blockShape);
356
+ });
357
+ if (blockSchemas.length === 1 && blockSchemas[0]) {
358
+ schema = zod.z.array(blockSchemas[0]);
359
+ } else if (blockSchemas.length > 1) {
360
+ schema = zod.z.array(zod.z.union(blockSchemas));
361
+ } else {
362
+ schema = zod.z.array(zod.z.any());
363
+ }
364
+ break;
365
+ }
366
+ if (field.items) {
367
+ schema = zod.z.array(buildSchema(field.items));
368
+ break;
369
+ }
370
+ schema = zod.z.array(zod.z.any());
371
+ break;
372
+ case "object":
373
+ if (field.properties && typeof field.properties === "object") {
374
+ const objectShape = {};
375
+ Object.entries(field.properties).forEach(([propertyName, propertyConfigRaw]) => {
376
+ const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === "object" ? propertyConfigRaw : {};
377
+ objectShape[propertyName] = buildSchema({
378
+ ...propertyConfig,
379
+ optional: propertyConfig.required === false
380
+ });
381
+ });
382
+ schema = zod.z.object(objectShape);
383
+ break;
384
+ }
385
+ schema = zod.z.object({});
386
+ break;
387
+ default:
388
+ schema = zod.z.any();
389
+ }
390
+ schema = applyValidation(field, schema);
391
+ if (field.optional || field.required === false) {
392
+ schema = schema.optional();
393
+ }
394
+ return schema;
395
+ };
396
+ for (const field of fields) {
397
+ shape[field.name] = buildSchema(field);
398
+ }
399
+ return zod.z.object(shape);
400
+ }
401
+ };
402
+
403
+ exports.PluginBuilder = PluginBuilder;
404
+ exports.PluginHelpers = PluginHelpers;
405
+ //# sourceMappingURL=chunk-YHW27CBV.cjs.map
406
+ //# sourceMappingURL=chunk-YHW27CBV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/sdk/plugin-builder.ts"],"names":["Hono","z"],"mappings":"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","file":"chunk-YHW27CBV.cjs","sourcesContent":["/**\n * Plugin Builder SDK\n *\n * Provides a fluent API for building SonicJS plugins\n *\n * @packageDocumentation\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport { Plugin, PluginBuilderOptions, PluginRoutes, PluginMiddleware, PluginModel, PluginService, PluginAdminPage, PluginComponent, PluginHook, PluginMenuItem } from '../types'\n\n/**\n * Fluent builder for creating SonicJS plugins.\n *\n * @beta This API is in beta and may change in future releases.\n *\n * @example\n * ```typescript\n * import { PluginBuilder } from '@sonicjs-cms/core'\n *\n * const plugin = PluginBuilder.create({\n * name: 'my-plugin',\n * version: '1.0.0',\n * description: 'My custom plugin'\n * })\n * .addRoute('/api/my-plugin', routes)\n * .addHook('content:save', handler)\n * .lifecycle({ activate: async () => console.log('Activated!') })\n * .build()\n * ```\n */\nexport class PluginBuilder {\n private plugin: Partial<Plugin>\n\n constructor(options: PluginBuilderOptions) {\n this.plugin = {\n name: options.name,\n version: options.version,\n description: options.description,\n author: options.author,\n dependencies: options.dependencies,\n routes: [],\n middleware: [],\n models: [],\n services: [],\n adminPages: [],\n adminComponents: [],\n menuItems: [],\n hooks: []\n }\n }\n\n /**\n * Create a new plugin builder\n */\n static create(options: PluginBuilderOptions): PluginBuilder {\n return new PluginBuilder(options)\n }\n\n /**\n * Add metadata to the plugin\n */\n metadata(metadata: {\n description?: string\n author?: Plugin['author']\n license?: string\n compatibility?: string\n dependencies?: string[]\n }): PluginBuilder {\n Object.assign(this.plugin, metadata)\n return this\n }\n\n /**\n * Add routes to plugin\n */\n addRoutes(routes: PluginRoutes[]): PluginBuilder {\n this.plugin.routes = [...(this.plugin.routes || []), ...routes]\n return this\n }\n\n /**\n * Add a single route to plugin\n */\n addRoute(path: string, handler: Hono, options?: {\n description?: string\n requiresAuth?: boolean\n roles?: string[]\n priority?: number\n }): PluginBuilder {\n const route: PluginRoutes = {\n path,\n handler,\n ...options\n }\n this.plugin.routes = [...(this.plugin.routes || []), route]\n return this\n }\n\n /**\n * Add middleware to plugin\n */\n addMiddleware(middleware: PluginMiddleware[]): PluginBuilder {\n this.plugin.middleware = [...(this.plugin.middleware || []), ...middleware]\n return this\n }\n\n /**\n * Add a single middleware to plugin\n */\n addSingleMiddleware(name: string, handler: any, options?: {\n description?: string\n priority?: number\n routes?: string[]\n global?: boolean\n }): PluginBuilder {\n const middleware: PluginMiddleware = {\n name,\n handler,\n ...options\n }\n this.plugin.middleware = [...(this.plugin.middleware || []), middleware]\n return this\n }\n\n /**\n * Add models to plugin\n */\n addModels(models: PluginModel[]): PluginBuilder {\n this.plugin.models = [...(this.plugin.models || []), ...models]\n return this\n }\n\n /**\n * Add a single model to plugin\n */\n addModel(name: string, options: {\n tableName: string\n schema: z.ZodSchema\n migrations: string[]\n relationships?: PluginModel['relationships']\n extendsContent?: boolean\n }): PluginBuilder {\n const model: PluginModel = {\n name,\n ...options\n }\n this.plugin.models = [...(this.plugin.models || []), model]\n return this\n }\n\n /**\n * Add services to plugin\n */\n addServices(services: PluginService[]): PluginBuilder {\n this.plugin.services = [...(this.plugin.services || []), ...services]\n return this\n }\n\n /**\n * Add a single service to plugin\n */\n addService(name: string, implementation: any, options?: {\n description?: string\n dependencies?: string[]\n singleton?: boolean\n }): PluginBuilder {\n const service: PluginService = {\n name,\n implementation,\n ...options\n }\n this.plugin.services = [...(this.plugin.services || []), service]\n return this\n }\n\n /**\n * Add admin pages to plugin\n */\n addAdminPages(pages: PluginAdminPage[]): PluginBuilder {\n this.plugin.adminPages = [...(this.plugin.adminPages || []), ...pages]\n return this\n }\n\n /**\n * Add a single admin page to plugin\n */\n addAdminPage(path: string, title: string, component: string, options?: {\n description?: string\n permissions?: string[]\n icon?: string\n menuItem?: PluginMenuItem\n }): PluginBuilder {\n const page: PluginAdminPage = {\n path,\n title,\n component,\n ...options\n }\n this.plugin.adminPages = [...(this.plugin.adminPages || []), page]\n return this\n }\n\n /**\n * Add admin components to plugin\n */\n addComponents(components: PluginComponent[]): PluginBuilder {\n this.plugin.adminComponents = [...(this.plugin.adminComponents || []), ...components]\n return this\n }\n\n /**\n * Add a single admin component to plugin\n */\n addComponent(name: string, template: (props: any) => string, options?: {\n description?: string\n propsSchema?: z.ZodSchema\n }): PluginBuilder {\n const component: PluginComponent = {\n name,\n template,\n ...options\n }\n this.plugin.adminComponents = [...(this.plugin.adminComponents || []), component]\n return this\n }\n\n /**\n * Add menu items to plugin\n */\n addMenuItems(items: PluginMenuItem[]): PluginBuilder {\n this.plugin.menuItems = [...(this.plugin.menuItems || []), ...items]\n return this\n }\n\n /**\n * Add a single menu item to plugin\n */\n addMenuItem(label: string, path: string, options?: {\n icon?: string\n order?: number\n parent?: string\n permissions?: string[]\n }): PluginBuilder {\n const menuItem: PluginMenuItem = {\n label,\n path,\n ...options\n }\n this.plugin.menuItems = [...(this.plugin.menuItems || []), menuItem]\n return this\n }\n\n /**\n * Add hooks to plugin\n */\n addHooks(hooks: PluginHook[]): PluginBuilder {\n this.plugin.hooks = [...(this.plugin.hooks || []), ...hooks]\n return this\n }\n\n /**\n * Add a single hook to plugin\n */\n addHook(name: string, handler: any, options?: {\n priority?: number\n description?: string\n }): PluginBuilder {\n const hook: PluginHook = {\n name,\n handler,\n ...options\n }\n this.plugin.hooks = [...(this.plugin.hooks || []), hook]\n return this\n }\n\n /**\n * Add lifecycle hooks\n */\n lifecycle(hooks: {\n install?: Plugin['install']\n uninstall?: Plugin['uninstall']\n activate?: Plugin['activate']\n deactivate?: Plugin['deactivate']\n configure?: Plugin['configure']\n }): PluginBuilder {\n Object.assign(this.plugin, hooks)\n return this\n }\n\n /**\n * Build the plugin\n */\n build(): Plugin {\n // Validate required fields\n if (!this.plugin.name || !this.plugin.version) {\n throw new Error('Plugin name and version are required')\n }\n\n return this.plugin as Plugin\n }\n}\n\n/**\n * Helper functions for common plugin patterns.\n *\n * @beta This API is in beta and may change in future releases.\n */\nexport class PluginHelpers {\n /**\n * Create a REST API route for a model.\n *\n * @experimental This method returns placeholder routes. Full implementation coming soon.\n */\n static createModelAPI(modelName: string, options?: {\n basePath?: string\n permissions?: {\n read?: string[]\n write?: string[]\n delete?: string[]\n }\n }): Hono {\n const app = new Hono()\n const basePath = options?.basePath || `/${modelName.toLowerCase()}`\n\n // GET /models - List all\n app.get('/', async (c) => {\n // Implementation would depend on the model service\n return c.json({ message: `List ${modelName} items` })\n })\n\n // GET /models/:id - Get by ID\n app.get('/:id', async (c) => {\n const id = c.req.param('id')\n return c.json({ message: `Get ${modelName} with ID: ${id}` })\n })\n\n // POST /models - Create new\n app.post('/', async (c) => {\n return c.json({ message: `Create new ${modelName}` })\n })\n\n // PUT /models/:id - Update\n app.put('/:id', async (c) => {\n const id = c.req.param('id')\n return c.json({ message: `Update ${modelName} with ID: ${id}` })\n })\n\n // DELETE /models/:id - Delete\n app.delete('/:id', async (c) => {\n const id = c.req.param('id')\n return c.json({ message: `Delete ${modelName} with ID: ${id}` })\n })\n\n return app\n }\n\n /**\n * Create an admin CRUD interface for a model.\n *\n * @experimental This method generates basic admin page structures. Full implementation coming soon.\n */\n static createAdminInterface(modelName: string, options?: {\n icon?: string\n permissions?: string[]\n fields?: Array<{\n name: string\n type: string\n label: string\n required?: boolean\n }>\n }): {\n pages: PluginAdminPage[]\n menuItems: PluginMenuItem[]\n } {\n const basePath = `/admin/${modelName.toLowerCase()}`\n const displayName = modelName.charAt(0).toUpperCase() + modelName.slice(1)\n\n const pages: PluginAdminPage[] = [\n {\n path: basePath,\n title: `${displayName} List`,\n component: `${modelName}List`,\n permissions: options?.permissions,\n icon: options?.icon\n },\n {\n path: `${basePath}/new`,\n title: `New ${displayName}`,\n component: `${modelName}Form`,\n permissions: options?.permissions\n },\n {\n path: `${basePath}/:id`,\n title: `Edit ${displayName}`,\n component: `${modelName}Form`,\n permissions: options?.permissions\n }\n ]\n\n const menuItems: PluginMenuItem[] = [\n {\n label: displayName,\n path: basePath,\n icon: options?.icon,\n permissions: options?.permissions\n }\n ]\n\n return { pages, menuItems }\n }\n\n /**\n * Create a database migration for a model\n */\n static createMigration(tableName: string, fields: Array<{\n name: string\n type: 'TEXT' | 'INTEGER' | 'REAL' | 'BLOB'\n nullable?: boolean\n primaryKey?: boolean\n unique?: boolean\n defaultValue?: string\n }>): string {\n const columns = fields.map(field => {\n let definition = `${field.name} ${field.type}`\n \n if (field.primaryKey) definition += ' PRIMARY KEY'\n if (field.unique) definition += ' UNIQUE'\n if (!field.nullable && !field.primaryKey) definition += ' NOT NULL'\n if (field.defaultValue) definition += ` DEFAULT ${field.defaultValue}`\n \n return definition\n }).join(',\\n ')\n\n return `\nCREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns},\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n);\n\nCREATE TRIGGER IF NOT EXISTS ${tableName}_updated_at\n AFTER UPDATE ON ${tableName}\nBEGIN\n UPDATE ${tableName} SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\nEND;\n `.trim()\n }\n\n /**\n * Create a Zod schema for a model\n */\n static createSchema(fields: Array<{\n name: string\n type: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object'\n optional?: boolean\n required?: boolean\n validation?: any\n items?: any\n properties?: Record<string, any>\n }>): z.ZodSchema {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n const applyValidation = (field: any, schema: z.ZodTypeAny) => {\n if (field.validation) {\n if (field.type === 'string' && field.validation.min) {\n schema = (schema as z.ZodString).min(field.validation.min)\n }\n if (field.type === 'string' && field.validation.max) {\n schema = (schema as z.ZodString).max(field.validation.max)\n }\n if (field.type === 'string' && field.validation.email) {\n schema = (schema as z.ZodString).email()\n }\n if (field.type === 'string' && field.validation.url) {\n schema = (schema as z.ZodString).url()\n }\n }\n return schema\n }\n\n const buildSchema = (field: any): z.ZodTypeAny => {\n let schema: z.ZodTypeAny\n\n switch (field.type) {\n case 'string':\n schema = z.string()\n break\n case 'number':\n schema = z.number()\n break\n case 'boolean':\n schema = z.boolean()\n break\n case 'date':\n schema = z.date()\n break\n case 'array':\n if (field.items?.blocks && typeof field.items.blocks === 'object') {\n const discriminator = typeof field.items.discriminator === 'string' && field.items.discriminator\n ? field.items.discriminator\n : 'blockType'\n const blockSchemas = Object.entries(field.items.blocks).map(([blockName, blockDef]: [string, any]) => {\n const properties = blockDef?.properties && typeof blockDef.properties === 'object'\n ? blockDef.properties\n : {}\n const blockShape: Record<string, z.ZodTypeAny> = {\n [discriminator]: z.literal(blockName)\n }\n\n Object.entries(properties).forEach(([propertyName, propertyConfigRaw]) => {\n const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === 'object'\n ? propertyConfigRaw as Record<string, any>\n : {}\n const propertySchema = buildSchema({\n ...propertyConfig,\n optional: propertyConfig.required === false\n })\n blockShape[propertyName] = propertySchema\n })\n\n return z.object(blockShape)\n })\n\n if (blockSchemas.length === 1 && blockSchemas[0]) {\n schema = z.array(blockSchemas[0])\n } else if (blockSchemas.length > 1) {\n schema = z.array(z.union(blockSchemas as unknown as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]))\n } else {\n schema = z.array(z.any())\n }\n break\n }\n if (field.items) {\n schema = z.array(buildSchema(field.items))\n break\n }\n schema = z.array(z.any())\n break\n case 'object':\n if (field.properties && typeof field.properties === 'object') {\n const objectShape: Record<string, z.ZodTypeAny> = {}\n Object.entries(field.properties).forEach(([propertyName, propertyConfigRaw]) => {\n const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === 'object'\n ? propertyConfigRaw as Record<string, any>\n : {}\n objectShape[propertyName] = buildSchema({\n ...propertyConfig,\n optional: propertyConfig.required === false\n })\n })\n schema = z.object(objectShape)\n break\n }\n schema = z.object({})\n break\n default:\n schema = z.any()\n }\n\n schema = applyValidation(field, schema)\n\n if (field.optional || field.required === false) {\n schema = schema.optional()\n }\n\n return schema\n }\n\n for (const field of fields) {\n shape[field.name] = buildSchema(field)\n }\n\n return z.object(shape)\n }\n}\n\n/**\n * Common plugin templates for rapid plugin development.\n *\n * @beta This API is in beta and may change in future releases.\n * @experimental Templates are provided as starting points and may require customization.\n */\nexport class PluginTemplates {\n /**\n * Create a simple content type plugin\n */\n static contentType(name: string, fields: Array<{\n name: string\n type: string\n label: string\n required?: boolean\n }>): Plugin {\n const builder = PluginBuilder.create({\n name: `${name}-content-type`,\n version: '1.0.0',\n description: `${name} content type plugin`\n })\n\n // Create model\n const schema = PluginHelpers.createSchema(\n fields.map(f => ({\n name: f.name,\n type: f.type as any,\n optional: !f.required\n }))\n )\n\n const migration = PluginHelpers.createMigration(\n name.toLowerCase(),\n fields.map(f => ({\n name: f.name,\n type: 'TEXT',\n nullable: !f.required\n }))\n )\n\n builder.addModel(name, {\n tableName: name.toLowerCase(),\n schema,\n migrations: [migration],\n extendsContent: true\n })\n\n // Create API routes\n const apiRoutes = PluginHelpers.createModelAPI(name)\n builder.addRoute(`/api/${name.toLowerCase()}`, apiRoutes)\n\n // Create admin interface\n const { pages, menuItems } = PluginHelpers.createAdminInterface(name, {\n fields\n })\n builder.addAdminPages(pages)\n builder.addMenuItems(menuItems)\n\n return builder.build()\n }\n\n /**\n * Create an analytics plugin\n */\n static analytics(name: string, options?: {\n endpoints?: string[]\n dashboard?: boolean\n }): Plugin {\n const builder = PluginBuilder.create({\n name: `${name}-analytics`,\n version: '1.0.0',\n description: `${name} analytics plugin`\n })\n\n // Add middleware to track requests\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n await next()\n const duration = Date.now() - start\n \n // Log analytics data\n console.info(`Analytics: ${c.req.method} ${c.req.path} - ${duration}ms`)\n }, {\n global: true,\n priority: 1\n })\n\n // Add analytics API\n const analyticsAPI = new Hono()\n analyticsAPI.get('/stats', (c) => {\n return c.json({ message: 'Analytics stats' })\n })\n builder.addRoute('/api/analytics', analyticsAPI)\n\n // Add dashboard if requested\n if (options?.dashboard) {\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboard',\n {\n description: 'View analytics and statistics',\n icon: 'chart-bar'\n }\n )\n\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 100\n })\n }\n\n return builder.build()\n }\n}\n"]}