@sonicjs-cms/core 2.19.0 → 3.0.0-beta.11
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/README.md +52 -52
- package/dist/admin-documents-form.template-DDSH6ROU.js +6 -0
- package/dist/{admin-layout-catalyst.template-UMTIN66R.js.map → admin-documents-form.template-DDSH6ROU.js.map} +1 -1
- package/dist/admin-documents-form.template-LSZKGA5J.cjs +19 -0
- package/dist/{admin-layout-catalyst.template-HFD37TY5.cjs.map → admin-documents-form.template-LSZKGA5J.cjs.map} +1 -1
- package/dist/{filter-bar.template-DlVYMk-T.d.cts → admin-layout-catalyst.template-DrwDUfsE.d.cts} +25 -1
- package/dist/{filter-bar.template-DlVYMk-T.d.ts → admin-layout-catalyst.template-DrwDUfsE.d.ts} +25 -1
- package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs +21 -0
- package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs.map +1 -0
- package/dist/admin-layout-catalyst.template-YQ4EMF2J.js +7 -0
- package/dist/admin-layout-catalyst.template-YQ4EMF2J.js.map +1 -0
- package/dist/app-Bo0X1OWX.d.ts +1268 -0
- package/dist/app-Do66yCcV.d.cts +1268 -0
- package/dist/cache-DDARE4QE.js +4 -0
- package/dist/cache-DDARE4QE.js.map +1 -0
- package/dist/cache-LVYS4BPL.cjs +33 -0
- package/dist/cache-LVYS4BPL.cjs.map +1 -0
- package/dist/chunk-2CB4KY7I.cjs +771 -0
- package/dist/chunk-2CB4KY7I.cjs.map +1 -0
- package/dist/{chunk-4NPCDK6B.js → chunk-3PU4WVU6.js} +557 -90
- package/dist/chunk-3PU4WVU6.js.map +1 -0
- package/dist/chunk-4BTBSXMR.cjs +912 -0
- package/dist/chunk-4BTBSXMR.cjs.map +1 -0
- package/dist/{chunk-55RDMDOP.js → chunk-5V62WT6M.js} +181 -57
- package/dist/chunk-5V62WT6M.js.map +1 -0
- package/dist/chunk-6H66MSSL.js +273 -0
- package/dist/chunk-6H66MSSL.js.map +1 -0
- package/dist/chunk-AI663NBO.js +821 -0
- package/dist/chunk-AI663NBO.js.map +1 -0
- package/dist/chunk-BLMTL57B.js +767 -0
- package/dist/chunk-BLMTL57B.js.map +1 -0
- package/dist/{chunk-4ZSNJDLS.cjs → chunk-CRGUD4KC.cjs} +9 -9
- package/dist/chunk-CRGUD4KC.cjs.map +1 -0
- package/dist/chunk-GCDZZNIN.js +192 -0
- package/dist/chunk-GCDZZNIN.js.map +1 -0
- package/dist/chunk-HIKBY7MS.cjs +70 -0
- package/dist/chunk-HIKBY7MS.cjs.map +1 -0
- package/dist/chunk-HPAJKZAQ.js +387 -0
- package/dist/chunk-HPAJKZAQ.js.map +1 -0
- package/dist/chunk-IESEVHXL.js +66 -0
- package/dist/chunk-IESEVHXL.js.map +1 -0
- package/dist/chunk-IVPRUGTY.js +242 -0
- package/dist/chunk-IVPRUGTY.js.map +1 -0
- package/dist/{chunk-JZVHLLSI.cjs → chunk-IXUHXTHW.cjs} +2 -151
- package/dist/chunk-IXUHXTHW.cjs.map +1 -0
- package/dist/chunk-J6JTWD2A.cjs +100 -0
- package/dist/chunk-J6JTWD2A.cjs.map +1 -0
- package/dist/chunk-JEQ7FLOD.cjs +199 -0
- package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
- package/dist/{chunk-ON5ZMSU4.js → chunk-JQISFW6U.js} +3 -3
- package/dist/chunk-JQISFW6U.js.map +1 -0
- package/dist/chunk-K25XHMM3.js +566 -0
- package/dist/chunk-K25XHMM3.js.map +1 -0
- package/dist/{chunk-R4FOLLFB.cjs → chunk-K342JMA3.cjs} +8730 -11520
- package/dist/chunk-K342JMA3.cjs.map +1 -0
- package/dist/{chunk-UYJ6TJHX.cjs → chunk-K623Q6WD.cjs} +181 -56
- package/dist/chunk-K623Q6WD.cjs.map +1 -0
- package/dist/chunk-KV3CM5RK.cjs +158 -0
- package/dist/chunk-KV3CM5RK.cjs.map +1 -0
- package/dist/{chunk-ABB34XUS.cjs → chunk-MKKGA3C4.cjs} +667 -19
- package/dist/chunk-MKKGA3C4.cjs.map +1 -0
- package/dist/chunk-N32OWET6.cjs +327 -0
- package/dist/chunk-N32OWET6.cjs.map +1 -0
- package/dist/chunk-NUKJ54GA.cjs +245 -0
- package/dist/chunk-NUKJ54GA.cjs.map +1 -0
- package/dist/{chunk-XWIA3HVX.js → chunk-OBA2RYZN.js} +6 -1249
- package/dist/chunk-OBA2RYZN.js.map +1 -0
- package/dist/chunk-ORF4CT74.cjs +276 -0
- package/dist/chunk-ORF4CT74.cjs.map +1 -0
- package/dist/{chunk-TFNTM3OA.js → chunk-PDYRDYXI.js} +645 -15
- package/dist/chunk-PDYRDYXI.js.map +1 -0
- package/dist/{chunk-OHYBNCVL.cjs → chunk-PXNTCCPE.cjs} +10 -1256
- package/dist/chunk-PXNTCCPE.cjs.map +1 -0
- package/dist/{chunk-E4YFJBM2.cjs → chunk-QJNKSFDJ.cjs} +876 -829
- package/dist/chunk-QJNKSFDJ.cjs.map +1 -0
- package/dist/chunk-QLFTG3QJ.js +1828 -0
- package/dist/chunk-QLFTG3QJ.js.map +1 -0
- package/dist/{chunk-BU7SFHGP.js → chunk-QZGABF2M.js} +3 -149
- package/dist/chunk-QZGABF2M.js.map +1 -0
- package/dist/chunk-RMRJGMDE.js +323 -0
- package/dist/chunk-RMRJGMDE.js.map +1 -0
- package/dist/chunk-RNZFGN4R.js +88 -0
- package/dist/chunk-RNZFGN4R.js.map +1 -0
- package/dist/chunk-RQ6N3FTV.js +900 -0
- package/dist/chunk-RQ6N3FTV.js.map +1 -0
- package/dist/{chunk-OCL3HMEG.js → chunk-SXLVXD2X.js} +7004 -9807
- package/dist/chunk-SXLVXD2X.js.map +1 -0
- package/dist/chunk-UHRHZXVR.cjs +408 -0
- package/dist/chunk-UHRHZXVR.cjs.map +1 -0
- package/dist/chunk-YA3TJ65D.cjs +575 -0
- package/dist/chunk-YA3TJ65D.cjs.map +1 -0
- package/dist/{chunk-7A4CB7T3.cjs → chunk-YJEBDJDV.cjs} +561 -91
- package/dist/chunk-YJEBDJDV.cjs.map +1 -0
- package/dist/chunk-YP7GW2G5.cjs +866 -0
- package/dist/chunk-YP7GW2G5.cjs.map +1 -0
- package/dist/chunk-ZUEIQFE5.js +154 -0
- package/dist/chunk-ZUEIQFE5.js.map +1 -0
- package/dist/{collection-config-B4PG-AaF.d.cts → collection-config-JgHOpFCG.d.cts} +30 -2
- package/dist/{collection-config-B4PG-AaF.d.ts → collection-config-JgHOpFCG.d.ts} +30 -2
- package/dist/config-HFXANXCC.js +6 -0
- package/dist/config-HFXANXCC.js.map +1 -0
- package/dist/config-ON6FNMYX.cjs +19 -0
- package/dist/config-ON6FNMYX.cjs.map +1 -0
- package/dist/define-plugin-BzNHc1ZI.d.ts +1321 -0
- package/dist/define-plugin-IWDKYaVm.d.cts +1321 -0
- package/dist/document-projection-TDWRJX3Z.cjs +13 -0
- package/dist/document-projection-TDWRJX3Z.cjs.map +1 -0
- package/dist/document-projection-YYMC6I4U.js +4 -0
- package/dist/document-projection-YYMC6I4U.js.map +1 -0
- package/dist/index.cjs +13739 -4328
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +331 -493
- package/dist/index.d.ts +331 -493
- package/dist/index.js +13456 -4067
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +38 -32
- package/dist/middleware.d.cts +50 -7
- package/dist/middleware.d.ts +50 -7
- package/dist/middleware.js +9 -3
- package/dist/migrations-XQLBY7E5.js +4 -0
- package/dist/{migrations-H5IXZNCO.js.map → migrations-XQLBY7E5.js.map} +1 -1
- package/dist/migrations-ZXJEUTFA.cjs +13 -0
- package/dist/{migrations-566IIPS2.cjs.map → migrations-ZXJEUTFA.cjs.map} +1 -1
- package/dist/{plugin-bootstrap-DfVerYV4.d.cts → plugin-bootstrap-B8ThJU21.d.cts} +4315 -1661
- package/dist/{plugin-bootstrap-P_ciLp_C.d.ts → plugin-bootstrap-qu8hJgUt.d.ts} +4315 -1661
- package/dist/plugins.cjs +171 -12
- package/dist/plugins.d.cts +36 -2
- package/dist/plugins.d.ts +36 -2
- package/dist/plugins.js +5 -2
- package/dist/rbac-O73MFKDA.js +5 -0
- package/dist/rbac-O73MFKDA.js.map +1 -0
- package/dist/rbac-VONLJJKB.cjs +14 -0
- package/dist/rbac-VONLJJKB.cjs.map +1 -0
- package/dist/routes.cjs +42 -46
- package/dist/routes.d.cts +56 -146
- package/dist/routes.d.ts +56 -146
- package/dist/routes.js +18 -10
- package/dist/services.cjs +43 -76
- package/dist/services.d.cts +93 -55
- package/dist/services.d.ts +93 -55
- package/dist/services.js +6 -3
- package/dist/{telemetry-B9vIV4wh.d.cts → telemetry-Cku1ax74.d.cts} +1 -1
- package/dist/{telemetry-B9vIV4wh.d.ts → telemetry-Cku1ax74.d.ts} +1 -1
- package/dist/templates.cjs +17 -29
- package/dist/templates.d.cts +2 -89
- package/dist/templates.d.ts +2 -89
- package/dist/templates.js +3 -3
- package/dist/types-Dea1eNxU.d.cts +286 -0
- package/dist/types-Dea1eNxU.d.ts +286 -0
- package/dist/types.d.cts +2 -2
- package/dist/types.d.ts +2 -2
- package/dist/utils.cjs +21 -20
- package/dist/utils.d.cts +2 -2
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +3 -2
- package/migrations/0001_core.sql +184 -0
- package/migrations/0002_documents.sql +163 -0
- package/package.json +12 -7
- package/dist/admin-layout-catalyst.template-HFD37TY5.cjs +0 -17
- package/dist/admin-layout-catalyst.template-UMTIN66R.js +0 -7
- package/dist/app-C9esKLmh.d.cts +0 -112
- package/dist/app-C9esKLmh.d.ts +0 -112
- package/dist/chunk-4NPCDK6B.js.map +0 -1
- package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
- package/dist/chunk-55RDMDOP.js.map +0 -1
- package/dist/chunk-635JAMSE.cjs +0 -653
- package/dist/chunk-635JAMSE.cjs.map +0 -1
- package/dist/chunk-7A4CB7T3.cjs.map +0 -1
- package/dist/chunk-ABB34XUS.cjs.map +0 -1
- package/dist/chunk-BU7SFHGP.js.map +0 -1
- package/dist/chunk-E4YFJBM2.cjs.map +0 -1
- package/dist/chunk-EXNEW5US.js +0 -648
- package/dist/chunk-EXNEW5US.js.map +0 -1
- package/dist/chunk-JZV22DEV.js +0 -1783
- package/dist/chunk-JZV22DEV.js.map +0 -1
- package/dist/chunk-JZVHLLSI.cjs.map +0 -1
- package/dist/chunk-OCL3HMEG.js.map +0 -1
- package/dist/chunk-OHYBNCVL.cjs.map +0 -1
- package/dist/chunk-ON5ZMSU4.js.map +0 -1
- package/dist/chunk-QFWHAFEO.js +0 -1843
- package/dist/chunk-QFWHAFEO.js.map +0 -1
- package/dist/chunk-R4FOLLFB.cjs.map +0 -1
- package/dist/chunk-RLMUFFUD.cjs +0 -2219
- package/dist/chunk-RLMUFFUD.cjs.map +0 -1
- package/dist/chunk-TFNTM3OA.js.map +0 -1
- package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
- package/dist/chunk-WAEQXGCX.cjs +0 -1898
- package/dist/chunk-WAEQXGCX.cjs.map +0 -1
- package/dist/chunk-XWIA3HVX.js.map +0 -1
- package/dist/chunk-ZYAYUIZE.js +0 -2217
- package/dist/chunk-ZYAYUIZE.js.map +0 -1
- package/dist/migrations-566IIPS2.cjs +0 -13
- package/dist/migrations-H5IXZNCO.js +0 -4
- package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
- package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
- package/migrations/001_initial_schema.sql +0 -170
- package/migrations/002_faq_plugin.sql +0 -86
- package/migrations/003_stage5_enhancements.sql +0 -121
- package/migrations/004_stage6_user_management.sql +0 -183
- package/migrations/005_stage7_workflow_automation.sql +0 -294
- package/migrations/006_plugin_system.sql +0 -155
- package/migrations/007_demo_login_plugin.sql +0 -23
- package/migrations/008_fix_slug_validation.sql +0 -22
- package/migrations/009_system_logging.sql +0 -57
- package/migrations/011_config_managed_collections.sql +0 -15
- package/migrations/012_testimonials_plugin.sql +0 -80
- package/migrations/013_code_examples_plugin.sql +0 -177
- package/migrations/014_fix_plugin_registry.sql +0 -88
- package/migrations/015_add_remaining_plugins.sql +0 -89
- package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
- package/migrations/017_auth_configurable_fields.sql +0 -49
- package/migrations/018_settings_table.sql +0 -23
- package/migrations/019_remove_blog_posts_collection.sql +0 -15
- package/migrations/020_add_email_plugin.sql +0 -22
- package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
- package/migrations/022_add_tinymce_plugin.sql +0 -25
- package/migrations/023_add_easy_mdx_plugin.sql +0 -25
- package/migrations/024_add_quill_editor_plugin.sql +0 -25
- package/migrations/025_add_easymde_plugin.sql +0 -25
- package/migrations/026_add_otp_login.sql +0 -42
- package/migrations/027_fix_slug_field_type.sql +0 -18
- package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
- package/migrations/029_add_forms_system.sql +0 -184
- package/migrations/030_add_turnstile_to_forms.sql +0 -14
- package/migrations/031_ai_search_plugin.sql +0 -45
- package/migrations/032_user_profiles.sql +0 -37
- package/migrations/033_form_content_integration.sql +0 -19
- package/migrations/034_security_audit_plugin.sql +0 -27
- package/migrations/035_user_profiles_data_column.sql +0 -16
- package/migrations/036_analytics_events.sql +0 -22
package/dist/chunk-EXNEW5US.js
DELETED
|
@@ -1,648 +0,0 @@
|
|
|
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
|
-
// src/plugins/core-plugins/turnstile-plugin/manifest.json
|
|
402
|
-
var manifest_default = {
|
|
403
|
-
id: "turnstile",
|
|
404
|
-
name: "Cloudflare Turnstile",
|
|
405
|
-
description: "CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.",
|
|
406
|
-
version: "1.0.0",
|
|
407
|
-
author: "SonicJS",
|
|
408
|
-
category: "security",
|
|
409
|
-
icon: "shield-check",
|
|
410
|
-
homepage: "https://developers.cloudflare.com/turnstile/",
|
|
411
|
-
repository: "https://github.com/sonicjs/sonicjs",
|
|
412
|
-
license: "MIT",
|
|
413
|
-
permissions: [
|
|
414
|
-
"settings:write",
|
|
415
|
-
"admin:access"
|
|
416
|
-
],
|
|
417
|
-
dependencies: [],
|
|
418
|
-
configSchema: {
|
|
419
|
-
siteKey: {
|
|
420
|
-
type: "string",
|
|
421
|
-
label: "Site Key",
|
|
422
|
-
description: "Your Cloudflare Turnstile site key (public)",
|
|
423
|
-
required: true
|
|
424
|
-
},
|
|
425
|
-
secretKey: {
|
|
426
|
-
type: "string",
|
|
427
|
-
label: "Secret Key",
|
|
428
|
-
description: "Your Cloudflare Turnstile secret key (private)",
|
|
429
|
-
required: true,
|
|
430
|
-
sensitive: true
|
|
431
|
-
},
|
|
432
|
-
theme: {
|
|
433
|
-
type: "select",
|
|
434
|
-
label: "Widget Theme",
|
|
435
|
-
description: "Visual theme for the Turnstile widget",
|
|
436
|
-
default: "auto",
|
|
437
|
-
options: [
|
|
438
|
-
{
|
|
439
|
-
value: "light",
|
|
440
|
-
label: "Light"
|
|
441
|
-
},
|
|
442
|
-
{
|
|
443
|
-
value: "dark",
|
|
444
|
-
label: "Dark"
|
|
445
|
-
},
|
|
446
|
-
{
|
|
447
|
-
value: "auto",
|
|
448
|
-
label: "Auto"
|
|
449
|
-
}
|
|
450
|
-
]
|
|
451
|
-
},
|
|
452
|
-
size: {
|
|
453
|
-
type: "select",
|
|
454
|
-
label: "Widget Size",
|
|
455
|
-
description: "Size of the Turnstile widget",
|
|
456
|
-
default: "normal",
|
|
457
|
-
options: [
|
|
458
|
-
{
|
|
459
|
-
value: "normal",
|
|
460
|
-
label: "Normal"
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
value: "compact",
|
|
464
|
-
label: "Compact"
|
|
465
|
-
}
|
|
466
|
-
]
|
|
467
|
-
},
|
|
468
|
-
mode: {
|
|
469
|
-
type: "select",
|
|
470
|
-
label: "Widget Mode",
|
|
471
|
-
description: "Managed: Adaptive challenge. Non-Interactive: Always visible, minimal friction. Invisible: No visible widget",
|
|
472
|
-
default: "managed",
|
|
473
|
-
options: [
|
|
474
|
-
{
|
|
475
|
-
value: "managed",
|
|
476
|
-
label: "Managed (Recommended)"
|
|
477
|
-
},
|
|
478
|
-
{
|
|
479
|
-
value: "non-interactive",
|
|
480
|
-
label: "Non-Interactive"
|
|
481
|
-
},
|
|
482
|
-
{
|
|
483
|
-
value: "invisible",
|
|
484
|
-
label: "Invisible"
|
|
485
|
-
}
|
|
486
|
-
]
|
|
487
|
-
},
|
|
488
|
-
appearance: {
|
|
489
|
-
type: "select",
|
|
490
|
-
label: "Appearance",
|
|
491
|
-
description: "When the Turnstile challenge is executed. Always: Verifies immediately. Execute: Challenge on form submit. Interaction Only: Only after user interaction",
|
|
492
|
-
default: "always",
|
|
493
|
-
options: [
|
|
494
|
-
{
|
|
495
|
-
value: "always",
|
|
496
|
-
label: "Always"
|
|
497
|
-
},
|
|
498
|
-
{
|
|
499
|
-
value: "execute",
|
|
500
|
-
label: "Execute"
|
|
501
|
-
},
|
|
502
|
-
{
|
|
503
|
-
value: "interaction-only",
|
|
504
|
-
label: "Interaction Only"
|
|
505
|
-
}
|
|
506
|
-
]
|
|
507
|
-
},
|
|
508
|
-
preClearance: {
|
|
509
|
-
type: "boolean",
|
|
510
|
-
label: "Enable Pre-clearance",
|
|
511
|
-
description: "Issue a clearance cookie that bypasses Cloudflare Firewall Rules (as if the user passed a challenge on your proxied site)",
|
|
512
|
-
default: false
|
|
513
|
-
},
|
|
514
|
-
preClearanceLevel: {
|
|
515
|
-
type: "select",
|
|
516
|
-
label: "Pre-clearance Level",
|
|
517
|
-
description: "Controls which Cloudflare Firewall Rules the clearance cookie bypasses. Only applies if Pre-clearance is enabled",
|
|
518
|
-
default: "managed",
|
|
519
|
-
options: [
|
|
520
|
-
{
|
|
521
|
-
value: "interactive",
|
|
522
|
-
label: "Interactive - Bypasses Interactive, Managed & JS Challenge Rules"
|
|
523
|
-
},
|
|
524
|
-
{
|
|
525
|
-
value: "managed",
|
|
526
|
-
label: "Managed - Bypasses Managed & JS Challenge Rules"
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
value: "non-interactive",
|
|
530
|
-
label: "Non-interactive - Bypasses JS Challenge Rules only"
|
|
531
|
-
}
|
|
532
|
-
]
|
|
533
|
-
},
|
|
534
|
-
enabled: {
|
|
535
|
-
type: "boolean",
|
|
536
|
-
label: "Enable Turnstile",
|
|
537
|
-
description: "Enable or disable Turnstile verification globally",
|
|
538
|
-
default: true
|
|
539
|
-
}
|
|
540
|
-
},
|
|
541
|
-
adminMenu: {
|
|
542
|
-
label: "Turnstile",
|
|
543
|
-
icon: "shield-check",
|
|
544
|
-
href: "/admin/plugins/turnstile/settings",
|
|
545
|
-
parentId: "plugins",
|
|
546
|
-
order: 100
|
|
547
|
-
},
|
|
548
|
-
codeName: "turnstile-plugin",
|
|
549
|
-
iconEmoji: "\u{1F6E1}\uFE0F",
|
|
550
|
-
is_core: true,
|
|
551
|
-
defaultSettings: {
|
|
552
|
-
siteKey: "",
|
|
553
|
-
secretKey: "",
|
|
554
|
-
theme: "auto",
|
|
555
|
-
size: "normal",
|
|
556
|
-
mode: "managed",
|
|
557
|
-
appearance: "always",
|
|
558
|
-
preClearanceEnabled: false,
|
|
559
|
-
preClearanceLevel: "managed",
|
|
560
|
-
enabled: false
|
|
561
|
-
}
|
|
562
|
-
};
|
|
563
|
-
|
|
564
|
-
// src/plugins/core-plugins/turnstile-plugin/services/turnstile.ts
|
|
565
|
-
var TurnstileService = class {
|
|
566
|
-
db;
|
|
567
|
-
VERIFY_URL = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
|
|
568
|
-
constructor(db) {
|
|
569
|
-
this.db = db;
|
|
570
|
-
}
|
|
571
|
-
/**
|
|
572
|
-
* Get Turnstile settings from database
|
|
573
|
-
*/
|
|
574
|
-
async getSettings() {
|
|
575
|
-
try {
|
|
576
|
-
const plugin = await this.db.prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`).bind(manifest_default.id).first();
|
|
577
|
-
if (!plugin || !plugin.settings) {
|
|
578
|
-
return null;
|
|
579
|
-
}
|
|
580
|
-
return JSON.parse(plugin.settings);
|
|
581
|
-
} catch (error) {
|
|
582
|
-
console.error("Error getting Turnstile settings:", error);
|
|
583
|
-
return null;
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
/**
|
|
587
|
-
* Verify a Turnstile token with Cloudflare
|
|
588
|
-
*/
|
|
589
|
-
async verifyToken(token, remoteIp) {
|
|
590
|
-
try {
|
|
591
|
-
const settings = await this.getSettings();
|
|
592
|
-
if (!settings) {
|
|
593
|
-
return { success: false, error: "Turnstile not configured" };
|
|
594
|
-
}
|
|
595
|
-
if (!settings.enabled) {
|
|
596
|
-
return { success: true };
|
|
597
|
-
}
|
|
598
|
-
if (!settings.secretKey) {
|
|
599
|
-
return { success: false, error: "Turnstile secret key not configured" };
|
|
600
|
-
}
|
|
601
|
-
const formData = new FormData();
|
|
602
|
-
formData.append("secret", settings.secretKey);
|
|
603
|
-
formData.append("response", token);
|
|
604
|
-
if (remoteIp) {
|
|
605
|
-
formData.append("remoteip", remoteIp);
|
|
606
|
-
}
|
|
607
|
-
const response = await fetch(this.VERIFY_URL, {
|
|
608
|
-
method: "POST",
|
|
609
|
-
body: formData
|
|
610
|
-
});
|
|
611
|
-
if (!response.ok) {
|
|
612
|
-
return { success: false, error: "Turnstile verification request failed" };
|
|
613
|
-
}
|
|
614
|
-
const result = await response.json();
|
|
615
|
-
if (!result.success) {
|
|
616
|
-
const errorCode = result["error-codes"]?.[0] || "unknown-error";
|
|
617
|
-
return { success: false, error: `Turnstile verification failed: ${errorCode}` };
|
|
618
|
-
}
|
|
619
|
-
return { success: true };
|
|
620
|
-
} catch (error) {
|
|
621
|
-
console.error("Error verifying Turnstile token:", error);
|
|
622
|
-
return { success: false, error: "Turnstile verification error" };
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
/**
|
|
626
|
-
* Save Turnstile settings to database
|
|
627
|
-
*/
|
|
628
|
-
async saveSettings(settings) {
|
|
629
|
-
try {
|
|
630
|
-
await this.db.prepare(`UPDATE plugins SET settings = ?, updated_at = ? WHERE id = ?`).bind(JSON.stringify(settings), Date.now(), manifest_default.id).run();
|
|
631
|
-
console.log("Turnstile settings saved successfully");
|
|
632
|
-
} catch (error) {
|
|
633
|
-
console.error("Error saving Turnstile settings:", error);
|
|
634
|
-
throw new Error("Failed to save Turnstile settings");
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
/**
|
|
638
|
-
* Check if Turnstile is enabled
|
|
639
|
-
*/
|
|
640
|
-
async isEnabled() {
|
|
641
|
-
const settings = await this.getSettings();
|
|
642
|
-
return settings?.enabled === true && !!settings.siteKey && !!settings.secretKey;
|
|
643
|
-
}
|
|
644
|
-
};
|
|
645
|
-
|
|
646
|
-
export { PluginBuilder, PluginHelpers, TurnstileService, manifest_default };
|
|
647
|
-
//# sourceMappingURL=chunk-EXNEW5US.js.map
|
|
648
|
-
//# sourceMappingURL=chunk-EXNEW5US.js.map
|