@sonicjs-cms/core 2.18.1 → 3.0.0-beta.10
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-ABB34XUS.cjs → chunk-3KYKEXV7.cjs} +667 -19
- package/dist/chunk-3KYKEXV7.cjs.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-XXDFQERJ.js → chunk-6OC6MF3C.js} +7192 -9806
- package/dist/chunk-6OC6MF3C.js.map +1 -0
- package/dist/chunk-AI663NBO.js +821 -0
- package/dist/chunk-AI663NBO.js.map +1 -0
- package/dist/chunk-ALDRXTUO.js +273 -0
- package/dist/chunk-ALDRXTUO.js.map +1 -0
- package/dist/{chunk-TFNTM3OA.js → chunk-ATUPB6MN.js} +645 -15
- package/dist/chunk-ATUPB6MN.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-F67UK75A.cjs +158 -0
- package/dist/chunk-F67UK75A.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-IDCZBF35.js +1186 -0
- package/dist/chunk-IDCZBF35.js.map +1 -0
- package/dist/chunk-IESEVHXL.js +66 -0
- package/dist/chunk-IESEVHXL.js.map +1 -0
- package/dist/chunk-IGADDMXH.js +387 -0
- package/dist/chunk-IGADDMXH.js.map +1 -0
- package/dist/chunk-IHTXB7AT.cjs +276 -0
- package/dist/chunk-IHTXB7AT.cjs.map +1 -0
- package/dist/chunk-IVPRUGTY.js +242 -0
- package/dist/chunk-IVPRUGTY.js.map +1 -0
- package/dist/{chunk-SQ6FNXU2.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-UYJ6TJHX.cjs → chunk-K623Q6WD.cjs} +181 -56
- package/dist/chunk-K623Q6WD.cjs.map +1 -0
- package/dist/chunk-MUNO67TT.cjs +1219 -0
- package/dist/chunk-MUNO67TT.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-PMGOBS6X.cjs +408 -0
- package/dist/chunk-PMGOBS6X.cjs.map +1 -0
- package/dist/{chunk-OHYBNCVL.cjs → chunk-PXNTCCPE.cjs} +10 -1256
- package/dist/chunk-PXNTCCPE.cjs.map +1 -0
- package/dist/chunk-PYVFXCSD.js +1828 -0
- package/dist/chunk-PYVFXCSD.js.map +1 -0
- package/dist/{chunk-MGFRZO24.js → chunk-QZGABF2M.js} +3 -149
- package/dist/chunk-QZGABF2M.js.map +1 -0
- package/dist/{chunk-T3Q5V33G.cjs → chunk-R4ILO3W6.cjs} +876 -829
- package/dist/chunk-R4ILO3W6.cjs.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-SXXTQETM.cjs → chunk-TO6EY4P7.cjs} +8722 -11323
- package/dist/chunk-TO6EY4P7.cjs.map +1 -0
- package/dist/chunk-V464XBYS.js +154 -0
- package/dist/chunk-V464XBYS.js.map +1 -0
- package/dist/chunk-YA3TJ65D.cjs +575 -0
- package/dist/chunk-YA3TJ65D.cjs.map +1 -0
- package/dist/chunk-YP7GW2G5.cjs +866 -0
- package/dist/chunk-YP7GW2G5.cjs.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 +13737 -4327
- 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 -4068
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +38 -32
- package/dist/middleware.d.cts +69 -7
- package/dist/middleware.d.ts +69 -7
- package/dist/middleware.js +9 -3
- package/dist/migrations-2XHQEGOQ.cjs +13 -0
- package/dist/{migrations-IYNTWDC6.cjs.map → migrations-2XHQEGOQ.cjs.map} +1 -1
- package/dist/migrations-PE3CDVSM.js +4 -0
- package/dist/{migrations-R337UD46.js.map → migrations-PE3CDVSM.js.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-4R3NOOL3.js +0 -2217
- package/dist/chunk-4R3NOOL3.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-ABB34XUS.cjs.map +0 -1
- package/dist/chunk-C54YUA23.cjs +0 -2219
- package/dist/chunk-C54YUA23.cjs.map +0 -1
- package/dist/chunk-DSUJ5YQH.cjs +0 -722
- package/dist/chunk-DSUJ5YQH.cjs.map +0 -1
- package/dist/chunk-EW5NOBVU.js +0 -1783
- package/dist/chunk-EW5NOBVU.js.map +0 -1
- package/dist/chunk-EXNEW5US.js +0 -648
- package/dist/chunk-EXNEW5US.js.map +0 -1
- package/dist/chunk-I2H5NGJQ.js +0 -692
- package/dist/chunk-I2H5NGJQ.js.map +0 -1
- package/dist/chunk-MGFRZO24.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-SQ6FNXU2.cjs.map +0 -1
- package/dist/chunk-SXXTQETM.cjs.map +0 -1
- package/dist/chunk-T3Q5V33G.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-XXDFQERJ.js.map +0 -1
- package/dist/migrations-IYNTWDC6.cjs +0 -13
- package/dist/migrations-R337UD46.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
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// package.json
|
|
4
|
+
var package_default = {
|
|
5
|
+
name: "@sonicjs-cms/core",
|
|
6
|
+
version: "3.0.0-beta.10",
|
|
7
|
+
description: "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers",
|
|
8
|
+
type: "module",
|
|
9
|
+
main: "./dist/index.cjs",
|
|
10
|
+
module: "./dist/index.js",
|
|
11
|
+
types: "./dist/index.d.ts",
|
|
12
|
+
bin: {
|
|
13
|
+
"sonicjs-db-reset": "./bin/db-reset.js"
|
|
14
|
+
},
|
|
15
|
+
exports: {
|
|
16
|
+
".": {
|
|
17
|
+
types: "./dist/index.d.ts",
|
|
18
|
+
import: "./dist/index.js",
|
|
19
|
+
require: "./dist/index.cjs"
|
|
20
|
+
},
|
|
21
|
+
"./services": {
|
|
22
|
+
types: "./dist/services.d.ts",
|
|
23
|
+
import: "./dist/services.js",
|
|
24
|
+
require: "./dist/services.cjs"
|
|
25
|
+
},
|
|
26
|
+
"./middleware": {
|
|
27
|
+
types: "./dist/middleware.d.ts",
|
|
28
|
+
import: "./dist/middleware.js",
|
|
29
|
+
require: "./dist/middleware.cjs"
|
|
30
|
+
},
|
|
31
|
+
"./routes": {
|
|
32
|
+
types: "./dist/routes.d.ts",
|
|
33
|
+
import: "./dist/routes.js",
|
|
34
|
+
require: "./dist/routes.cjs"
|
|
35
|
+
},
|
|
36
|
+
"./templates": {
|
|
37
|
+
types: "./dist/templates.d.ts",
|
|
38
|
+
import: "./dist/templates.js",
|
|
39
|
+
require: "./dist/templates.cjs"
|
|
40
|
+
},
|
|
41
|
+
"./plugins": {
|
|
42
|
+
types: "./dist/plugins.d.ts",
|
|
43
|
+
import: "./dist/plugins.js",
|
|
44
|
+
require: "./dist/plugins.cjs"
|
|
45
|
+
},
|
|
46
|
+
"./utils": {
|
|
47
|
+
types: "./dist/utils.d.ts",
|
|
48
|
+
import: "./dist/utils.js",
|
|
49
|
+
require: "./dist/utils.cjs"
|
|
50
|
+
},
|
|
51
|
+
"./types": {
|
|
52
|
+
types: "./dist/types.d.ts",
|
|
53
|
+
import: "./dist/types.js",
|
|
54
|
+
require: "./dist/types.cjs"
|
|
55
|
+
},
|
|
56
|
+
"./package.json": "./package.json"
|
|
57
|
+
},
|
|
58
|
+
files: [
|
|
59
|
+
"bin",
|
|
60
|
+
"dist",
|
|
61
|
+
"migrations",
|
|
62
|
+
"README.md",
|
|
63
|
+
"LICENSE"
|
|
64
|
+
],
|
|
65
|
+
scripts: {
|
|
66
|
+
"generate:migrations": "npx tsx scripts/generate-migrations.ts",
|
|
67
|
+
prebuild: "npm run generate:migrations",
|
|
68
|
+
build: "tsup",
|
|
69
|
+
dev: "tsup --watch",
|
|
70
|
+
"type-check": "tsc --noEmit",
|
|
71
|
+
lint: "eslint src/",
|
|
72
|
+
"lint:fix": "eslint src/ --fix",
|
|
73
|
+
test: "vitest run",
|
|
74
|
+
"test:cov": "vitest run --coverage",
|
|
75
|
+
"test:watch": "vitest",
|
|
76
|
+
prepublishOnly: "npm run build",
|
|
77
|
+
prepare: "npm run build"
|
|
78
|
+
},
|
|
79
|
+
keywords: [
|
|
80
|
+
"cms",
|
|
81
|
+
"headless-cms",
|
|
82
|
+
"cloudflare",
|
|
83
|
+
"workers",
|
|
84
|
+
"edge",
|
|
85
|
+
"typescript",
|
|
86
|
+
"hono",
|
|
87
|
+
"content-management",
|
|
88
|
+
"api",
|
|
89
|
+
"sonicjs"
|
|
90
|
+
],
|
|
91
|
+
author: "SonicJS Team",
|
|
92
|
+
license: "MIT",
|
|
93
|
+
repository: {
|
|
94
|
+
type: "git",
|
|
95
|
+
url: "git+https://github.com/sonicjs/sonicjs.git",
|
|
96
|
+
directory: "packages/core"
|
|
97
|
+
},
|
|
98
|
+
bugs: {
|
|
99
|
+
url: "https://github.com/sonicjs/sonicjs/issues"
|
|
100
|
+
},
|
|
101
|
+
homepage: "https://sonicjs.com",
|
|
102
|
+
peerDependencies: {
|
|
103
|
+
"@cloudflare/workers-types": "^4.0.0",
|
|
104
|
+
"drizzle-orm": "^0.44.0",
|
|
105
|
+
hono: "^4.0.0",
|
|
106
|
+
zod: "^3.0.0 || ^4.0.0"
|
|
107
|
+
},
|
|
108
|
+
dependencies: {
|
|
109
|
+
"@cf-wasm/resvg": "^0.3.3",
|
|
110
|
+
"better-auth": "^1.6.13",
|
|
111
|
+
"better-auth-cloudflare": "^0.3.0",
|
|
112
|
+
"csv-parse": "^6.2.1",
|
|
113
|
+
"drizzle-zod": "^0.8.3",
|
|
114
|
+
"highlight.js": "^11.11.1",
|
|
115
|
+
linkedom: "^0.18.12",
|
|
116
|
+
marked: "^16.4.1",
|
|
117
|
+
"qrcode-svg": "^1.1.0",
|
|
118
|
+
semver: "^7.7.3",
|
|
119
|
+
"tiny-lru": "^13.0.0"
|
|
120
|
+
},
|
|
121
|
+
devDependencies: {
|
|
122
|
+
"@cloudflare/workers-types": "^4.20251014.0",
|
|
123
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
124
|
+
"@types/node": "^24.9.2",
|
|
125
|
+
"@types/qrcode-svg": "^1.1.5",
|
|
126
|
+
"@typescript-eslint/eslint-plugin": "^8.50.0",
|
|
127
|
+
"@typescript-eslint/parser": "^8.50.0",
|
|
128
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
129
|
+
"better-sqlite3": "^12.10.0",
|
|
130
|
+
"drizzle-orm": "^0.45.2",
|
|
131
|
+
eslint: "^9.39.2",
|
|
132
|
+
glob: "^10.5.0",
|
|
133
|
+
hono: "^4.12.26",
|
|
134
|
+
tsup: "^8.5.0",
|
|
135
|
+
typescript: "^5.9.3",
|
|
136
|
+
vitest: "^4.1.9",
|
|
137
|
+
zod: "^4.1.12"
|
|
138
|
+
},
|
|
139
|
+
engines: {
|
|
140
|
+
node: ">=18.0.0"
|
|
141
|
+
},
|
|
142
|
+
publishConfig: {
|
|
143
|
+
access: "public",
|
|
144
|
+
registry: "https://registry.npmjs.org/"
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// src/utils/version.ts
|
|
149
|
+
var SONICJS_VERSION = package_default.version;
|
|
150
|
+
function getCoreVersion() {
|
|
151
|
+
return SONICJS_VERSION;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
exports.SONICJS_VERSION = SONICJS_VERSION;
|
|
155
|
+
exports.getCoreVersion = getCoreVersion;
|
|
156
|
+
exports.package_default = package_default;
|
|
157
|
+
//# sourceMappingURL=chunk-F67UK75A.cjs.map
|
|
158
|
+
//# sourceMappingURL=chunk-F67UK75A.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/utils/version.ts"],"names":[],"mappings":"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","file":"chunk-F67UK75A.cjs","sourcesContent":["{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"3.0.0-beta.10\",\n \"description\": \"Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"sonicjs-db-reset\": \"./bin/db-reset.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./services\": {\n \"types\": \"./dist/services.d.ts\",\n \"import\": \"./dist/services.js\",\n \"require\": \"./dist/services.cjs\"\n },\n \"./middleware\": {\n \"types\": \"./dist/middleware.d.ts\",\n \"import\": \"./dist/middleware.js\",\n \"require\": \"./dist/middleware.cjs\"\n },\n \"./routes\": {\n \"types\": \"./dist/routes.d.ts\",\n \"import\": \"./dist/routes.js\",\n \"require\": \"./dist/routes.cjs\"\n },\n \"./templates\": {\n \"types\": \"./dist/templates.d.ts\",\n \"import\": \"./dist/templates.js\",\n \"require\": \"./dist/templates.cjs\"\n },\n \"./plugins\": {\n \"types\": \"./dist/plugins.d.ts\",\n \"import\": \"./dist/plugins.js\",\n \"require\": \"./dist/plugins.cjs\"\n },\n \"./utils\": {\n \"types\": \"./dist/utils.d.ts\",\n \"import\": \"./dist/utils.js\",\n \"require\": \"./dist/utils.cjs\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\",\n \"require\": \"./dist/types.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"migrations\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"generate:migrations\": \"npx tsx scripts/generate-migrations.ts\",\n \"prebuild\": \"npm run generate:migrations\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"type-check\": \"tsc --noEmit\",\n \"lint\": \"eslint src/\",\n \"lint:fix\": \"eslint src/ --fix\",\n \"test\": \"vitest run\",\n \"test:cov\": \"vitest run --coverage\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"npm run build\",\n \"prepare\": \"npm run build\"\n },\n \"keywords\": [\n \"cms\",\n \"headless-cms\",\n \"cloudflare\",\n \"workers\",\n \"edge\",\n \"typescript\",\n \"hono\",\n \"content-management\",\n \"api\",\n \"sonicjs\"\n ],\n \"author\": \"SonicJS Team\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/sonicjs/sonicjs.git\",\n \"directory\": \"packages/core\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/sonicjs/sonicjs/issues\"\n },\n \"homepage\": \"https://sonicjs.com\",\n \"peerDependencies\": {\n \"@cloudflare/workers-types\": \"^4.0.0\",\n \"drizzle-orm\": \"^0.44.0\",\n \"hono\": \"^4.0.0\",\n \"zod\": \"^3.0.0 || ^4.0.0\"\n },\n \"dependencies\": {\n \"@cf-wasm/resvg\": \"^0.3.3\",\n \"better-auth\": \"^1.6.13\",\n \"better-auth-cloudflare\": \"^0.3.0\",\n \"csv-parse\": \"^6.2.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"highlight.js\": \"^11.11.1\",\n \"linkedom\": \"^0.18.12\",\n \"marked\": \"^16.4.1\",\n \"qrcode-svg\": \"^1.1.0\",\n \"semver\": \"^7.7.3\",\n \"tiny-lru\": \"^13.0.0\"\n },\n \"devDependencies\": {\n \"@cloudflare/workers-types\": \"^4.20251014.0\",\n \"@types/better-sqlite3\": \"^7.6.13\",\n \"@types/node\": \"^24.9.2\",\n \"@types/qrcode-svg\": \"^1.1.5\",\n \"@typescript-eslint/eslint-plugin\": \"^8.50.0\",\n \"@typescript-eslint/parser\": \"^8.50.0\",\n \"@vitest/coverage-v8\": \"^4.1.9\",\n \"better-sqlite3\": \"^12.10.0\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.26\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.9\",\n \"zod\": \"^4.1.12\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","/**\n * Version utility\n *\n * Provides the current version of @sonicjs-cms/core package\n */\n\nimport pkg from '../../package.json'\n\nexport const SONICJS_VERSION = pkg.version\n\n/**\n * Get the current SonicJS core version\n */\nexport function getCoreVersion(): string {\n return SONICJS_VERSION\n}\n"]}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
|
|
3
|
+
// ../../node_modules/nanoid/index.js
|
|
4
|
+
|
|
5
|
+
// ../../node_modules/nanoid/url-alphabet/index.js
|
|
6
|
+
var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
|
|
7
|
+
|
|
8
|
+
// ../../node_modules/nanoid/index.js
|
|
9
|
+
var POOL_SIZE_MULTIPLIER = 128;
|
|
10
|
+
var pool;
|
|
11
|
+
var poolOffset;
|
|
12
|
+
var fillPool = (bytes) => {
|
|
13
|
+
if (bytes < 0 || bytes > 1024) throw new RangeError("Wrong ID size");
|
|
14
|
+
if (!pool || pool.length < bytes) {
|
|
15
|
+
pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
|
|
16
|
+
crypto.randomFillSync(pool);
|
|
17
|
+
poolOffset = 0;
|
|
18
|
+
} else if (poolOffset + bytes > pool.length) {
|
|
19
|
+
crypto.randomFillSync(pool);
|
|
20
|
+
poolOffset = 0;
|
|
21
|
+
}
|
|
22
|
+
poolOffset += bytes;
|
|
23
|
+
};
|
|
24
|
+
var nanoid = (size = 21) => {
|
|
25
|
+
fillPool(size |= 0);
|
|
26
|
+
let id = "";
|
|
27
|
+
for (let i = poolOffset - size; i < poolOffset; i++) {
|
|
28
|
+
id += urlAlphabet[pool[i] & 63];
|
|
29
|
+
}
|
|
30
|
+
return id;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/services/document-projection.ts
|
|
34
|
+
var MAX_PARAMS = 90;
|
|
35
|
+
function chunkArray(arr, size) {
|
|
36
|
+
const chunks = [];
|
|
37
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
38
|
+
chunks.push(arr.slice(i, i + size));
|
|
39
|
+
}
|
|
40
|
+
return chunks;
|
|
41
|
+
}
|
|
42
|
+
var DocumentProjection = class {
|
|
43
|
+
constructor(db) {
|
|
44
|
+
this.db = db;
|
|
45
|
+
}
|
|
46
|
+
// Build D1 PreparedStatement arrays for inserting facets/references for a document.
|
|
47
|
+
// Returns raw D1 PreparedStatement objects suitable for inclusion in db.batch([...]).
|
|
48
|
+
buildDerivedInsertStatements(doc, queryableFields, now) {
|
|
49
|
+
const statements = [];
|
|
50
|
+
const facets = [];
|
|
51
|
+
const refs = [];
|
|
52
|
+
for (const field of queryableFields) {
|
|
53
|
+
const rawValue = this.extractPath(doc.data, field.path ?? `$.${field.name}`);
|
|
54
|
+
if (field.kind === "facet") {
|
|
55
|
+
const values = Array.isArray(rawValue) ? rawValue : rawValue != null ? [rawValue] : [];
|
|
56
|
+
values.forEach((v, ordinal) => {
|
|
57
|
+
const isNum = typeof v === "number";
|
|
58
|
+
facets.push({
|
|
59
|
+
id: nanoid(),
|
|
60
|
+
tenant_id: doc.tenantId,
|
|
61
|
+
document_id: doc.id,
|
|
62
|
+
root_id: doc.rootId,
|
|
63
|
+
type_id: doc.typeId,
|
|
64
|
+
field_name: field.name,
|
|
65
|
+
ordinal,
|
|
66
|
+
value_text: isNum ? null : String(v),
|
|
67
|
+
value_number: isNum ? v : null,
|
|
68
|
+
now
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
} else if (field.kind === "reference") {
|
|
72
|
+
const roots = Array.isArray(rawValue) ? rawValue : rawValue != null ? [rawValue] : [];
|
|
73
|
+
roots.forEach((rootId, ordinal) => {
|
|
74
|
+
refs.push({
|
|
75
|
+
id: nanoid(),
|
|
76
|
+
tenant_id: doc.tenantId,
|
|
77
|
+
from_root_id: doc.rootId,
|
|
78
|
+
from_document_id: doc.id,
|
|
79
|
+
field_name: field.name,
|
|
80
|
+
ordinal,
|
|
81
|
+
to_root_id: String(rootId),
|
|
82
|
+
ref_strength: field.refStrength ?? "weak",
|
|
83
|
+
now
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const FACET_COLS = 10;
|
|
89
|
+
for (const chunk of chunkArray(facets, Math.floor(MAX_PARAMS / FACET_COLS))) {
|
|
90
|
+
const placeholders = chunk.map(() => "(?,?,?,?,?,?,?,?,?,?)").join(",");
|
|
91
|
+
const params = [];
|
|
92
|
+
for (const f of chunk) {
|
|
93
|
+
params.push(f.id, f.tenant_id, f.document_id, f.root_id, f.type_id, f.field_name, f.ordinal, f.value_text, f.value_number, f.now);
|
|
94
|
+
}
|
|
95
|
+
statements.push(
|
|
96
|
+
this.db.prepare(
|
|
97
|
+
`INSERT INTO document_facets (id, tenant_id, document_id, root_id, type_id, field_name, ordinal, value_text, value_number, created_at) VALUES ${placeholders}`
|
|
98
|
+
).bind(...params)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
const REF_COLS = 9;
|
|
102
|
+
for (const chunk of chunkArray(refs, Math.floor(MAX_PARAMS / REF_COLS))) {
|
|
103
|
+
const placeholders = chunk.map(() => "(?,?,?,?,?,?,?,?,?)").join(",");
|
|
104
|
+
const params = [];
|
|
105
|
+
for (const r of chunk) {
|
|
106
|
+
params.push(r.id, r.tenant_id, r.from_root_id, r.from_document_id, r.field_name, r.ordinal, r.to_root_id, r.ref_strength, r.now);
|
|
107
|
+
}
|
|
108
|
+
statements.push(
|
|
109
|
+
this.db.prepare(
|
|
110
|
+
`INSERT INTO document_references (id, tenant_id, from_root_id, from_document_id, field_name, ordinal, to_root_id, ref_strength, created_at) VALUES ${placeholders}`
|
|
111
|
+
).bind(...params)
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
return statements;
|
|
115
|
+
}
|
|
116
|
+
buildDerivedDeleteStatements(documentId) {
|
|
117
|
+
return [
|
|
118
|
+
this.db.prepare("DELETE FROM document_facets WHERE document_id = ?").bind(documentId),
|
|
119
|
+
this.db.prepare("DELETE FROM document_references WHERE from_document_id = ?").bind(documentId)
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
// Rebuild derived rows for all current-draft and published rows of a type.
|
|
123
|
+
// One bounded admin action; not chunked cron orchestration.
|
|
124
|
+
async reindexType(typeId, tenantId, queryableFields) {
|
|
125
|
+
const result = await this.db.prepare(
|
|
126
|
+
`SELECT * FROM documents
|
|
127
|
+
WHERE type_id = ? AND tenant_id = ? AND (is_current_draft = 1 OR is_published = 1) AND deleted_at IS NULL`
|
|
128
|
+
).bind(typeId, tenantId).all();
|
|
129
|
+
const rows = result.results ?? [];
|
|
130
|
+
if (rows.length === 0) return 0;
|
|
131
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
132
|
+
let rebuilt = 0;
|
|
133
|
+
for (const chunk of chunkArray(rows, 20)) {
|
|
134
|
+
const statements = [];
|
|
135
|
+
for (const row of chunk) {
|
|
136
|
+
const doc = rowToDocument(row);
|
|
137
|
+
statements.push(...this.buildDerivedDeleteStatements(doc.id));
|
|
138
|
+
statements.push(...this.buildDerivedInsertStatements(doc, queryableFields, now));
|
|
139
|
+
}
|
|
140
|
+
if (statements.length > 0) {
|
|
141
|
+
await this.db.batch(statements);
|
|
142
|
+
rebuilt += chunk.length;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return rebuilt;
|
|
146
|
+
}
|
|
147
|
+
extractPath(data, path) {
|
|
148
|
+
if (path.startsWith("$.")) {
|
|
149
|
+
const key = path.slice(2);
|
|
150
|
+
return data[key] ?? null;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
function rowToDocument(row) {
|
|
156
|
+
return {
|
|
157
|
+
id: row.id,
|
|
158
|
+
rootId: row.root_id,
|
|
159
|
+
typeId: row.type_id,
|
|
160
|
+
typeVersion: row.type_version,
|
|
161
|
+
versionOfId: row.version_of_id,
|
|
162
|
+
versionNumber: row.version_number,
|
|
163
|
+
isCurrentDraft: row.is_current_draft === 1,
|
|
164
|
+
isPublished: row.is_published === 1,
|
|
165
|
+
status: row.status,
|
|
166
|
+
parentRootId: row.parent_root_id,
|
|
167
|
+
slug: row.slug,
|
|
168
|
+
path: row.path,
|
|
169
|
+
title: row.title,
|
|
170
|
+
zone: row.zone,
|
|
171
|
+
sortOrder: row.sort_order,
|
|
172
|
+
visible: row.visible === 1,
|
|
173
|
+
publishedAt: row.published_at,
|
|
174
|
+
scheduledAt: row.scheduled_at,
|
|
175
|
+
expiresAt: row.expires_at,
|
|
176
|
+
deletedAt: row.deleted_at,
|
|
177
|
+
tenantId: row.tenant_id,
|
|
178
|
+
locale: row.locale,
|
|
179
|
+
translationGroupId: row.translation_group_id,
|
|
180
|
+
data: JSON.parse(row.data),
|
|
181
|
+
metadata: JSON.parse(row.metadata),
|
|
182
|
+
ownerId: row.owner_id,
|
|
183
|
+
createdBy: row.created_by,
|
|
184
|
+
updatedBy: row.updated_by,
|
|
185
|
+
createdAt: row.created_at,
|
|
186
|
+
updatedAt: row.updated_at
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export { DocumentProjection, nanoid };
|
|
191
|
+
//# sourceMappingURL=chunk-GCDZZNIN.js.map
|
|
192
|
+
//# sourceMappingURL=chunk-GCDZZNIN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/nanoid/url-alphabet/index.js","../../../node_modules/nanoid/index.js","../src/services/document-projection.ts"],"names":[],"mappings":"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","file":"chunk-GCDZZNIN.js","sourcesContent":["let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nexport { urlAlphabet }\n","import crypto from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (bytes < 0 || bytes > 1024) throw new RangeError('Wrong ID size')\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nlet random = bytes => {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) => {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { D1Database } from '@cloudflare/workers-types'\nimport { nanoid } from 'nanoid'\nimport type { Document, QueryableField, DocumentRow } from '../schemas/document'\n\n// D1 hard limit: 100 bound parameters per statement. Keep under 90 for safety.\nconst MAX_PARAMS = 90\n\nfunction chunkArray<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n return chunks\n}\n\ninterface FacetInsert {\n id: string\n tenant_id: string\n document_id: string\n root_id: string\n type_id: string\n field_name: string\n ordinal: number\n value_text: string | null\n value_number: number | null\n now: number\n}\n\ninterface ReferenceInsert {\n id: string\n tenant_id: string\n from_root_id: string\n from_document_id: string\n field_name: string\n ordinal: number\n to_root_id: string\n ref_strength: string\n now: number\n}\n\nexport class DocumentProjection {\n constructor(private db: D1Database) {}\n\n // Build D1 PreparedStatement arrays for inserting facets/references for a document.\n // Returns raw D1 PreparedStatement objects suitable for inclusion in db.batch([...]).\n buildDerivedInsertStatements(\n doc: Document,\n queryableFields: QueryableField[],\n now: number,\n ): D1PreparedStatement[] {\n const statements: D1PreparedStatement[] = []\n const facets: FacetInsert[] = []\n const refs: ReferenceInsert[] = []\n\n for (const field of queryableFields) {\n const rawValue = this.extractPath(doc.data, field.path ?? `$.${field.name}`)\n\n if (field.kind === 'facet') {\n const values = Array.isArray(rawValue) ? rawValue : rawValue != null ? [rawValue] : []\n values.forEach((v, ordinal) => {\n const isNum = typeof v === 'number'\n facets.push({\n id: nanoid(),\n tenant_id: doc.tenantId,\n document_id: doc.id,\n root_id: doc.rootId,\n type_id: doc.typeId,\n field_name: field.name,\n ordinal,\n value_text: isNum ? null : String(v),\n value_number: isNum ? v : null,\n now,\n })\n })\n } else if (field.kind === 'reference') {\n const roots = Array.isArray(rawValue) ? rawValue : rawValue != null ? [rawValue] : []\n roots.forEach((rootId, ordinal) => {\n refs.push({\n id: nanoid(),\n tenant_id: doc.tenantId,\n from_root_id: doc.rootId,\n from_document_id: doc.id,\n field_name: field.name,\n ordinal,\n to_root_id: String(rootId),\n ref_strength: field.refStrength ?? 'weak',\n now,\n })\n })\n }\n // 'scalar' fields are VIRTUAL generated columns; no derived rows needed.\n }\n\n // Insert facets in chunks to respect the 100-param D1 limit (9 params per row).\n const FACET_COLS = 10\n for (const chunk of chunkArray(facets, Math.floor(MAX_PARAMS / FACET_COLS))) {\n const placeholders = chunk.map(() => '(?,?,?,?,?,?,?,?,?,?)').join(',')\n const params: (string | number | null)[] = []\n for (const f of chunk) {\n params.push(f.id, f.tenant_id, f.document_id, f.root_id, f.type_id, f.field_name, f.ordinal, f.value_text, f.value_number, f.now)\n }\n statements.push(\n this.db.prepare(\n `INSERT INTO document_facets (id, tenant_id, document_id, root_id, type_id, field_name, ordinal, value_text, value_number, created_at) VALUES ${placeholders}`,\n ).bind(...params),\n )\n }\n\n // Insert references in chunks (9 params per row).\n const REF_COLS = 9\n for (const chunk of chunkArray(refs, Math.floor(MAX_PARAMS / REF_COLS))) {\n const placeholders = chunk.map(() => '(?,?,?,?,?,?,?,?,?)').join(',')\n const params: (string | number | null)[] = []\n for (const r of chunk) {\n params.push(r.id, r.tenant_id, r.from_root_id, r.from_document_id, r.field_name, r.ordinal, r.to_root_id, r.ref_strength, r.now)\n }\n statements.push(\n this.db.prepare(\n `INSERT INTO document_references (id, tenant_id, from_root_id, from_document_id, field_name, ordinal, to_root_id, ref_strength, created_at) VALUES ${placeholders}`,\n ).bind(...params),\n )\n }\n\n return statements\n }\n\n buildDerivedDeleteStatements(documentId: string): D1PreparedStatement[] {\n return [\n this.db.prepare('DELETE FROM document_facets WHERE document_id = ?').bind(documentId),\n this.db.prepare('DELETE FROM document_references WHERE from_document_id = ?').bind(documentId),\n ]\n }\n\n // Rebuild derived rows for all current-draft and published rows of a type.\n // One bounded admin action; not chunked cron orchestration.\n async reindexType(typeId: string, tenantId: string, queryableFields: QueryableField[]): Promise<number> {\n // Only reindex rows that participate in queries (current-draft or published).\n const result = await this.db\n .prepare(\n `SELECT * FROM documents\n WHERE type_id = ? AND tenant_id = ? AND (is_current_draft = 1 OR is_published = 1) AND deleted_at IS NULL`,\n )\n .bind(typeId, tenantId)\n .all<DocumentRow>()\n\n const rows = result.results ?? []\n if (rows.length === 0) return 0\n\n const now = Math.floor(Date.now() / 1000)\n let rebuilt = 0\n\n // Process in batches of 20 documents to stay well under D1's 1000-rows-per-batch guidance.\n for (const chunk of chunkArray(rows, 20)) {\n const statements: D1PreparedStatement[] = []\n\n for (const row of chunk) {\n const doc = rowToDocument(row)\n statements.push(...this.buildDerivedDeleteStatements(doc.id))\n statements.push(...this.buildDerivedInsertStatements(doc, queryableFields, now))\n }\n\n if (statements.length > 0) {\n await this.db.batch(statements)\n rebuilt += chunk.length\n }\n }\n\n return rebuilt\n }\n\n private extractPath(data: Record<string, unknown>, path: string): unknown {\n // Supports simple $.<key> paths only; full JSONPath is overkill for the POC.\n if (path.startsWith('$.')) {\n const key = path.slice(2)\n return data[key] ?? null\n }\n return null\n }\n}\n\nfunction rowToDocument(row: DocumentRow): Document {\n return {\n id: row.id,\n rootId: row.root_id,\n typeId: row.type_id,\n typeVersion: row.type_version,\n versionOfId: row.version_of_id,\n versionNumber: row.version_number,\n isCurrentDraft: row.is_current_draft === 1,\n isPublished: row.is_published === 1,\n status: row.status,\n parentRootId: row.parent_root_id,\n slug: row.slug,\n path: row.path,\n title: row.title,\n zone: row.zone,\n sortOrder: row.sort_order,\n visible: row.visible === 1,\n publishedAt: row.published_at,\n scheduledAt: row.scheduled_at,\n expiresAt: row.expires_at,\n deletedAt: row.deleted_at,\n tenantId: row.tenant_id,\n locale: row.locale,\n translationGroupId: row.translation_group_id,\n data: JSON.parse(row.data),\n metadata: JSON.parse(row.metadata),\n ownerId: row.owner_id,\n createdBy: row.created_by,\n updatedBy: row.updated_by,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
|
|
5
|
+
// src/services/auth-validation.ts
|
|
6
|
+
async function isRegistrationEnabled(db) {
|
|
7
|
+
try {
|
|
8
|
+
const row = await db.prepare(
|
|
9
|
+
"SELECT data FROM documents WHERE slug = 'core-auth' AND type_id = 'plugin' AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL"
|
|
10
|
+
).first();
|
|
11
|
+
if (row?.data) {
|
|
12
|
+
const data = typeof row.data === "string" ? JSON.parse(row.data) : row.data;
|
|
13
|
+
const enabled = data?.settings?.registration?.enabled;
|
|
14
|
+
return enabled !== false && enabled !== 0;
|
|
15
|
+
}
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const plugin = await db.prepare("SELECT settings FROM plugins WHERE id = ?").bind("core-auth").first();
|
|
20
|
+
if (plugin?.settings) {
|
|
21
|
+
const settings = JSON.parse(plugin.settings);
|
|
22
|
+
const enabled = settings?.registration?.enabled;
|
|
23
|
+
return enabled !== false && enabled !== 0;
|
|
24
|
+
}
|
|
25
|
+
} catch {
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
async function isFirstUserRegistration(db) {
|
|
30
|
+
try {
|
|
31
|
+
const result = await db.prepare("SELECT COUNT(*) as count FROM auth_user").first();
|
|
32
|
+
return result?.count === 0;
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
var baseRegistrationSchema = zod.z.object({
|
|
38
|
+
email: zod.z.string().email("Valid email is required"),
|
|
39
|
+
password: zod.z.string().min(8, "Password must be at least 8 characters"),
|
|
40
|
+
firstName: zod.z.string().min(1, "First name is required").optional(),
|
|
41
|
+
lastName: zod.z.string().min(1, "Last name is required").optional()
|
|
42
|
+
});
|
|
43
|
+
var authValidationService = {
|
|
44
|
+
/**
|
|
45
|
+
* Build registration schema dynamically based on auth settings
|
|
46
|
+
* For now, returns a static schema with standard fields
|
|
47
|
+
*/
|
|
48
|
+
async buildRegistrationSchema(_db) {
|
|
49
|
+
return baseRegistrationSchema;
|
|
50
|
+
},
|
|
51
|
+
/**
|
|
52
|
+
* Generate default values for optional fields
|
|
53
|
+
*/
|
|
54
|
+
generateDefaultValue(field, data) {
|
|
55
|
+
switch (field) {
|
|
56
|
+
case "firstName":
|
|
57
|
+
return "User";
|
|
58
|
+
case "lastName":
|
|
59
|
+
return data.email ? data.email.split("@")[0] : "Account";
|
|
60
|
+
default:
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
exports.authValidationService = authValidationService;
|
|
67
|
+
exports.isFirstUserRegistration = isFirstUserRegistration;
|
|
68
|
+
exports.isRegistrationEnabled = isRegistrationEnabled;
|
|
69
|
+
//# sourceMappingURL=chunk-HIKBY7MS.cjs.map
|
|
70
|
+
//# sourceMappingURL=chunk-HIKBY7MS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/auth-validation.ts"],"names":["z"],"mappings":";;;;;AAyBA,eAAsB,sBAAsB,EAAA,EAAkC;AAK5E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CACf,OAAA;AAAA,MACC;AAAA,MAED,KAAA,EAAM;AACT,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,IAAA;AACvE,MAAA,MAAM,OAAA,GAAU,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,OAAA;AAC9C,MAAA,OAAO,OAAA,KAAY,SAAS,OAAA,KAAY,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,2CAA2C,CAAA,CACxE,IAAA,CAAK,WAAW,CAAA,CAChB,KAAA,EAAM;AACT,IAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAC3C,MAAA,MAAM,OAAA,GAAU,UAAU,YAAA,EAAc,OAAA;AACxC,MAAA,OAAO,OAAA,KAAY,SAAS,OAAA,KAAY,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACT;AAQA,eAAsB,wBAAwB,EAAA,EAAkC;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,yCAAyC,EAAE,KAAA,EAAM;AACjF,IAAA,OAAO,QAAQ,KAAA,KAAU,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AA6CA,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EACtC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB,CAAA;AAAA,EACjD,UAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,wCAAwC,CAAA;AAAA,EACpE,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,wBAAwB,EAAE,QAAA,EAAS;AAAA,EAChE,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,uBAAuB,EAAE,QAAA;AACvD,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,wBAAwB,GAAA,EAA8C;AAG1E,IAAA,OAAO,sBAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,OAAe,IAAA,EAAmB;AACrD,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,WAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA;AAAA,MACjD;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF;AACF","file":"chunk-HIKBY7MS.cjs","sourcesContent":["/**\n * Auth Validation Service\n *\n * Provides validation schemas for authentication operations\n */\n\nimport { z } from 'zod'\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// In-memory cache for admin existence check (lazy initialization pattern)\nlet adminExistsCache: boolean | null = null\n\nexport interface AuthSettings {\n enablePasswordLogin?: boolean\n enableOAuthLogin?: boolean\n requireEmailVerification?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\n/**\n * Check if user registration is enabled in the auth plugin settings\n * @param db - D1 database instance\n * @returns true if registration is enabled, false if disabled\n */\nexport async function isRegistrationEnabled(db: D1Database): Promise<boolean> {\n // Plugin settings live on the plugin's document (type_id='plugin', slug=pluginId) since the\n // document-model migration — the legacy `plugins` table no longer exists on greenfield. The\n // /admin/plugins/core-auth/settings write goes through PluginService.updatePluginSettings (doc model),\n // so the read must come from the same place or \"disable registration\" silently no-ops.\n try {\n const row = await db\n .prepare(\n \"SELECT data FROM documents WHERE slug = 'core-auth' AND type_id = 'plugin' AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL\",\n )\n .first() as { data: string } | null\n if (row?.data) {\n const data = typeof row.data === 'string' ? JSON.parse(row.data) : row.data\n const enabled = data?.settings?.registration?.enabled\n return enabled !== false && enabled !== 0\n }\n } catch {\n // fall through to the legacy table for installs that still have it\n }\n\n // Legacy fallback: the dropped `plugins` table (guarded — absent on greenfield).\n try {\n const plugin = await db.prepare('SELECT settings FROM plugins WHERE id = ?')\n .bind('core-auth')\n .first() as { settings: string } | null\n if (plugin?.settings) {\n // SQLite stores booleans as 0/1, so check for both false and 0.\n const settings = JSON.parse(plugin.settings)\n const enabled = settings?.registration?.enabled\n return enabled !== false && enabled !== 0\n }\n } catch {\n // no legacy table either\n }\n\n return true // Default to enabled when no setting is found\n}\n\n/**\n * Check if this would be the first user registration (bootstrap scenario)\n * The first user should always be allowed to register even if registration is disabled\n * @param db - D1 database instance\n * @returns true if no users exist in the database\n */\nexport async function isFirstUserRegistration(db: D1Database): Promise<boolean> {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM auth_user').first() as { count: number } | null\n return result?.count === 0\n } catch {\n return false // Default to not first user on error\n }\n}\n\n/**\n * Check if an admin user exists in the database (with in-memory caching)\n * Uses lazy initialization - only queries DB on first call, then caches result\n * @param db - D1 database instance\n * @returns true if an admin user exists\n */\nexport async function checkAdminUserExists(db: D1Database): Promise<boolean> {\n // Return cached value if already checked\n if (adminExistsCache !== null) {\n return adminExistsCache\n }\n\n try {\n const result = await db.prepare('SELECT id FROM auth_user WHERE role = ?')\n .bind('admin')\n .first()\n adminExistsCache = !!result\n return adminExistsCache\n } catch {\n // On error (e.g., table doesn't exist yet), assume no admin exists\n return false\n }\n}\n\n/**\n * Set the admin exists cache to true\n * Call this after successfully creating the first admin user\n */\nexport function setAdminExists(): void {\n adminExistsCache = true\n}\n\n/**\n * Reset the admin exists cache (for testing purposes)\n */\nexport function resetAdminExistsCache(): void {\n adminExistsCache = null\n}\n\n/**\n * Auth Validation Service\n * Provides dynamic validation schemas for registration based on database settings\n */\nconst baseRegistrationSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(8, 'Password must be at least 8 characters'),\n firstName: z.string().min(1, 'First name is required').optional(),\n lastName: z.string().min(1, 'Last name is required').optional()\n})\n\nexport type RegistrationSchema = typeof baseRegistrationSchema\nexport type RegistrationData = z.infer<RegistrationSchema>\n\nexport const authValidationService = {\n /**\n * Build registration schema dynamically based on auth settings\n * For now, returns a static schema with standard fields\n */\n async buildRegistrationSchema(_db: D1Database): Promise<RegistrationSchema> {\n // TODO: Load settings from database to make fields optional/required dynamically\n // For now, use a static schema with common registration fields\n return baseRegistrationSchema\n },\n\n /**\n * Generate default values for optional fields\n */\n generateDefaultValue(field: string, data: any): string {\n switch (field) {\n case 'firstName':\n return 'User'\n case 'lastName':\n return data.email ? data.email.split('@')[0] : 'Account'\n default:\n return ''\n }\n }\n}\n"]}
|