@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.
Files changed (230) hide show
  1. package/README.md +52 -52
  2. package/dist/admin-documents-form.template-DDSH6ROU.js +6 -0
  3. package/dist/{admin-layout-catalyst.template-UMTIN66R.js.map → admin-documents-form.template-DDSH6ROU.js.map} +1 -1
  4. package/dist/admin-documents-form.template-LSZKGA5J.cjs +19 -0
  5. package/dist/{admin-layout-catalyst.template-HFD37TY5.cjs.map → admin-documents-form.template-LSZKGA5J.cjs.map} +1 -1
  6. package/dist/{filter-bar.template-DlVYMk-T.d.cts → admin-layout-catalyst.template-DrwDUfsE.d.cts} +25 -1
  7. package/dist/{filter-bar.template-DlVYMk-T.d.ts → admin-layout-catalyst.template-DrwDUfsE.d.ts} +25 -1
  8. package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs +21 -0
  9. package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs.map +1 -0
  10. package/dist/admin-layout-catalyst.template-YQ4EMF2J.js +7 -0
  11. package/dist/admin-layout-catalyst.template-YQ4EMF2J.js.map +1 -0
  12. package/dist/app-Bo0X1OWX.d.ts +1268 -0
  13. package/dist/app-Do66yCcV.d.cts +1268 -0
  14. package/dist/cache-DDARE4QE.js +4 -0
  15. package/dist/cache-DDARE4QE.js.map +1 -0
  16. package/dist/cache-LVYS4BPL.cjs +33 -0
  17. package/dist/cache-LVYS4BPL.cjs.map +1 -0
  18. package/dist/chunk-2CB4KY7I.cjs +771 -0
  19. package/dist/chunk-2CB4KY7I.cjs.map +1 -0
  20. package/dist/{chunk-4NPCDK6B.js → chunk-3PU4WVU6.js} +557 -90
  21. package/dist/chunk-3PU4WVU6.js.map +1 -0
  22. package/dist/chunk-4BTBSXMR.cjs +912 -0
  23. package/dist/chunk-4BTBSXMR.cjs.map +1 -0
  24. package/dist/{chunk-55RDMDOP.js → chunk-5V62WT6M.js} +181 -57
  25. package/dist/chunk-5V62WT6M.js.map +1 -0
  26. package/dist/chunk-6H66MSSL.js +273 -0
  27. package/dist/chunk-6H66MSSL.js.map +1 -0
  28. package/dist/chunk-AI663NBO.js +821 -0
  29. package/dist/chunk-AI663NBO.js.map +1 -0
  30. package/dist/chunk-BLMTL57B.js +767 -0
  31. package/dist/chunk-BLMTL57B.js.map +1 -0
  32. package/dist/{chunk-4ZSNJDLS.cjs → chunk-CRGUD4KC.cjs} +9 -9
  33. package/dist/chunk-CRGUD4KC.cjs.map +1 -0
  34. package/dist/chunk-GCDZZNIN.js +192 -0
  35. package/dist/chunk-GCDZZNIN.js.map +1 -0
  36. package/dist/chunk-HIKBY7MS.cjs +70 -0
  37. package/dist/chunk-HIKBY7MS.cjs.map +1 -0
  38. package/dist/chunk-HPAJKZAQ.js +387 -0
  39. package/dist/chunk-HPAJKZAQ.js.map +1 -0
  40. package/dist/chunk-IESEVHXL.js +66 -0
  41. package/dist/chunk-IESEVHXL.js.map +1 -0
  42. package/dist/chunk-IVPRUGTY.js +242 -0
  43. package/dist/chunk-IVPRUGTY.js.map +1 -0
  44. package/dist/{chunk-JZVHLLSI.cjs → chunk-IXUHXTHW.cjs} +2 -151
  45. package/dist/chunk-IXUHXTHW.cjs.map +1 -0
  46. package/dist/chunk-J6JTWD2A.cjs +100 -0
  47. package/dist/chunk-J6JTWD2A.cjs.map +1 -0
  48. package/dist/chunk-JEQ7FLOD.cjs +199 -0
  49. package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
  50. package/dist/{chunk-ON5ZMSU4.js → chunk-JQISFW6U.js} +3 -3
  51. package/dist/chunk-JQISFW6U.js.map +1 -0
  52. package/dist/chunk-K25XHMM3.js +566 -0
  53. package/dist/chunk-K25XHMM3.js.map +1 -0
  54. package/dist/{chunk-R4FOLLFB.cjs → chunk-K342JMA3.cjs} +8730 -11520
  55. package/dist/chunk-K342JMA3.cjs.map +1 -0
  56. package/dist/{chunk-UYJ6TJHX.cjs → chunk-K623Q6WD.cjs} +181 -56
  57. package/dist/chunk-K623Q6WD.cjs.map +1 -0
  58. package/dist/chunk-KV3CM5RK.cjs +158 -0
  59. package/dist/chunk-KV3CM5RK.cjs.map +1 -0
  60. package/dist/{chunk-ABB34XUS.cjs → chunk-MKKGA3C4.cjs} +667 -19
  61. package/dist/chunk-MKKGA3C4.cjs.map +1 -0
  62. package/dist/chunk-N32OWET6.cjs +327 -0
  63. package/dist/chunk-N32OWET6.cjs.map +1 -0
  64. package/dist/chunk-NUKJ54GA.cjs +245 -0
  65. package/dist/chunk-NUKJ54GA.cjs.map +1 -0
  66. package/dist/{chunk-XWIA3HVX.js → chunk-OBA2RYZN.js} +6 -1249
  67. package/dist/chunk-OBA2RYZN.js.map +1 -0
  68. package/dist/chunk-ORF4CT74.cjs +276 -0
  69. package/dist/chunk-ORF4CT74.cjs.map +1 -0
  70. package/dist/{chunk-TFNTM3OA.js → chunk-PDYRDYXI.js} +645 -15
  71. package/dist/chunk-PDYRDYXI.js.map +1 -0
  72. package/dist/{chunk-OHYBNCVL.cjs → chunk-PXNTCCPE.cjs} +10 -1256
  73. package/dist/chunk-PXNTCCPE.cjs.map +1 -0
  74. package/dist/{chunk-E4YFJBM2.cjs → chunk-QJNKSFDJ.cjs} +876 -829
  75. package/dist/chunk-QJNKSFDJ.cjs.map +1 -0
  76. package/dist/chunk-QLFTG3QJ.js +1828 -0
  77. package/dist/chunk-QLFTG3QJ.js.map +1 -0
  78. package/dist/{chunk-BU7SFHGP.js → chunk-QZGABF2M.js} +3 -149
  79. package/dist/chunk-QZGABF2M.js.map +1 -0
  80. package/dist/chunk-RMRJGMDE.js +323 -0
  81. package/dist/chunk-RMRJGMDE.js.map +1 -0
  82. package/dist/chunk-RNZFGN4R.js +88 -0
  83. package/dist/chunk-RNZFGN4R.js.map +1 -0
  84. package/dist/chunk-RQ6N3FTV.js +900 -0
  85. package/dist/chunk-RQ6N3FTV.js.map +1 -0
  86. package/dist/{chunk-OCL3HMEG.js → chunk-SXLVXD2X.js} +7004 -9807
  87. package/dist/chunk-SXLVXD2X.js.map +1 -0
  88. package/dist/chunk-UHRHZXVR.cjs +408 -0
  89. package/dist/chunk-UHRHZXVR.cjs.map +1 -0
  90. package/dist/chunk-YA3TJ65D.cjs +575 -0
  91. package/dist/chunk-YA3TJ65D.cjs.map +1 -0
  92. package/dist/{chunk-7A4CB7T3.cjs → chunk-YJEBDJDV.cjs} +561 -91
  93. package/dist/chunk-YJEBDJDV.cjs.map +1 -0
  94. package/dist/chunk-YP7GW2G5.cjs +866 -0
  95. package/dist/chunk-YP7GW2G5.cjs.map +1 -0
  96. package/dist/chunk-ZUEIQFE5.js +154 -0
  97. package/dist/chunk-ZUEIQFE5.js.map +1 -0
  98. package/dist/{collection-config-B4PG-AaF.d.cts → collection-config-JgHOpFCG.d.cts} +30 -2
  99. package/dist/{collection-config-B4PG-AaF.d.ts → collection-config-JgHOpFCG.d.ts} +30 -2
  100. package/dist/config-HFXANXCC.js +6 -0
  101. package/dist/config-HFXANXCC.js.map +1 -0
  102. package/dist/config-ON6FNMYX.cjs +19 -0
  103. package/dist/config-ON6FNMYX.cjs.map +1 -0
  104. package/dist/define-plugin-BzNHc1ZI.d.ts +1321 -0
  105. package/dist/define-plugin-IWDKYaVm.d.cts +1321 -0
  106. package/dist/document-projection-TDWRJX3Z.cjs +13 -0
  107. package/dist/document-projection-TDWRJX3Z.cjs.map +1 -0
  108. package/dist/document-projection-YYMC6I4U.js +4 -0
  109. package/dist/document-projection-YYMC6I4U.js.map +1 -0
  110. package/dist/index.cjs +13739 -4328
  111. package/dist/index.cjs.map +1 -1
  112. package/dist/index.d.cts +331 -493
  113. package/dist/index.d.ts +331 -493
  114. package/dist/index.js +13456 -4067
  115. package/dist/index.js.map +1 -1
  116. package/dist/middleware.cjs +38 -32
  117. package/dist/middleware.d.cts +50 -7
  118. package/dist/middleware.d.ts +50 -7
  119. package/dist/middleware.js +9 -3
  120. package/dist/migrations-XQLBY7E5.js +4 -0
  121. package/dist/{migrations-H5IXZNCO.js.map → migrations-XQLBY7E5.js.map} +1 -1
  122. package/dist/migrations-ZXJEUTFA.cjs +13 -0
  123. package/dist/{migrations-566IIPS2.cjs.map → migrations-ZXJEUTFA.cjs.map} +1 -1
  124. package/dist/{plugin-bootstrap-DfVerYV4.d.cts → plugin-bootstrap-B8ThJU21.d.cts} +4315 -1661
  125. package/dist/{plugin-bootstrap-P_ciLp_C.d.ts → plugin-bootstrap-qu8hJgUt.d.ts} +4315 -1661
  126. package/dist/plugins.cjs +171 -12
  127. package/dist/plugins.d.cts +36 -2
  128. package/dist/plugins.d.ts +36 -2
  129. package/dist/plugins.js +5 -2
  130. package/dist/rbac-O73MFKDA.js +5 -0
  131. package/dist/rbac-O73MFKDA.js.map +1 -0
  132. package/dist/rbac-VONLJJKB.cjs +14 -0
  133. package/dist/rbac-VONLJJKB.cjs.map +1 -0
  134. package/dist/routes.cjs +42 -46
  135. package/dist/routes.d.cts +56 -146
  136. package/dist/routes.d.ts +56 -146
  137. package/dist/routes.js +18 -10
  138. package/dist/services.cjs +43 -76
  139. package/dist/services.d.cts +93 -55
  140. package/dist/services.d.ts +93 -55
  141. package/dist/services.js +6 -3
  142. package/dist/{telemetry-B9vIV4wh.d.cts → telemetry-Cku1ax74.d.cts} +1 -1
  143. package/dist/{telemetry-B9vIV4wh.d.ts → telemetry-Cku1ax74.d.ts} +1 -1
  144. package/dist/templates.cjs +17 -29
  145. package/dist/templates.d.cts +2 -89
  146. package/dist/templates.d.ts +2 -89
  147. package/dist/templates.js +3 -3
  148. package/dist/types-Dea1eNxU.d.cts +286 -0
  149. package/dist/types-Dea1eNxU.d.ts +286 -0
  150. package/dist/types.d.cts +2 -2
  151. package/dist/types.d.ts +2 -2
  152. package/dist/utils.cjs +21 -20
  153. package/dist/utils.d.cts +2 -2
  154. package/dist/utils.d.ts +2 -2
  155. package/dist/utils.js +3 -2
  156. package/migrations/0001_core.sql +184 -0
  157. package/migrations/0002_documents.sql +163 -0
  158. package/package.json +12 -7
  159. package/dist/admin-layout-catalyst.template-HFD37TY5.cjs +0 -17
  160. package/dist/admin-layout-catalyst.template-UMTIN66R.js +0 -7
  161. package/dist/app-C9esKLmh.d.cts +0 -112
  162. package/dist/app-C9esKLmh.d.ts +0 -112
  163. package/dist/chunk-4NPCDK6B.js.map +0 -1
  164. package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
  165. package/dist/chunk-55RDMDOP.js.map +0 -1
  166. package/dist/chunk-635JAMSE.cjs +0 -653
  167. package/dist/chunk-635JAMSE.cjs.map +0 -1
  168. package/dist/chunk-7A4CB7T3.cjs.map +0 -1
  169. package/dist/chunk-ABB34XUS.cjs.map +0 -1
  170. package/dist/chunk-BU7SFHGP.js.map +0 -1
  171. package/dist/chunk-E4YFJBM2.cjs.map +0 -1
  172. package/dist/chunk-EXNEW5US.js +0 -648
  173. package/dist/chunk-EXNEW5US.js.map +0 -1
  174. package/dist/chunk-JZV22DEV.js +0 -1783
  175. package/dist/chunk-JZV22DEV.js.map +0 -1
  176. package/dist/chunk-JZVHLLSI.cjs.map +0 -1
  177. package/dist/chunk-OCL3HMEG.js.map +0 -1
  178. package/dist/chunk-OHYBNCVL.cjs.map +0 -1
  179. package/dist/chunk-ON5ZMSU4.js.map +0 -1
  180. package/dist/chunk-QFWHAFEO.js +0 -1843
  181. package/dist/chunk-QFWHAFEO.js.map +0 -1
  182. package/dist/chunk-R4FOLLFB.cjs.map +0 -1
  183. package/dist/chunk-RLMUFFUD.cjs +0 -2219
  184. package/dist/chunk-RLMUFFUD.cjs.map +0 -1
  185. package/dist/chunk-TFNTM3OA.js.map +0 -1
  186. package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
  187. package/dist/chunk-WAEQXGCX.cjs +0 -1898
  188. package/dist/chunk-WAEQXGCX.cjs.map +0 -1
  189. package/dist/chunk-XWIA3HVX.js.map +0 -1
  190. package/dist/chunk-ZYAYUIZE.js +0 -2217
  191. package/dist/chunk-ZYAYUIZE.js.map +0 -1
  192. package/dist/migrations-566IIPS2.cjs +0 -13
  193. package/dist/migrations-H5IXZNCO.js +0 -4
  194. package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
  195. package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
  196. package/migrations/001_initial_schema.sql +0 -170
  197. package/migrations/002_faq_plugin.sql +0 -86
  198. package/migrations/003_stage5_enhancements.sql +0 -121
  199. package/migrations/004_stage6_user_management.sql +0 -183
  200. package/migrations/005_stage7_workflow_automation.sql +0 -294
  201. package/migrations/006_plugin_system.sql +0 -155
  202. package/migrations/007_demo_login_plugin.sql +0 -23
  203. package/migrations/008_fix_slug_validation.sql +0 -22
  204. package/migrations/009_system_logging.sql +0 -57
  205. package/migrations/011_config_managed_collections.sql +0 -15
  206. package/migrations/012_testimonials_plugin.sql +0 -80
  207. package/migrations/013_code_examples_plugin.sql +0 -177
  208. package/migrations/014_fix_plugin_registry.sql +0 -88
  209. package/migrations/015_add_remaining_plugins.sql +0 -89
  210. package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
  211. package/migrations/017_auth_configurable_fields.sql +0 -49
  212. package/migrations/018_settings_table.sql +0 -23
  213. package/migrations/019_remove_blog_posts_collection.sql +0 -15
  214. package/migrations/020_add_email_plugin.sql +0 -22
  215. package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
  216. package/migrations/022_add_tinymce_plugin.sql +0 -25
  217. package/migrations/023_add_easy_mdx_plugin.sql +0 -25
  218. package/migrations/024_add_quill_editor_plugin.sql +0 -25
  219. package/migrations/025_add_easymde_plugin.sql +0 -25
  220. package/migrations/026_add_otp_login.sql +0 -42
  221. package/migrations/027_fix_slug_field_type.sql +0 -18
  222. package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
  223. package/migrations/029_add_forms_system.sql +0 -184
  224. package/migrations/030_add_turnstile_to_forms.sql +0 -14
  225. package/migrations/031_ai_search_plugin.sql +0 -45
  226. package/migrations/032_user_profiles.sql +0 -37
  227. package/migrations/033_form_content_integration.sql +0 -19
  228. package/migrations/034_security_audit_plugin.sql +0 -27
  229. package/migrations/035_user_profiles_data_column.sql +0 -16
  230. package/migrations/036_analytics_events.sql +0 -22
