@sonicjs-cms/core 2.18.1 → 3.0.0-beta.2

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 (225) 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-55RDMDOP.js → chunk-3TB6AT6X.js} +148 -55
  19. package/dist/chunk-3TB6AT6X.js.map +1 -0
  20. package/dist/{chunk-ON5ZMSU4.js → chunk-6JQOUUOB.js} +3 -3
  21. package/dist/chunk-6JQOUUOB.js.map +1 -0
  22. package/dist/chunk-6OUHGKFD.js +387 -0
  23. package/dist/chunk-6OUHGKFD.js.map +1 -0
  24. package/dist/{chunk-DSUJ5YQH.cjs → chunk-AAWNRBRB.cjs} +537 -92
  25. package/dist/chunk-AAWNRBRB.cjs.map +1 -0
  26. package/dist/chunk-AI663NBO.js +821 -0
  27. package/dist/chunk-AI663NBO.js.map +1 -0
  28. package/dist/chunk-BDDABDAB.cjs +1149 -0
  29. package/dist/chunk-BDDABDAB.cjs.map +1 -0
  30. package/dist/chunk-BLMTL57B.js +767 -0
  31. package/dist/chunk-BLMTL57B.js.map +1 -0
  32. package/dist/chunk-DNQCEKUK.cjs +327 -0
  33. package/dist/chunk-DNQCEKUK.cjs.map +1 -0
  34. package/dist/chunk-DSA4UX5B.cjs +276 -0
  35. package/dist/chunk-DSA4UX5B.cjs.map +1 -0
  36. package/dist/chunk-EF2NQUIQ.js +323 -0
  37. package/dist/chunk-EF2NQUIQ.js.map +1 -0
  38. package/dist/chunk-GCDZZNIN.js +192 -0
  39. package/dist/chunk-GCDZZNIN.js.map +1 -0
  40. package/dist/{chunk-ABB34XUS.cjs → chunk-H2AXVCLS.cjs} +667 -19
  41. package/dist/chunk-H2AXVCLS.cjs.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-SQ6FNXU2.cjs → chunk-IXUHXTHW.cjs} +2 -151
  51. package/dist/chunk-IXUHXTHW.cjs.map +1 -0
  52. package/dist/chunk-J6JTWD2A.cjs +100 -0
  53. package/dist/chunk-J6JTWD2A.cjs.map +1 -0
  54. package/dist/chunk-JEQ7FLOD.cjs +199 -0
  55. package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
  56. package/dist/chunk-K25XHMM3.js +566 -0
  57. package/dist/chunk-K25XHMM3.js.map +1 -0
  58. package/dist/chunk-LRZIAW7U.cjs +158 -0
  59. package/dist/chunk-LRZIAW7U.cjs.map +1 -0
  60. package/dist/{chunk-OHYBNCVL.cjs → chunk-MVIZJOO5.cjs} +10 -1256
  61. package/dist/chunk-MVIZJOO5.cjs.map +1 -0
  62. package/dist/{chunk-UYJ6TJHX.cjs → chunk-NAVPFIG5.cjs} +148 -55
  63. package/dist/chunk-NAVPFIG5.cjs.map +1 -0
  64. package/dist/chunk-NLJVSER2.js +273 -0
  65. package/dist/chunk-NLJVSER2.js.map +1 -0
  66. package/dist/chunk-NMPEMSU4.js +154 -0
  67. package/dist/chunk-NMPEMSU4.js.map +1 -0
  68. package/dist/chunk-NUKJ54GA.cjs +245 -0
  69. package/dist/chunk-NUKJ54GA.cjs.map +1 -0
  70. package/dist/{chunk-T3Q5V33G.cjs → chunk-QAYFOER6.cjs} +621 -829
  71. package/dist/chunk-QAYFOER6.cjs.map +1 -0
  72. package/dist/{chunk-MGFRZO24.js → chunk-QZGABF2M.js} +3 -149
  73. package/dist/chunk-QZGABF2M.js.map +1 -0
  74. package/dist/chunk-RNZFGN4R.js +88 -0
  75. package/dist/chunk-RNZFGN4R.js.map +1 -0
  76. package/dist/chunk-RZ6H7OZK.js +1134 -0
  77. package/dist/chunk-RZ6H7OZK.js.map +1 -0
  78. package/dist/{chunk-XXDFQERJ.js → chunk-VD2EA3WT.js} +7192 -9806
  79. package/dist/chunk-VD2EA3WT.js.map +1 -0
  80. package/dist/{chunk-SXXTQETM.cjs → chunk-VXE42MYF.cjs} +8722 -11323
  81. package/dist/chunk-VXE42MYF.cjs.map +1 -0
  82. package/dist/{chunk-4ZSNJDLS.cjs → chunk-WULONYGB.cjs} +9 -9
  83. package/dist/chunk-WULONYGB.cjs.map +1 -0
  84. package/dist/chunk-XW56B23A.cjs +408 -0
  85. package/dist/chunk-XW56B23A.cjs.map +1 -0
  86. package/dist/chunk-YA3TJ65D.cjs +575 -0
  87. package/dist/chunk-YA3TJ65D.cjs.map +1 -0
  88. package/dist/{chunk-TFNTM3OA.js → chunk-YHSQVQXX.js} +645 -15
  89. package/dist/chunk-YHSQVQXX.js.map +1 -0
  90. package/dist/chunk-YP7GW2G5.cjs +866 -0
  91. package/dist/chunk-YP7GW2G5.cjs.map +1 -0
  92. package/dist/{chunk-QFWHAFEO.js → chunk-ZEZ245PW.js} +148 -858
  93. package/dist/chunk-ZEZ245PW.js.map +1 -0
  94. package/dist/{chunk-EW5NOBVU.js → chunk-ZGGXCFR6.js} +611 -817
  95. package/dist/chunk-ZGGXCFR6.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 +13735 -4329
  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 +13386 -3999
  113. package/dist/index.js.map +1 -1
  114. package/dist/middleware.cjs +36 -32
  115. package/dist/middleware.d.cts +69 -7
  116. package/dist/middleware.d.ts +69 -7
  117. package/dist/middleware.js +7 -3
  118. package/dist/migrations-NJJWQUKK.cjs +13 -0
  119. package/dist/{migrations-IYNTWDC6.cjs.map → migrations-NJJWQUKK.cjs.map} +1 -1
  120. package/dist/migrations-WCAVBD7C.js +4 -0
  121. package/dist/{migrations-R337UD46.js.map → migrations-WCAVBD7C.js.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-4R3NOOL3.js +0 -2217
  160. package/dist/chunk-4R3NOOL3.js.map +0 -1
  161. package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
  162. package/dist/chunk-55RDMDOP.js.map +0 -1
  163. package/dist/chunk-635JAMSE.cjs +0 -653
  164. package/dist/chunk-635JAMSE.cjs.map +0 -1
  165. package/dist/chunk-ABB34XUS.cjs.map +0 -1
  166. package/dist/chunk-C54YUA23.cjs +0 -2219
  167. package/dist/chunk-C54YUA23.cjs.map +0 -1
  168. package/dist/chunk-DSUJ5YQH.cjs.map +0 -1
  169. package/dist/chunk-EW5NOBVU.js.map +0 -1
  170. package/dist/chunk-EXNEW5US.js +0 -648
  171. package/dist/chunk-EXNEW5US.js.map +0 -1
  172. package/dist/chunk-I2H5NGJQ.js +0 -692
  173. package/dist/chunk-I2H5NGJQ.js.map +0 -1
  174. package/dist/chunk-MGFRZO24.js.map +0 -1
  175. package/dist/chunk-OHYBNCVL.cjs.map +0 -1
  176. package/dist/chunk-ON5ZMSU4.js.map +0 -1
  177. package/dist/chunk-QFWHAFEO.js.map +0 -1
  178. package/dist/chunk-SQ6FNXU2.cjs.map +0 -1
  179. package/dist/chunk-SXXTQETM.cjs.map +0 -1
  180. package/dist/chunk-T3Q5V33G.cjs.map +0 -1
  181. package/dist/chunk-TFNTM3OA.js.map +0 -1
  182. package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
  183. package/dist/chunk-WAEQXGCX.cjs +0 -1898
  184. package/dist/chunk-WAEQXGCX.cjs.map +0 -1
  185. package/dist/chunk-XWIA3HVX.js.map +0 -1
  186. package/dist/chunk-XXDFQERJ.js.map +0 -1
  187. package/dist/migrations-IYNTWDC6.cjs +0 -13
  188. package/dist/migrations-R337UD46.js +0 -4
  189. package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
  190. package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
  191. package/migrations/001_initial_schema.sql +0 -170
  192. package/migrations/002_faq_plugin.sql +0 -86
  193. package/migrations/003_stage5_enhancements.sql +0 -121
  194. package/migrations/004_stage6_user_management.sql +0 -183
  195. package/migrations/005_stage7_workflow_automation.sql +0 -294
  196. package/migrations/006_plugin_system.sql +0 -155
  197. package/migrations/007_demo_login_plugin.sql +0 -23
  198. package/migrations/008_fix_slug_validation.sql +0 -22
  199. package/migrations/009_system_logging.sql +0 -57
  200. package/migrations/011_config_managed_collections.sql +0 -15
  201. package/migrations/012_testimonials_plugin.sql +0 -80
  202. package/migrations/013_code_examples_plugin.sql +0 -177
  203. package/migrations/014_fix_plugin_registry.sql +0 -88
  204. package/migrations/015_add_remaining_plugins.sql +0 -89
  205. package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
  206. package/migrations/017_auth_configurable_fields.sql +0 -49
  207. package/migrations/018_settings_table.sql +0 -23
  208. package/migrations/019_remove_blog_posts_collection.sql +0 -15
  209. package/migrations/020_add_email_plugin.sql +0 -22
  210. package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
  211. package/migrations/022_add_tinymce_plugin.sql +0 -25
  212. package/migrations/023_add_easy_mdx_plugin.sql +0 -25
  213. package/migrations/024_add_quill_editor_plugin.sql +0 -25
  214. package/migrations/025_add_easymde_plugin.sql +0 -25
  215. package/migrations/026_add_otp_login.sql +0 -42
  216. package/migrations/027_fix_slug_field_type.sql +0 -18
  217. package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
  218. package/migrations/029_add_forms_system.sql +0 -184
  219. package/migrations/030_add_turnstile_to_forms.sql +0 -14
  220. package/migrations/031_ai_search_plugin.sql +0 -45
  221. package/migrations/032_user_profiles.sql +0 -37
  222. package/migrations/033_form_content_integration.sql +0 -19
  223. package/migrations/034_security_audit_plugin.sql +0 -27
  224. package/migrations/035_user_profiles_data_column.sql +0 -16
  225. package/migrations/036_analytics_events.sql +0 -22
@@ -0,0 +1,163 @@
1
+ -- Migration 0002: Document Schema (v3 greenfield)
2
+ -- Contains only the new document data model tables, generated columns, and indexes.
3
+
4
+ -- Document type registry
5
+ CREATE TABLE IF NOT EXISTS document_types (
6
+ id TEXT PRIMARY KEY,
7
+ name TEXT NOT NULL UNIQUE,
8
+ display_name TEXT NOT NULL,
9
+ description TEXT,
10
+ schema TEXT NOT NULL DEFAULT '{}',
11
+ queryable_fields TEXT NOT NULL DEFAULT '[]',
12
+ settings TEXT NOT NULL DEFAULT '{}',
13
+ plugin_id TEXT,
14
+ source TEXT NOT NULL DEFAULT 'code' CHECK (source IN ('code', 'plugin', 'system')),
15
+ schema_version INTEGER NOT NULL DEFAULT 1,
16
+ is_system INTEGER NOT NULL DEFAULT 0,
17
+ is_active INTEGER NOT NULL DEFAULT 1,
18
+ is_auth INTEGER NOT NULL DEFAULT 0,
19
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
20
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_document_types_plugin ON document_types(plugin_id);
24
+ CREATE INDEX IF NOT EXISTS idx_document_types_active ON document_types(is_active);
25
+
26
+ -- Documents: canonical document rows and historical versions.
27
+ CREATE TABLE IF NOT EXISTS documents (
28
+ id TEXT PRIMARY KEY,
29
+ root_id TEXT NOT NULL,
30
+ type_id TEXT NOT NULL REFERENCES document_types(id),
31
+ type_version INTEGER NOT NULL DEFAULT 1,
32
+
33
+ version_of_id TEXT REFERENCES documents(id),
34
+ version_number INTEGER NOT NULL DEFAULT 1,
35
+
36
+ is_current_draft INTEGER NOT NULL DEFAULT 1,
37
+ is_published INTEGER NOT NULL DEFAULT 0,
38
+ status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
39
+
40
+ parent_root_id TEXT NOT NULL DEFAULT '',
41
+ slug TEXT,
42
+ path TEXT,
43
+ title TEXT,
44
+ zone TEXT,
45
+ sort_order INTEGER NOT NULL DEFAULT 0,
46
+ visible INTEGER NOT NULL DEFAULT 1,
47
+
48
+ published_at INTEGER,
49
+ scheduled_at INTEGER,
50
+ expires_at INTEGER,
51
+ deleted_at INTEGER,
52
+
53
+ tenant_id TEXT NOT NULL DEFAULT 'default',
54
+ locale TEXT NOT NULL DEFAULT 'default',
55
+ translation_group_id TEXT NOT NULL DEFAULT '',
56
+
57
+ data TEXT NOT NULL DEFAULT '{}',
58
+ metadata TEXT NOT NULL DEFAULT '{}',
59
+
60
+ owner_id TEXT,
61
+ created_by TEXT,
62
+ updated_by TEXT,
63
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
64
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
65
+ );
66
+
67
+ -- Queryable scalar fields (VIRTUAL generated columns) and their q_* filter indexes
68
+ -- are AUTO-GENERATED at runtime from each document type's queryableFields config —
69
+ -- see DocumentTypeRegistry.register() -> ensureScalarSchema() (document-scalar-schema.ts).
70
+ -- Do not hand-add q_* columns/indexes here; declare the field in the type instead.
71
+
72
+ -- Revision chain
73
+ CREATE INDEX IF NOT EXISTS idx_documents_root ON documents(root_id, version_number DESC);
74
+
75
+ -- List / lifecycle
76
+ CREATE INDEX IF NOT EXISTS idx_documents_published ON documents(tenant_id, type_id, locale, is_published)
77
+ WHERE is_published = 1 AND deleted_at IS NULL;
78
+ CREATE INDEX IF NOT EXISTS idx_documents_drafts ON documents(tenant_id, type_id, status, is_current_draft)
79
+ WHERE is_current_draft = 1;
80
+ CREATE INDEX IF NOT EXISTS idx_documents_parent ON documents(tenant_id, parent_root_id, sort_order, is_published);
81
+ CREATE INDEX IF NOT EXISTS idx_documents_path ON documents(tenant_id, path);
82
+ CREATE INDEX IF NOT EXISTS idx_documents_translation ON documents(translation_group_id, locale);
83
+ CREATE INDEX IF NOT EXISTS idx_documents_deleted ON documents(deleted_at);
84
+ CREATE INDEX IF NOT EXISTS idx_documents_scheduled ON documents(scheduled_at) WHERE scheduled_at IS NOT NULL;
85
+ CREATE INDEX IF NOT EXISTS idx_documents_expires ON documents(expires_at) WHERE expires_at IS NOT NULL;
86
+
87
+ -- Stable keyset/cursor pagination for published lists
88
+ CREATE INDEX IF NOT EXISTS idx_documents_published_cursor
89
+ ON documents(tenant_id, type_id, updated_at DESC, id DESC)
90
+ WHERE is_published = 1 AND deleted_at IS NULL;
91
+
92
+ -- (q_* generated-column filter indexes are auto-created at runtime — see note above.)
93
+
94
+ -- Partial unique indexes: the hard concurrency guarantees for draft/publish invariants.
95
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_documents_one_current_draft
96
+ ON documents(root_id) WHERE is_current_draft = 1;
97
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_documents_one_published
98
+ ON documents(root_id) WHERE is_published = 1;
99
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_documents_unique_version
100
+ ON documents(root_id, version_number);
101
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_documents_unique_slug
102
+ ON documents(tenant_id, locale, type_id, parent_root_id, slug)
103
+ WHERE is_current_draft = 1 AND deleted_at IS NULL AND slug IS NOT NULL;
104
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_documents_one_translation_per_locale
105
+ ON documents(tenant_id, translation_group_id, locale)
106
+ WHERE is_current_draft = 1 AND translation_group_id <> '';
107
+
108
+ -- Document references: typed document-to-document edges.
109
+ CREATE TABLE IF NOT EXISTS document_references (
110
+ id TEXT PRIMARY KEY,
111
+ tenant_id TEXT NOT NULL,
112
+ from_root_id TEXT NOT NULL,
113
+ from_document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
114
+ field_name TEXT NOT NULL,
115
+ ordinal INTEGER NOT NULL DEFAULT 0,
116
+ to_root_id TEXT NOT NULL,
117
+ ref_strength TEXT NOT NULL DEFAULT 'weak' CHECK (ref_strength IN ('strong', 'weak')),
118
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
119
+ );
120
+
121
+ CREATE INDEX IF NOT EXISTS idx_docref_to ON document_references(tenant_id, to_root_id);
122
+ CREATE INDEX IF NOT EXISTS idx_docref_from ON document_references(from_document_id);
123
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_docref_unique
124
+ ON document_references(from_document_id, field_name, ordinal);
125
+
126
+ -- Document facets: indexed rows for multi-valued scalar fields (e.g. tags arrays).
127
+ CREATE TABLE IF NOT EXISTS document_facets (
128
+ id TEXT PRIMARY KEY,
129
+ tenant_id TEXT NOT NULL,
130
+ document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
131
+ root_id TEXT NOT NULL,
132
+ type_id TEXT NOT NULL,
133
+ field_name TEXT NOT NULL,
134
+ ordinal INTEGER NOT NULL DEFAULT 0,
135
+ value_text TEXT,
136
+ value_number REAL,
137
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
138
+ );
139
+
140
+ CREATE INDEX IF NOT EXISTS idx_facets_lookup ON document_facets(tenant_id, type_id, field_name, value_text);
141
+ CREATE INDEX IF NOT EXISTS idx_facets_doc ON document_facets(document_id);
142
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_facets_unique
143
+ ON document_facets(document_id, field_name, ordinal);
144
+
145
+ -- Document permissions: per-document ACL overrides.
146
+ CREATE TABLE IF NOT EXISTS document_permissions (
147
+ id TEXT PRIMARY KEY,
148
+ tenant_id TEXT NOT NULL,
149
+ root_id TEXT NOT NULL,
150
+ principal_type TEXT NOT NULL CHECK (principal_type IN ('user', 'role', 'group', 'public', 'token')),
151
+ principal_id TEXT NOT NULL,
152
+ permission TEXT NOT NULL CHECK (permission IN ('read', 'create', 'update', 'delete', 'publish', 'manage')),
153
+ effect TEXT NOT NULL DEFAULT 'allow' CHECK (effect IN ('allow', 'deny')),
154
+ inherited INTEGER NOT NULL DEFAULT 0,
155
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
156
+ created_by TEXT
157
+ );
158
+
159
+ CREATE INDEX IF NOT EXISTS idx_document_permissions_root ON document_permissions(tenant_id, root_id);
160
+ CREATE INDEX IF NOT EXISTS idx_document_permissions_principal
161
+ ON document_permissions(tenant_id, principal_type, principal_id, permission);
162
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_document_permissions_unique
163
+ ON document_permissions(root_id, principal_type, principal_id, permission);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonicjs-cms/core",
3
- "version": "2.18.1",
3
+ "version": "3.0.0-beta.2",
4
4
  "description": "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -67,10 +67,11 @@
67
67
  "type-check": "tsc --noEmit",
68
68
  "lint": "eslint src/",
69
69
  "lint:fix": "eslint src/ --fix",
70
- "test": "vitest --run",
71
- "test:cov": "vitest --run --coverage",
70
+ "test": "vitest run",
71
+ "test:cov": "vitest run --coverage",
72
72
  "test:watch": "vitest",
73
- "prepublishOnly": "npm run build"
73
+ "prepublishOnly": "npm run build",
74
+ "prepare": "npm run build"
74
75
  },
75
76
  "keywords": [
76
77
  "cms",
@@ -103,6 +104,8 @@
103
104
  },
104
105
  "dependencies": {
105
106
  "@cf-wasm/resvg": "^0.3.3",
107
+ "better-auth": "^1.6.13",
108
+ "better-auth-cloudflare": "^0.3.0",
106
109
  "csv-parse": "^6.2.1",
107
110
  "drizzle-zod": "^0.8.3",
108
111
  "highlight.js": "^11.11.1",
@@ -114,18 +117,20 @@
114
117
  },
115
118
  "devDependencies": {
116
119
  "@cloudflare/workers-types": "^4.20251014.0",
120
+ "@types/better-sqlite3": "^7.6.13",
117
121
  "@types/node": "^24.9.2",
118
122
  "@types/qrcode-svg": "^1.1.5",
119
123
  "@typescript-eslint/eslint-plugin": "^8.50.0",
120
124
  "@typescript-eslint/parser": "^8.50.0",
121
- "@vitest/coverage-v8": "^4.0.5",
125
+ "@vitest/coverage-v8": "^4.1.9",
126
+ "better-sqlite3": "^12.10.0",
122
127
  "drizzle-orm": "^0.45.2",
123
128
  "eslint": "^9.39.2",
124
129
  "glob": "^10.5.0",
125
- "hono": "^4.12.12",
130
+ "hono": "^4.12.26",
126
131
  "tsup": "^8.5.0",
127
132
  "typescript": "^5.9.3",
128
- "vitest": "^4.0.5",
133
+ "vitest": "^4.1.9",
129
134
  "zod": "^4.1.12"
130
135
  },
131
136
  "engines": {
@@ -1,17 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkUYJ6TJHX_cjs = require('./chunk-UYJ6TJHX.cjs');
4
- require('./chunk-IGJUBJBW.cjs');
5
-
6
- chunkUYJ6TJHX_cjs.init_admin_layout_catalyst_template();
7
-
8
- Object.defineProperty(exports, "renderAdminLayoutCatalyst", {
9
- enumerable: true,
10
- get: function () { return chunkUYJ6TJHX_cjs.renderAdminLayoutCatalyst; }
11
- });
12
- Object.defineProperty(exports, "renderCatalystCheckbox", {
13
- enumerable: true,
14
- get: function () { return chunkUYJ6TJHX_cjs.renderCatalystCheckbox; }
15
- });
16
- //# sourceMappingURL=admin-layout-catalyst.template-HFD37TY5.cjs.map
17
- //# sourceMappingURL=admin-layout-catalyst.template-HFD37TY5.cjs.map
@@ -1,7 +0,0 @@
1
- import { init_admin_layout_catalyst_template } from './chunk-55RDMDOP.js';
2
- export { renderAdminLayoutCatalyst, renderCatalystCheckbox } from './chunk-55RDMDOP.js';
3
- import './chunk-V4OQ3NZ2.js';
4
-
5
- init_admin_layout_catalyst_template();
6
- //# sourceMappingURL=admin-layout-catalyst.template-UMTIN66R.js.map
7
- //# sourceMappingURL=admin-layout-catalyst.template-UMTIN66R.js.map
@@ -1,112 +0,0 @@
1
- import { Hono, Context } from 'hono';
2
- import { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types';
3
-
4
- /**
5
- * Main Application Factory
6
- *
7
- * Creates a configured SonicJS application with all core functionality
8
- */
9
-
10
- interface Bindings {
11
- DB: D1Database;
12
- CACHE_KV: KVNamespace;
13
- MEDIA_BUCKET: R2Bucket;
14
- ASSETS: Fetcher;
15
- EMAIL_QUEUE?: Queue;
16
- SENDGRID_API_KEY?: string;
17
- DEFAULT_FROM_EMAIL?: string;
18
- IMAGES_ACCOUNT_ID?: string;
19
- IMAGES_API_TOKEN?: string;
20
- ENVIRONMENT?: string;
21
- CORS_ORIGINS?: string;
22
- JWT_SECRET?: string;
23
- JWT_EXPIRES_IN?: string;
24
- JWT_REFRESH_GRACE_SECONDS?: string;
25
- BUCKET_NAME?: string;
26
- GOOGLE_MAPS_API_KEY?: string;
27
- }
28
- interface Variables {
29
- user?: {
30
- userId: string;
31
- email: string;
32
- role: string;
33
- exp: number;
34
- iat: number;
35
- };
36
- requestId?: string;
37
- startTime?: number;
38
- appVersion?: string;
39
- csrfToken?: string;
40
- pluginMenuItems?: Array<{
41
- label: string;
42
- path: string;
43
- icon: string;
44
- }>;
45
- }
46
- interface SonicJSConfig {
47
- collections?: {
48
- directory?: string;
49
- autoSync?: boolean;
50
- };
51
- plugins?: {
52
- directory?: string;
53
- autoLoad?: boolean;
54
- disableAll?: boolean;
55
- };
56
- routes?: Array<{
57
- path: string;
58
- handler: Hono;
59
- }>;
60
- middleware?: {
61
- beforeAuth?: Array<(c: Context, next: () => Promise<void>) => Promise<void>>;
62
- afterAuth?: Array<(c: Context, next: () => Promise<void>) => Promise<void>>;
63
- };
64
- adminAccessRoles?: string[];
65
- version?: string;
66
- name?: string;
67
- }
68
- type SonicJSApp = Hono<{
69
- Bindings: Bindings;
70
- Variables: Variables;
71
- }>;
72
- /**
73
- * Create a SonicJS application with core functionality
74
- *
75
- * @param config - Application configuration
76
- * @returns Configured Hono application
77
- *
78
- * @example
79
- * ```typescript
80
- * import { createSonicJSApp } from '@sonicjs-cms/core'
81
- *
82
- * const app = createSonicJSApp({
83
- * collections: {
84
- * directory: './src/collections',
85
- * autoSync: true
86
- * },
87
- * plugins: {
88
- * directory: './src/plugins',
89
- * autoLoad: true
90
- * }
91
- * })
92
- *
93
- * export default app
94
- * ```
95
- */
96
- declare function createSonicJSApp(config?: SonicJSConfig): SonicJSApp;
97
- /**
98
- * Setup core middleware (backward compatibility)
99
- *
100
- * @param _app - Hono application
101
- * @deprecated Use createSonicJSApp() instead
102
- */
103
- declare function setupCoreMiddleware(_app: SonicJSApp): void;
104
- /**
105
- * Setup core routes (backward compatibility)
106
- *
107
- * @param _app - Hono application
108
- * @deprecated Use createSonicJSApp() instead
109
- */
110
- declare function setupCoreRoutes(_app: SonicJSApp): void;
111
-
112
- export { type Bindings as B, type SonicJSConfig as S, type Variables as V, type SonicJSApp as a, setupCoreRoutes as b, createSonicJSApp as c, setupCoreMiddleware as s };
@@ -1,112 +0,0 @@
1
- import { Hono, Context } from 'hono';
2
- import { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types';
3
-
4
- /**
5
- * Main Application Factory
6
- *
7
- * Creates a configured SonicJS application with all core functionality
8
- */
9
-
10
- interface Bindings {
11
- DB: D1Database;
12
- CACHE_KV: KVNamespace;
13
- MEDIA_BUCKET: R2Bucket;
14
- ASSETS: Fetcher;
15
- EMAIL_QUEUE?: Queue;
16
- SENDGRID_API_KEY?: string;
17
- DEFAULT_FROM_EMAIL?: string;
18
- IMAGES_ACCOUNT_ID?: string;
19
- IMAGES_API_TOKEN?: string;
20
- ENVIRONMENT?: string;
21
- CORS_ORIGINS?: string;
22
- JWT_SECRET?: string;
23
- JWT_EXPIRES_IN?: string;
24
- JWT_REFRESH_GRACE_SECONDS?: string;
25
- BUCKET_NAME?: string;
26
- GOOGLE_MAPS_API_KEY?: string;
27
- }
28
- interface Variables {
29
- user?: {
30
- userId: string;
31
- email: string;
32
- role: string;
33
- exp: number;
34
- iat: number;
35
- };
36
- requestId?: string;
37
- startTime?: number;
38
- appVersion?: string;
39
- csrfToken?: string;
40
- pluginMenuItems?: Array<{
41
- label: string;
42
- path: string;
43
- icon: string;
44
- }>;
45
- }
46
- interface SonicJSConfig {
47
- collections?: {
48
- directory?: string;
49
- autoSync?: boolean;
50
- };
51
- plugins?: {
52
- directory?: string;
53
- autoLoad?: boolean;
54
- disableAll?: boolean;
55
- };
56
- routes?: Array<{
57
- path: string;
58
- handler: Hono;
59
- }>;
60
- middleware?: {
61
- beforeAuth?: Array<(c: Context, next: () => Promise<void>) => Promise<void>>;
62
- afterAuth?: Array<(c: Context, next: () => Promise<void>) => Promise<void>>;
63
- };
64
- adminAccessRoles?: string[];
65
- version?: string;
66
- name?: string;
67
- }
68
- type SonicJSApp = Hono<{
69
- Bindings: Bindings;
70
- Variables: Variables;
71
- }>;
72
- /**
73
- * Create a SonicJS application with core functionality
74
- *
75
- * @param config - Application configuration
76
- * @returns Configured Hono application
77
- *
78
- * @example
79
- * ```typescript
80
- * import { createSonicJSApp } from '@sonicjs-cms/core'
81
- *
82
- * const app = createSonicJSApp({
83
- * collections: {
84
- * directory: './src/collections',
85
- * autoSync: true
86
- * },
87
- * plugins: {
88
- * directory: './src/plugins',
89
- * autoLoad: true
90
- * }
91
- * })
92
- *
93
- * export default app
94
- * ```
95
- */
96
- declare function createSonicJSApp(config?: SonicJSConfig): SonicJSApp;
97
- /**
98
- * Setup core middleware (backward compatibility)
99
- *
100
- * @param _app - Hono application
101
- * @deprecated Use createSonicJSApp() instead
102
- */
103
- declare function setupCoreMiddleware(_app: SonicJSApp): void;
104
- /**
105
- * Setup core routes (backward compatibility)
106
- *
107
- * @param _app - Hono application
108
- * @deprecated Use createSonicJSApp() instead
109
- */
110
- declare function setupCoreRoutes(_app: SonicJSApp): void;
111
-
112
- export { type Bindings as B, type SonicJSConfig as S, type Variables as V, type SonicJSApp as a, setupCoreRoutes as b, createSonicJSApp as c, setupCoreMiddleware as s };