@sonicjs-cms/core 2.19.0 → 3.0.0-beta.3

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 (224) hide show
  1. package/README.md +4 -3
  2. package/dist/admin-documents-form.template-KN7JF66Q.cjs +19 -0
  3. package/dist/{admin-layout-catalyst.template-UMTIN66R.js.map → admin-documents-form.template-KN7JF66Q.cjs.map} +1 -1
  4. package/dist/admin-documents-form.template-NLSI6Z42.js +6 -0
  5. package/dist/{admin-layout-catalyst.template-HFD37TY5.cjs.map → admin-documents-form.template-NLSI6Z42.js.map} +1 -1
  6. package/dist/admin-layout-catalyst.template-WHJGSWWD.js +7 -0
  7. package/dist/admin-layout-catalyst.template-WHJGSWWD.js.map +1 -0
  8. package/dist/admin-layout-catalyst.template-ZK5HD545.cjs +17 -0
  9. package/dist/admin-layout-catalyst.template-ZK5HD545.cjs.map +1 -0
  10. package/dist/app-Bo0X1OWX.d.ts +1268 -0
  11. package/dist/app-Do66yCcV.d.cts +1268 -0
  12. package/dist/cache-DDARE4QE.js +4 -0
  13. package/dist/cache-DDARE4QE.js.map +1 -0
  14. package/dist/cache-LVYS4BPL.cjs +33 -0
  15. package/dist/cache-LVYS4BPL.cjs.map +1 -0
  16. package/dist/chunk-2CB4KY7I.cjs +771 -0
  17. package/dist/chunk-2CB4KY7I.cjs.map +1 -0
  18. package/dist/chunk-2JTWQZHG.cjs +276 -0
  19. package/dist/chunk-2JTWQZHG.cjs.map +1 -0
  20. package/dist/{chunk-55RDMDOP.js → chunk-3TB6AT6X.js} +148 -55
  21. package/dist/chunk-3TB6AT6X.js.map +1 -0
  22. package/dist/{chunk-E4YFJBM2.cjs → chunk-673S7EBY.cjs} +621 -829
  23. package/dist/chunk-673S7EBY.cjs.map +1 -0
  24. package/dist/{chunk-ON5ZMSU4.js → chunk-6JQOUUOB.js} +3 -3
  25. package/dist/chunk-6JQOUUOB.js.map +1 -0
  26. package/dist/chunk-7LHUVREV.cjs +158 -0
  27. package/dist/chunk-7LHUVREV.cjs.map +1 -0
  28. package/dist/chunk-AI663NBO.js +821 -0
  29. package/dist/chunk-AI663NBO.js.map +1 -0
  30. package/dist/chunk-BDDABDAB.cjs +1149 -0
  31. package/dist/chunk-BDDABDAB.cjs.map +1 -0
  32. package/dist/chunk-BLMTL57B.js +767 -0
  33. package/dist/chunk-BLMTL57B.js.map +1 -0
  34. package/dist/{chunk-ABB34XUS.cjs → chunk-CHCBHIBM.cjs} +667 -19
  35. package/dist/chunk-CHCBHIBM.cjs.map +1 -0
  36. package/dist/chunk-DNQCEKUK.cjs +327 -0
  37. package/dist/chunk-DNQCEKUK.cjs.map +1 -0
  38. package/dist/chunk-EF2NQUIQ.js +323 -0
  39. package/dist/chunk-EF2NQUIQ.js.map +1 -0
  40. package/dist/chunk-GCDZZNIN.js +192 -0
  41. package/dist/chunk-GCDZZNIN.js.map +1 -0
  42. package/dist/{chunk-XWIA3HVX.js → chunk-HDWE5FRJ.js} +6 -1249
  43. package/dist/chunk-HDWE5FRJ.js.map +1 -0
  44. package/dist/chunk-HIKBY7MS.cjs +70 -0
  45. package/dist/chunk-HIKBY7MS.cjs.map +1 -0
  46. package/dist/chunk-IESEVHXL.js +66 -0
  47. package/dist/chunk-IESEVHXL.js.map +1 -0
  48. package/dist/chunk-IVPRUGTY.js +242 -0
  49. package/dist/chunk-IVPRUGTY.js.map +1 -0
  50. package/dist/{chunk-JZVHLLSI.cjs → chunk-IXUHXTHW.cjs} +2 -151
  51. package/dist/chunk-IXUHXTHW.cjs.map +1 -0
  52. package/dist/{chunk-7A4CB7T3.cjs → chunk-J5DCX3F6.cjs} +509 -91
  53. package/dist/chunk-J5DCX3F6.cjs.map +1 -0
  54. package/dist/chunk-J6JTWD2A.cjs +100 -0
  55. package/dist/chunk-J6JTWD2A.cjs.map +1 -0
  56. package/dist/chunk-JEQ7FLOD.cjs +199 -0
  57. package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
  58. package/dist/chunk-K25XHMM3.js +566 -0
  59. package/dist/chunk-K25XHMM3.js.map +1 -0
  60. package/dist/{chunk-R4FOLLFB.cjs → chunk-LO6MEPRW.cjs} +8730 -11520
  61. package/dist/chunk-LO6MEPRW.cjs.map +1 -0
  62. package/dist/chunk-MHP7HYTT.js +273 -0
  63. package/dist/chunk-MHP7HYTT.js.map +1 -0
  64. package/dist/chunk-MP3Q2W76.js +387 -0
  65. package/dist/chunk-MP3Q2W76.js.map +1 -0
  66. package/dist/{chunk-OHYBNCVL.cjs → chunk-MVIZJOO5.cjs} +10 -1256
  67. package/dist/chunk-MVIZJOO5.cjs.map +1 -0
  68. package/dist/{chunk-UYJ6TJHX.cjs → chunk-NAVPFIG5.cjs} +148 -55
  69. package/dist/chunk-NAVPFIG5.cjs.map +1 -0
  70. package/dist/chunk-NUKJ54GA.cjs +245 -0
  71. package/dist/chunk-NUKJ54GA.cjs.map +1 -0
  72. package/dist/{chunk-BU7SFHGP.js → chunk-QZGABF2M.js} +3 -149
  73. package/dist/chunk-QZGABF2M.js.map +1 -0
  74. package/dist/{chunk-JZV22DEV.js → chunk-RJV6UXLZ.js} +611 -817
  75. package/dist/chunk-RJV6UXLZ.js.map +1 -0
  76. package/dist/chunk-RNZFGN4R.js +88 -0
  77. package/dist/chunk-RNZFGN4R.js.map +1 -0
  78. package/dist/{chunk-TFNTM3OA.js → chunk-SL6XS6YT.js} +645 -15
  79. package/dist/chunk-SL6XS6YT.js.map +1 -0
  80. package/dist/{chunk-OCL3HMEG.js → chunk-SO2T3OXR.js} +7004 -9807
  81. package/dist/chunk-SO2T3OXR.js.map +1 -0
  82. package/dist/chunk-VQHAJUZZ.cjs +408 -0
  83. package/dist/chunk-VQHAJUZZ.cjs.map +1 -0
  84. package/dist/{chunk-4NPCDK6B.js → chunk-VZ3NHR5Z.js} +505 -90
  85. package/dist/chunk-VZ3NHR5Z.js.map +1 -0
  86. package/dist/{chunk-4ZSNJDLS.cjs → chunk-WULONYGB.cjs} +9 -9
  87. package/dist/chunk-WULONYGB.cjs.map +1 -0
  88. package/dist/chunk-XFQHK64T.js +154 -0
  89. package/dist/chunk-XFQHK64T.js.map +1 -0
  90. package/dist/chunk-YA3TJ65D.cjs +575 -0
  91. package/dist/chunk-YA3TJ65D.cjs.map +1 -0
  92. package/dist/chunk-YP7GW2G5.cjs +866 -0
  93. package/dist/chunk-YP7GW2G5.cjs.map +1 -0
  94. package/dist/{chunk-QFWHAFEO.js → chunk-ZEZ245PW.js} +148 -858
  95. package/dist/chunk-ZEZ245PW.js.map +1 -0
  96. package/dist/{collection-config-B4PG-AaF.d.cts → collection-config-JgHOpFCG.d.cts} +30 -2
  97. package/dist/{collection-config-B4PG-AaF.d.ts → collection-config-JgHOpFCG.d.ts} +30 -2
  98. package/dist/config-HFXANXCC.js +6 -0
  99. package/dist/config-HFXANXCC.js.map +1 -0
  100. package/dist/config-ON6FNMYX.cjs +19 -0
  101. package/dist/config-ON6FNMYX.cjs.map +1 -0
  102. package/dist/define-plugin-BzNHc1ZI.d.ts +1321 -0
  103. package/dist/define-plugin-IWDKYaVm.d.cts +1321 -0
  104. package/dist/document-projection-TDWRJX3Z.cjs +13 -0
  105. package/dist/document-projection-TDWRJX3Z.cjs.map +1 -0
  106. package/dist/document-projection-YYMC6I4U.js +4 -0
  107. package/dist/document-projection-YYMC6I4U.js.map +1 -0
  108. package/dist/index.cjs +13734 -4328
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +329 -492
  111. package/dist/index.d.ts +329 -492
  112. package/dist/index.js +13385 -3998
  113. package/dist/index.js.map +1 -1
  114. package/dist/middleware.cjs +36 -32
  115. package/dist/middleware.d.cts +50 -7
  116. package/dist/middleware.d.ts +50 -7
  117. package/dist/middleware.js +7 -3
  118. package/dist/migrations-DK2YFPLR.js +4 -0
  119. package/dist/{migrations-H5IXZNCO.js.map → migrations-DK2YFPLR.js.map} +1 -1
  120. package/dist/migrations-YHNHTJOO.cjs +13 -0
  121. package/dist/{migrations-566IIPS2.cjs.map → migrations-YHNHTJOO.cjs.map} +1 -1
  122. package/dist/{plugin-bootstrap-DfVerYV4.d.cts → plugin-bootstrap-B8ThJU21.d.cts} +4315 -1661
  123. package/dist/{plugin-bootstrap-P_ciLp_C.d.ts → plugin-bootstrap-qu8hJgUt.d.ts} +4315 -1661
  124. package/dist/plugins.cjs +171 -12
  125. package/dist/plugins.d.cts +36 -2
  126. package/dist/plugins.d.ts +36 -2
  127. package/dist/plugins.js +5 -2
  128. package/dist/rbac-O73MFKDA.js +5 -0
  129. package/dist/rbac-O73MFKDA.js.map +1 -0
  130. package/dist/rbac-VONLJJKB.cjs +14 -0
  131. package/dist/rbac-VONLJJKB.cjs.map +1 -0
  132. package/dist/routes.cjs +41 -45
  133. package/dist/routes.d.cts +56 -146
  134. package/dist/routes.d.ts +56 -146
  135. package/dist/routes.js +17 -9
  136. package/dist/services.cjs +39 -72
  137. package/dist/services.d.cts +79 -54
  138. package/dist/services.d.ts +79 -54
  139. package/dist/services.js +6 -3
  140. package/dist/templates.cjs +17 -29
  141. package/dist/templates.d.cts +1 -66
  142. package/dist/templates.d.ts +1 -66
  143. package/dist/templates.js +3 -3
  144. package/dist/types-Dea1eNxU.d.cts +286 -0
  145. package/dist/types-Dea1eNxU.d.ts +286 -0
  146. package/dist/types.d.cts +1 -1
  147. package/dist/types.d.ts +1 -1
  148. package/dist/utils.cjs +18 -17
  149. package/dist/utils.d.cts +1 -1
  150. package/dist/utils.d.ts +1 -1
  151. package/dist/utils.js +2 -1
  152. package/migrations/0001_core.sql +184 -0
  153. package/migrations/0002_documents.sql +163 -0
  154. package/package.json +12 -7
  155. package/dist/admin-layout-catalyst.template-HFD37TY5.cjs +0 -17
  156. package/dist/admin-layout-catalyst.template-UMTIN66R.js +0 -7
  157. package/dist/app-C9esKLmh.d.cts +0 -112
  158. package/dist/app-C9esKLmh.d.ts +0 -112
  159. package/dist/chunk-4NPCDK6B.js.map +0 -1
  160. package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
  161. package/dist/chunk-55RDMDOP.js.map +0 -1
  162. package/dist/chunk-635JAMSE.cjs +0 -653
  163. package/dist/chunk-635JAMSE.cjs.map +0 -1
  164. package/dist/chunk-7A4CB7T3.cjs.map +0 -1
  165. package/dist/chunk-ABB34XUS.cjs.map +0 -1
  166. package/dist/chunk-BU7SFHGP.js.map +0 -1
  167. package/dist/chunk-E4YFJBM2.cjs.map +0 -1
  168. package/dist/chunk-EXNEW5US.js +0 -648
  169. package/dist/chunk-EXNEW5US.js.map +0 -1
  170. package/dist/chunk-JZV22DEV.js.map +0 -1
  171. package/dist/chunk-JZVHLLSI.cjs.map +0 -1
  172. package/dist/chunk-OCL3HMEG.js.map +0 -1
  173. package/dist/chunk-OHYBNCVL.cjs.map +0 -1
  174. package/dist/chunk-ON5ZMSU4.js.map +0 -1
  175. package/dist/chunk-QFWHAFEO.js.map +0 -1
  176. package/dist/chunk-R4FOLLFB.cjs.map +0 -1
  177. package/dist/chunk-RLMUFFUD.cjs +0 -2219
  178. package/dist/chunk-RLMUFFUD.cjs.map +0 -1
  179. package/dist/chunk-TFNTM3OA.js.map +0 -1
  180. package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
  181. package/dist/chunk-WAEQXGCX.cjs +0 -1898
  182. package/dist/chunk-WAEQXGCX.cjs.map +0 -1
  183. package/dist/chunk-XWIA3HVX.js.map +0 -1
  184. package/dist/chunk-ZYAYUIZE.js +0 -2217
  185. package/dist/chunk-ZYAYUIZE.js.map +0 -1
  186. package/dist/migrations-566IIPS2.cjs +0 -13
  187. package/dist/migrations-H5IXZNCO.js +0 -4
  188. package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
  189. package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
  190. package/migrations/001_initial_schema.sql +0 -170
  191. package/migrations/002_faq_plugin.sql +0 -86
  192. package/migrations/003_stage5_enhancements.sql +0 -121
  193. package/migrations/004_stage6_user_management.sql +0 -183
  194. package/migrations/005_stage7_workflow_automation.sql +0 -294
  195. package/migrations/006_plugin_system.sql +0 -155
  196. package/migrations/007_demo_login_plugin.sql +0 -23
  197. package/migrations/008_fix_slug_validation.sql +0 -22
  198. package/migrations/009_system_logging.sql +0 -57
  199. package/migrations/011_config_managed_collections.sql +0 -15
  200. package/migrations/012_testimonials_plugin.sql +0 -80
  201. package/migrations/013_code_examples_plugin.sql +0 -177
  202. package/migrations/014_fix_plugin_registry.sql +0 -88
  203. package/migrations/015_add_remaining_plugins.sql +0 -89
  204. package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
  205. package/migrations/017_auth_configurable_fields.sql +0 -49
  206. package/migrations/018_settings_table.sql +0 -23
  207. package/migrations/019_remove_blog_posts_collection.sql +0 -15
  208. package/migrations/020_add_email_plugin.sql +0 -22
  209. package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
  210. package/migrations/022_add_tinymce_plugin.sql +0 -25
  211. package/migrations/023_add_easy_mdx_plugin.sql +0 -25
  212. package/migrations/024_add_quill_editor_plugin.sql +0 -25
  213. package/migrations/025_add_easymde_plugin.sql +0 -25
  214. package/migrations/026_add_otp_login.sql +0 -42
  215. package/migrations/027_fix_slug_field_type.sql +0 -18
  216. package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
  217. package/migrations/029_add_forms_system.sql +0 -184
  218. package/migrations/030_add_turnstile_to_forms.sql +0 -14
  219. package/migrations/031_ai_search_plugin.sql +0 -45
  220. package/migrations/032_user_profiles.sql +0 -37
  221. package/migrations/033_form_content_integration.sql +0 -19
  222. package/migrations/034_security_audit_plugin.sql +0 -27
  223. package/migrations/035_user_profiles_data_column.sql +0 -16
  224. package/migrations/036_analytics_events.sql +0 -22
