@sonicjs-cms/core 2.5.0 → 2.6.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-63K7XXRX.cjs} +5 -5
  4. package/dist/{chunk-YIXSSJWD.cjs.map → chunk-63K7XXRX.cjs.map} +1 -1
  5. package/dist/{chunk-BHNDALCA.js → chunk-7DL5SPPX.js} +6 -4
  6. package/dist/chunk-7DL5SPPX.js.map +1 -0
  7. package/dist/{chunk-AZLU3ROK.cjs → chunk-BZC4FYW7.cjs} +4 -4
  8. package/dist/chunk-BZC4FYW7.cjs.map +1 -0
  9. package/dist/chunk-CLIH2T74.js +403 -0
  10. package/dist/chunk-CLIH2T74.js.map +1 -0
  11. package/dist/{chunk-VEL7QRYI.js → chunk-EVZOVYLO.js} +9 -2
  12. package/dist/chunk-EVZOVYLO.js.map +1 -0
  13. package/dist/{chunk-TJTWRO4G.js → chunk-EYWR6UA2.js} +4 -4
  14. package/dist/{chunk-TJTWRO4G.js.map → chunk-EYWR6UA2.js.map} +1 -1
  15. package/dist/{chunk-3YUHXWSG.js → chunk-F332TENF.js} +3 -3
  16. package/dist/{chunk-3YUHXWSG.js.map → chunk-F332TENF.js.map} +1 -1
  17. package/dist/{chunk-OJZ45OJD.js → chunk-F6GZURXJ.js} +2243 -539
  18. package/dist/chunk-F6GZURXJ.js.map +1 -0
  19. package/dist/{chunk-I4V3VZWF.cjs → chunk-IIRVZSP2.cjs} +9 -2
  20. package/dist/chunk-IIRVZSP2.cjs.map +1 -0
  21. package/dist/{chunk-V5LBQN3I.js → chunk-KA2PDJNB.js} +4 -4
  22. package/dist/chunk-KA2PDJNB.js.map +1 -0
  23. package/dist/{chunk-AVPUX57O.js → chunk-KAOWRIFD.js} +3 -3
  24. package/dist/{chunk-AVPUX57O.js.map → chunk-KAOWRIFD.js.map} +1 -1
  25. package/dist/{chunk-ILZ3DP4I.cjs → chunk-MPT5PA6U.cjs} +24 -2
  26. package/dist/chunk-MPT5PA6U.cjs.map +1 -0
  27. package/dist/{chunk-UAQL2VWX.cjs → chunk-N7TDLOUE.cjs} +2406 -703
  28. package/dist/chunk-N7TDLOUE.cjs.map +1 -0
  29. package/dist/{chunk-YYV3XQOQ.cjs → chunk-T3YIKW2A.cjs} +7 -7
  30. package/dist/{chunk-YYV3XQOQ.cjs.map → chunk-T3YIKW2A.cjs.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-ZWV3EBZ7.cjs → chunk-YMTTGHEK.cjs} +6 -4
  38. package/dist/chunk-YMTTGHEK.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 +2156 -300
  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 +1893 -44
  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-QNYAWQLB.cjs +13 -0
  52. package/dist/{migrations-NIEUFG44.cjs.map → migrations-QNYAWQLB.cjs.map} +1 -1
  53. package/dist/migrations-R6NQBKQV.js +4 -0
  54. package/dist/{migrations-TGZKJKV4.js.map → migrations-R6NQBKQV.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
@@ -1,209 +0,0 @@
1
- import 'hono';
2
- import 'zod';
3
-
4
- // src/plugins/sdk/plugin-builder.ts
5
- var PluginBuilder = class _PluginBuilder {
6
- plugin;
7
- constructor(options) {
8
- this.plugin = {
9
- name: options.name,
10
- version: options.version,
11
- description: options.description,
12
- author: options.author,
13
- dependencies: options.dependencies,
14
- routes: [],
15
- middleware: [],
16
- models: [],
17
- services: [],
18
- adminPages: [],
19
- adminComponents: [],
20
- menuItems: [],
21
- hooks: []
22
- };
23
- }
24
- /**
25
- * Create a new plugin builder
26
- */
27
- static create(options) {
28
- return new _PluginBuilder(options);
29
- }
30
- /**
31
- * Add metadata to the plugin
32
- */
33
- metadata(metadata) {
34
- Object.assign(this.plugin, metadata);
35
- return this;
36
- }
37
- /**
38
- * Add routes to plugin
39
- */
40
- addRoutes(routes) {
41
- this.plugin.routes = [...this.plugin.routes || [], ...routes];
42
- return this;
43
- }
44
- /**
45
- * Add a single route to plugin
46
- */
47
- addRoute(path, handler, options) {
48
- const route = {
49
- path,
50
- handler,
51
- ...options
52
- };
53
- this.plugin.routes = [...this.plugin.routes || [], route];
54
- return this;
55
- }
56
- /**
57
- * Add middleware to plugin
58
- */
59
- addMiddleware(middleware) {
60
- this.plugin.middleware = [...this.plugin.middleware || [], ...middleware];
61
- return this;
62
- }
63
- /**
64
- * Add a single middleware to plugin
65
- */
66
- addSingleMiddleware(name, handler, options) {
67
- const middleware = {
68
- name,
69
- handler,
70
- ...options
71
- };
72
- this.plugin.middleware = [...this.plugin.middleware || [], middleware];
73
- return this;
74
- }
75
- /**
76
- * Add models to plugin
77
- */
78
- addModels(models) {
79
- this.plugin.models = [...this.plugin.models || [], ...models];
80
- return this;
81
- }
82
- /**
83
- * Add a single model to plugin
84
- */
85
- addModel(name, options) {
86
- const model = {
87
- name,
88
- ...options
89
- };
90
- this.plugin.models = [...this.plugin.models || [], model];
91
- return this;
92
- }
93
- /**
94
- * Add services to plugin
95
- */
96
- addServices(services) {
97
- this.plugin.services = [...this.plugin.services || [], ...services];
98
- return this;
99
- }
100
- /**
101
- * Add a single service to plugin
102
- */
103
- addService(name, implementation, options) {
104
- const service = {
105
- name,
106
- implementation,
107
- ...options
108
- };
109
- this.plugin.services = [...this.plugin.services || [], service];
110
- return this;
111
- }
112
- /**
113
- * Add admin pages to plugin
114
- */
115
- addAdminPages(pages) {
116
- this.plugin.adminPages = [...this.plugin.adminPages || [], ...pages];
117
- return this;
118
- }
119
- /**
120
- * Add a single admin page to plugin
121
- */
122
- addAdminPage(path, title, component, options) {
123
- const page = {
124
- path,
125
- title,
126
- component,
127
- ...options
128
- };
129
- this.plugin.adminPages = [...this.plugin.adminPages || [], page];
130
- return this;
131
- }
132
- /**
133
- * Add admin components to plugin
134
- */
135
- addComponents(components) {
136
- this.plugin.adminComponents = [...this.plugin.adminComponents || [], ...components];
137
- return this;
138
- }
139
- /**
140
- * Add a single admin component to plugin
141
- */
142
- addComponent(name, template, options) {
143
- const component = {
144
- name,
145
- template,
146
- ...options
147
- };
148
- this.plugin.adminComponents = [...this.plugin.adminComponents || [], component];
149
- return this;
150
- }
151
- /**
152
- * Add menu items to plugin
153
- */
154
- addMenuItems(items) {
155
- this.plugin.menuItems = [...this.plugin.menuItems || [], ...items];
156
- return this;
157
- }
158
- /**
159
- * Add a single menu item to plugin
160
- */
161
- addMenuItem(label, path, options) {
162
- const menuItem = {
163
- label,
164
- path,
165
- ...options
166
- };
167
- this.plugin.menuItems = [...this.plugin.menuItems || [], menuItem];
168
- return this;
169
- }
170
- /**
171
- * Add hooks to plugin
172
- */
173
- addHooks(hooks) {
174
- this.plugin.hooks = [...this.plugin.hooks || [], ...hooks];
175
- return this;
176
- }
177
- /**
178
- * Add a single hook to plugin
179
- */
180
- addHook(name, handler, options) {
181
- const hook = {
182
- name,
183
- handler,
184
- ...options
185
- };
186
- this.plugin.hooks = [...this.plugin.hooks || [], hook];
187
- return this;
188
- }
189
- /**
190
- * Add lifecycle hooks
191
- */
192
- lifecycle(hooks) {
193
- Object.assign(this.plugin, hooks);
194
- return this;
195
- }
196
- /**
197
- * Build the plugin
198
- */
199
- build() {
200
- if (!this.plugin.name || !this.plugin.version) {
201
- throw new Error("Plugin name and version are required");
202
- }
203
- return this.plugin;
204
- }
205
- };
206
-
207
- export { PluginBuilder };
208
- //# sourceMappingURL=chunk-QDBNW7KQ.js.map
209
- //# sourceMappingURL=chunk-QDBNW7KQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plugins/sdk/plugin-builder.ts"],"names":[],"mappings":"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","file":"chunk-QDBNW7KQ.js","sourcesContent":["/**\n * Plugin Builder SDK\n * \n * Provides a fluent API for building SonicJS plugins\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport { Plugin, PluginBuilderOptions, PluginRoutes, PluginMiddleware, PluginModel, PluginService, PluginAdminPage, PluginComponent, PluginHook, PluginMenuItem } from '../types'\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 */\nexport class PluginHelpers {\n /**\n * Create a REST API route for a model\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 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\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"]}
@@ -1 +0,0 @@
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-SGAG6FD3.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\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"]}