@@ -1,653 +0,0 @@
1
- 'use strict';
2
-
3
- var hono = require('hono');
4
- var zod = require('zod');
5
-
6
- // src/plugins/sdk/plugin-builder.ts
7
- var PluginBuilder = class _PluginBuilder {
8
- plugin;
9
- constructor(options) {
10
- this.plugin = {
11
- name: options.name,
12
- version: options.version,
13
- description: options.description,
14
- author: options.author,
15
- dependencies: options.dependencies,
16
- routes: [],
17
- middleware: [],
18
- models: [],
19
- services: [],
20
- adminPages: [],
21
- adminComponents: [],
22
- menuItems: [],
23
- hooks: []
24
- };
25
- }
26
- /**
27
- * Create a new plugin builder
28
- */
29
- static create(options) {
30
- return new _PluginBuilder(options);
31
- }
32
- /**
33
- * Add metadata to the plugin
34
- */
35
- metadata(metadata) {
36
- Object.assign(this.plugin, metadata);
37
- return this;
38
- }
39
- /**
40
- * Add routes to plugin
41
- */
42
- addRoutes(routes) {
43
- this.plugin.routes = [...this.plugin.routes || [], ...routes];
44
- return this;
45
- }
46
- /**
47
- * Add a single route to plugin
48
- */
49
- addRoute(path, handler, options) {
50
- const route = {
51
- path,
52
- handler,
53
- ...options
54
- };
55
- this.plugin.routes = [...this.plugin.routes || [], route];
56
- return this;
57
- }
58
- /**
59
- * Add middleware to plugin
60
- */
61
- addMiddleware(middleware) {
62
- this.plugin.middleware = [...this.plugin.middleware || [], ...middleware];
63
- return this;
64
- }
65
- /**
66
- * Add a single middleware to plugin
67
- */
68
- addSingleMiddleware(name, handler, options) {
69
- const middleware = {
70
- name,
71
- handler,
72
- ...options
73
- };
74
- this.plugin.middleware = [...this.plugin.middleware || [], middleware];
75
- return this;
76
- }
77
- /**
78
- * Add models to plugin
79
- */
80
- addModels(models) {
81
- this.plugin.models = [...this.plugin.models || [], ...models];
82
- return this;
83
- }
84
- /**
85
- * Add a single model to plugin
86
- */
87
- addModel(name, options) {
88
- const model = {
89
- name,
90
- ...options
91
- };
92
- this.plugin.models = [...this.plugin.models || [], model];
93
- return this;
94
- }
95
- /**
96
- * Add services to plugin
97
- */
98
- addServices(services) {
99
- this.plugin.services = [...this.plugin.services || [], ...services];
100
- return this;
101
- }
102
- /**
103
- * Add a single service to plugin
104
- */
105
- addService(name, implementation, options) {
106
- const service = {
107
- name,
108
- implementation,
109
- ...options
110
- };
111
- this.plugin.services = [...this.plugin.services || [], service];
112
- return this;
113
- }
114
- /**
115
- * Add admin pages to plugin
116
- */
117
- addAdminPages(pages) {
118
- this.plugin.adminPages = [...this.plugin.adminPages || [], ...pages];
119
- return this;
120
- }
121
- /**
122
- * Add a single admin page to plugin
123
- */
124
- addAdminPage(path, title, component, options) {
125
- const page = {
126
- path,
127
- title,
128
- component,
129
- ...options
130
- };
131
- this.plugin.adminPages = [...this.plugin.adminPages || [], page];
132
- return this;
133
- }
134
- /**
135
- * Add admin components to plugin
136
- */
137
- addComponents(components) {
138
- this.plugin.adminComponents = [...this.plugin.adminComponents || [], ...components];
139
- return this;
140
- }
141
- /**
142
- * Add a single admin component to plugin
143
- */
144
- addComponent(name, template, options) {
145
- const component = {
146
- name,
147
- template,
148
- ...options
149
- };
150
- this.plugin.adminComponents = [...this.plugin.adminComponents || [], component];
151
- return this;
152
- }
153
- /**
154
- * Add menu items to plugin
155
- */
156
- addMenuItems(items) {
157
- this.plugin.menuItems = [...this.plugin.menuItems || [], ...items];
158
- return this;
159
- }
160
- /**
161
- * Add a single menu item to plugin
162
- */
163
- addMenuItem(label, path, options) {
164
- const menuItem = {
165
- label,
166
- path,
167
- ...options
168
- };
169
- this.plugin.menuItems = [...this.plugin.menuItems || [], menuItem];
170
- return this;
171
- }
172
- /**
173
- * Add hooks to plugin
174
- */
175
- addHooks(hooks) {
176
- this.plugin.hooks = [...this.plugin.hooks || [], ...hooks];
177
- return this;
178
- }
179
- /**
180
- * Add a single hook to plugin
181
- */
182
- addHook(name, handler, options) {
183
- const hook = {
184
- name,
185
- handler,
186
- ...options
187
- };
188
- this.plugin.hooks = [...this.plugin.hooks || [], hook];
189
- return this;
190
- }
191
- /**
192
- * Add lifecycle hooks
193
- */
194
- lifecycle(hooks) {
195
- Object.assign(this.plugin, hooks);
196
- return this;
197
- }
198
- /**
199
- * Build the plugin
200
- */
201
- build() {
202
- if (!this.plugin.name || !this.plugin.version) {
203
- throw new Error("Plugin name and version are required");
204
- }
205
- return this.plugin;
206
- }
207
- };
208
- var PluginHelpers = class {
209
- /**
210
- * Create a REST API route for a model.
211
- *
212
- * @experimental This method returns placeholder routes. Full implementation coming soon.
213
- */
214
- static createModelAPI(modelName, options) {
215
- const app = new hono.Hono();
216
- options?.basePath || `/${modelName.toLowerCase()}`;
217
- app.get("/", async (c) => {
218
- return c.json({ message: `List ${modelName} items` });
219
- });
220
- app.get("/:id", async (c) => {
221
- const id = c.req.param("id");
222
- return c.json({ message: `Get ${modelName} with ID: ${id}` });
223
- });
224
- app.post("/", async (c) => {
225
- return c.json({ message: `Create new ${modelName}` });
226
- });
227
- app.put("/:id", async (c) => {
228
- const id = c.req.param("id");
229
- return c.json({ message: `Update ${modelName} with ID: ${id}` });
230
- });
231
- app.delete("/:id", async (c) => {
232
- const id = c.req.param("id");
233
- return c.json({ message: `Delete ${modelName} with ID: ${id}` });
234
- });
235
- return app;
236
- }
237
- /**
238
- * Create an admin CRUD interface for a model.
239
- *
240
- * @experimental This method generates basic admin page structures. Full implementation coming soon.
241
- */
242
- static createAdminInterface(modelName, options) {
243
- const basePath = `/admin/${modelName.toLowerCase()}`;
244
- const displayName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
245
- const pages = [
246
- {
247
- path: basePath,
248
- title: `${displayName} List`,
249
- component: `${modelName}List`,
250
- permissions: options?.permissions,
251
- icon: options?.icon
252
- },
253
- {
254
- path: `${basePath}/new`,
255
- title: `New ${displayName}`,
256
- component: `${modelName}Form`,
257
- permissions: options?.permissions
258
- },
259
- {
260
- path: `${basePath}/:id`,
261
- title: `Edit ${displayName}`,
262
- component: `${modelName}Form`,
263
- permissions: options?.permissions
264
- }
265
- ];
266
- const menuItems = [
267
- {
268
- label: displayName,
269
- path: basePath,
270
- icon: options?.icon,
271
- permissions: options?.permissions
272
- }
273
- ];
274
- return { pages, menuItems };
275
- }
276
- /**
277
- * Create a database migration for a model
278
- */
279
- static createMigration(tableName, fields) {
280
- const columns = fields.map((field) => {
281
- let definition = `${field.name} ${field.type}`;
282
- if (field.primaryKey) definition += " PRIMARY KEY";
283
- if (field.unique) definition += " UNIQUE";
284
- if (!field.nullable && !field.primaryKey) definition += " NOT NULL";
285
- if (field.defaultValue) definition += ` DEFAULT ${field.defaultValue}`;
286
- return definition;
287
- }).join(",\n ");
288
- return `
289
- CREATE TABLE IF NOT EXISTS ${tableName} (
290
- ${columns},
291
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
292
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
293
- );
294
-
295
- CREATE TRIGGER IF NOT EXISTS ${tableName}_updated_at
296
- AFTER UPDATE ON ${tableName}
297
- BEGIN
298
- UPDATE ${tableName} SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;
299
- END;
300
- `.trim();
301
- }
302
- /**
303
- * Create a Zod schema for a model
304
- */
305
- static createSchema(fields) {
306
- const shape = {};
307
- const applyValidation = (field, schema) => {
308
- if (field.validation) {
309
- if (field.type === "string" && field.validation.min) {
310
- schema = schema.min(field.validation.min);
311
- }
312
- if (field.type === "string" && field.validation.max) {
313
- schema = schema.max(field.validation.max);
314
- }
315
- if (field.type === "string" && field.validation.email) {
316
- schema = schema.email();
317
- }
318
- if (field.type === "string" && field.validation.url) {
319
- schema = schema.url();
320
- }
321
- }
322
- return schema;
323
- };
324
- const buildSchema = (field) => {
325
- let schema;
326
- switch (field.type) {
327
- case "string":
328
- schema = zod.z.string();
329
- break;
330
- case "number":
331
- schema = zod.z.number();
332
- break;
333
- case "boolean":
334
- schema = zod.z.boolean();
335
- break;
336
- case "date":
337
- schema = zod.z.date();
338
- break;
339
- case "array":
340
- if (field.items?.blocks && typeof field.items.blocks === "object") {
341
- const discriminator = typeof field.items.discriminator === "string" && field.items.discriminator ? field.items.discriminator : "blockType";
342
- const blockSchemas = Object.entries(field.items.blocks).map(([blockName, blockDef]) => {
343
- const properties = blockDef?.properties && typeof blockDef.properties === "object" ? blockDef.properties : {};
344
- const blockShape = {
345
- [discriminator]: zod.z.literal(blockName)
346
- };
347
- Object.entries(properties).forEach(([propertyName, propertyConfigRaw]) => {
348
- const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === "object" ? propertyConfigRaw : {};
349
- const propertySchema = buildSchema({
350
- ...propertyConfig,
351
- optional: propertyConfig.required === false
352
- });
353
- blockShape[propertyName] = propertySchema;
354
- });
355
- return zod.z.object(blockShape);
356
- });
357
- if (blockSchemas.length === 1 && blockSchemas[0]) {
358
- schema = zod.z.array(blockSchemas[0]);
359
- } else if (blockSchemas.length > 1) {
360
- schema = zod.z.array(zod.z.union(blockSchemas));
361
- } else {
362
- schema = zod.z.array(zod.z.any());
363
- }
364
- break;
365
- }
366
- if (field.items) {
367
- schema = zod.z.array(buildSchema(field.items));
368
- break;
369
- }
370
- schema = zod.z.array(zod.z.any());
371
- break;
372
- case "object":
373
- if (field.properties && typeof field.properties === "object") {
374
- const objectShape = {};
375
- Object.entries(field.properties).forEach(([propertyName, propertyConfigRaw]) => {
376
- const propertyConfig = propertyConfigRaw && typeof propertyConfigRaw === "object" ? propertyConfigRaw : {};
377
- objectShape[propertyName] = buildSchema({
378
- ...propertyConfig,
379
- optional: propertyConfig.required === false
380
- });
381
- });
382
- schema = zod.z.object(objectShape);
383
- break;
384
- }
385
- schema = zod.z.object({});
386
- break;
387
- default:
388
- schema = zod.z.any();
389
- }
390
- schema = applyValidation(field, schema);
391
- if (field.optional || field.required === false) {
392
- schema = schema.optional();
393
- }
394
- return schema;
395
- };
396
- for (const field of fields) {
397
- shape[field.name] = buildSchema(field);
398
- }
399
- return zod.z.object(shape);
400
- }
401
- };
402
-
403
- // src/plugins/core-plugins/turnstile-plugin/manifest.json
404
- var manifest_default = {
405
- id: "turnstile",
406
- name: "Cloudflare Turnstile",
407
- description: "CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.",
408
- version: "1.0.0",
409
- author: "SonicJS",
410
- category: "security",
411
- icon: "shield-check",
412
- homepage: "https://developers.cloudflare.com/turnstile/",
413
- repository: "https://github.com/sonicjs/sonicjs",
414
- license: "MIT",
415
- permissions: [
416
- "settings:write",
417
- "admin:access"
418
- ],
419
- dependencies: [],
420
- configSchema: {
421
- siteKey: {
422
- type: "string",
423
- label: "Site Key",
424
- description: "Your Cloudflare Turnstile site key (public)",
425
- required: true
426
- },
427
- secretKey: {
428
- type: "string",
429
- label: "Secret Key",
430
- description: "Your Cloudflare Turnstile secret key (private)",
431
- required: true,
432
- sensitive: true
433
- },
434
- theme: {
435
- type: "select",
436
- label: "Widget Theme",
437
- description: "Visual theme for the Turnstile widget",
438
- default: "auto",
439
- options: [
440
- {
441
- value: "light",
442
- label: "Light"
443
- },
444
- {
445
- value: "dark",
446
- label: "Dark"
447
- },
448
- {
449
- value: "auto",
450
- label: "Auto"
451
- }
452
- ]
453
- },
454
- size: {
455
- type: "select",
456
- label: "Widget Size",
457
- description: "Size of the Turnstile widget",
458
- default: "normal",
459
- options: [
460
- {
461
- value: "normal",
462
- label: "Normal"
463
- },
464
- {
465
- value: "compact",
466
- label: "Compact"
467
- }
468
- ]
469
- },
470
- mode: {
471
- type: "select",
472
- label: "Widget Mode",
473
- description: "Managed: Adaptive challenge. Non-Interactive: Always visible, minimal friction. Invisible: No visible widget",
474
- default: "managed",
475
- options: [
476
- {
477
- value: "managed",
478
- label: "Managed (Recommended)"
479
- },
480
- {
481
- value: "non-interactive",
482
- label: "Non-Interactive"
483
- },
484
- {
485
- value: "invisible",
486
- label: "Invisible"
487
- }
488
- ]
489
- },
490
- appearance: {
491
- type: "select",
492
- label: "Appearance",
493
- description: "When the Turnstile challenge is executed. Always: Verifies immediately. Execute: Challenge on form submit. Interaction Only: Only after user interaction",
494
- default: "always",
495
- options: [
496
- {
497
- value: "always",
498
- label: "Always"
499
- },
500
- {
501
- value: "execute",
502
- label: "Execute"
503
- },
504
- {
505
- value: "interaction-only",
506
- label: "Interaction Only"
507
- }
508
- ]
509
- },
510
- preClearance: {
511
- type: "boolean",
512
- label: "Enable Pre-clearance",
513
- description: "Issue a clearance cookie that bypasses Cloudflare Firewall Rules (as if the user passed a challenge on your proxied site)",
514
- default: false
515
- },
516
- preClearanceLevel: {
517
- type: "select",
518
- label: "Pre-clearance Level",
519
- description: "Controls which Cloudflare Firewall Rules the clearance cookie bypasses. Only applies if Pre-clearance is enabled",
520
- default: "managed",
521
- options: [
522
- {
523
- value: "interactive",
524
- label: "Interactive - Bypasses Interactive, Managed & JS Challenge Rules"
525
- },
526
- {
527
- value: "managed",
528
- label: "Managed - Bypasses Managed & JS Challenge Rules"
529
- },
530
- {
531
- value: "non-interactive",
532
- label: "Non-interactive - Bypasses JS Challenge Rules only"
533
- }
534
- ]
535
- },
536
- enabled: {
537
- type: "boolean",
538
- label: "Enable Turnstile",
539
- description: "Enable or disable Turnstile verification globally",
540
- default: true
541
- }
542
- },
543
- adminMenu: {
544
- label: "Turnstile",
545
- icon: "shield-check",
546
- href: "/admin/plugins/turnstile/settings",
547
- parentId: "plugins",
548
- order: 100
549
- },
550
- codeName: "turnstile-plugin",
551
- iconEmoji: "\u{1F6E1}\uFE0F",
552
- is_core: true,
553
- defaultSettings: {
554
- siteKey: "",
555
- secretKey: "",
556
- theme: "auto",
557
- size: "normal",
558
- mode: "managed",
559
- appearance: "always",
560
- preClearanceEnabled: false,
561
- preClearanceLevel: "managed",
562
- enabled: false
563
- }
564
- };
565
-
566
- // src/plugins/core-plugins/turnstile-plugin/services/turnstile.ts
567
- var TurnstileService = class {
568
- db;
569
- VERIFY_URL = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
570
- constructor(db) {
571
- this.db = db;
572
- }
573
- /**
574
- * Get Turnstile settings from database
575
- */
576
- async getSettings() {
577
- try {
578
- const plugin = await this.db.prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`).bind(manifest_default.id).first();
579
- if (!plugin || !plugin.settings) {
580
- return null;
581
- }
582
- return JSON.parse(plugin.settings);
583
- } catch (error) {
584
- console.error("Error getting Turnstile settings:", error);
585
- return null;
586
- }
587
- }
588
- /**
589
- * Verify a Turnstile token with Cloudflare
590
- */
591
- async verifyToken(token, remoteIp) {
592
- try {
593
- const settings = await this.getSettings();
594
- if (!settings) {
595
- return { success: false, error: "Turnstile not configured" };
596
- }
597
- if (!settings.enabled) {
598
- return { success: true };
599
- }
600
- if (!settings.secretKey) {
601
- return { success: false, error: "Turnstile secret key not configured" };
602
- }
603
- const formData = new FormData();
604
- formData.append("secret", settings.secretKey);
605
- formData.append("response", token);
606
- if (remoteIp) {
607
- formData.append("remoteip", remoteIp);
608
- }
609
- const response = await fetch(this.VERIFY_URL, {
610
- method: "POST",
611
- body: formData
612
- });
613
- if (!response.ok) {
614
- return { success: false, error: "Turnstile verification request failed" };
615
- }
616
- const result = await response.json();
617
- if (!result.success) {
618
- const errorCode = result["error-codes"]?.[0] || "unknown-error";
619
- return { success: false, error: `Turnstile verification failed: ${errorCode}` };
620
- }
621
- return { success: true };
622
- } catch (error) {
623
- console.error("Error verifying Turnstile token:", error);
624
- return { success: false, error: "Turnstile verification error" };
625
- }
626
- }
627
- /**
628
- * Save Turnstile settings to database
629
- */
630
- async saveSettings(settings) {
631
- try {
632
- await this.db.prepare(`UPDATE plugins SET settings = ?, updated_at = ? WHERE id = ?`).bind(JSON.stringify(settings), Date.now(), manifest_default.id).run();
633
- console.log("Turnstile settings saved successfully");
634
- } catch (error) {
635
- console.error("Error saving Turnstile settings:", error);
636
- throw new Error("Failed to save Turnstile settings");
637
- }
638
- }
639
- /**
640
- * Check if Turnstile is enabled
641
- */
642
- async isEnabled() {
643
- const settings = await this.getSettings();
644
- return settings?.enabled === true && !!settings.siteKey && !!settings.secretKey;
645
- }
646
- };
647
-
648
- exports.PluginBuilder = PluginBuilder;
649
- exports.PluginHelpers = PluginHelpers;
650
- exports.TurnstileService = TurnstileService;
651
- exports.manifest_default = manifest_default;
652
- //# sourceMappingURL=chunk-635JAMSE.cjs.map
653
- //# sourceMappingURL=chunk-635JAMSE.cjs.map