@@ -1,18 +0,0 @@
1
- -- Migration: Fix slug field type
2
- -- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation
3
- -- Created: 2026-01-10
4
-
5
- -- Update pages collection slug field to use 'slug' field type
6
- UPDATE content_fields
7
- SET field_type = 'slug'
8
- WHERE field_name = 'slug' AND collection_id = 'pages-collection';
9
-
10
- -- Update blog posts slug field if it exists
11
- UPDATE content_fields
12
- SET field_type = 'slug'
13
- WHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';
14
-
15
- -- Update news slug field if it exists
16
- UPDATE content_fields
17
- SET field_type = 'slug'
18
- WHERE field_name = 'slug' AND collection_id = 'news-collection';
@@ -1,30 +0,0 @@
1
- -- Migration: Fix slug field type in collection schemas
2
- -- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'
3
- -- Created: 2026-01-10
4
-
5
- -- Update pages-collection schema
6
- UPDATE collections
7
- SET schema = REPLACE(
8
- schema,
9
- '"slug":{"type":"string"',
10
- '"slug":{"type":"slug"'
11
- )
12
- WHERE id = 'pages-collection' AND schema LIKE '%"slug":{"type":"string"%';
13
-
14
- -- Update blog-posts-collection schema if it exists
15
- UPDATE collections
16
- SET schema = REPLACE(
17
- schema,
18
- '"slug":{"type":"string"',
19
- '"slug":{"type":"slug"'
20
- )
21
- WHERE id = 'blog-posts-collection' AND schema LIKE '%"slug":{"type":"string"%';
22
-
23
- -- Update news-collection schema if it exists
24
- UPDATE collections
25
- SET schema = REPLACE(
26
- schema,
27
- '"slug":{"type":"string"',
28
- '"slug":{"type":"slug"'
29
- )
30
- WHERE id = 'news-collection' AND schema LIKE '%"slug":{"type":"string"%';
@@ -1,184 +0,0 @@
1
- -- Migration: 029_add_forms_system.sql
2
- -- Description: Add Form.io integration for advanced form building
3
- -- Date: January 23, 2026
4
- -- Phase: 1 - Database Schema
5
-
6
- -- =====================================================
7
- -- Table: forms
8
- -- Description: Stores form definitions and configuration
9
- -- =====================================================
10
-
11
- CREATE TABLE IF NOT EXISTS forms (
12
- id TEXT PRIMARY KEY,
13
- name TEXT NOT NULL UNIQUE, -- Machine name (e.g., "contact-form")
14
- display_name TEXT NOT NULL, -- Human name (e.g., "Contact Form")
15
- description TEXT, -- Optional description
16
- category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)
17
-
18
- -- Form.io schema (JSON)
19
- formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema
20
-
21
- -- Settings
22
- settings TEXT, -- JSON: {
23
- -- emailNotifications: true,
24
- -- notifyEmail: "admin@example.com",
25
- -- successMessage: "Thank you!",
26
- -- redirectUrl: "/thank-you",
27
- -- allowAnonymous: true,
28
- -- requireAuth: false,
29
- -- maxSubmissions: null,
30
- -- submitButtonText: "Submit",
31
- -- saveProgress: true,
32
- -- webhookUrl: null
33
- -- }
34
-
35
- -- Status & Management
36
- is_active INTEGER DEFAULT 1, -- Active/inactive flag
37
- is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)
38
- managed INTEGER DEFAULT 0, -- Code-managed (like collections)
39
-
40
- -- Metadata
41
- icon TEXT, -- Optional icon for admin UI
42
- color TEXT, -- Optional color (hex) for admin UI
43
- tags TEXT, -- JSON array of tags
44
-
45
- -- Stats
46
- submission_count INTEGER DEFAULT 0, -- Total submissions received
47
- view_count INTEGER DEFAULT 0, -- Form views (optional tracking)
48
-
49
- -- Ownership
50
- created_by TEXT REFERENCES users(id), -- User who created the form
51
- updated_by TEXT REFERENCES users(id), -- User who last updated
52
-
53
- -- Timestamps
54
- created_at INTEGER NOT NULL,
55
- updated_at INTEGER NOT NULL
56
- );
57
-
58
- -- Indexes for forms
59
- CREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);
60
- CREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);
61
- CREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);
62
- CREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);
63
- CREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);
64
-
65
- -- =====================================================
66
- -- Table: form_submissions
67
- -- Description: Stores submitted form data
68
- -- =====================================================
69
-
70
- CREATE TABLE IF NOT EXISTS form_submissions (
71
- id TEXT PRIMARY KEY,
72
- form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,
73
-
74
- -- Submission data
75
- submission_data TEXT NOT NULL, -- JSON: The actual form data submitted
76
-
77
- -- Submission metadata
78
- status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam
79
- submission_number INTEGER, -- Sequential number per form
80
-
81
- -- User information (if authenticated)
82
- user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)
83
- user_email TEXT, -- Email from form (or user account)
84
-
85
- -- Tracking information
86
- ip_address TEXT, -- IP address of submitter
87
- user_agent TEXT, -- Browser user agent
88
- referrer TEXT, -- Page that referred to form
89
- utm_source TEXT, -- UTM tracking params
90
- utm_medium TEXT,
91
- utm_campaign TEXT,
92
-
93
- -- Review/Processing
94
- reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed
95
- reviewed_at INTEGER, -- Review timestamp
96
- review_notes TEXT, -- Admin notes
97
-
98
- -- Flags
99
- is_spam INTEGER DEFAULT 0, -- Spam flag
100
- is_archived INTEGER DEFAULT 0, -- Archived flag
101
-
102
- -- Timestamps
103
- submitted_at INTEGER NOT NULL,
104
- updated_at INTEGER NOT NULL
105
- );
106
-
107
- -- Indexes for submissions
108
- CREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);
109
- CREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);
110
- CREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);
111
- CREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);
112
- CREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);
113
- CREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);
114
-
115
- -- Trigger to auto-increment submission_number per form
116
- CREATE TRIGGER IF NOT EXISTS set_submission_number
117
- AFTER INSERT ON form_submissions
118
- BEGIN
119
- UPDATE form_submissions
120
- SET submission_number = (
121
- SELECT COUNT(*)
122
- FROM form_submissions
123
- WHERE form_id = NEW.form_id
124
- AND id <= NEW.id
125
- )
126
- WHERE id = NEW.id;
127
- END;
128
-
129
- -- Trigger to update form submission_count
130
- CREATE TRIGGER IF NOT EXISTS increment_form_submission_count
131
- AFTER INSERT ON form_submissions
132
- BEGIN
133
- UPDATE forms
134
- SET submission_count = submission_count + 1,
135
- updated_at = unixepoch() * 1000
136
- WHERE id = NEW.form_id;
137
- END;
138
-
139
- -- =====================================================
140
- -- Table: form_files (Optional)
141
- -- Description: Link form submissions to uploaded files
142
- -- =====================================================
143
-
144
- CREATE TABLE IF NOT EXISTS form_files (
145
- id TEXT PRIMARY KEY,
146
- submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,
147
- media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,
148
- field_name TEXT NOT NULL, -- Form field that uploaded this file
149
- uploaded_at INTEGER NOT NULL
150
- );
151
-
152
- -- Indexes for form files
153
- CREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);
154
- CREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);
155
-
156
- -- =====================================================
157
- -- Sample Data: Create a default contact form
158
- -- =====================================================
159
-
160
- INSERT OR IGNORE INTO forms (
161
- id,
162
- name,
163
- display_name,
164
- description,
165
- category,
166
- formio_schema,
167
- settings,
168
- is_active,
169
- is_public,
170
- created_at,
171
- updated_at
172
- ) VALUES (
173
- 'default-contact-form',
174
- 'contact',
175
- 'Contact Form',
176
- 'A simple contact form for getting in touch',
177
- 'contact',
178
- '{"components":[]}',
179
- '{"emailNotifications":false,"successMessage":"Thank you for your submission!","submitButtonText":"Submit","requireAuth":false}',
180
- 1,
181
- 1,
182
- unixepoch() * 1000,
183
- unixepoch() * 1000
184
- );
@@ -1,14 +0,0 @@
1
- -- Add Turnstile configuration to forms table
2
- -- This allows per-form Turnstile settings with global fallback
3
-
4
- -- Add columns (D1 may not support CHECK constraints in ALTER TABLE)
5
- ALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;
6
- ALTER TABLE forms ADD COLUMN turnstile_settings TEXT;
7
-
8
- -- Set default to inherit global settings for existing forms
9
- UPDATE forms
10
- SET turnstile_settings = '{"inherit":true}'
11
- WHERE turnstile_settings IS NULL;
12
-
13
- -- Add index for faster lookups
14
- CREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);
@@ -1,45 +0,0 @@
1
- -- AI Search plugin settings
2
- CREATE TABLE IF NOT EXISTS ai_search_settings (
3
- id INTEGER PRIMARY KEY AUTOINCREMENT,
4
- enabled BOOLEAN DEFAULT 0,
5
- ai_mode_enabled BOOLEAN DEFAULT 1,
6
- selected_collections TEXT, -- JSON array of collection IDs to index
7
- dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index
8
- autocomplete_enabled BOOLEAN DEFAULT 1,
9
- cache_duration INTEGER DEFAULT 1, -- hours
10
- results_limit INTEGER DEFAULT 20,
11
- index_media BOOLEAN DEFAULT 0,
12
- index_status TEXT, -- JSON object with status per collection
13
- last_indexed_at INTEGER,
14
- created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),
15
- updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
16
- );
17
-
18
- -- Search history/analytics
19
- CREATE TABLE IF NOT EXISTS ai_search_history (
20
- id INTEGER PRIMARY KEY AUTOINCREMENT,
21
- query TEXT NOT NULL,
22
- mode TEXT, -- 'ai' or 'keyword'
23
- results_count INTEGER,
24
- user_id INTEGER,
25
- created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
26
- );
27
-
28
- -- Index metadata tracking (per collection)
29
- CREATE TABLE IF NOT EXISTS ai_search_index_meta (
30
- id INTEGER PRIMARY KEY AUTOINCREMENT,
31
- collection_id INTEGER NOT NULL,
32
- collection_name TEXT NOT NULL, -- Cache collection name for display
33
- total_items INTEGER DEFAULT 0,
34
- indexed_items INTEGER DEFAULT 0,
35
- last_sync_at INTEGER,
36
- status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'
37
- error_message TEXT,
38
- UNIQUE(collection_id)
39
- );
40
-
41
- -- Indexes for performance
42
- CREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);
43
- CREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);
44
- CREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);
45
- CREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);
@@ -1,37 +0,0 @@
1
- -- User Profiles Table (Core Migration)
2
- -- Stores extended user profile data separate from auth concerns
3
- -- Required by admin-users.ts for user edit page profile management
4
- --
5
- -- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)
6
- -- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,
7
- -- but no corresponding core migration was added. This migration corrects that gap.
8
- --
9
- -- IF NOT EXISTS guards ensure idempotency for databases that already have the table
10
- -- from the app-level migration.
11
-
12
- CREATE TABLE IF NOT EXISTS user_profiles (
13
- id TEXT PRIMARY KEY,
14
- user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
15
-
16
- display_name TEXT,
17
- bio TEXT,
18
- company TEXT,
19
- job_title TEXT,
20
- website TEXT,
21
- location TEXT,
22
- date_of_birth INTEGER,
23
- data TEXT DEFAULT '{}',
24
-
25
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
26
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
27
- );
28
-
29
- -- Index for fast user lookups
30
- CREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);
31
-
32
- -- Trigger to auto-update updated_at timestamp
33
- CREATE TRIGGER IF NOT EXISTS user_profiles_updated_at
34
- AFTER UPDATE ON user_profiles
35
- BEGIN
36
- UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;
37
- END;
@@ -1,19 +0,0 @@
1
- -- Migration 033: Form-Content Integration
2
- -- Adds bridge columns to link forms to collections and submissions to content items
3
-
4
- -- Add source_type and source_id to collections for form-derived collections
5
- ALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';
6
- ALTER TABLE collections ADD COLUMN source_id TEXT;
7
-
8
- -- Index for efficient lookup of form-derived collections
9
- CREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);
10
-
11
- -- Add content_id to form_submissions for linking to content items
12
- ALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);
13
-
14
- -- Index for efficient lookup by content_id
15
- CREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);
16
-
17
- -- Create system user for anonymous form submissions
18
- INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)
19
- VALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);
@@ -1,27 +0,0 @@
1
- -- Security Audit Plugin
2
- -- Tracks login attempts, registrations, and security events for monitoring and brute-force detection
3
-
4
- CREATE TABLE IF NOT EXISTS security_events (
5
- id TEXT PRIMARY KEY,
6
- event_type TEXT NOT NULL,
7
- severity TEXT NOT NULL DEFAULT 'info',
8
- user_id TEXT,
9
- email TEXT,
10
- ip_address TEXT,
11
- user_agent TEXT,
12
- country_code TEXT,
13
- request_path TEXT,
14
- request_method TEXT,
15
- details TEXT,
16
- fingerprint TEXT,
17
- blocked INTEGER NOT NULL DEFAULT 0,
18
- created_at INTEGER NOT NULL
19
- );
20
-
21
- CREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);
22
- CREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);
23
- CREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);
24
- CREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);
25
- CREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);
26
- CREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);
27
- CREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);
@@ -1,16 +0,0 @@
1
- -- Migration 035: Add data column to user_profiles (no-op)
2
- --
3
- -- This migration originally added a missing 'data' column to user_profiles.
4
- -- Migration 032 has since been updated to include the column in the CREATE TABLE,
5
- -- so on fresh installs the column already exists by the time this runs.
6
- --
7
- -- The ALTER TABLE has been removed to prevent "duplicate column name: data" errors
8
- -- during fresh installs (GitHub issue #771). Wrangler's migration runner does not
9
- -- gracefully handle duplicate column errors like the runtime MigrationService does.
10
- --
11
- -- Existing databases that ran the old 032 (without the data column) get the column
12
- -- added at runtime by the core MigrationService, which skips duplicate-column errors.
13
- --
14
- -- This file is kept as a no-op so that wrangler's migration tracking remains
15
- -- consistent (it tracks migrations by filename).
16
- SELECT 1;
@@ -1,22 +0,0 @@
1
- -- Migration 036: Analytics Events Table
2
- -- Provides storage for user behavior event tracking (page views, custom events)
3
-
4
- CREATE TABLE IF NOT EXISTS analytics_events (
5
- id TEXT PRIMARY KEY,
6
- event TEXT NOT NULL,
7
- category TEXT NOT NULL DEFAULT 'user-activity',
8
- properties TEXT,
9
- user_id TEXT,
10
- session_id TEXT,
11
- ip_address TEXT,
12
- user_agent TEXT,
13
- path TEXT,
14
- created_at INTEGER NOT NULL DEFAULT (unixepoch())
15
- );
16
-
17
- CREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);
18
- CREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);
19
- CREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);
20
- CREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);
21
- CREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);
22
- CREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);