@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.
- package/dist/{app-Db0AfT5F.d.cts → app-DV27cjPy.d.cts} +1 -1
- package/dist/{app-Db0AfT5F.d.ts → app-DV27cjPy.d.ts} +1 -1
- package/dist/{chunk-YIXSSJWD.cjs → chunk-63K7XXRX.cjs} +5 -5
- package/dist/{chunk-YIXSSJWD.cjs.map → chunk-63K7XXRX.cjs.map} +1 -1
- package/dist/{chunk-BHNDALCA.js → chunk-7DL5SPPX.js} +6 -4
- package/dist/chunk-7DL5SPPX.js.map +1 -0
- package/dist/{chunk-AZLU3ROK.cjs → chunk-BZC4FYW7.cjs} +4 -4
- package/dist/chunk-BZC4FYW7.cjs.map +1 -0
- package/dist/chunk-CLIH2T74.js +403 -0
- package/dist/chunk-CLIH2T74.js.map +1 -0
- package/dist/{chunk-VEL7QRYI.js → chunk-EVZOVYLO.js} +9 -2
- package/dist/chunk-EVZOVYLO.js.map +1 -0
- package/dist/{chunk-TJTWRO4G.js → chunk-EYWR6UA2.js} +4 -4
- package/dist/{chunk-TJTWRO4G.js.map → chunk-EYWR6UA2.js.map} +1 -1
- package/dist/{chunk-3YUHXWSG.js → chunk-F332TENF.js} +3 -3
- package/dist/{chunk-3YUHXWSG.js.map → chunk-F332TENF.js.map} +1 -1
- package/dist/{chunk-OJZ45OJD.js → chunk-F6GZURXJ.js} +2243 -539
- package/dist/chunk-F6GZURXJ.js.map +1 -0
- package/dist/{chunk-I4V3VZWF.cjs → chunk-IIRVZSP2.cjs} +9 -2
- package/dist/chunk-IIRVZSP2.cjs.map +1 -0
- package/dist/{chunk-V5LBQN3I.js → chunk-KA2PDJNB.js} +4 -4
- package/dist/chunk-KA2PDJNB.js.map +1 -0
- package/dist/{chunk-AVPUX57O.js → chunk-KAOWRIFD.js} +3 -3
- package/dist/{chunk-AVPUX57O.js.map → chunk-KAOWRIFD.js.map} +1 -1
- package/dist/{chunk-ILZ3DP4I.cjs → chunk-MPT5PA6U.cjs} +24 -2
- package/dist/chunk-MPT5PA6U.cjs.map +1 -0
- package/dist/{chunk-UAQL2VWX.cjs → chunk-N7TDLOUE.cjs} +2406 -703
- package/dist/chunk-N7TDLOUE.cjs.map +1 -0
- package/dist/{chunk-YYV3XQOQ.cjs → chunk-T3YIKW2A.cjs} +7 -7
- package/dist/{chunk-YYV3XQOQ.cjs.map → chunk-T3YIKW2A.cjs.map} +1 -1
- package/dist/{chunk-LWG2MWDA.cjs → chunk-Y72M3MVX.cjs} +4 -4
- package/dist/{chunk-LWG2MWDA.cjs.map → chunk-Y72M3MVX.cjs.map} +1 -1
- package/dist/{chunk-SGAG6FD3.js → chunk-YFJJU26H.js} +24 -2
- package/dist/chunk-YFJJU26H.js.map +1 -0
- package/dist/chunk-YHW27CBV.cjs +406 -0
- package/dist/chunk-YHW27CBV.cjs.map +1 -0
- package/dist/{chunk-ZWV3EBZ7.cjs → chunk-YMTTGHEK.cjs} +6 -4
- package/dist/chunk-YMTTGHEK.cjs.map +1 -0
- package/dist/{collection-config-B6gMPunn.d.cts → collection-config-BF95LgQb.d.cts} +1 -1
- package/dist/{collection-config-B6gMPunn.d.ts → collection-config-BF95LgQb.d.ts} +1 -1
- package/dist/index.cjs +2156 -300
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +503 -8
- package/dist/index.d.ts +503 -8
- package/dist/index.js +1893 -44
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +24 -24
- package/dist/middleware.d.cts +1 -1
- package/dist/middleware.d.ts +1 -1
- package/dist/middleware.js +3 -3
- package/dist/migrations-QNYAWQLB.cjs +13 -0
- package/dist/{migrations-NIEUFG44.cjs.map → migrations-QNYAWQLB.cjs.map} +1 -1
- package/dist/migrations-R6NQBKQV.js +4 -0
- package/dist/{migrations-TGZKJKV4.js.map → migrations-R6NQBKQV.js.map} +1 -1
- package/dist/{plugin-bootstrap-dYhD9fQR.d.ts → plugin-bootstrap-CB-xaBfK.d.ts} +2 -2
- package/dist/{plugin-bootstrap-SHsdjE6X.d.cts → plugin-bootstrap-U-cw9jn3.d.cts} +2 -2
- package/dist/plugins.cjs +11 -11
- package/dist/plugins.js +2 -2
- package/dist/routes.cjs +27 -27
- package/dist/routes.d.cts +1 -1
- package/dist/routes.d.ts +1 -1
- package/dist/routes.js +7 -7
- package/dist/services.cjs +16 -16
- package/dist/services.d.cts +2 -2
- package/dist/services.d.ts +2 -2
- package/dist/services.js +2 -2
- package/dist/templates.cjs +17 -17
- package/dist/templates.js +2 -2
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils.cjs +14 -14
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/migrations/029_ai_search_plugin.sql +45 -0
- package/package.json +4 -2
- package/dist/chunk-AI2JJIJX.cjs +0 -211
- package/dist/chunk-AI2JJIJX.cjs.map +0 -1
- package/dist/chunk-AZLU3ROK.cjs.map +0 -1
- package/dist/chunk-BHNDALCA.js.map +0 -1
- package/dist/chunk-I4V3VZWF.cjs.map +0 -1
- package/dist/chunk-ILZ3DP4I.cjs.map +0 -1
- package/dist/chunk-OJZ45OJD.js.map +0 -1
- package/dist/chunk-QDBNW7KQ.js +0 -209
- package/dist/chunk-QDBNW7KQ.js.map +0 -1
- package/dist/chunk-SGAG6FD3.js.map +0 -1
- package/dist/chunk-UAQL2VWX.cjs.map +0 -1
- package/dist/chunk-V5LBQN3I.js.map +0 -1
- package/dist/chunk-VEL7QRYI.js.map +0 -1
- package/dist/chunk-ZWV3EBZ7.cjs.map +0 -1
- package/dist/migrations-NIEUFG44.cjs +0 -13
- package/dist/migrations-TGZKJKV4.js +0 -4
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { z } from '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
|
+
var PluginHelpers = class {
|
|
207
|
+
/**
|
|
208
|
+
* Create a REST API route for a model.
|
|
209
|
+
*
|
|
210
|
+
* @experimental This method returns placeholder routes. Full implementation coming soon.
|
|
211
|
+
*/
|
|
212
|
+
static createModelAPI(modelName, options) {
|
|
213
|
+
const app = new Hono();
|
|
214
|
+
options?.basePath || `/${modelName.toLowerCase()}`;
|
|
215
|
+
app.get("/", async (c) => {
|
|
216
|
+
return c.json({ message: `List ${modelName} items` });
|
|
217
|
+
});
|
|
218
|
+
app.get("/:id", async (c) => {
|
|
219
|
+
const id = c.req.param("id");
|
|
220
|
+
return c.json({ message: `Get ${modelName} with ID: ${id}` });
|
|
221
|
+
});
|
|
222
|
+
app.post("/", async (c) => {
|
|
223
|
+
return c.json({ message: `Create new ${modelName}` });
|
|
224
|
+
});
|
|
225
|
+
app.put("/:id", async (c) => {
|
|
226
|
+
const id = c.req.param("id");
|
|
227
|
+
return c.json({ message: `Update ${modelName} with ID: ${id}` });
|
|
228
|
+
});
|
|
229
|
+
app.delete("/:id", async (c) => {
|
|
230
|
+
const id = c.req.param("id");
|
|
231
|
+
return c.json({ message: `Delete ${modelName} with ID: ${id}` });
|
|
232
|
+
});
|
|
233
|
+
return app;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Create an admin CRUD interface for a model.
|
|
237
|
+
*
|
|
238
|
+
* @experimental This method generates basic admin page structures. Full implementation coming soon.
|
|
239
|
+
*/
|
|
240
|
+
static createAdminInterface(modelName, options) {
|
|
241
|
+
const basePath = `/admin/${modelName.toLowerCase()}`;
|
|
242
|
+
const displayName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
|
|
243
|
+
const pages = [
|
|
244
|
+
{
|
|
245
|
+
path: basePath,
|
|
246
|
+
title: `${displayName} List`,
|
|
247
|
+
component: `${modelName}List`,
|
|
248
|
+
permissions: options?.permissions,
|
|
249
|
+
icon: options?.icon
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
path: `${basePath}/new`,
|
|
253
|
+
title: `New ${displayName}`,
|
|
254
|
+
component: `${modelName}Form`,
|
|
255
|
+
permissions: options?.permissions
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
path: `${basePath}/:id`,
|
|
259
|
+
title: `Edit ${displayName}`,
|
|
260
|
+
component: `${modelName}Form`,
|
|
261
|
+
permissions: options?.permissions
|
|
262
|
+
}
|
|
263
|
+
];
|
|
264
|
+
const menuItems = [
|
|
265
|
+
{
|
|
266
|
+
label: displayName,
|
|
267
|
+
path: basePath,
|
|
268
|
+
icon: options?.icon,
|
|
269
|
+
permissions: options?.permissions
|
|
270
|
+
}
|
|
271
|
+
];
|
|
272
|
+
return { pages, menuItems };
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Create a database migration for a model
|
|
276
|
+
*/
|
|
277
|
+
static createMigration(tableName, fields) {
|
|
278
|
+
const columns = fields.map((field) => {
|
|
279
|
+
let definition = `${field.name} ${field.type}`;
|
|
280
|
+
if (field.primaryKey) definition += " PRIMARY KEY";
|
|
281
|
+
if (field.unique) definition += " UNIQUE";
|
|
282
|
+
if (!field.nullable && !field.primaryKey) definition += " NOT NULL";
|
|
283
|
+
if (field.defaultValue) definition += ` DEFAULT ${field.defaultValue}`;
|
|
284
|
+
return definition;
|
|
285
|
+
}).join(",\n ");
|
|
286
|
+
return `
|
|
287
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
288
|
+
${columns},
|
|
289
|
+
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
290
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
CREATE TRIGGER IF NOT EXISTS ${tableName}_updated_at
|
|
294
|
+
AFTER UPDATE ON ${tableName}
|
|
295
|
+
BEGIN
|
|
296
|
+
UPDATE ${tableName} SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;
|
|
297
|
+
END;
|
|
298
|
+
`.trim();
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Create a Zod schema for a model
|
|
302
|
+
*/
|
|
303
|
+
static createSchema(fields) {
|
|
304
|
+
const shape = {};
|
|
305
|
+
const applyValidation = (field, schema) => {
|
|
306
|
+
if (field.validation) {
|
|
307
|
+
if (field.type === "string" && field.validation.min) {
|
|
308
|
+
schema = schema.min(field.validation.min);
|
|
309
|
+
}
|
|
310
|
+
if (field.type === "string" && field.validation.max) {
|
|
311
|
+
schema = schema.max(field.validation.max);
|
|
312
|
+
}
|
|
313
|
+
if (field.type === "string" && field.validation.email) {
|
|
314
|
+
schema = schema.email();
|
|
315
|
+
}
|
|
316
|
+
if (field.type === "string" && field.validation.url) {
|
|
317
|
+
schema = schema.url();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return schema;
|
|
321
|
+
};
|
|
322
|
+
const buildSchema = (field) => {
|
|
323
|
+
let schema;
|
|
324
|
+
switch (field.type) {
|
|
325
|
+
case "string":
|
|
326
|
+
schema = z.string();
|
|
327
|
+
break;
|
|
328
|
+
case "number":
|
|
329
|
+
schema = z.number();
|
|
330
|
+
break;
|
|
331
|
+
case "boolean":
|
|
332
|
+
schema = z.boolean();
|
|
333
|
+
break;
|
|
334
|
+
case "date":
|
|
335
|
+
schema = z.date();
|
|
336
|
+
break;
|
|
337
|
+
case "array":
|
|
338
|
+
if (field.items?.blocks && typeof field.items.blocks === "object") {
|
|
339
|
+
const discriminator = typeof field.items.discriminator === "string" && field.items.discriminator ? field.items.discriminator : "blockType";
|
|
340
|
+
const blockSchemas = Object.entries(field.items.blocks).map(([blockName, blockDef]) => {
|
|
341
|
+
const properties = blockDef?.properties && typeof blockDef.properties === "object" ? blockDef.properties : {};
|
|
342
|
+
const blockShape = {
|
|
343
|
+
[discriminator]: z.literal(blockName)
|
|
344
|
+
};
|
|
345
|
+
Object.entries(properties).forEach(([propertyName, propertyConfigRaw]) => {
|
|
346
|
+
const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === "object" ? propertyConfigRaw : {};
|
|
347
|
+
const propertySchema = buildSchema({
|
|
348
|
+
...propertyConfig,
|
|
349
|
+
optional: propertyConfig.required === false
|
|
350
|
+
});
|
|
351
|
+
blockShape[propertyName] = propertySchema;
|
|
352
|
+
});
|
|
353
|
+
return z.object(blockShape);
|
|
354
|
+
});
|
|
355
|
+
if (blockSchemas.length === 1 && blockSchemas[0]) {
|
|
356
|
+
schema = z.array(blockSchemas[0]);
|
|
357
|
+
} else if (blockSchemas.length > 1) {
|
|
358
|
+
schema = z.array(z.union(blockSchemas));
|
|
359
|
+
} else {
|
|
360
|
+
schema = z.array(z.any());
|
|
361
|
+
}
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
if (field.items) {
|
|
365
|
+
schema = z.array(buildSchema(field.items));
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
schema = z.array(z.any());
|
|
369
|
+
break;
|
|
370
|
+
case "object":
|
|
371
|
+
if (field.properties && typeof field.properties === "object") {
|
|
372
|
+
const objectShape = {};
|
|
373
|
+
Object.entries(field.properties).forEach(([propertyName, propertyConfigRaw]) => {
|
|
374
|
+
const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === "object" ? propertyConfigRaw : {};
|
|
375
|
+
objectShape[propertyName] = buildSchema({
|
|
376
|
+
...propertyConfig,
|
|
377
|
+
optional: propertyConfig.required === false
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
schema = z.object(objectShape);
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
schema = z.object({});
|
|
384
|
+
break;
|
|
385
|
+
default:
|
|
386
|
+
schema = z.any();
|
|
387
|
+
}
|
|
388
|
+
schema = applyValidation(field, schema);
|
|
389
|
+
if (field.optional || field.required === false) {
|
|
390
|
+
schema = schema.optional();
|
|
391
|
+
}
|
|
392
|
+
return schema;
|
|
393
|
+
};
|
|
394
|
+
for (const field of fields) {
|
|
395
|
+
shape[field.name] = buildSchema(field);
|
|
396
|
+
}
|
|
397
|
+
return z.object(shape);
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
export { PluginBuilder, PluginHelpers };
|
|
402
|
+
//# sourceMappingURL=chunk-CLIH2T74.js.map
|
|
403
|
+
//# sourceMappingURL=chunk-CLIH2T74.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugins/sdk/plugin-builder.ts"],"names":[],"mappings":"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","file":"chunk-CLIH2T74.js","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"]}
|
|
@@ -1486,6 +1486,13 @@ SET schema = REPLACE(
|
|
|
1486
1486
|
)
|
|
1487
1487
|
WHERE id = 'news-collection' AND schema LIKE '%"slug":{"type":"string"%';
|
|
1488
1488
|
`
|
|
1489
|
+
},
|
|
1490
|
+
{
|
|
1491
|
+
id: "029",
|
|
1492
|
+
name: "Ai Search Plugin",
|
|
1493
|
+
filename: "029_ai_search_plugin.sql",
|
|
1494
|
+
description: "Migration 029: Ai Search Plugin",
|
|
1495
|
+
sql: "-- AI Search plugin settings\nCREATE TABLE IF NOT EXISTS ai_search_settings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n enabled BOOLEAN DEFAULT 0,\n ai_mode_enabled BOOLEAN DEFAULT 1,\n selected_collections TEXT, -- JSON array of collection IDs to index\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\n autocomplete_enabled BOOLEAN DEFAULT 1,\n cache_duration INTEGER DEFAULT 1, -- hours\n results_limit INTEGER DEFAULT 20,\n index_media BOOLEAN DEFAULT 0,\n index_status TEXT, -- JSON object with status per collection\n last_indexed_at INTEGER,\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- Search history/analytics\nCREATE TABLE IF NOT EXISTS ai_search_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query TEXT NOT NULL,\n mode TEXT, -- 'ai' or 'keyword'\n results_count INTEGER,\n user_id INTEGER,\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- Index metadata tracking (per collection)\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n collection_name TEXT NOT NULL, -- Cache collection name for display\n total_items INTEGER DEFAULT 0,\n indexed_items INTEGER DEFAULT 0,\n last_sync_at INTEGER,\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\n error_message TEXT,\n UNIQUE(collection_id)\n);\n\n-- Indexes for performance\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\n"
|
|
1489
1496
|
}
|
|
1490
1497
|
];
|
|
1491
1498
|
var migrationsByIdMap = new Map(
|
|
@@ -1894,5 +1901,5 @@ var MigrationService = class {
|
|
|
1894
1901
|
};
|
|
1895
1902
|
|
|
1896
1903
|
export { MigrationService };
|
|
1897
|
-
//# sourceMappingURL=chunk-
|
|
1898
|
-
//# sourceMappingURL=chunk-
|
|
1904
|
+
//# sourceMappingURL=chunk-EVZOVYLO.js.map
|
|
1905
|
+
//# sourceMappingURL=chunk-EVZOVYLO.js.map
|